软件工程专题 · 13 分头号大坑

软考·软件设计师 | 上午 13 分 + 下午 DFD 案例题必答 | 复习优先级 = 分值 × 未掌握度 = 最高
⚠️ 为什么先啃这块:上午卷面 13 分(最高),下午第 1 题数据流图 DFD 是必答送分题。软工不学透,上午丢分 + 下午送分题也丢。本专题 = 开发模型 / 需求工具 / 内聚耦合 / McCabe / 测试 / 维护 / 质量。

① 开发模型(12 分)

软件开发"怎么走流程",就是开发模型。考"给个场景/特点,问是哪个模型"。

模型核心思想特点 / 题眼缺点
瀑布模型 阶段像瀑布一样**线性顺序**:需求→设计→编码→测试→维护 文档驱动,阶段间有严格评审;适合需求明确、稳定的项目 缺乏灵活性,难以应对需求变更(最常考缺点)
原型模型 先快速做个"样品"给用户看,反复修改 适合需求不明确;帮助澄清需求 原型可能被误当成品
螺旋模型 原型 + 瀑布,一圈圈螺旋上升 引入"风险分析"(最大特色);适合大型、高风险项目 风险分析成本高
增量模型 分批交付,每次做一个"增量"(部分功能) 先给核心功能,逐步完善;用户能早用上 需良好的架构规划
喷泉模型 面向对象开发,各阶段无缝、迭代、重叠 “喷泉”比喻阶段像水一样上下翻滚、无间隙 管理复杂
敏捷(Agile) 短周期迭代、快速交付可工作软件 快速迭代交付、拥抱变化、重人轻文档 不重文档,大团队难协调
统一过程 RUP 4 阶段:初始→精化→构建→转换;用例驱动、以架构为中心、迭代增量 AUP(敏捷统一过程)= 在大型上连续、小型上迭代 —
V 模型 开发与测试一一对应(见测试章节) 强调测试贯穿始终 —
🧠 题眼秒杀:
看到"缺乏灵活性 / 需求变更难" → 瀑布
看到"风险分析" → 螺旋(唯一带风险分析的)
看到"快速迭代 / 短周期 / 可工作软件" → 敏捷
看到"需求不明确 / 先做样品" → 原型
看到"面向对象 / 无缝 / 迭代重叠" → 喷泉
看到"分批 / 增量交付" → 增量

📊 模型长啥样(图形记忆)

需求分析 ↓
概要设计 ↓
详细设计 ↓
编码实现 ↓
测试维护 ↓
瀑布模型:一级级往下,不能回头(缺灵活性)
增量1
核心
增量2
增量3
增量4
完整
增量模型:每批加一块,逐版交付
风险分析 ★ 一圈圈扩大
螺旋模型:原型+瀑布,每圈做风险分析
阶段上下翻滚·无缝
喷泉模型:面向对象,阶段无缝迭代

② 需求分析工具(11 分)

需求分析阶段要产出:数据流图 DFD、数据字典、E-R 图、状态转换图、用例图。不包括:软件体系结构图(那是设计阶段)。

DFD 数据流图(下午第 1 题必考)

DFD 四种元素(必背,画图/补图全靠它):
元素图形说明
外部实体矩形 □系统外的人/系统,如"用户""银行"
加工(处理)圆角矩形 / 圆 ○对数据做处理,如"计算成绩"
数据存储双横线 / 开口矩形数据的存放处,如"学生表"
数据流带箭头 →数据的流向,标名称

⚠️ DFD 没有"控制流"!控制流是程序流程图的概念。(历年高频错点)

DFD 的"平衡"原则(下午题判分点)

父图和子图必须平衡:
• 父图中某个加工的输入/输出数据流,必须和它分解出的子图的边界输入/输出数据流一致(数量、方向、名称)。
• 子图内部加工之间新增数据流,不体现在父图。

📐 DFD 四要素长什么样(画图必认)

外部实体
矩形 □:系统外的人/系统
加工
圆/圆角:对数据加工
数据存储
开口矩形/双横线:存数据
→
箭头:数据流向(要标名)

📐 DFD 示例(带进出数据流)

用户 1 计算成绩 成绩表 答题信息 成绩记录
外部实体「用户」→ 加工「计算成绩」→ 数据存储「成绩表」,箭头是数据流(不是控制流)

数据字典 DD

数据字典 = 对 DFD 中每个数据流、数据项、数据存储、加工的精确定义(名字、别名、类型、来源去向)。DFD 画骨架,数据字典填血肉

其它需求工具

工具面向用途
E-R 图数据描述实体-联系,数据库设计
状态转换图行为描述系统状态变化
用例图功能/用户OO 需求,描述参与者与系统交互

③ 模块设计:内聚 & 耦合(3+4 分)

耦合(Coupling)——越低越好

