阅读本文你将收获
1、GQM概念、起源步骤设计和参考意义;
2、GQM整体框架详解:目标-问题-指标;
3、构建研发效能度量体系的方法:现代GQM实践指南;
作者简介
任晶磊,思码逸 创始人兼CEO,清华大学计算机系博士,前微软亚洲研究院研究员,斯坦福大学、卡内基梅隆大学访问学者;《软件研发效能度量规范》标准专家组核心专家。在软件系统、软件工程领域从事前沿研究多年,具备丰富经验。曾在FSE、OSDI 等顶级国际学术会议上发表论文多篇,亦参与过微软下一代服务器系统架构设计与实现。同时,也是一位积极的开源贡献者。 现任思码逸CEO,通过打造先进的深度代码分析技术和研发大数据平台,以数据驱动软件工程,助力企业和团队提升研发效能。
前言
目标-问题-指标(GQM)是软件工程领域的一套系统方法,被称为研发效能度量方法的“事实标准”。 通过系统化的数据度量和分析,我们可以更好地认知软件研发过程和产物,为研发团队提供及时反馈,优化研发流程,提升研发效能,为开发者带来卓越的软件工程实践。 但目前产业界对 GQM 的应用存在两方面的误区: 一是简单从字面理解“目标”、“问题”和“指标”的概念,没有进一步理解它们的具体定义和背后的模型等精髓; 二是尚未充分意识到 GQM 是构建研发效能度量体系的一种根本性方法。
今天我们看到很多关于研发效能度量的文章、演讲、案例和书籍。 它们分享了实践中宝贵的第一手经验,但各家指标纷繁、模式各异,研发效能实践者难免会感到无所适从。 GQM 为我们提供了抓住本质、化繁为简的有效路径。 本文将分享我们对早期和经典 GQM 模式的评论,并为读者提供一套现代 GQM 实践指南。
GQM 概念与起源
GQM 最早由 Basili 提出(Basili(1984)),发表在软件工程领域权威期刊 IEEE Transactions on Software Engineering 上。 GQM 当初是为软件工程研究中的数据收集和分析而设计的,基本思想是:
实际上,我们今天所讨论的研发效能度量,可以看作软件工程研究领域数据收集和分析的“低配版”。 软件工程研究通常需要生产环境中的数据来评价软件开发方法和认知软件开发过程,会采用 GQM 这样系统的方法,保证具体实施的科学性和严谨性。 实用目的下的研发效能度量,不必过度追求科学性和严谨性,但现实中往往因为一些随意乃至混乱的做法,获得无效的数据或误导的结论。 采用 GQM 方法,可以帮助我们实行真正有意义的研发效能度量。 我们先追本溯源,概览早期 GQM 的实施步骤。
早期步骤设计和参考意义
效率是“以正确的方式做事”,而效能是“做正确的事”。——彼得·德鲁克《有效的管理者》
GQM 包含如下六个基本步骤,其中最费时费力的一些步骤(标记了“*”)在今天已经因为流程工具的普及而变得非常便利。 正是因为这样数据收集成本的极大降低,让研发效能度量变得普遍可行和实用。 与此同时,其他 GQM 步骤侧重概念层面的思考和梳理,并不会给团队带来很大成本,却至关重要,能够保证整个过程在“做正确的事”。 它们在今天的研发效能度量实践中经常被忽视,得不偿失。
理解经典 GQM
GQM 方法提出后,经过了不断的丰富和发展,早期即应用在 NASA、惠普、普华永道、斯伦贝谢、西门子、爱立信、飞利浦、博世、戴姆勒-克莱斯勒、安联、宝洁等各行业先进企业,相关文献和引用比较丰富。 其中,Basili 在马里兰大学的技术报告(Basili(1992))和 2002 年与其他人合作的文章(vanSolingen(2002))是对经典 GQM 较为成熟和完整的阐述,推荐读者参考。 前者适合有研究背景的读者,但其表达和格式上存在一些不足之处,可能影响阅读和理解;后者适合行业中更广泛的读者,但其某些裁剪和简化容易误导实践,下面会逐一指出。 本文综合这两篇和其他文献的主要内容,将经典 GQM 的精华进行了提炼和总结。
整体框架
通过 GQM 雏形的主要实操步骤,我们对该方法已经建立了初步的认知。图 1 展示了方法的整体框架。

