系统开发基础
系统开发基础
软件工程概述
信息系统基本生存周期
- 可行性分析与项目开发计划
- 需求分析
- 概要设计
- 详细设计
- 编码
- 测试
- 维护
软件过程
软件过程改进-CMM
初始级:杂乱无章,甚至混乱,几乎没有明确定义的步骤,项目的成功依赖于个人的努力和核心任务的作用。
可重复级:建立了基本的项目管理过程和实践来跟踪项目费用、进度和功能特性,有必要的过程准则来重复以前在同类项目中的成功。
已定义级:管理和工程两方面的软件过程已经文档化、标准化,并综合成整个软件开发组织的标准过程。
已管理级:制定了软件过程和产品质量的详细度量标准。
优化级:加强了定量分析,通过来自过程质量反馈和来自新观念、新技术的反馈过程能不断持续地改进。
软件过程改进-CMMI阶段式模型

- 软件过程改进-CMMI连续式模型

软件开发方法
结构化方法
适合针对需求明确的项目
特点:
- 用户至上
- 严格区分工作阶段,每阶段有任务和结果
- 强调系统开发过程中的整体性和全局性
- 系统开发过程工程化,文档资料标准化
- 自顶向下,逐步分解(规划、需求分析、设计、编码、测试、运维)
原型法
适用于需求不明确的项目,帮助用户明确需求
面向对象方法
适用于复杂的大型项目
特点:
- 更好的复用性
- 关键在于建立一个全面、合理、统一的模型
- 分析、设计、实现三阶段的界限不明确
面向服务的方法
更高级别的面向对象方法
特点:
- 抽象级别:操作、服务、业务流程
Jackson
面向数据结构的方法
软件开发模型(必考、重点)
瀑布模型和V模型
瀑布模型
标准的结构化模型,需求明确, 以文档作为驱动的。

V模型
特点:
- 做需求分析时需要考虑验收测试、系统测试
- 做概要设计时要考虑集成测试
- 详细设计时需要考虑单元测试
- 测试过程贯穿始终

演化模型(原型模型、螺旋模型)
演化模型是迭代的过程模型,使得软件开发人员能够逐步开发出更完善的软件版本。非常适合于对软件需求缺乏准确认识的情况。


螺旋模型是由瀑布模型和演化模型结合,加入了风险分析。特别适用于庞大、复杂并且高风险的系统。
增量模型

喷泉模型
面向对象模型,以用户需求为动力,迭代无间隙

统一过程UP

初始->细化->构建->交付
敏捷方法
适合于小项目小团队,总体目标是尽可能早地、持续地对有价值的软件的交付,使得客户满意。
基本原则:
- 短平快的会议
- 小型版本的发布
- 较少的文档
- 合作为重
- 客户直接参与
- 自动化测试
- 适应性计划调整
- 结对编程
- 测试驱动开发
- 持续集成
- 重构
极限编程XP

其他敏捷开发方法

需求分析
需求分析的概念
需求分析的任务是多问题做分析,明确解决这个问题要做什么。
需求分析的过程:
- 问题识别
- 分析和综合
- 编制需求分析文档,产出需求规格说明书SRS
- 需求分析与评审
结构化分析的结果:一套分层的数据流图、一本数据词典、一组小说明( 也被称为加工逻辑说明)、补充材料
例题:软件开发过程中,需求分析阶段的输出包括数据流图、实体联系图、数据字典。而软件体系结构图是在整体架构设计阶段的产物。
需求的分类

需求分析的工具
数据流图DFD

数据流图是结构化分析的工具,遵循自顶向下、从抽象到具体的原则。
数据流:由一组固定成分的数据组成,表示数据的流向。每个数据流通常有一个适合的名词,反映数据流的含义。数据流必须和加工相关,即从加工流向加工、数据源流向加工、加工流向数据源
加工:描述了输入数据流到输出数据流之间的变换,也就是输入数据流做了什么处理之后变成了输出数据流。
数据存储(文件):用于表示暂时存储的数据,每个文件都有名字。流向文件的数据流表示写文件,流出的表示读文件。
外部实体:值存在于软件系统外的人员活组织
数据字典DD

数据字典有以下4类条目:数据流、数据项、数据存储和基本加工。
判定表、判定树 、结构化语言





系统设计
系统设计概述
软件设计的任务和活动
概要设计和详细设计
1. 抽象化
2. 自顶向下
3. 信息隐蔽
4. 模块独立(高内聚、低耦合)
- 体系结构设计:定义软件系统各主要部件之间的关系。
- 数据设计:基于E-R图确定软件及设计的文件系统的结构及数据库的表结构。
- 接口设计:软件内部,软件和操作系统间以及软件和人之间如何通信,其主要依赖于分析阶段的数据流图。
- 过程设计:系统结构部件转换成软件的过程描述。确定软件各个组成部分内的算法及内部数据结构,并选定某个过程的表达形式来描述各种算法。
应用的工具:
- 输入输出(IPO)图
- PDL
- PAD
- 程序流程图
- N/S盒图
例题1:概要设计文档的内容包括:体系结构设计、数据库设计、逻辑数据结构设计
例题2:结构化开发方法中,过程设计主要包含对数据结构和算法的设计。
模块设计
原则:
- 保存模块的大小适中
- 尽可能减少调用的深度
- 多扇入,少扇出
- 单入口,单出口
- 模块的作用域应该在模块之内
- 功能应该是可预测的
核心原则:高内聚,低耦合


人机界面设计
黄金三原则:置于用户控制之下、减少用户的记忆负担、保持界面的一致性
架构设计
- 架构设计的核心问题是能否达到架构级的软件复用
- 架构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个构件有效地组织成一个完整的系统
- 架构风格定义了用于描述系统的术语表和一组指导构建系统的规则
- 数据流风格:批处理序列、管道-过滤器
批处理序列
构件为一系列固定顺序的计算单元,构件之间只通过数据传递交互。每个处理步骤是一个独立的程序,每一步必须在其前一步结束之后才能开始,且数据必须是完整的,以整体的方式进行传递。
管道-过滤器
每个构件都有一组输入和输出,构建读输入的数据流,经过内部处理,产出输出数据流。这个过程通常是通过对输入数据的变换或计算来完成的,包括通过计算和增加信息以丰富数据、通过压缩和删除以精简数据、通过改变记录方式以转换数据和递增地转换数据等。这里的构件被称为过滤器,连接件就是数据流传输的管道,将一个过滤器的输出传到另外一个过滤器的输入。
- 调用/返回风格:主程序/子程序、面向对象、层次结构(MVC、C/S、B/S)
主程序/子程序:
单线程控制,把问题划分为若干个处理步骤,构件即为主程序和子程序,子程序通常可以合并为模块。过程调用作为交互机制,即充当连接件的角色。调用关系具有层次性,其语义逻辑表现为主程序的正确性取决于它调用的子程序的正确性。
面向对象:显示调用过程
构件是对象,对象是抽象数据类型的实例。在抽象数据类型中,数据的表示和它们的相印操作被封装起来,对象的行为体现在其接受和请求的动作。连接件即是对象间交互的方式,对象是通过函数和过程的调用来交互的。
层次结构:
构件组织是一个层次结构,连接件通过决定层间如何交互的协议来定义。每层为上一层提供服务,使用下一层的服务,只能见到与自己邻近的层。通过层次化结构,可以将大的问题分解为若干个渐进的小问题逐步解决,可以隐藏问题的复杂度。修改某一层,最多影响其相邻两层。


MVC架构
- 独立构件风格:进程通信、事件驱动系统(隐式调用)
- 进程通信:
构件是独立的过程,连接件是消息传递。构件通常是命名过程,消息传递的方式可以是点对点、异步或同步方式,以及远程过程调用等。
- 事件驱动系统(隐式调用):
构件不直接调用一个过程,而是触发或广播一个或多个事件。构件中的过程在一个或多个事件中注册,当某个事件被触发时,系统自动调用在这个事件中注册的所有过程。
- 进程通信:
- 虚拟机风格:解释器、基于规则的系统

- 仓库风格:数据库系统、超文本系统、黑板系统

- 数据流风格:批处理序列、管道-过滤器
系统测试(必考)
测试的基本概念及分类
系统测试的原则:
- 尽早、不断的进行测试
- 避免程序员自己测试自己设计的程序
- 既要选择合理的数据,又要选择无效、不合理的数据
- 修改后应进行回归测试
- 尚未发现的错误数量与该程序已发现错误的数量成正比
测试分类:
动态测试(机器运行):
- 黑盒测试
- 等价类划分
- 边界值分析
- 错误推测
- 因果图
- 白盒测试
- 基本路径测试
- 循环覆盖测试
- 逻辑覆盖测试
- 灰盒测试(黑盒+白盒测试)
- 黑盒测试
静态测试(纯人工):
- 桌前检查
- 代码审查
- 代码走查
黑盒测试
- 等价类划分
- 确定无效和有效等价类
- 设计用力尽可能多的覆盖有效类
- 设计用例只覆盖一个无效类
- 边界值分析
- 处理边界情况时最容易出错
- 选取的测试数据应该恰好等于、稍小于或稍大于边界值
白盒测试(重点)



测试阶段划分


McCabe复杂度计算

边的个数 - 点个数 + 2 = V(G)


软件维护

软件文档

软件质量保证模型


