第6章 软件度量
2.1 本章定位
本章从量化角度说明如何评估软件项目、过程、产品和团队。期末客观题很可能考定义、分类和公式;主观题可能给出控制流图或代码片段,要求计算圈复杂度。
2.2 核心概念
软件度量
客观题重点,已在第一次小测中出现。
软件度量是对==软件项目(Project)、软件开发过程(Process)、软件产品(Product)和人(People)==进行数据定义、收集及分析的持续性量化过程,简称 4P 度量。
软件度量目的:加深对软件项目、软件过程及件产品的理解,达到预测、评估、控制和改善软件开发过程的目的,最终开发出高质量的软件产品。
- 加深对软件项目、软件过程和软件产品的理解;
- 达到预测、评估、控制和改善软件开发过程的目的;
- 最终开发高质量软件产品。
软件度量四要素
- 确定要度量的软件属性: 包括内部属性和外部属性。
- 建立软件属性的经验系统,并选择相应的形式系统
- 通过度量准则将经验系统映射到形式系统:例如用耦合度、内聚度、复杂度来量化软件属性。
- 评估度量结果: 例如判断复杂度是否过高、耦合度是否超过阈值。
一个软件度量由==经验系统、形式系统和映射==三部分组成。
2.3 四类度量对象
2.4 项目度量
软件项目度量是一种全局性度量,包括项目规模、项目成本、项目进度和客户满意度。
常见软件规模度量方法
常见软件成本度量方法
常见项目进度度量方法
软件项目进度度量:是通过系统化的方法跟踪、评估和预测项目实际进展与计划目标的匹配程度,确保项目按时交付。
挣值分析法 EVM
- 计划价值 (PV, Planned Value):到某个时间点,按照计划你应该完成的工作值多少钱 。
- 挣值 (EV, Earned Value):这是最核心的指标,指到某个时间点,你实际完成的工作按预算算值多少钱 。
- 实际成本 (AC, Actual Cost):到某个时间点,你为了完成这些工作实际花掉了多少钱 。
2.5 过程度量
软件过程度量是针对软件开发流程的量化评估方法,目标是监控和优化开发活动效率、资源利用率、团队协作和流程规范性。
课件列出的过程度量方法:
- 定性方法:过程文档分析、SWOT 分析、CMMI 过程成熟度模型评估等。
- 定量方法:生产率度量、时间和周期度量、缺陷度量、成本度量、过程成熟度量化评估、敏捷度量、统计过程控制。
2.6 产品度量
软件产品度量是对软件开发过程中产生的中间产品或工作产品、最终产品进行的度量。它包含:
- 软件产品结构度量;
- 软件产品质量度量。
第一次小测已考:软件产品结构度量主要包含扇入和扇出、耦合度、内聚度、复杂度。
扇入和扇出
耦合度
耦合度是模块及模块之间信息或参数依赖的程度。设计原则通常是低耦合。
已在第一次小测中出现。常见耦合:
内聚度
内聚度表示模块内部各成分彼此结合的紧密程度。设计原则通常是高内聚。
从高到低:
2.7 圈复杂度
客观题重点,已在第一次小测中出现;主观题可考。
圈复杂度用于衡量模块判定结构的复杂程度,数量上表现为线性无关路径条数,也可理解为测试该模块所需的最少独立路径条数。
常用公式:
$$ V(G)=E-N+2P $$
其中:
- $E$:控制流图中边的数量;
- $N$:控制流图中节点的数量;
- $P$:连通分量数。单个连通 CFG 通常取 $P=1$,所以:
$$ V(G)=E-N+2 $$
也可用:
$$ V(G)=J+1 $$
其中 $J$ 为判定节点数。
还可用:
$$ V(G)=R $$
其中 $R$ 为控制流图划分出的区域数。
Halstead 复杂度度量
则:
程序词汇表长度$$ n = n_1 + n_2 $$
程序长度$$ N = N_1 + N_2 $$
注意:这里的 N 是 Halstead 长度,不是源代码行数。
预测长度
$$ \hat{N}=n_1\log_2n_1+n_2\log_2n_2 $$
有上述基本度量值,可以得到以下衍生度量值:
• 程序体积或容量: Volume: V = Nlog2 (n),表明了程序在词汇上的复杂性。
• 程序级别: Level: L^ = (2/n1) × (n2 /N2),表明了一个程序的最紧凑形式的程序量与实际程序量之比,反映了程序的效率。[L^越接近1,程序中冗余越少,程序越高效且易于理解]
• 程序难度 Difficulty: D = 1/L^,表明了实现算法的困难程度。
• 编程工作量 Effort: E = V × D = V/L^ .
软件产品质量度量
(1)基于标准的度量和评估:ISO/IEC 25010软件质量模型。
(2)其他量化指标: ①技术债务比率(technical debt ratio); ②可维护性指数(maintainability index); ③重复代码率(duplicated code percentage); ④缺陷密度(defect density); ⑤平均故障间隔时间(MTBF, mean time between failures);⑥用户满意度指数(CSI, customer satisfaction index)。
其他量化指标
2.8 易混淆点
2.9 小测关联
第一次小测已考:
- 软件度量定义;
- 4P 中的软件项目、软件开发过程、软件产品;
- 产品结构度量四类;
- 耦合类型;
- 圈复杂度三个等价公式。
2.10 本章复习检查题
填空题
- 软件度量是对软件项目、________、________和________进行数据定义、收集及分析的持续性量化过程。
- 软件产品结构度量主要包含扇入和扇出、________、和。
- 圈复杂度的三个常用公式为 。
选择题
- “一个模块调用很多下级模块”主要对应:A. 扇入 B. 扇出 C. 内聚 D. 质量模型
- 下列内聚中最高的是:A. 偶然内聚 B. 逻辑内聚 C. 功能内聚 D. 时间内聚
判断题
- 高耦合通常有利于软件维护。
- 圈复杂度可以用判定节点数加 1 计算。
- 扇入过高一定总是好事。
参考答案
- 填空:软件开发过程、软件产品、人;耦合度、内聚度、复杂度;$E-N+2P$ 或单连通时 $E-N+2$、$J+1$、$R$。
- 选择:B;C。
- 判断:错;对;错。
第6章总复习框架
一句话总结
第6章讲的是:
如何用量化数据对软件项目、软件过程、软件产品和人/团队进行评估,从而支持预测、评估、控制和改进软件质量。
第6章客观题必背清单
A. 填空题重点
- 软件度量是对软件项目、软件开发过程、软件产品和人进行数据定义、收集及分析的持续性量化过程。
- 软件度量简称 4P 度量。
- 4P 包括 Project、Process、Product、People。
- 软件项目度量包括项目规模、项目成本、项目进度、客户满意度。
- 软件规模度量方法包括 LOC、FPA、OP、UCP、COSMIC、故事点。
- FPA 五类功能组件:ILF、EIF、EI、EO、EQ。
- 项目进度度量方法包括甘特图、燃尽图、关键路径法、挣值分析法、看板。
- 挣值分析三个核心指标:PV、EV、AC。
- 软件产品度量包括软件结构度量和软件质量度量。
- 软件产品结构度量包括扇入/扇出、耦合度、内聚度、复杂度。
- 耦合度最高的是内容耦合。
- 内聚度最高的是功能内聚,最低的是偶然内聚。
- 圈复杂度公式: $$ V(G)=e-n+2p $$ 连通图中: $$ V(G)=e-n+2 $$
- 圈复杂度也等于判定节点数 + 1。
- Halstead 复杂度基于操作符和操作数数量。
- 软件质量度量可基于 ISO/IEC 25010 软件质量模型。
- MTBF 是平均故障间隔时间。
- CSI 是用户满意度指数。
B. 选择题重点
C. 判断题易错点
- 软件度量只用于项目结束后的验收阶段。 错。计划、开发、验收阶段都可以用。
- LOC 简单直观,但会受到语言和编程风格影响。 对。
- 功能点分析法依赖具体编程语言。 错。FPA 与语言和技术实现无关。
- EO 和 EQ 都是输出信息,因此没有区别。 错。EO 包含计算/推导/派生数据,EQ 只是查询检索。
- 挣值分析法同时考虑项目进度和成本。 对。
- SV 小于 0 表示进度超前。 错。SV 小于 0 表示进度落后。
- CV 小于 0 表示成本超支。 对。
- SPI 小于 1 表示进度效率低于预期。 对。
- CPI 小于 1 表示成本效率低于预期。 对。
- 高扇出通常说明模块依赖较多,复杂度可能较高。 对。
- 耦合度越高越好。 错。一般低耦合更好。
- 内聚度越高越好。 对。
- 内容耦合是耦合度最高的一种。 对。
- 功能内聚是内聚度最高的一种。 对。
- 圈复杂度越高,程序通常越容易测试和维护。 错。圈复杂度越高越难测试和维护。
- Halstead 的 N 是源代码行数。 错。N 是 Halstead 程序长度,不是 LOC。
第6章主观题可能考法
虽然第6章主要偏客观题,但也可能出情景题。
情景1:给一个项目,让你选择规模度量方法
答题模板:
- 如果在需求分析早期,代码尚未实现,可选 功能点分析法 FPA 或 用例点法 UCP。
- 如果已有代码,可用 LOC。
- 如果是敏捷项目,可用 故事点。
- 如果是实时、嵌入式系统,可考虑 COSMIC 方法。
- 说明选择原因:项目阶段、可用信息、估算目标。
情景2:给 PV、EV、AC,让你分析项目状态
答题模板:
- 写出三个指标含义:
- PV:计划价值;
- EV:挣值;
- AC:实际成本。
- 计算: $$ SV=EV-PV $$ $$ CV=EV-AC $$ $$ SPI=EV/PV $$ $$ CPI=EV/AC $$
- 判断:
- SV < 0:进度落后;
- SV > 0:进度超前;
- CV < 0:成本超支;
- CV > 0:成本节省;
- SPI < 1:进度效率低;
- CPI < 1:成本效率低。
情景3:给一个模块结构,让你分析结构质量
答题模板:
- 看扇入:
- 扇入高可能说明复用性高;
- 但过高可能职责过多、内聚下降。
- 看扇出:
- 扇出高说明依赖多、复杂度高;
- 可能需要引入中间层。
- 看耦合:
- 尽量降低耦合;
- 避免内容耦合、公共耦合;
- 优先数据耦合、消息耦合。
- 看内聚:
- 提高内聚;
- 目标是功能内聚;
- 避免偶然内聚、逻辑内聚。
情景4:给控制流图,让你算圈复杂度
答题模板:
- 如果给边数 e、节点数 n: $$ V(G)=e-n+2 $$
- 如果给判定节点数: $$ V(G)=判定节点数+1 $$
- 如果给区域数: $$ V(G)=R $$
- 解释含义:
- 圈复杂度表示线性无关路径数;
- 也是最少测试路径条数;
- 值越高,代码越复杂,越难测试和维护。
第6章最终记忆主线
你复习第6章时可以抓住这条线:
软件度量先分 4P:项目、过程、产品、人。 项目度量看规模、成本、进度、客户满意度。 过程度量看流程效率、资源利用、缺陷、成熟度。 产品度量看结构和质量。 结构度量重点是扇入扇出、耦合、内聚、圈复杂度、Halstead、CK。 质量度量重点是 ISO/IEC 25010、缺陷密度、MTBF、CSI 等指标。
第6章最需要优先背的是:
- 4P 度量定义;
- FPA 五类功能点:ILF、EIF、EI、EO、EQ;
- 挣值分析 PV、EV、AC、SV、CV、SPI、CPI;
- 扇入/扇出定义;
- 耦合类型与最高/最低耦合;
- 内聚类型从高到低排序;
- 圈复杂度三个计算方法;
- Halstead 中 n1、n2、N1、N2 的含义;
- CK 度量元常见指标;
- 产品质量度量指标:缺陷密度、MTBF、CSI 等。