第6章 软件度量

2.1 本章定位

本章从量化角度说明如何评估软件项目、过程、产品和团队。期末客观题很可能考定义、分类和公式;主观题可能给出控制流图或代码片段,要求计算圈复杂度。

2.2 核心概念

软件度量

客观题重点,已在第一次小测中出现。

软件度量是对==软件项目(Project)、软件开发过程(Process)、软件产品(Product)和人(People)==进行数据定义、收集及分析的持续性量化过程,简称 4P 度量。

软件度量目的:加深对软件项目、软件过程及件产品的理解,达到预测、评估、控制和改善软件开发过程的目的,最终开发出高质量的软件产品。

  • 加深对软件项目、软件过程和软件产品的理解;
  • 达到预测、评估、控制和改善软件开发过程的目的;
  • 最终开发高质量软件产品。

软件度量四要素

  1. 确定要度量的软件属性: 包括内部属性和外部属性。
  2. 建立软件属性的经验系统,并选择相应的形式系统
  3. 通过度量准则将经验系统映射到形式系统:例如用耦合度、内聚度、复杂度来量化软件属性。
  4. 评估度量结果: 例如判断复杂度是否过高、耦合度是否超过阈值。
要素含义
确定属性确定要度量的软件属性,包括内部属性和外部属性
建立经验系统和形式系统将经验世界中的对象和关系转化为可表示的数值或符号
建立映射用度量准则把经验系统映射到形式系统
评估结果判断耦合度、内聚度、复杂度等是否超过阈值

一个软件度量由==经验系统、形式系统和映射==三部分组成。

2.3 四类度量对象

4P度量对象典型内容
Project软件项目规模、成本、进度、客户满意度
Process软件开发过程流程效率、资源利用率、团队协作、流程规范性
Product软件产品软件结构度量、软件质量度量
People人/团队客户满意度、团队能力、协作等,课件主要在团队/客户满意度处展开

2.4 项目度量

软件项目度量是一种全局性度量,包括项目规模、项目成本、项目进度和客户满意度。

类型作用
项目规模度量量化项目大小、复杂度和工作量,辅助时间/费用分配和缺陷密度统计
项目成本度量估算和监控全生命周期资源投入和资金消耗
项目进度度量跟踪、评估和预测实际进展与计划目标的匹配程度
客户满意度度量根据满意度要素度量客户满意程度

常见软件规模度量方法

方法含义特点
代码行数 LOC统计源代码有效行数简单直观,但受语言和风格影响
功能点分析 FPA基于用户需求功能数量度量==独立于语言==,适合早期估算
对象点 OP面向==对象或图形界面==系统估算适合屏幕、报表等组件估算
用例点 UCP根据用例数量、复杂度、技术环境因素估算适合==用例驱动开发==
COSMIC 方法以数据移动为单位适合实时、嵌入式等领域
故事点==敏捷开发==相对估算常用斐波那契数列赋值

常见软件成本度量方法

方法类别具体方法含义特点
基于代码规模的估算代码行成本法基于历史数据,计算每千行代码(KLOC)的平均成本(CPK),结合新项目预估代码量计算总成本 。 计算公式:$Cost = L_{KLOC} \times CPK$直接与代码总行数挂钩,需要依赖历史数据来得出单位代码的平均成本 。
Halstead成本模型基于Halstead复杂度指标(即程序中运算符 $n_1$ 和操作数 $n_2$ 的数量),计算程序工作量与成本 。 计算公式:$Cost = E \times C$($E$表示工作量总和,$C$表示人力成本)从代码词汇的底层构成(运算符和操作数)出发评估复杂性,进而推算总成本 。
基于功能规模的估算功能点分析法通过功能点(FP)量化用户功能需求,结合历史生产率(如成本/功能点)估算总成本 。 计算公式:$Cost = FP \times cost/FP$建立在用户视角的功能需求量化之上,结合历史开发生产率数据进行推算 。
用例点法基于用例模型计算出用例点,结合技术与环境因子调整后估算成本 。 计算公式:$Effort = UCP \times 20$ (其中 $UCP = UUCP \times TCF \times EF$)会将未调整用例点(UUCP)与系统技术因子(TCF)及团队环境因子(EF)综合起来进行修正估算 。