这里面需要特别提出的关键概念是模型。 问题本质上是一种定义模型的方法。 这个模型可以是显式的数学模型,也可以是通过问题反映出的在专家头脑中的隐式模型。 GQM 强调有效的研发效能度量必须:
概念层:目标
目标以通用术语表达组织的信息需要。其定义包括如下部分:
GQM 面向度量目标,与改进目标有所区分(vanSolingen(2002))。 度量为改进行动提供所需信息,即哪里需要改进和如何进行改进。 但实际上,组织最终关心的还是改进目标,度量目标应为改进目标服务。 所以,我们更赞成将改进视作目标的一种目的(Basili(1992)),而改进目标到度量目标的转化可包含在问题和模型中。
视角有一层含义在于区分数据范围,例如项目经理需要及时的进度反馈,而公司可以接受更长时间范围的评价(vanSolingen(2002))。 今天数据极大丰富,又支持快速自动分析,这种区分对后续度量的影响不大,所以视角的主要含义还是不同角色关注不同的目标。
另外,环境这个参数在相关文献中较少展开论述,通常只是由目标项目或团队指代。 它在今天研发效能度量中的主要意义是支持对比,不论组织内部,还是同行之间,多用于以评价为目的的目标。 我们推荐在实践中简化目标定义,不必每一个目标都包含环境要素,只在需要度量间对比时进行定义。
下面我们给出一个目标实例,其自然表述可以拆分出如上各个参数。

操作层:问题
根据目标提出的一系列问题,主要用于刻画目标(vanSolingen(2002)),其中隐含着一个在目标维度上刻画目标对象的模型。
我们通过一个实例来具体理解“刻画”的含义和常见方式。

表 2 中的问题并不一定是完备的,可以扩充或裁剪,取决于研发团队实际的信息需要。 这体现出 GQM 方法及其通过问题表达隐式模型的灵活性,从实际应用出发,根据实际情况判断。 通过这些问题,我们可以看到分布和关系是两种典型的刻画方式。 并且,它们都可以通过度量数据采用统计方法计算。
另一方面,这些问题隐含了对“可靠性”的定义。 我们并没有显式描述该定义,但隐含的理解是,可靠性主要反映在已交付系统发生的失败和导致失败背后的软件缺陷上,所以问题才会围绕两者展开。 这种定义是隐式模型的重要组成部分。
我们再举一个更为完备的隐式模型的例子(Basili(1992))。

这些问题隐含了对“测试过程”和“缺陷逃逸”的定义,即该公司各项目均经历系统测试和验收测试,我们关注的缺陷逃逸指系统测试这一步。 进而上述问题列表可以转化为如下数学模型:
Es = 该项目在系统测试发现的千行缺陷数;
Ea = 该项目在验收测试发现的千行缺陷数;
Eo = 该项目在发布后发现的千行缺陷数。
令 {Pi} 表示用于对比的同类项目集合,有:
PEs = {Pi} 平均在系统测试发现的千行缺陷数;
PEa = {Pi} 平均在验收测试发现的千行缺陷数;
PEo = {Pi} 平均在发布后发现的千行缺陷数。
进而,令:
Fc = 该项目在系统测试发现的千行缺陷数与发现的总千行总缺陷数的比值,
即Fc=Es/(Es+Ea+Eo);
Fs = 同类项目在系统测试发现的千行缺陷数与发现的千行总缺陷数的平均比值,
即Fs=PEs/(PEs+PEa+PEo)。
最终,我们有:
QF=Fc/Fs,即该项目系统测试水平与同类项目间的关系。
显而易见,上述各定义与表 3 中的问题是分别对应的。 数学定义更加清晰准确,比如多个项目的“平均比值”有公式就不必担心歧义。 在 GQM 的实际应用中,这种精确性通常依赖问题对应的指标,所以指标的规范化非常重要(OpenMARI)。
全面的问题
全面来说,问题包含的几个主要方面如下(Basili(1992)):
对上述符合性的刻画有助于保证度量结论的可靠性,防止忽略过程执行不到位或者执行者偏差等的影响。 在实践中,符合性调研值得推荐,例如询问每位开发者对缺陷标签和判别标准的熟悉程度。
量化层:指标
回答问题所需的指标既可以是客观的,也可以是主观的,但都应当是可量化的。 客观数据通常从研发产物或研发过程中的活动记录乃至上下游业务系统中获得。 今天日益扩展的 DevOps 工具链产生大量的数据可供分析和挖掘。 主观数据可来自对研发团队或用户的问卷调查。
下表给出了表 1 目标下一个问题对应的指标集。

