06. 系统开发基础¶
软件工程、开发方法与模型、需求分析、设计、测试、维护、质量与文档。
配套阅读:系统开发基础:课件笔记,含课程配图、例题和参考解析。
配套阅读:【软件设计】数据流图:课件笔记,含课程配图、例题和参考解析。
本章目录¶
软件工程概览¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 软件工程
## 开发过程
- [生命周期与开发模型](/software-design/06-system-development/#lifecycle)
- 从可行性、需求与设计到实现、测试和维护
- 瀑布、V 模型、原型、增量、螺旋与统一过程
- 敏捷协作、过程改进与软件文档
- [需求分析与系统设计](/software-design/06-system-development/#requirements-and-design)
- 功能、质量与约束;数据流图与业务规则
- 架构、模块、数据、接口和人机界面
- 高内聚、低耦合与信息隐藏
- [数据库设计](/software-design/09-databases/)
- 将数据需求落实为模型、结构与约束
## 质量与协作
- [测试、质量与维护](/software-design/06-system-development/#testing-and-maintenance)
- 黑盒、白盒、测试层次与回归测试
- 圈复杂度、质量特性与维护类型
- [项目管理](/software-design/07-project-management/#project-management)
- 进度网络、关键路径、风险和成本
- 沟通、人员、配置与变更控制
## 面向对象
- [面向对象基础](/software-design/08-object-oriented/#object-oriented)
- 对象、类、封装、继承、多态与设计原则
- [UML](/software-design/08-object-oriented/#uml)
- 结构、行为、交互与关系语义
- [设计模式](/software-design/08-object-oriented/#design-patterns)
- 创建型、结构型与行为型,共 23 种
## 学科索引
- [软件工程](/software-design/06-system-development/)
- [知识产权与标准化](/software-design/12-intellectual-property/#intellectual-property-and-standards)
生命周期与开发模型¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 生命周期与开发模型
## 生命周期
- 可行性分析
- 评估技术、经济、运行与约束条件
- 需求分析
- 确定系统应提供的能力与验收依据
- 概要设计与详细设计
- 从系统架构细化到接口、数据结构和算法
- 编码、测试与交付
- 实现设计,检查质量,部署可用版本
- 运行、维护与退役
- 修复缺陷、适应环境、持续演化
- 阶段可迭代、交叠,具体安排由过程模型决定
## 开发方法
- 结构化方法
- 自顶向下、逐步分解,以功能和数据流组织分析设计
- 原型法
- 用可交互模型澄清需求、验证方案
- 可用于完整系统,也可用于大型系统的局部
- 面向对象方法
- 以对象职责和协作组织系统,支持封装与复用
## 顺序与验证
- 瀑布模型
- 阶段顺序推进,阶段成果经过评审
- 适合需求较稳定、交付边界较清晰的场景
- 后期需求变更可能带来较大返工
- V 模型
- 需求与验收、系统设计与系统测试相对应
- 架构设计与集成测试、详细设计与单元测试相对应
- 在开发早期规划对应测试,并开展评审
## 迭代与增量
- 演化模型
- 通过反馈逐步明确需求并改进产品
- 原型模型
- 抛弃式原型:验证后舍弃,正式系统重新工程化
- 演化式原型:持续改进为最终产品,需控制架构和质量
- 增量模型
- 按优先级分批交付可用功能
- 早期增量通常提供核心能力,各增量保持集成一致性
- 螺旋模型
- 风险驱动,每轮确定目标、分析风险、开发验证、规划下一轮
- 适合风险较高、复杂度较大的系统,风险分析需要投入
- 喷泉模型
- 面向对象活动相互交叠、反复迭代,阶段边界较弱
- 统一过程 UP
- 用例驱动、以架构为中心、迭代与增量
- 初始、细化、构造、移交四个阶段
- 需求、设计、实现和测试活动可跨越多个阶段
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 敏捷与协作方法
## 敏捷思想
- 短周期交付可用软件,通过反馈调整优先级
- 重视人员协作、客户参与、技术质量与持续改进
- 保留必要的文档、设计和计划,使其服务于交付
- 小团队便于沟通,大规模采用需要额外协调机制
## 极限编程 XP
- 价值观
- 沟通、简单、反馈、勇气
- 后续版本加入尊重,常概括为五项价值观
- 早期五项原则
- 快速反馈、简单性假设、增量变化、拥抱变化、优质工作
- 经典十二项实践
- 计划游戏、小型发布、系统隐喻、简单设计
- 测试、重构、结对编程、集体代码所有权
- 持续集成、每周 40 小时、现场客户、编码标准
- 工时实践强调可持续节奏,实践集合随版本演化
## Scrum
- Sprint 是固定时长的冲刺,长度不超过一个月
- 产品负责人、Scrum Master、开发者共同组成 Scrum 团队
- 产品待办列表、Sprint 待办列表、增量
- Sprint 计划、每日 Scrum、评审与回顾
- 通过透明、检视和适应调整工作
## 水晶方法 Crystal
- 以人为中心,根据团队规模和系统关键性调整过程
- 强调沟通、频繁交付与反思改进
## 特性驱动开发 FDD
- 建立总体模型和特性列表
- 按特性计划、设计和构建
- 常设置首席程序员、类所有者与临时特性团队
## 自适应软件开发 ASD
- 推测、协作、学习形成反复循环
- 在不确定条件下通过反馈调整方向
## 开源协作
- 常见分布式开发、公开评审与共同维护
- 开源是协作与许可方式,本身不等同于敏捷过程
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 过程改进与软件文档
## SW-CMM 成熟度等级
- 1 初始级:过程不稳定,结果较依赖个人经验
- 2 可重复级:建立基本项目管理,跟踪成本、进度和功能
- 3 已定义级:组织过程文档化、标准化,项目按需裁剪
- 4 已管理级:定量度量和控制过程及产品质量
- 5 优化级:利用反馈、缺陷预防和技术改进持续优化
## CMMI 的等级口径
- 阶段式成熟度与连续式能力等级含义不同
- 成熟度等级描述组织过程改进的整体阶段
- 能力等级描述特定过程域的能力
- CMMI V1.3 阶段式成熟度
- 1 初始、2 已管理、3 已定义
- 4 定量管理、5 优化
- CMMI V1.2 连续式能力等级
- CL0 未完成:未执行,或未满足过程域目标
- CL1 已执行:完成过程域所需工作
- CL2 已管理:计划、监控并制度化管理
- CL3 已定义:采用经裁剪的组织标准过程
- CL4 定量管理:通过统计与量化手段控制过程
- CL5 优化:持续改进过程性能
- CMMI V1.3 连续式保留 CL0–CL3
- 等级名称与范围必须结合模型版本和表示方式
## 软件文档
- 开发文档
- 可行性分析、需求规格、设计说明、测试计划与报告
- 产品文档
- 安装、使用、运维和接口说明
- 管理文档
- 项目计划、进展记录、质量报告、变更和配置记录
- 文档随版本维护,保持需求、实现和验证结果可追踪
需求分析与系统设计¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 需求分析
## 需求的类别
- 功能需求
- 系统应提供的服务、业务规则和行为
- 性能需求
- 响应时间、吞吐量、容量和资源消耗
- 指标应说明负载、数据规模和运行条件
- 其他质量需求
- 安全性、可靠性、可用性、可维护性等
- 设计与实现约束
- 法规、平台、接口协议、技术选型和兼容性限制
## 分析与确认
- 获取利益相关者需求,明确系统边界与术语
- 处理冲突、遗漏和歧义,确定优先级
- 形成可验证的需求规格和验收条件
- 建立需求到设计、实现和测试的追踪关系
## 结构化分析成果
- 分层数据流图 DFD
- 外部实体:系统边界外的数据提供者或接收者
- 加工:输入数据到输出数据的转换
- 数据流:数据的传递;数据存储:需要保存的数据
- 顶层图描述边界,逐层细化加工
- 父图与子图的输入输出保持平衡
- 描述数据变换,不表示程序控制顺序或执行时间
- 数据字典
- 统一定义数据项、数据结构、数据流和数据存储
- 记录类型、取值范围、含义和组成关系
- 加工规格说明
- 说明底层加工的规则,可用结构化语言、判定表或判定树
- 补充材料
- 性能、安全、异常处理等难以由数据流图表达的要求
## 判定表与判定树
- 判定表
- 条件项、条件组合、动作项和动作选择
- 适合检查多条件业务规则的完整性与冲突
- 判定树
- 用分支表达条件判断和对应动作
- 适合展示分层决策,较容易看出判断顺序
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 系统设计
## 从概要到细节
- 概要设计
- 确定架构、子系统、模块分工及主要接口
- 详细设计
- 确定模块内部算法、数据结构、状态和异常处理
- 基本原则
- 抽象、自顶向下、逐步求精
- 信息隐藏、模块独立、高内聚与低耦合
## 设计任务
- 体系结构设计
- 定义主要部件、职责、连接方式与部署约束
- 数据设计
- 将概念模型落实为逻辑结构和物理存储方案
- 包括数据库表、索引、文件格式和内部数据结构
- E-R 模型可支持数据库设计,不直接决定全部文件系统结构
- 接口设计
- 模块间、外部系统、操作系统和用户交互接口
- 明确输入输出、协议、错误语义与调用约束
- 过程设计
- 用伪代码、流程图等描述算法和处理逻辑
## 模块结构
- 控制规模与调用深度,使职责和行为可理解
- 扇入:直接调用某模块的模块数量
- 公共模块可能有较大扇入,反映复用机会
- 扇出:某模块直接调用的模块数量
- 过大可能表示职责过重,需要合理分层
- 作用范围尽量限制在控制范围内
- 某判断影响的模块,应处于该判断所属模块的控制结构内
- 单入口、单出口是结构化设计原则
- 具体语言的异常、提前返回等应结合可读性和正确性处理
## 人机界面
- 用户掌控
- 操作有反馈,可取消或撤销,错误后可恢复
- 减少记忆负担
- 显示可选项与上下文,使用有意义的默认值
- 保持一致
- 术语、布局、控件行为与错误提示遵循统一规则
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 模块内聚与耦合
## 内聚:模块内部的联系
- 功能内聚
- 全部元素协作完成一个明确功能
- 顺序内聚
- 前一处理的输出成为后一处理的输入
- 通信内聚
- 多项处理使用相同输入,或产生相同输出
- 过程内聚
- 多项处理因执行次序而放在一起,不必存在数据传递
- 时间内聚/瞬时内聚
- 多项任务因在同一阶段发生而组合,如初始化
- 逻辑内聚
- 同类操作集中,通过控制参数选择执行其中一种
- 偶然内聚
- 无关或联系很弱的任务被放在同一模块
- 传统分类通常按上述次序由强到弱
## 耦合:模块之间的依赖
- 非直接耦合
- 模块间无直接联系,通过共同上层模块协作
- 数据耦合
- 通过明确参数传递所需数据
- 标记耦合/印记耦合
- 传递复合数据结构,接收者只使用其中一部分
- 控制耦合
- 传入标志或命令,影响另一模块的内部控制流程
- 外部耦合
- 共同依赖外部规定的格式、协议或设备接口
- 公共耦合
- 多个模块共享全局变量或公共数据区
- 共享单个全局变量也属于公共数据依赖
- 内容耦合
- 直接访问另一模块内部实现或跳入其内部执行
- 设计目标
- 减少隐藏依赖,让数据交换和接口契约明确
- 耦合强弱还受接口规模、变更频率和依赖方向影响
测试、质量与维护¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 测试方法
## 测试目标
- 发现缺陷,评估质量与风险,检查需求是否满足
- 测试发现缺陷的存在,不能一般性地证明不存在缺陷
- 静态检查
- 评审需求、设计和代码,不执行被测程序
- 动态测试
- 执行程序,比较实际结果与预期结果
- 调试
- 定位原因、修复缺陷,与测试活动相互配合
## 黑盒测试
- 从输入输出与规格设计用例,不依赖内部实现
- 等价类划分
- 将输入划分为有效类与无效类,每类选代表值
- 有效用例可覆盖多个有效类
- 无效类通常分别设计用例,避免错误互相掩盖
- 边界值分析
- 检查边界及其相邻值,兼顾输入和输出边界
- 整数闭区间可取最小值前后、最大值前后及边界本身
- 连续数值的相邻值取决于精度与表示方式
- 判定表、状态迁移等方法
- 检查条件组合和状态相关的业务行为
## 白盒测试
- 语句覆盖
- 每条可执行语句至少执行一次
- 判定覆盖/分支覆盖
- 每个判定的各个结果或分支至少执行一次
- 条件覆盖
- 每个基本布尔条件的真、假值至少出现一次
- 条件覆盖与判定覆盖一般互不蕴含
- 判定/条件覆盖
- 同时满足判定覆盖和条件覆盖
- 条件组合覆盖
- 每个判定中基本条件的可行取值组合都被覆盖
- 短路求值会影响条件是否实际执行
- 路径覆盖
- 执行所有可行路径
- 循环可能产生无限路径,不可行路径也需识别
- 覆盖率限制
- 高覆盖率不代表断言充分、需求完整或软件无缺陷
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 测试层次与控制流复杂度
## 测试层次
- 单元测试
- 检查函数、类或模块的逻辑、接口、边界和异常
- 必要时用桩或替身隔离依赖,用驱动调用被测单元
- 集成测试
- 检查组件之间的接口、数据交换与协作
- 自顶向下常用桩,自底向上常用驱动
- 渐增集成便于定位接口缺陷
- 系统测试
- 在代表性环境中检查完整系统的功能和质量属性
- 包含性能、安全、恢复、兼容性等方面
- 确认与验收
- 确认关注是否满足用户需要和预期用途
- 验收依据约定准则决定是否接受交付
## 变更后的检查
- 确认修复
- 重现原失败场景,检查缺陷是否已修复
- 回归测试
- 检查变更是否破坏原有功能或引入新的副作用
- 可发生在任何测试层次,并非独立的固定生命周期阶段
## McCabe 圈复杂度
- 基于程序控制流图衡量结构复杂程度
- 单一连通控制流图
- V(G) = E − N + 2
- E 为控制流边数,N 为节点数
- 通常按单入口、单出口的控制流图建模
- 多个独立控制流分量
- V(G) = E − N + 2P
- P 为独立控制流分量数,每个分量按同一规则建模
- 二分支判定的简式
- V(G) = 判定节点数 + 1
- 多路分支、短路表达式需先按控制流展开,不能直接数代码行
- 基本路径测试
- 依据独立路径集合构造用例,并分析路径可行性
- 圈复杂度与独立路径有关,不等于全部路径数量
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 软件维护与质量
## 维护类型
- 改正性维护
- 修复交付后发现的缺陷
- 适应性维护
- 适应操作系统、硬件、协议等环境变化
- 完善性维护
- 扩充能力、改进性能或使用体验
- 预防性维护
- 提前消除潜在问题,降低未来故障与维护成本
- 分类依据是变更目的,同一变更可能兼具多个目的
## 可维护性
- 可理解:结构清晰,职责、接口和文档一致
- 可分析:能够定位问题并评估变更影响
- 可修改:局部变更不会产生失控的连锁影响
- 可测试:能够构造输入并观察和验证结果
- 维护过程
- 分析影响、实施变更、回归验证、更新配置和文档
## 经典六特性质量模型
- 功能性
- 适合性、准确性、互操作性与安全性
- 功能符合规定和约束
- 可靠性
- 成熟性、容错性、易恢复性
- 易用性
- 易理解、易学、易操作与吸引性
- 效率
- 时间特性与资源利用
- 维护性
- 易分析性、易改变性、稳定性、易测试性
- 可移植性
- 适应性、易安装性、共存性、易替换性
- 模型版本
- ISO/IEC 9126 属于历史六特性模型
- 后续质量模型调整了分类,指标应使用一致的版本口径
## 质量保证
- 通过过程规范、评审、审计和度量预防质量问题
- 测试、缺陷分析和过程改进共同提供质量证据
- 为质量目标设定可测量指标,并明确使用情境