常见项目进度度量方法

软件项目进度度量:是通过系统化的方法跟踪、评估和预测项目实际进展与计划目标的匹配程度,确保项目按时交付。

挣值分析法 EVM

  • 计划价值 (PV, Planned Value):到某个时间点,按照计划你应该完成的工作值多少钱 。
  • 挣值 (EV, Earned Value):这是最核心的指标,指到某个时间点,你实际完成的工作按预算算值多少钱 。
  • 实际成本 (AC, Actual Cost):到某个时间点,你为了完成这些工作实际花掉了多少钱 。
指标名称计算公式状态判别
进度偏差 (SV)$SV = EV - PV$负数表示进度落后,正数表示超前。
成本偏差 (CV)$CV = EV - AC$负数表示成本超支,正数表示节省。
进度绩效指数 (SPI)$SPI = EV / PV$小于 1 表示进度效率低于预期。
成本绩效指数 (CPI)$CPI = EV / AC$小于 1 表示成本效率低于预期(钱花得不值)。

2.5 过程度量

软件过程度量是针对软件开发流程的量化评估方法,目标是监控和优化开发活动效率、资源利用率、团队协作和流程规范性。

课件列出的过程度量方法:

  • 定性方法:过程文档分析、SWOT 分析、CMMI 过程成熟度模型评估等。
  • 定量方法:生产率度量、时间和周期度量、缺陷度量、成本度量、过程成熟度量化评估、敏捷度量、统计过程控制。

2.6 产品度量

软件产品度量是对软件开发过程中产生的中间产品或工作产品、最终产品进行的度量。它包含:

  • 软件产品结构度量;
  • 软件产品质量度量。

第一次小测已考:软件产品结构度量主要包含扇入和扇出、耦合度、内聚度、复杂度。

扇入和扇出

指标含义判断
扇入 fan-in有多少上级模块调用该模块高扇入表示复用性强,但过高可能职责过多、内聚下降
扇出 fan-out一个模块调用多少下级模块高扇出表示复杂度高,可能缺少中间层;过小也可能不利维护

耦合度

耦合度是模块及模块之间信息或参数依赖的程度。设计原则通常是低耦合。

已在第一次小测中出现。常见耦合:

耦合类型说明
内容耦合耦合度最高,又称病态耦合
共享耦合/公共耦合多模块通过公共数据环境相互作用
外部耦合共享外加数据格式、通信协议或设备接口等
控制耦合传递控制变量影响被调模块行为
特征耦合/标记耦合共享复杂数据结构
数据耦合通过参数传递基本数据
消息耦合通过消息传递交互
无耦合模块之间完全不交换信息

内聚度

内聚度表示模块内部各成分彼此结合的紧密程度。设计原则通常是高内聚。

从高到低:

顺序类型含义
1功能内聚模块内所有元素都为完成单一功能所需要,关联最强
2顺序内聚元素按顺序执行,后继依赖前驱结果
3通信内聚元素处理同一类数据或信息,需要互相通信
4过程内聚元素为完成一个任务或目标,需要按步骤依次执行
5时间内聚元素在同一时间段内执行,但关联较弱
6逻辑内聚元素实现同一种逻辑关系,但不一定相互通信或依赖
7偶然内聚元素之间没有内在关联,只是被偶然组合在一起

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 复杂度度量

类型例子
操作符语言保留字、函数调用、运算符、分隔符等
操作数常数、变量、标识符等
符号含义
n1不同操作符个数
n2不同操作数个数
N1操作符出现总数
N2操作数出现总数

则:

程序词汇表长度$$ 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)。

其他量化指标

指标英文含义
技术债务比率technical debt ratio技术债务占比
可维护性指数maintainability index衡量软件可维护性
重复代码率duplicated code percentage重复代码占比
缺陷密度defect density单位规模中的缺陷数量
平均故障间隔时间MTBFmean time between failures
用户满意度指数CSIcustomer satisfaction index

2.8 易混淆点