耦合 = 模块之间联系的紧密程度。设计目标是高内聚、低耦合。从低到高:

排序类型说明
最低✅非直接耦合模块间无直接联系
↓数据耦合通过简单数据参数交换(如传 int)
↓标记耦合通过参数表传递"数据结构/记录"
↓控制耦合传递"控制信息"(开关、标志)控制对方
↓外部耦合模块都访问同一外部设备/格式
↓公共耦合多个模块共享公共数据环境(全局变量/公共区)
最高❌内容耦合一个模块直接访问另一个模块内部数据/代码
🧠 题眼:"通过外部变量交换输入输出" = 公共耦合(共享公共环境);"传简单数据参数" = 数据耦合;"传记录/结构" = 标记耦合;"传开关标志" = 控制耦合。
口诀:非→数→标→控→外→公→内(越好越前)

内聚(Cohesion)——越高越好

内聚 = 模块内部各元素结合的紧密程度。从高到低:

排序类型说明
最高✅功能内聚完成一个单一功能,各部分缺一不可
↓顺序内聚处理元素相关且必须顺序执行
↓通信内聚所有处理元素在同一数据结构上操作
↓过程内聚处理元素相关,必须按特定次序执行
↓时间内聚任务必须在同一时间间隔内执行(如初始化)
↓逻辑内聚完成逻辑上相关的一组任务
最低❌偶然内聚一组毫无关系/松散关系的任务
🧠 题眼:"所有处理元素都在同一个数据结构上操作" = 通信内聚;"必须按特定次序执行" = 过程内聚;"同一时间间隔" = 时间内聚。
口诀:功→顺→通→过→时→逻→偶(前越高越紧)

📊 耦合 & 内聚 梯度一览

耦合(越低越好 ↓)

非直接
数据
标记
控制
外部
公共
内容

内聚(越高越好 ↑)

功能
顺序
通信
过程
时间
逻辑
偶然
设计目标 = 高内聚(往上)+ 低耦合(往上):让模块内部抱团、模块之间少牵扯
⚠️ 高频混淆:顺序内聚 vs 过程内聚(教材 319 页原文)
顺序内聚过程内聚
依赖类型数据依赖(前一输出 = 后一输入)流程依赖(只是先后次序)
模块内容密切相关于同一功能完成多个任务
类比流水线(原料层层加工)仪式流程(一步步走,不传东西)
例子读数据→求和→求平均(数据顺着流)清屏→打印横幅→检查授权→启动(无数据流)
题眼"前一处理的输出是后一处理的输入""必须按指定过程/特定次序执行"
一句话:传数据 = 顺序;不传数据、只讲次序 = 过程。

模块设计原则

• 目标:高内聚、低耦合,模块规模适中(不过大不过小,还要看模块间关系)
• 信息隐蔽:模块内部细节对外隐藏
• 模块功能应完整,消除重复功能,减少病态连接
• 错项特征:"只根据模块功能确定规模大小" ← 错!还要看模块间关系

④ McCabe 环路复杂度(4 分,年年考)

公式:V(G) = E − N + 2 (E = 边的条数,N = 节点数)
等价公式:V(G) = 判定节点数 + 1

意义:V(G) 就是"需要测试的独立路径条数",值越大程序越复杂。

例:某流图 E=11,N=10 → V(G) = 11 − 10 + 2 = 3。
验算:判定节点(有分叉的)有 2 个 → 2+1 = 3 ✓。

陷阱:数"边"和"节点"要仔细;或者直接数判定节点(菱形,出度≥2 的节点)再 +1,更快。

📐 例:流图怎么数

T F T F 循环回边 1 2 3 4 5 6
节点 N=6,边 E=7 → V(G)=7−6+2=3;判定节点是 2 和 4(共 2 个)→ 2+1=3 ✓

⑤ 软件测试(2+2+8+4 分)

V 模型:测试与开发阶段一一对应

开发阶段对应测试依据
需求分析系统测试 / 验收测试需求规格说明书
概要设计集成测试概要设计文档(测模块接口)
详细设计 / 编码单元测试详细设计文档(测单个模块)
🧠 题眼:"发现模块之间接口问题" = 集成测试;"系统测试目标来自()阶段" = 需求分析;"类测试相当于传统单元测试" = OO 里"单元"就是类。

📐 V 模型长啥样

需求分析 概要设计 详细设计 编码 系统/验收测试 集成测试 单元测试
左边往下开发,右边往上测试;同一水平线一一对应(需求↔验收、概设↔集成、详设↔单元)

黑盒测试 vs 白盒测试

