软件度量
00:00
代码行度量、功能点分析、圈复杂度与软件质量指标。
1. 软件度量概述
1.1 度量目的
| 目的 | 说明 |
|---|---|
| 评估质量 | 量化软件质量属性 |
| 预测工作量 | 估算项目规模和成本 |
| 监控进度 | 跟踪开发进展 |
| 改进过程 | 识别改进机会 |
1.2 度量分类
| 分类 | 说明 | 示例 |
|---|---|---|
| 产品度量 | 软件产品属性 | 代码行数、缺陷密度 |
| 过程度量 | 开发过程属性 | 开发周期、评审次数 |
| 项目度量 | 项目管理属性 | 成本、进度、人力 |
2. 规模度量
2.1 代码行(LOC)
| 指标 | 说明 |
|---|---|
| SLOC | 源代码行(不含空行和注释) |
| KLOC | 千行代码 |
| LOC/人月 | 人均生产率 |
局限性:
- 语言差异大(同一功能,Python vs Java行数差异大)
- 不反映复杂度
- 不鼓励简洁代码
2.2 功能点分析(FPA)
功能点衡量软件的功能规模,与实现语言无关:
| 功能类型 | 简单 | 平均 | 复杂 | 权重说明 |
|---|---|---|---|---|
| 外部输入(EI) | 3 | 4 | 6 | 用户输入 |
| 外部输出(EO) | 4 | 5 | 7 | 用户输出 |
| 外部查询(EQ) | 3 | 4 | 6 | 查询操作 |
| 内部逻辑文件(ILF) | 7 | 10 | 15 | 系统维护的数据 |
| 外部接口文件(EIF) | 5 | 7 | 10 | 系统引用的数据 |
调整后的功能点:
其中 为14个通用系统特性的影响度。
3. 复杂度度量
3.1 圈复杂度(Cyclomatic Complexity)
衡量程序的线性独立路径数:
其中 为边数, 为节点数, 为连通分量数。
简化计算:
| 圈复杂度 | 风险等级 | 建议 |
|---|---|---|
| 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 可维护性指数
| 范围 | 评级 |
|---|---|
| 0~9 | 低 |
| 10~19 | 中 |
| 20~100 | 高 |
5. 度量实践
5.1 度量仪表盘
| 维度 | 指标 | 目标 |
|---|---|---|
| 质量 | 缺陷密度 | <5/KLOC |
| 质量 | 测试覆盖率 | >80% |
| 效率 | 开发速度 | 故事点/Sprint |
| 效率 | 构建成功率 | >95% |
| 可维护性 | 圈复杂度 | <15 |
| 可维护性 | 重复率 | <3% |
5.2 Goodhart法则
“当一个度量成为目标时,它就不再是一个好的度量。”
避免度量陷阱:
- 度量是工具,不是目标
- 组合多个度量,避免单一指标优化
- 定期审视度量的有效性