软件工程
本模块涵盖软件工程概述、开发模型、开发方法、系统分析与设计、系统测试、系统维护与质量保证、项目管理等核心知识点。
一、软件工程概述
1.1 软件危机与软件工程
软件危机:在计算机软件的开发和维护过程中所遇到的一系列严重问题。
软件危机的表现:
- 软件开发成本和进度估计不准确
- 用户对已完成系统不满意
- 软件质量不可靠
- 软件不可维护
- 软件成本逐年上升
- 软件开发生产率提高速度跟不上需求增长
软件工程:
- 定义:将系统化的、规范化的、可量化的方法应用于软件的开发、运行和维护
- 三要素:方法、工具、过程
1.2 软件生命周期
软件产品从概念形成到退役的整个过程。
主要阶段:
| 阶段 | 主要任务 | 产出物 |
|---|---|---|
| 可行性分析 | 技术、经济、法律可行性 | 可行性研究报告 |
| 需求分析 | 确定系统功能和非功能需求 | 需求规格说明书(SRS) |
| 概要设计 | 系统架构设计、模块划分 | 概要设计说明书 |
| 详细设计 | 模块内部算法和数据结构设计 | 详细设计说明书 |
| 编码 | 编写程序代码 | 源代码 |
| 测试 | 发现并修复缺陷 | 测试报告 |
| 维护 | 改正性、适应性、完善性、预防性维护 | 维护报告 |
二、软件开发模型
2.1 瀑布模型
特点:
- 线性顺序执行,阶段间有因果关系
- 每个阶段有明确的输入和输出
- 文档驱动
优点:
- 阶段清晰,易于管理
- 文档完整
缺点:
- 缺乏灵活性,难以适应需求变化
- 风险暴露较晚
适用:需求明确、变化少的项目
2.2 增量模型
特点:
- 将系统分解为多个增量构件
- 每个增量都经历完整的开发过程
- 分批交付
优点:
- 早期获得部分功能
- 降低开发风险
- 适应需求变化
适用:需求较明确,但希望尽早交付部分功能的项目
2.3 演化模型(原型模型)
特点:
- 快速构建原型
- 用户反馈,逐步完善
- 迭代开发
类型:
- 探索型原型:明确需求
- 实验型原型:验证方案可行性
- 演化型原型:逐步演化为最终产品
适用:需求不明确的项目
2.4 螺旋模型
特点:
- 结合瀑布模型和原型模型
- 引入风险分析
- 每圈螺旋都是一个完整的开发周期
四个象限:
- 制定计划
- 风险分析
- 实施工程
- 客户评估
优点:
- 强调风险分析
- 支持用户早期参与
缺点:
- 风险分析成本高
- 依赖风险评估能力
适用:大型、复杂、高风险项目
2.5 喷泉模型
特点:
- 面向对象开发
- 迭代、无间隙
- 各阶段相互重叠、反复迭代
适用:面向对象的软件开发
2.6 统一过程(RUP)
特点:
- 用例驱动
- 架构为中心
- 迭代和增量
四个阶段:
- 初始:确定项目范围和目标
- 细化:分析问题域,建立架构基础
- 构建:开发剩余构件
- 移交:交付给用户
核心工作流:
- 6个核心过程工作流(业务建模、需求、分析设计、实现、测试、部署)
- 3个核心支持工作流(配置与变更管理、项目管理、环境)
2.7 敏捷开发
核心价值观(敏捷宣言):
- 个体和互动 高于 流程和工具
- 可工作的软件 高于 详尽的文档
- 客户合作 高于 合同谈判
- 响应变化 高于 遵循计划
常见方法:
| 方法 | 特点 |
|---|---|
| 极限编程(XP) | 测试驱动开发、结对编程、持续集成、重构 |
| Scrum | 迭代冲刺(Sprint)、每日站会、产品待办列表 |
| 水晶方法 | 根据项目规模调整方法 |
| 特征驱动开发(FDD) | 以特征为单位进行开发 |
| 自适应软件开发(ASD) | 预测、协作、学习 |
| 开放式源码 | 开源社区协作开发 |
三、开发方法
3.1 结构化方法
特点:
- 自顶向下,逐步求精
- 模块化设计
- 面向数据流
核心:
- 结构化分析(SA):数据流图(DFD)、数据字典(DD)
- 结构化设计(SD):模块结构图、概要设计
- 结构化程序设计(SP):顺序、选择、循环
缺点:
- 难以适应需求变化
- 对复杂系统建模能力不足
3.2 面向对象方法
特点:
- 以对象为基本单位
- 封装、继承、多态
- 更好的复用性和可维护性
主要方法:
- OMT(对象建模技术)
- Booch方法
- OOSE(面向对象软件工程)
- UML(统一建模语言)
3.3 原型法
特点:
- 快速构建原型
- 用户参与评价
- 逐步完善
分类:
- 抛弃式原型:原型仅用于明确需求,最终抛弃
- 演化式原型:原型逐步演化为最终系统
3.4 Jackson方法
特点:
- 面向数据结构
- 从数据结构导出程序结构
- 适合数据处理类系统
四、系统分析与设计
4.1 需求分析
需求分类:
| 类型 | 说明 | 示例 |
|---|---|---|
| 功能需求 | 系统必须完成的功能 | 用户登录、数据查询 |
| 非功能需求 | 系统属性约束 | 性能、安全性、可靠性 |
| 设计约束 | 限制条件 | 使用特定技术、平台 |
需求获取方法:
- 用户访谈
- 问卷调查
- 现场观察
- 原型法
- 头脑风暴
- 联合应用开发(JAD)
需求分析工具:
- 数据流图(DFD)
- 数据字典(DD)
- 判定表/判定树
- 状态转换图(STD)
- 用例图
4.2 系统设计
设计原则:
- 模块化:高内聚、低耦合
- 抽象:隐藏细节,暴露接口
- 逐步求精:自顶向下细化
- 信息隐藏:封装实现细节
内聚类型(由高到低):
| 内聚类型 | 说明 | 评分 |
|---|---|---|
| 功能内聚 | 模块完成单一功能 | 最高 |
| 顺序内聚 | 模块内元素顺序执行 | 高 |
| 通信内聚 | 模块内元素操作同一数据 | 中 |
| 过程内聚 | 模块内元素按特定步骤执行 | 中 |
| 时间内聚 | 模块内元素同时执行 | 低 |
| 逻辑内聚 | 模块内元素逻辑相似 | 低 |
| 偶然内聚 | 模块内元素无关联 | 最低 |
耦合类型(由低到高):
| 耦合类型 | 说明 | 评分 |
|---|---|---|
| 非直接耦合 | 模块间无直接关系 | 最低 |
| 数据耦合 | 模块间通过参数传递基本数据 | 低 |
| 标记耦合 | 模块间通过参数传递数据结构 | 中 |
| 控制耦合 | 模块间通过控制标志交互 | 中 |
| 外部耦合 | 模块间通过外部变量交互 | 高 |
| 公共耦合 | 模块间通过全局变量交互 | 高 |
| 内容耦合 | 一个模块直接访问另一个模块内部 | 最高 |
设计目标:高内聚、低耦合
4.3 结构化设计
变换型数据流:
- 传入路径 → 变换中心 → 传出路径
- 映射为:输入模块、变换模块、输出模块
事务型数据流:
- 事务中心根据输入选择执行路径
- 映射为:事务中心模块、事务处理模块
4.4 面向对象设计
设计原则(SOLID):
- Single Responsibility Principle:单一职责原则
- Open/Close Principle:开闭原则
- Liskov Substitution Principle:里氏替换原则
- Interface Segregation Principle:接口隔离原则
- Dependency Inversion Principle:依赖倒置原则
五、系统测试
5.1 测试原则
- 测试是为了发现错误,而不是证明正确
- 测试应尽早进行
- 测试应由独立的第三方进行
- 测试用例应包括合理和不合理的输入
- 充分注意测试中的群集现象
- 严格执行测试计划,排除随意性
- 对每一个测试结果做全面检查
- 妥善保存测试计划、用例、出错统计和最终分析报告
5.2 测试分类
按测试阶段:
| 阶段 | 测试对象 | 目的 |
|---|---|---|
| 单元测试 | 模块/函数 | 验证模块功能正确 |
| 集成测试 | 模块组合 | 验证模块间接口 |
| 系统测试 | 完整系统 | 验证系统满足需求 |
| 验收测试 | 最终产品 | 用户确认系统可用 |
按测试方法:
| 方法 | 特点 | 说明 |
|---|---|---|
| 静态测试 | 不执行代码 | 代码审查、走查、桌面检查 |
| 动态测试 | 执行代码 | 黑盒测试、白盒测试 |
黑盒测试(功能测试):
| 方法 | 说明 |
|---|---|
| 等价类划分 | 将输入划分为等价类,每类选一个代表 |
| 边界值分析 | 测试边界值及边界附近的值 |
| 错误推测法 | 凭经验推测可能的错误 |
| 因果图法 | 分析输入条件组合 |
| 判定表驱动 | 用判定表表示条件和动作 |
| 正交试验法 | 用正交表设计测试用例 |
| 功能图法 | 用功能图描述程序功能 |
| 场景法 | 模拟用户场景 |
白盒测试(结构测试):
| 覆盖标准 | 说明 | 覆盖程度 |
|---|---|---|
| 语句覆盖 | 每条语句至少执行一次 | 最低 |
| 判定覆盖(分支覆盖) | 每个判定的真假分支都执行 | 较低 |
| 条件覆盖 | 每个条件的各种可能值都满足 | 中 |
| 判定/条件覆盖 | 同时满足判定覆盖和条件覆盖 | 较高 |
| 条件组合覆盖 | 每个判定中条件的各种组合都出现 | 高 |
| 路径覆盖 | 每条可能的路径都执行 | 最高 |
McCabe复杂度(环路复杂度):
V(G) = E - N + 2P
- E:边数
- N:节点数
- P:连通分量数(通常为1)
其他测试类型:
- 回归测试:修改后重新测试,确保未引入新错误
- 冒烟测试:验证基本功能是否正常
- 性能测试:负载测试、压力测试、容量测试
- 安全测试:发现安全漏洞
- 兼容性测试:不同环境测试
- 易用性测试:用户体验测试
5.3 调试
调试方法:
- 试探法
- 回溯法
- 对分查找法
- 归纳法
- 演绎法
六、系统维护与质量保证
6.1 软件维护类型
| 类型 | 目的 | 占比 |
|---|---|---|
| 改正性维护 | 修复发现的错误 | 约20% |
| 适应性维护 | 适应环境变化 | 约25% |
| 完善性维护 | 改进功能和性能 | 约50% |
| 预防性维护 | 预防潜在问题 | 约5% |
维护副作用:
- 修改代码的副作用
- 修改数据的副作用
- 修改文档的副作用
6.2 软件质量
ISO/IEC 9126质量模型:
| 特性 | 子特性 |
|---|---|
| 功能性 | 适合性、准确性、互操作性、安全性、功能依从性 |
| 可靠性 | 成熟性、容错性、易恢复性、可靠性依从性 |
| 易用性 | 易理解性、易学性、易操作性、吸引性、易用性依从性 |
| 效率 | 时间特性、资源利用性、效率依从性 |
| 维护性 | 易分析性、易改变性、稳定性、易测试性、维护性依从性 |
| 可移植性 | 适应性、易安装性、共存性、易替换性、可移植性依从性 |
McCall质量模型:
- 产品运行:正确性、可靠性、效率、完整性、实用性
- 产品修改:可维护性、灵活性、可测试性
- 产品转移:可移植性、可复用性、互操作性
6.3 软件可靠性
可靠性指标:
- 平均失效间隔时间(MTBF)
- 平均修复时间(MTTR)
- 平均无故障时间(MTTF)
可靠性模型:
- 失效时间模型
- 缺陷计数模型
七、软件项目管理
7.1 项目管理知识领域
| 领域 | 说明 |
|---|---|
| 范围管理 | 确定和控制项目范围 |
| 时间管理 | 进度计划和控制 |
| 成本管理 | 成本估算和预算控制 |
| 质量管理 | 质量计划、保证和控制 |
| 人力资源管理 | 团队组建和管理 |
| 沟通管理 | 信息分发和沟通 |
| 风险管理 | 风险识别、分析、应对 |
| 采购管理 | 采购计划和管理 |
| 集成管理 | 项目整体协调 |
7.2 进度管理
工作分解结构(WBS):
- 将项目分解为可管理的工作包
- 自顶向下分解
网络图:
- 双代号网络图(AOA):箭线表示活动,节点表示事件
- 单代号网络图(AON):节点表示活动,箭线表示依赖
关键路径法(CPM):
- 关键路径:网络图中最长的路径
- 关键路径上的活动为关键活动
- 关键路径长度决定项目最短工期
- 关键活动的总时差为0
计划评审技术(PERT):
期望时间 = (乐观时间 + 4×最可能时间 + 悲观时间) / 6
方差 = ((悲观时间 - 乐观时间) / 6)²
甘特图:
- 横轴表示时间
- 纵轴表示活动
- 直观显示活动进度
7.3 成本管理
成本估算方法:
- 专家判断
- 类比估算
- 参数估算
- 自下而上估算
- 三点估算
挣值分析:
| 指标 | 公式 | 说明 |
|---|---|---|
| PV(计划值) | 计划完成工作的预算成本 | |
| EV(挣值) | 实际完成工作的预算成本 | |
| AC(实际成本) | 实际完成工作的实际成本 | |
| SV(进度偏差) | SV = EV - PV | >0 进度超前 |
| CV(成本偏差) | CV = EV - AC | >0 成本节约 |
| SPI(进度绩效指数) | SPI = EV / PV | >1 进度超前 |
| CPI(成本绩效指数) | CPI = EV / AC | >1 成本节约 |
| ETC(完工尚需估算) | ETC = (BAC - EV) / CPI | |
| EAC(完工估算) | EAC = AC + ETC |
7.4 风险管理
风险分类:
- 项目风险:预算、进度、人员等
- 技术风险:设计、实现、接口等
- 商业风险:市场、策略、销售等
风险管理过程:
- 风险识别
- 风险分析(定性、定量)
- 风险应对计划
- 风险监控
风险应对策略:
- 规避:消除风险源
- 转移:将风险转移给第三方
- 减轻:降低风险概率或影响
- 接受:接受风险后果
章节要点回顾
- 软件生命周期:掌握各阶段的任务和产出物
- 开发模型:理解瀑布、增量、原型、螺旋、喷泉、RUP、敏捷等模型的特点和适用场景
- 开发方法:理解结构化、面向对象、原型法、Jackson方法的特点
- 需求分析:掌握需求分类和获取方法
- 系统设计:理解高内聚、低耦合原则,掌握内聚和耦合的分类
- 系统测试:掌握测试原则、分类,黑盒和白盒测试方法
- 软件维护:掌握四种维护类型的特点和占比
- 软件质量:了解ISO/IEC 9126质量模型
- 项目管理:掌握WBS、关键路径、PERT、挣值分析等方法