黑盒测试白盒测试
看什么只看输入输出(不看内部)看内部逻辑结构
方法等价类划分、边界值分析、因果图、错误推测语句覆盖、判定覆盖、条件覆盖、路径覆盖
场景"分别输入 3499/3500/3501" → 边界值"覆盖所有语句/路径" → 白盒
白盒覆盖强度(从弱到强,必背):
语句覆盖 < 判定覆盖 < 条件覆盖 < 判定/条件覆盖 < 条件组合覆盖 < 路径覆盖
问"覆盖程度最高" → 闭眼选【路径覆盖】。
语句覆盖最弱(只要每句跑一遍);路径覆盖最强(所有可能路径都跑)。

测试阶段与"质量"

• 技术评审 = 主动质量管控(需求/设计/代码评审),能早期发现问题 → 提高质量
• 软件测试 = 事后缺陷验证 → 只能发现缺陷
• 金句:"质量不是测出来的,是构建出来的";问"提高质量"选评审,问"发现缺陷"选测试

⑥ 软件维护(7+6 分)

类型触发原因题眼
改正性维护修 bug改正错误、修复缺陷
适应性维护软硬件环境变化"OS 升级 / 新硬件 / 环境变化"
改善性(完善性)维护增加新功能、改进性能"用户提出新需求 / 功能增强"
预防性维护防止未来出问题"主动提高可维护性 / 为将来做准备"
🧠 秒杀:环境变了 = 适应性;修 bug = 改正性;加功能 = 完善性;防未来 = 预防性。
可维护性公式:M = 1 / (1 + MTTR)(MTTR = 平均故障修复时间)

维护类型(按内容分):程序维护 / 数据维护(对数据增删改)/ 代码维护 / 设备维护。题眼:"对文件或数据中的记录增删改" = 数据维护。

⑦ 软件质量 & CMM(3+4 分)

CMM 能力成熟度模型(五级)

级别名称特征
1初始级混乱,靠个人英雄
2可重复级有基本项目管理,可重复成功经验
3已定义级过程标准化、文档化
4已管理级定量管理,有度量数据
5优化级持续改进

口诀:初始 → 可重复 → 已定义 → 已管理 → 优化

ISO/IEC 软件质量特性

六大特性:功能性、可靠性、易用性、效率、可维护性、可移植性。
可移植性子特性:适应性、易安装性、一致性、易替换性(不含"易测试性"——易测试性属可维护性)。

⑧ 自测 6 道(软工高频)

练 1:某系统需求明确且稳定,要求各阶段严格评审、文档齐全,最适合的开发模型是?
A. 原型模型 B. 螺旋模型 C. 瀑布模型 D. 敏捷
答案 C。需求明确稳定 + 文档驱动 + 严格评审 = 瀑布。
练 2:数据流图(DFD)的组成不包括?
A. 数据流 B. 外部实体 C. 数据存储 D. 控制流
答案 D。DFD 四要素 = 数据流 + 外部实体 + 加工 + 数据存储,没有控制流(那是程序流程图)。
练 3:两个模块通过一个外部(全局)变量交换输入输出信息,这种耦合是?
A. 数据耦合 B. 标记耦合 C. 控制耦合 D. 公共耦合
答案 D。共享"公共数据环境/全局变量" = 公共耦合。传简单数据=数据耦合;传记录=标记耦合;传开关标志=控制耦合。
练 4:某模块所有处理元素都在同一个数据结构上操作,其内聚类型是?
A. 逻辑内聚 B. 过程内聚 C. 通信内聚 D. 功能内聚
答案 C。"同一数据结构上操作" = 通信内聚。
练 5:下列测试方法中,覆盖程度最高的是?
A. 语句覆盖 B. 判定覆盖 C. 条件覆盖 D. 路径覆盖
答案 D。覆盖强度:语句 < 判定 < 条件 < 判定/条件 < 条件组合 < 路径。问最强选路径。
练 6:因操作系统升级,对软件进行修改,这属于哪种维护?
A. 改正性 B. 适应性 C. 改善性 D. 预防性
答案 B。软硬件环境变化 = 适应性维护。修 bug=改正性;加功能=完善性;防未来=预防性。
🎯 软件工程速记总表
考点一句话
瀑布/螺旋/敏捷题眼缺灵活=瀑布;风险分析=螺旋;快迭代=敏捷
DFD 四要素数据流、加工、数据存储、外部实体(无控制流)
耦合(低→高)非→数→标→控→外→公→内
内聚(高→低)功→顺→通→过→时→逻→偶
McCabeV(G)=E−N+2 = 判定节点+1
覆盖强度语句<判定<条件<路径(最强)
提高质量选"技术评审",不是测试
维护四类环境变=适应性;修bug=改正性;加功能=完善性;防未来=预防性
CMM初始→可重复→已定义→已管理→优化
软考·软件设计师 | 软件工程专题 | 配套:冲刺总笔记「五、软件工程」
学习路径:本页 → 做 20 道软工题 → 记错题集 → 冲刺期回顾