软考
软件工程与 UML 速查表
软考高级系统架构设计师备考:开发模型/需求/测试 McCabe/维护/CMMI + UML 九图与类间关系,综合知识与案例双覆盖
一句话定位
本表覆盖软考 §3.5 软件工程基础 与 §3.6 系统建模(UML),是综合知识(~18 题)与案例分析(UML 选图、设计模式场景)的共用底盘。重点:开发模型对比、McCabe 环路复杂度、UML 九图判别、类间关系六种。
NOTE
软件工程与 UML 在综合知识中约占 13~17 分,在案例分析中常以”看图填空/选图/改图”形式出现。建议与后续 P4 架构核心(架构风格/质量属性)和 P5 设计模式 联动复习。
A. 软件工程基础
A.1 软件生命周期与开发模型
生命周期阶段
| 阶段 | 核心任务 | 输出物 |
|---|---|---|
| 问题定义 | 明确问题边界、确定目标 | 可行性研究报告 |
| 需求分析 | 功能/性能/约束需求获取与分析 | 软件需求规格说明书(SRS) |
| 设计 | 概要设计 + 详细设计 | 设计文档(模块结构、接口、算法) |
| 编码 | 程序实现 | 源代码 |
| 测试 | 单元/集成/确认/系统测试 | 测试报告 |
| 维护 | 改正/适应/完善/预防性维护 | 维护记录 |
开发模型对比表(★★★ 必考)
| 模型 | 核心特征 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 瀑布模型 | 线性顺序、阶段里程碑、文档驱动 | 结构清晰、阶段明确、管理简单 | 难应对变更、前期错误后期才发现 | 需求明确、变更少的项目 |
| 快速原型 | 先造原型 → 用户反馈 → 精化需求 | 需求可视化、用户参与早 | 易陷入”不断改需求”、可能忽视质量 | 需求不明确、创新性强的项目 |
| 螺旋模型 | 风险驱动、迭代 + 瀑布、四象限循环 | 风险管控强、逐步细化 | 复杂度高、对小项目过重 | 大型高风险项目 |
| 增量模型 | 分批次交付、每次增一个子集 | 快速见效、降低风险 | 需提前架构、增量间可能冲突 | 功能模块可独立交付的项目 |
| 敏捷(Agile) | 迭代(2~4 周 Sprint)、用户故事、持续交付、拥抱变化 | 快速响应变更、用户持续反馈 | 文档轻量、大型团队协作挑战 | 需求多变、互联网产品 |
IMPORTANT
- 螺旋模型 = 风险驱动(不是迭代也不是瀑布,而是以风险分析为核心驱动每轮迭代)
- 敏捷 ≠ 无文档:敏捷强调”刚好足够”的文档,不是不写;强调”可工作的软件胜过详尽的文档”(敏捷宣言价值观之一)
- V 模型(瀑布变种):测试与开发阶段一一对应,强调”测试早介入”
敏捷方法论对比
| 方法论 | 核心实践 | 特点 |
|---|---|---|
| Scrum | Sprint(2~4 周)、每日站会、Sprint 评审/回顾、产品待办列表 | 最流行的敏捷框架 |
| XP(极限编程) | 结对编程、TDD、持续集成、小发布、重构 | 技术实践密集的敏捷方法 |
| 看板(Kanban) | 可视化工作流、限制在制品(WIP)、流动效率 | 专注流程优化、无固定迭代 |
| DevOps | CI/CD、自动化测试、监控反馈、基础设施即代码 | 开发与运维一体化,详见后续新技术专题 |
A.2 需求工程
| 阶段 | 任务 | 关键产出 | 常用方法 |
|---|---|---|---|
| 需求获取 | 收集用户原始需求 | 需求调研记录 | 访谈、问卷、观察、原型、头脑风暴 |
| 需求分析 | 分析需求可行性、消除冲突 | 需求模型(用例图、数据流图) | 结构化分析、面向对象分析 |
| 需求规约 | 编写 formal 需求文档 | SRS(软件需求规格说明书) | 自然语言 + 形式化描述 |
| 需求验证 | 评审需求正确性、一致性 | 评审报告 | 评审会议、原型验证、测试用例 |
| 需求管理 | 变更控制、版本追踪、状态跟踪 | 变更请求单 | 需求跟踪矩阵(RTM) |
NOTE
需求分类:功能需求(系统做什么)+ 非功能需求(性能、安全、可用性等质量属性)+ 约束条件(预算、技术、法规)。 需求变更控制流程:提出变更 → 影响分析 → 审批 → 实施 → 验证 → 归档。变更控制委员会(CCB)负责审批。
A.3 软件设计
设计分层
| 层级 | 关注点 | 产出物 |
|---|---|---|
| 概要设计(高层) | 模块划分、接口定义、数据结构、数据库逻辑结构 | 概要设计说明书(HLD) |
| 详细设计(底层) | 算法实现、数据结构细节、接口详细定义 | 详细设计说明书(LLD) |
耦合类型(由低到高,耦合度越低越好)
| 耦合类型 | 定义 | 记忆关键词 |
|---|---|---|
| 非直接耦合 | 模块间无直接关系,通过主程序/控制模块联系 | 最低耦合,最理想 |
| 数据耦合 | 模块间通过参数传递基本数据 | 参数传值 |
| 标记耦合 | 模块间通过数据结构(如记录)传递 | 传结构体/对象 |
| 控制耦合 | 一个模块控制另一个模块的内部逻辑 | 传递控制变量/标志 |
| 外部耦合 | 模块与外部硬件/环境交互 | 硬件/操作系统依赖 |
| 公共耦合 | 多个模块共享全局数据区 | 全局变量/公共数据区 |
| 内容耦合 | 一个模块直接访问另一模块内部 | 最高耦合,最应避免 |
内聚类型(由高到低,内聚度越高越好)
| 内聚类型 | 定义 | 记忆关键词 |
|---|---|---|
| 功能内聚 | 模块内所有元素共同完成单一功能 the best | 一个功能,一个模块 |
| 顺序内聚 | 元素顺序执行,前一输出为后一输入 | 数据流顺序 |
| 通信内聚 | 元素操作同一数据集 | 共享数据 |
| 过程内聚 | 元素必按特定顺序执行(无数据流依赖) | 固定执行顺序 |
| 时间内聚 | 元素在相同时间执行(初始化/收尾) | 同时执行 |
| 逻辑内聚 | 元素功能类似,由外部参数选择执行哪个 | 逻辑选择 |
| 偶然内聚 | 元素无实质关联,偶然放在一起 | 最差,避免 |
设计原则速记
| 原则 | 英文 | 核心思想 |
|---|---|---|
| 单一职责 | SRP | 一个模块只做一件事 |
| 开闭原则 | OCP | 对扩展开放、对修改关闭 |
| 里氏替换 | LSP | 子类可替换父类 |
| 接口隔离 | ISP | 客户端不应依赖不用的接口 |
| 依赖倒置 | DIP | 依赖于抽象而非实现 |
| 迪米特法则 | LoD | 最小知识原则,减少对象间交互 |
A.4 软件测试
测试分类
| 分类维度 | 类型 | 说明 |
|---|---|---|
| 测试技术 | 黑盒测试 | 不关注内部结构,按功能需求测试(等价类划分/边界值/因果图/决策表/错误推测) |
| 白盒测试 | 关注内部结构,按代码逻辑测试(语句覆盖/判定覆盖/条件覆盖/路径覆盖/判定-条件覆盖) | |
| 测试阶段 | 单元测试 | 最小可测试单元(函数/类/模块) |
| 集成测试 | 模块组装后测试(自顶向下/自底向上/三明治/大爆炸) | |
| 确认测试 | 验证软件是否满足需求规格(SRS) sand 验收测试 | |
| 系统测试 | 整体系统测试(功能/性能/安全/兼容性/压力) | |
| 回归测试 | 修改后重新执行已有测试用例,确保未引入新问题 |
McCabe 环路复杂度(★★★ 必考计算题)
公式:V(G) = E - N + 2 (或 V(G) = P + 1,P 为判定节点数)
其中:
- E = 边数(edge)
- N = 节点数(node)
- P = 判定节点数(predicate node,即分支节点)
例题:某程序流程图有 11 条边、9 个节点、3 个判定节点,求环路复杂度。
解:
- V(G) = E - N + 2 = 11 - 9 + 2 = 4
- 验证:V(G) = P + 1 = 3 + 1 = 4 ✓
结论:环路复杂度为 4,意味着至少需要 4 条独立路径才能覆盖所有语句。
A.5 软件维护
| 类型 | 定义 | 占比 | 触发原因 |
|---|---|---|---|
| 改正性维护 | 修复已发现的错误 | ~25% | 用户报告 bug |
| 适应性维护 | 适应环境变化(OS/硬件/法规) | ~20% | 外部环境变更 |
| 完善性维护 | 增强功能、提升性能 | ~50%(最大) | 用户新需求 |
| 预防性维护 | 预防未来问题、重构优化 | ~5% | 预见性技术债务 |
WARNING
完善性维护占比最大(约 Later 维护),是易混淆考点。改正性维护≠完善性维护:前者是修 bug,后者是加功能。
A.6 CMM / CMMI 五级
| 级别 | 名称 | 特征 | 关键过程域 |
|---|---|---|---|
| 1 级 | 初始级 | 过程混乱、依赖个人英雄主义 | — |
| 2 级 | 可重复级 | 有基本项目管理(计划/跟踪/配置管理) | 需求管理、项目计划、配置管理 |
| 3 级 | 已定义级 | 组织级标准过程、文档化 | 组织过程焦点、组织培训、集成项目管理 |
| 4 级 | 已管理级 | 量化管理、过程度量、预测性控制 | 量化项目管理、组织过程绩效 |
| 5 级 | 优化级 | 持续过程改进、技术创新 | 因果分析与解决、组织创新与部署 |
B. UML 系统建模
B.1 UML 九图速查表
| 图 | 类型 | 核心用途 | 关键词 | 案例场景 |
|---|---|---|---|---|
| 用例图 | 静态 | 描述系统功能需求与参与者关系 | Actor、用例、包含(include)、扩展(extend) | 需求分析阶段,界定系统边界 |
| 类图 | 静态 | 描述类结构、属性、操作及类间关系 | 类、属性、方法、关联/聚合/组合/泛化/实现 | 系统设计核心,数据库映射基础 |
| 对象图 | 静态 | 类图的实例快照,某时刻对象及链接 | 对象名、属性值 | 验证类图正确性、展示运行时状态 |
| 构件图 | 静态 | 描述软件构件及其依赖关系 | 构件、接口、依赖 | 系统实现视图,模块组装 |
| 部署图 | 静态 | 描述硬件节点及软件构件的物理部署 | 节点、构件、通信路径 | 系统部署架构,服务器/网络拓扑 |
| 状态图 | 动态 | 描述对象生命周期内状态转换 | 状态、事件、转换、 Guard 条件 | 订单状态机、线程生命周期 |
| 顺序图 | 动态 | 按时间顺序描述对象间消息交互 | 生命线、消息、激活块、返回消息 | 典型交互流程,强调时序 |
| 协作图 | 动态 | 描述对象间交互的组织结构 | 对象、链接、消息序号 | 强调空间结构,与顺序图等价 |
| 活动图 | 动态 | 描述工作流/业务流程/并发行为 | 活动、泳道、分支/合并、 fork/join | 业务流程建模、算法流程 |
IMPORTANT
顺序图 vs 协作图 = 语义等价:两者表达同一交互的不同视角。
- 顺序图强调时间顺序(纵向为时间,横向为对象)。
- 协作图强调空间结构(对象间链接关系)。
- 两者可互相转换,UML 2.x 中协作图更名为通信图(Communication Diagram)。
- 构件图 vs 部署图:构件图是逻辑实现(模块/组件关系),部署图是物理部署(服务器/硬件/网络)。
B.2 类间关系六种与 UML 符号
| 关系 | 英文 | UML 符号 | 语义 | 示例 |
|---|---|---|---|---|
| 依赖 | Dependency | 虚线箭头 ------> | 一个类使用/依赖于另一个类 | A 的方法参数是 B |
| 关联 | Association | 实线(可带箭头指向被依赖方) | 对象间的引用/链接 | 学生 ↔ 课程 |
| 聚合 | Aggregation | 空心菱形 ◇ + 实线 | 整体-部分,部分可独立存在 | 学校 ◇-o 学生 |
| 组合 | Composition | 实心菱形 ◆ + 实线 | 整体-部分,部分不可独立存在 | 订单 ◆-o 订单项 |
| 泛化 | Generalization | 空心三角箭头 △ + 实线 | 继承关系(is-a) | 动物 △- 狗 |
| 实现 | Realization | 空心三角箭头 △ + 虚线 | 接口实现 | USB 接口 △- 实现类 |
WARNING
聚合 vs 组合是案例分析高频混淆点:
- 聚合:弱整体-部分,部分可独立(学校没了学生还在)。
- 组合:强整体-部分,生命周期绑定(订单没了订单项也没了)。
- 考试常考:“部门与员工”→聚合;“汽车与发动机”→组合(发动机不可脱离汽车存在)。
B.3 UML 类图示例(Mermaid)
注:图中展示了类图六种关系中的五种:关联(学生-课程)、聚合(学院-系)、组合(系-教授)、泛化(教工-教授)、实现(教工-教工接口)。依赖关系未直接展示,通常在方法参数或局部变量中使用。
C. 记忆口诀与易错点
开发模型速记
| 模型 | 关键词 | 口诀 |
|---|---|---|
| 瀑布 | 线性、文档、顺序 | ”瀑布飞流直下,文档驱动它” |
| 原型 | 需求不明、先造样 | ”需求不明先造样,用户看了再商量” |
| 螺旋 | 风险、迭代、四象限 | ”螺旋转圈不慌张,风险驱动四象限” |
| 增量 | 分批、交付、模块 | ”增量分批交,每批都叫好” |
| 敏捷 | 迭代、用户、变化 | ”敏捷迭代快,用户故事带” |
UML 九图速记口诀
| 类别 | 图 | 口诀 |
|---|---|---|
| 静态 | 用例、类、对象、构件、部署 | ”用例类对象,构件部署站” |
| 动态 | 状态、顺序、协作、活动 | ”状态顺序走,协作活动凑” |
| 补充 | 包图、组合结构、定时、交互概览 | ”包组定时交” |
易错点汇总
| 易错点 | 正确答案 |
|---|---|
| 螺旋模型的核心驱动因素 | 风险,不是迭代也不是瀑布 |
| 敏捷是否不写文档 | 写,“刚好足够”而非不写 |
| 完善性维护 vs 改正性维护 | 完善性 = 加功能(占比最大);改正性 = 修 bug |
| 耦合排序(由低到高) | 非直接 → 数据 → 标记 → 控制 → 外部 → 公共 → 内容 |
| 内聚排序(由高到低) | 功能 → 顺序 → 通信 → 过程 → 时间 → 逻辑 → 偶然 |
| 聚合 vs 组合 | 空心菱形◇=聚合(部分可独立);实心菱形◆=组合(部分不可独立) |
| 顺序图 vs 协作图 | 两者语义等价,可互转;顺序图强调时序,协作图强调结构 |
| V(G)=E-N+2 中 E 和 N 的含义 | E=边数,N=节点数(不是路径数!) |
D. 交叉引用与关联阅读
| 相关主题 | 位置 | 关联内容 |
|---|---|---|
| 计算机基础ATAL** | 01-cs-fundamentals.mdx | OS 进程调度、PV 操作、数据库事务 ACID |
| 架构核心 | 04-architecture-core.mdx(待产) | 架构风格对比、质量属性战术、ATAM/SAAM 评估流程 |
| 设计模式 | 05-design-patterns.mdx(待产) | 23 种 GoF 速查、UML 类图应用 |
| 新技术 | 06-new-tech-web-arch.mdx(待产) | DevOps、CI/CD、云原生四要素 |
| 案例分析模板 | 07-case-analysis-template.mdx(待产) | UML 选图答题套路、设计模式场景判断 |
| 论文素材库 | 08-essay-material-library.mdx(待产) | 软件工程方法论在论文中的应用 |
E. 自测题(检验掌握程度)
- 某程序模块有 8 条边、6 个节点,McCabe 环路复杂度 V(G) = ?
点击查看答案
V(G) = E - N + 2 = 8 - 6 + 2 = 4
- 以下哪种耦合度最低?A. 数据耦合 B. 标记耦合 C. 控制耦合 D. 公共耦合
点击查看答案
A. 数据耦合(耦合度排序:数据 < 标记 < 控制 < 外部 < 公共 < 内容)
- “汽车”与”发动机”应使用哪种类间关系?A. 关联 B. 聚合 C. 组合 D. 依赖
点击查看答案
C. 组合(发动机不可脱离汽车独立存在,生命周期绑定)
- 螺旋模型的核心驱动因素是什么?
点击查看答案
风险分析(不是迭代,也不是瀑布,是风险驱动的迭代过程)
- CMMI 五级的第 3 级名称是什么?
点击查看答案
已定义级(组织级标准过程、文档化)