Skip to content

度量基础

度量是根据特定规则为实体的属性分配数值或符号的过程,以便进行比较和分析。一个“实体”可以是对象(如软件模块、项目)、事件(如构建过程、测试运行)或过程(如开发生命周期)。

正式而言,度量涉及使用清晰定义的规则,将现实世界(经验系统)中实体的属性映射到由数字或符号组成的抽象世界(形式化关系系统)。

为什么要在软件工程中进行度量?

Section titled “为什么要在软件工程中进行度量?”

度量是工程学科的基础,软件工程也不例外。虽然我们在日常生活中凭直觉度量事物(价格、尺寸、重量),但在软件开发中严格应用度量对于从经验证据转向客观评估至关重要。

软件工程中进行度量的主要原因包括:

  • 理解:深入了解项目状态、产品质量、过程绩效和资源利用情况。(例如:这个模块有多复杂?我们的构建需要多久?)
  • 控制:对照计划和目标监控进展,识别偏差并采取纠正措施。(例如:缺陷率是否在上升?我们是否按计划进行?)
  • 改进:根据客观数据识别瓶颈、低效之处以及过程或产品需要改进的领域。(例如:大多数缺陷是在哪里引入的?哪次重构改进了可维护性指标?)

没有度量,软件开发经常会遇到以下问题:

  • 模糊的质量目标(例如,说“使其用户友好”而不是“在标准 SUS 调查中达到 >80% 的可用性分数”)。
  • 较差的估算和成本控制。
  • 无法客观评估新工具或技术的影响。
  • 难以证明进展或质量改进。

有效的度量需要明确的目标(通常使用 GQM - Goal, Question, Metric,即目标、问题、度量等框架定义)、精确定义度量的对象,以及一致的数据收集程序。

该理论为度量提供了形式化基础。它将度量视为在现实世界的经验观察和关系与数学世界的数值表示和关系之间建立一种对应关系(映射)。

在现实世界中,我们根据实体的属性感知它们之间的关系。例如:

  • 二元关系:模块 A“比”模块 B“更复杂”。
  • 二元关系:测试用例 X“涵盖与”测试用例 Y“相同的需求”。
  • 一元关系:需求 Z“是关键的”。

这些关系反映了我们在分配数字之前对属性的理解或比较。

度量需要明确的规则来分配数字或符号。这些规则定义了从经验世界(例如,模块的感知复杂性)到形式化世界(例如,圈复杂度分数 Cyclomatic Complexity score)的映射。

软件度量中的规则示例:

  • 代码行数 (Lines of Code, LOC):指定什么是“一行”(例如,非注释、非空源代码行)。
  • 缺陷严重程度评级 (Defect Severity Rating):根据影响定义“关键”、“高”、“中”、“低”的标准。
  • 可用性评分 (Usability Score):定义问卷(例如,系统可用性量表 System Usability Scale - SUS)和计算方法。

一个基本原则是,度量映射 (M) 必须保留观察到的经验关系在数值关系中。我们在现实世界中观察到的关系应该在分配的数字中也成立。

示例:如果我们在经验上观察到模块 A“比”模块 B“更复杂”,那么有效的复杂度度量 M 必须满足:M(A) > M(B)。

示例:如果我们按类型对缺陷进行分类(定类量表 Nominal Scale),映射应确保两个缺陷只有在经验上被视为同一类型时,才被分配相同的类型标签。

数据获取技术示例(映射经验感知)

Section titled “数据获取技术示例(映射经验感知)”

有时,度量涉及捕获主观感知(例如,可用性、可维护性难度)。各种技术有助于构建这种映射:

  • 李克特量表 (Likert Scale):受访者在有序量表上对陈述的同意程度进行评分(例如,强烈不同意到强烈同意)。通常被视为定序量表 (ordinal),有时近似为定距量表 (interval) 进行分析。
  • 示例陈述:“系统提供的错误消息很有帮助。”[量表:1=强烈不同意 … 5=强烈同意]
  • 强制排序 (Forced Ranking):受访者根据特定标准对一组项目进行排序。
  • 示例:“按重要性顺序对以下功能进行排名(1 = 最重要):功能 A、功能 B、功能 C。”(定序量表)
  • 语义微分量表 (Semantic Differential Scale):受访者在两极化量表上对某个概念进行评分,两端是对比形容词。
  • 示例:评价系统的性能:[慢] 1 — 2 — 3 — 4 — 5 [快](通常被视为定距量表)
  • 检查表 (Checklists):确认是否存在特定属性。(定类量表)

结构化的度量方法通常包括:

  1. 确定目标 (Identify Goal):定义度量的目的(例如,提高可维护性)。
  2. 定义实体与属性 (Define Entity & Attribute):指定被度量的对象/过程(例如,源代码模块)以及哪个属性(例如,结构复杂度)。
  3. 刻画属性 (Characterize Attribute):理解与属性相关的经验关系(例如,模块 A 比模块 B 更复杂)。
  4. 定义度量工具/规则 (Define Measurement Instrument/Rule):指定如何量化属性(例如,使用工具 X 计算圈复杂度 Cyclomatic Complexity)。
  5. 选择量表 (Select Scale):确定适当的度量量表(例如,圈复杂度的比率量表 Ratio scale)。
  6. 执行度量 (Perform Measurement):应用工具/规则收集数据。
  7. 分析与解释 (Analyze & Interpret):根据量表和目标使用适当的统计技术得出结论。