我们可以看到,这样的指标集中包含了数据分析,如均值、标准差、上下限等统计。 另一种做法是将围绕一个指标的统计学计算都归入指标自身的定义,不再逐一列出。 考虑到统计学方法的通用性,我们更推荐后者。
与问题列表类似,指标集可根据实际信息需要增减。 但有一个重要的理念(Basili(1992))是,如果一个问题的指标集设计包含某指标但实际中该指标无法被度量(可能因为所需数据难以获得等原因),那么该指标同样应该被列出,因为它可能代表了缺失的信息和问题答案的局限性。
现代 GQM 实践指南
今天我们正在进入数据驱动研发效能的时代。 这里提供一份在今天应用 GQM 的最佳实践指南。 它在以往文献和实践的基础上做出的贡献主要有两个方面:一是兼顾本质性和实操性,给出 GQM 的现代化理解,修正了以往认知和实践中的问题;二是从研发组织构建效能度量体系的现实需求出发,对 GQM 的形式进行规范和统一,亦有利于方法论的沉淀和共享。 你想要知道的关于 GQM 的一切都在这里。
基本原理
GQM 本质上是一种因果分析,通过追问合理的问题和进行统计分析实现。 例如,通过回答“缺陷有哪些可判定的类型”、“各类型的缺陷数量的怎样分布”等问题找到导致缺陷的主要原因。 与其他市场或产品等数据分析领域不同,在复杂的生产环境和软件开发过程中,利用对照实验判断影响因素或评价具体实践措施是不现实的。
GQM 的核心思想是通过问题来建立和表达有关研发的模型,解决了显式(数学)模型难以定义的困难,在严谨性和实用性之间找到了合理的平衡。 可以说,GQM 的精髓是一种提问的艺术。
目标
我们将目标定义标准化为如下四个要素。
对象:研发的过程(process)、产物(product)或资源(resource)中的一种。每种对象都可能存在层级结构。
维度:目标聚焦的角度或对象的属性。 参考认知域的划分,速度、质量、价值、成本、能力都可作为一种维度。 这是一个开放的集合,实际中目标可以有更细的维度。
目的:了解(understanding)、评价(evaluation)、改进(improvement)、控制(control)和预测(prediction)中的一种。
角色:组织中谁会关注该目标,通常为开发者(developer)、项目经理(project manager)、技术经理(tech lead)、高层管理者(executive)中的一个或多个。
组织中的目标体系,核心是按照对象、维度和目的三个要素组织,它们直接影响目标的定义。 而角色可以作为目标的一种标签,主要标记谁会关注该目标。
问题
问题是对模型的定义,该模型一方面是对目标及其各要素的拆解和刻画,另一方面为数据解读为目标提供框架和途径。
问题的设立会帮助我们根据数据分析目标进行数据收集,而不是先收集数据才发现遗漏或者无用功。 例如,开发者需要给事务打哪些标签,应考虑后续数据分析要回答的问题来进行设计。 缺失标签会降低数据质量,多余或混乱的标签会浪费研发团队的时间。
完备的参考问题列表,一方面方便实践者选择或裁剪,另一方面提供多种模型,可支持度量结果的交叉验证。
为了规范和简洁,参考问题可包含参数。 这些参数通常反映隐式模型的定义,实践中根据具体应用环境设定。 例如,需求多长时间交付的问题,可把需求交付的阶段划分(即交付过程的组成部分)作为参数。 实际应用时,当前项目采用的具体阶段划分,即是对该项目交付过程模型的一种具体定义。
当目标包含层级结构时,每一层目标都有与之对应的问题。问题可针对当前目标对象(即其整体和现状)提出,也可深入其组成部分、历史周期,或者与其他同类对象进行对比。 几种目的下,对应这几类范围的问题有一些典型的提问方式,可总结为表 5。

指标
指标的明确定义和规范化是解决问题描述可能存在的模糊和歧义的关键。
完备的参考指标列表,一方面方便实践者选择或裁剪,另一方面提供相关指标,可支持对问题更全面的理解。
为了规范和简洁,以指标为基础的各类统计,归入对应指标的分析方法,而不单列为另外的指标。 常见的分析方法有: