度量与模型
软件质量中的度量和模型
Section titled “软件质量中的度量和模型”在软件工程中,模型帮助我们理解、预测和改进过程和产品。度量提供构建和验证这些模型所需的定量数据。有效的度量涉及识别软件实体(如过程、产品或资源)的相关属性,并将其映射到数值。
通常推荐采用结构化方法,如目标-问题-度量 (Goal-Question-Metric, GQM),来选择相关度量。这包括定义您的目标(例如,提高代码可维护性),提出解决这些问题的问题(例如,哪些模块最难修改?),以及识别可以回答这些问题的度量(例如,圈复杂度 cyclomatic complexity,代码变动量 code churn)。
度量大致可分为两类:
- 直接度量 (Direct measurement)
- 间接度量 (Indirect measurement)
直接度量独立地量化实体的属性,无需度量其他属性。这些通常是计数或简单的计时。
现代软件工程中常见的例子包括:
- 任务花费的工作量(例如,人时 person-hours)
- 时间周期(例如,测试阶段持续天数,功能交付周期 cycle time)
- 发现的缺陷数量(例如,在代码评审、测试或发布后)
- 代码规模(例如,代码行数 Lines of Code, LOC;类/函数数量 - 使用 LOC 需谨慎,其价值因语言和上下文差异很大)
- 执行或自动化的测试用例数量
- 部署频率(例如,每周部署次数 deployment frequency)
间接度量是通过组合两个或多个直接度量得出的。它们通常表示比率、百分比或速率,提供关于效率、质量或生产力的洞见。
常见例子包括:
$\small Team:Velocity :(Agile) = \frac{Sum :of:Story:Points:completed}{Sprint:Duration}$ (注意:速率 Velocity 特定于团队,主要用于规划,不用于比较团队)
$\small Defect:Density = \frac{Number :of:defects}{Code :size :(e.g., KLOC :or:Function:Points)}$
$\small Defect:Detection:Percentage :(DDP) = \frac{Number :of:defects:found:before:release}{Total :number :of:defects :(pre :+ :post:release)} \times 100%$
$\small Test:Coverage = \frac{Number :of:items:(e.g.,:code:lines,:branches,:requirements):covered:by:tests}{Total :number :of :items} \times 100%$
$\small Change:Failure:Rate :(DORA:Metric) = \frac{Number :of:deployments:causing:failures}{Total :number :of:deployments} \times 100%$
$\small Lead:Time:for:Changes :(DORA:Metric) = Average:time:from:code:commit:to:production:release$
$\small Rework:Effort:Ratio = \frac{Effort :spent:fixing:defects}{Total :project :effort} \times 100%$
理解每个度量的上下文和局限性至关重要。没有单一的度量能说明全部情况。使用一组与您的具体目标和上下文相关的平衡度量。
用于预测的度量
Section titled “用于预测的度量”度量对于构建预测模型至关重要。通过分析历史数据,我们可以预测未来的结果,如项目工作量、持续时间、成本或潜在的缺陷率。例如,历史速率 (velocity) 数据可以帮助预测团队在未来冲刺 (sprints) 中可以完成多少工作(在相同的上下文中)。
预测系统通常包括:
- 一个数学或统计模型(从简单的回归到复杂的机器学习模型),将预测变量(当前度量)与被预测的变量关联起来。
- 足够的历史数据来训练和验证模型。
- 应用模型、解释结果以及理解其准确性和局限性的程序。
常见的预测领域包括工作量估算(例如,使用敏捷估算技术如用户故事点 story points,或适用的算法模型)、缺陷预测(识别易出错模块)和项目进度预测。