软件度量

5 minIntermediate2026/6/14

代码行度量、功能点分析、圈复杂度与软件质量指标。

1. 软件度量概述

1.1 度量目的

目的说明
评估质量量化软件质量属性
预测工作量估算项目规模和成本
监控进度跟踪开发进展
改进过程识别改进机会

1.2 度量分

说明示例
产品度量软件产品属性代码行数、缺陷密度
过程度量开发过程属性开发周期、评审次数
项目度量项目管理属性成本、进度、人力

2. 规模度量

2.1 代码行(LOC)

指标说明
SLOC源代码行(不含空行和注释)
KLOC千行代码
LOC/人月人均生产率

局限性

  • 语言差异大(同一功能,Python vs Java行数差异大)
  • 不反映复杂度
  • 不鼓励简洁代码

2.2 功能点分析(FPA)

功能点衡量软件的功能规模,与实现语言无关:

UFP=i=15j=13Cij×Wij\text{UFP} = \sum_{i=1}^{5} \sum_{j=1}^{3} C_{ij} \times W_{ij}

功能简单平均复杂权重说明
外部输入(EI)346用户输入
外部输出(EO)457用户输出
外部查询(EQ)346查询操作
内部逻辑文件(ILF)71015系统维护的数据
外部接口文件(EIF)5710系统引用的数据

调整后的功能点

AFP=UFP×VAF\text{AFP} = \text{UFP} \times \text{VAF}

VAF=0.65+0.01×i=114Fi\text{VAF} = 0.65 + 0.01 \times \sum_{i=1}^{14} F_i

其中 Fi[0,5]F_i \in [0, 5] 为14个通用系统特性的影响度。

3. 复杂度度量

3.1 圈复杂度(Cyclomatic Complexity)

衡量程序的线性独立路径数

V(G)=EN+2PV(G) = E - N + 2P

其中 EE 为边数,NN 为节点数,PP 为连通分量数。

简化计算

V(G)=决策点数+1V(G) = \text{决策点数} + 1

圈复杂度风险等级建议
1~10简单,低风险
11~20较复杂,中等风险
21~50复杂,高风险
>50极高不可测试,必须重构

3.2 认知复杂度

圈复杂度的改进,更符合人理解难度:

  • 不对线性逻辑(if-else链)增加复杂度
  • 嵌套增加额外复杂度
  • 跳转(break、continue)增加复杂度

4. 质量度量

4.1 缺陷度量

指标公式说明
缺陷密度缺陷数/KLOC每千行代码缺陷数
缺陷发现率缺陷数/测试时间单位时间发现的缺陷
缺陷修复率已修复/总缺陷修复进度
缺陷泄漏率生产缺陷/(测试缺陷+生产缺陷)测试有效性

4.2 代码质量指标

指标说明工具
重复率重复代码占比SonarQube
测试覆盖率被测试代码的占比JaCoCo、Istanbul
技术债务修复所有问题所需时间SonarQube
代码异味数代码坏味道数量SonarQube
依赖复杂度模块间耦合度Structure101

4.3 可维护性指数

MI=1715.2ln(avgHV)0.23avgCC16.2ln(avgLOC)+50sin(2.4avgCM)\text{MI} = 171 - 5.2 \ln(\text{avgHV}) - 0.23 \text{avgCC} - 16.2 \ln(\text{avgLOC}) + 50 \sin(\sqrt{2.4 \text{avgCM}})

范围评级
0~9
10~19
20~100

5. 度量实践

5.1 度量仪表盘

维度指标目标
质量缺陷密度<5/KLOC
质量测试覆盖率>80%
效率开发速度故事点/Sprint
效率构建成功率>95%
可维护性圈复杂度<15
可维护性重复率<3%

5.2 Goodhart法则

“当一个度量成为目标时,它就不再是一个好的度量。”

避免度量陷阱:

  • 度量是工具,不是目标
  • 组合多个度量,避免单一指标优化
  • 定期审视度量的有效性