概念区分
耦合 vs 内聚耦合看模块之间依赖;内聚看模块内部相关性
扇入 vs 扇出扇入看“被多少模块调用”;扇出看“调用多少模块”
圈复杂度 vs 代码行数圈复杂度看控制结构和独立路径,不等于代码行数
产品结构度量 vs 产品质量度量结构度量关注扇入/扇出、耦合、内聚、复杂度;质量度量基于质量模型评估内部/外部质量

2.9 小测关联

第一次小测已考:

  • 软件度量定义;
  • 4P 中的软件项目、软件开发过程、软件产品;
  • 产品结构度量四类;
  • 耦合类型;
  • 圈复杂度三个等价公式。

2.10 本章复习检查题

填空题

  1. 软件度量是对软件项目、________、________和________进行数据定义、收集及分析的持续性量化过程。
  2. 软件产品结构度量主要包含扇入和扇出、________、
  3. 圈复杂度的三个常用公式为 。

选择题

  1. “一个模块调用很多下级模块”主要对应:A. 扇入 B. 扇出 C. 内聚 D. 质量模型
  2. 下列内聚中最高的是:A. 偶然内聚 B. 逻辑内聚 C. 功能内聚 D. 时间内聚

判断题

  1. 高耦合通常有利于软件维护。
  2. 圈复杂度可以用判定节点数加 1 计算。
  3. 扇入过高一定总是好事。

参考答案

  1. 填空:软件开发过程、软件产品、人;耦合度、内聚度、复杂度;$E-N+2P$ 或单连通时 $E-N+2$、$J+1$、$R$。
  2. 选择:B;C。
  3. 判断:错;对;错。

第6章总复习框架

一句话总结

第6章讲的是:

如何用量化数据对软件项目、软件过程、软件产品和人/团队进行评估,从而支持预测、评估、控制和改进软件质量。


第6章客观题必背清单

A. 填空题重点

  1. 软件度量是对软件项目、软件开发过程、软件产品和人进行数据定义、收集及分析的持续性量化过程。
  2. 软件度量简称 4P 度量
  3. 4P 包括 Project、Process、Product、People
  4. 软件项目度量包括项目规模、项目成本、项目进度、客户满意度。
  5. 软件规模度量方法包括 LOC、FPA、OP、UCP、COSMIC、故事点。
  6. FPA 五类功能组件:ILF、EIF、EI、EO、EQ。
  7. 项目进度度量方法包括甘特图、燃尽图、关键路径法、挣值分析法、看板。
  8. 挣值分析三个核心指标:PV、EV、AC。
  9. 软件产品度量包括软件结构度量和软件质量度量。
  10. 软件产品结构度量包括扇入/扇出、耦合度、内聚度、复杂度。
  11. 耦合度最高的是内容耦合。
  12. 内聚度最高的是功能内聚,最低的是偶然内聚。
  13. 圈复杂度公式: $$ V(G)=e-n+2p $$ 连通图中: $$ V(G)=e-n+2 $$
  14. 圈复杂度也等于判定节点数 + 1。
  15. Halstead 复杂度基于操作符和操作数数量。
  16. 软件质量度量可基于 ISO/IEC 25010 软件质量模型。
  17. MTBF 是平均故障间隔时间。
  18. CSI 是用户满意度指数。

B. 选择题重点

问题答案方向
4P 度量包括什么?Project、Process、Product、People
哪种规模度量方法与语言无关?功能点分析 FPA
FPA 中哪些属于数据功能?ILF、EIF
FPA 中哪些属于事务功能?EI、EO、EQ
哪些属于进度度量方法?甘特图、燃尽图、关键路径、挣值分析、看板
哪些属于定性过程度量方法?专家评审、访谈、观察、SWOT、根因分析
哪些属于定量过程度量方法?生产率、周期、缺陷、成本、资源利用率
哪个耦合度最高?内容耦合
哪个内聚度最高?功能内聚
哪个 CK 指标表示继承树深度?DIT
哪个 CK 指标表示直接子类数?NOC
哪个 CK 指标表示对象间耦合?CBO

C. 判断题易错点

  1. 软件度量只用于项目结束后的验收阶段。 错。计划、开发、验收阶段都可以用。
  2. LOC 简单直观,但会受到语言和编程风格影响。 对。
  3. 功能点分析法依赖具体编程语言。 错。FPA 与语言和技术实现无关。
  4. EO 和 EQ 都是输出信息,因此没有区别。 错。EO 包含计算/推导/派生数据,EQ 只是查询检索。
  5. 挣值分析法同时考虑项目进度和成本。 对。
  6. SV 小于 0 表示进度超前。 错。SV 小于 0 表示进度落后。
  7. CV 小于 0 表示成本超支。 对。
  8. SPI 小于 1 表示进度效率低于预期。 对。
  9. CPI 小于 1 表示成本效率低于预期。 对。
  10. 高扇出通常说明模块依赖较多,复杂度可能较高。 对。
  11. 耦合度越高越好。 错。一般低耦合更好。
  12. 内聚度越高越好。 对。
  13. 内容耦合是耦合度最高的一种。 对。
  14. 功能内聚是内聚度最高的一种。 对。
  15. 圈复杂度越高,程序通常越容易测试和维护。 错。圈复杂度越高越难测试和维护。
  16. Halstead 的 N 是源代码行数。 错。N 是 Halstead 程序长度,不是 LOC。

第6章主观题可能考法

虽然第6章主要偏客观题,但也可能出情景题。

情景1:给一个项目,让你选择规模度量方法

答题模板:

  1. 如果在需求分析早期,代码尚未实现,可选 功能点分析法 FPA用例点法 UCP
  2. 如果已有代码,可用 LOC
  3. 如果是敏捷项目,可用 故事点
  4. 如果是实时、嵌入式系统,可考虑 COSMIC 方法
  5. 说明选择原因:项目阶段、可用信息、估算目标。

情景2:给 PV、EV、AC,让你分析项目状态

答题模板:

  1. 写出三个指标含义:
    • PV:计划价值;
    • EV:挣值;
    • AC:实际成本。
  2. 计算: $$ SV=EV-PV $$ $$ CV=EV-AC $$ $$ SPI=EV/PV $$ $$ CPI=EV/AC $$
  3. 判断:
    • SV < 0:进度落后;
    • SV > 0:进度超前;
    • CV < 0:成本超支;
    • CV > 0:成本节省;
    • SPI < 1:进度效率低;
    • CPI < 1:成本效率低。

情景3:给一个模块结构,让你分析结构质量

答题模板:

  1. 看扇入:
    • 扇入高可能说明复用性高;
    • 但过高可能职责过多、内聚下降。
  2. 看扇出:
    • 扇出高说明依赖多、复杂度高;
    • 可能需要引入中间层。
  3. 看耦合:
    • 尽量降低耦合;
    • 避免内容耦合、公共耦合;
    • 优先数据耦合、消息耦合。
  4. 看内聚:
    • 提高内聚;
    • 目标是功能内聚;
    • 避免偶然内聚、逻辑内聚。

情景4:给控制流图,让你算圈复杂度

答题模板:

  1. 如果给边数 e、节点数 n: $$ V(G)=e-n+2 $$
  2. 如果给判定节点数: $$ V(G)=判定节点数+1 $$
  3. 如果给区域数: $$ V(G)=R $$
  4. 解释含义:
    • 圈复杂度表示线性无关路径数;
    • 也是最少测试路径条数;
    • 值越高,代码越复杂,越难测试和维护。

第6章最终记忆主线

你复习第6章时可以抓住这条线:

软件度量先分 4P:项目、过程、产品、人。 项目度量看规模、成本、进度、客户满意度。 过程度量看流程效率、资源利用、缺陷、成熟度。 产品度量看结构和质量。 结构度量重点是扇入扇出、耦合、内聚、圈复杂度、Halstead、CK。 质量度量重点是 ISO/IEC 25010、缺陷密度、MTBF、CSI 等指标。

第6章最需要优先背的是:

  1. 4P 度量定义
  2. FPA 五类功能点:ILF、EIF、EI、EO、EQ
  3. 挣值分析 PV、EV、AC、SV、CV、SPI、CPI
  4. 扇入/扇出定义
  5. 耦合类型与最高/最低耦合
  6. 内聚类型从高到低排序
  7. 圈复杂度三个计算方法
  8. Halstead 中 n1、n2、N1、N2 的含义
  9. CK 度量元常见指标
  10. 产品质量度量指标:缺陷密度、MTBF、CSI 等