33

最近我就软件开发指标进行了一些有趣的对话,特别是如何在相当大的组织中使用它们来帮助开发团队更好地工作。我知道有关于哪些指标好用的 Stack Overflow 问题 - 就像这个一样,但我的问题更多是关于哪些指标对哪些利益相关者有用,以及在什么级别的聚合

举个例子,我的观点是代码覆盖率是一个有用的指标,有以下几种方式(也许还有其他方式):

  • 与其他测量相结合时,供团队内部使用。
  • 对于促进/支持/指导团队,在逐个团队考虑作为一种趋势时可能具有指导意义(例如,如果团队 A 和 B 本月覆盖 75 和 50,我会更关心团队如果上个月他们有 80 和 40,则 A 比 B)。
  • 当作为跨多个团队或整个部门的汇总统计数据呈现时,适用于高级管理人员。

但我认为高级管理层逐个团队地看待这一点没有用处,因为这鼓励人为地尝试通过仅执行而不是测试代码的测试来增强覆盖率。

我在一个管理层次结构中有几个级别的组织中,但是绝大多数经理在技术上都具有头脑和能力(许多人仍然手忙脚乱)。一些开发团队在推动敏捷开发实践方面处于领先地位,但其他开发团队则滞后,现在来自最高层的一项严肃要求是,这就是组织的工作方式。我们中的一些人正在启动一个计划来鼓励这一点。在这种组织中,您认为哪些指标有用,对谁有用,为什么有用,在什么聚合级别上有用?

我不希望人们觉得他们的表现是根据他们可以人为影响的指标来评估的;与此同时,高级管理层将需要某种证据来证明正在取得进展。根据您自己组织的经验,您可以提供哪些建议或注意事项?

编辑

我们绝对希望将指标用作组织改进的工具,而不是个人绩效衡量的工具。

4

10 回答 10

47

一个亲身经历的故事。 为篇幅道歉。

几年前,我们的开发小组尝试为个人和团队领导设定“适当的”可衡量的目标。实验只持续了一年,因为硬指标对于个人目标并不是很有效(请参阅我关于该主题的问题以获取一些链接和进一步讨论)。

请注意,我是一名团队负责人,并与我的技术老板和其他团队负责人一起参与计划,所以目标不是由无知的高层管理人员从高层决定的——当时我们真的希望他们发挥作用. 还值得注意的是,奖金结构无意中鼓励了开发人员之间的竞争。以下是我对我们尝试过的事情的观察。

客户可见的问题

在我们的案例中,我们计算了我们为客户提供的服务的中断。在收缩包装的产品中,它可能是客户报告的错误数量。

优点:这是对高层管理人员可见的唯一真正措施。它也是最客观的,在开发组之外进行测量。

缺点:没有那么多中断——每个开发人员一整年大约只有一次——这意味着失败或超过目标是每个团队确实发生的少数中断“归咎于”的问题。这导致了不好的感觉和士气的丧失。

完成的工作量

优点:这是唯一的积极措施。其他一切都是“当坏事发生时我们会注意到”,这令人沮丧。它的包含也是必要的,因为没有它,一个全年无所事事的开发人员将超过所有其他目标,这显然不符合公司的利益。测量完成的工作量检查了开发人员在估计任务大小时的自然乐观情绪,这很有用。

缺点: “已完成工作”的衡量标准是基于开发人员自己提供的估计(通常是一件好事),但将其作为他们目标的一部分会鼓励系统博弈以夸大估计。我们没有其他可行的衡量已完成工作的方法:我认为衡量生产力的唯一可能有价值的方法是“对公司底线的影响”,但大多数开发人员都远离直销,这在个人层面上很少实用。

在新的生产代码中发现缺陷

我们衡量了这一年引入新生产代码的缺陷,因为认为前几年的错误不应计入今年目标中的任何个人。内部质量团队发现的缺陷即使不影响客户也被计入计数。

优点:出奇地少。引入缺陷和发现缺陷之间的时间差意味着实际上没有立即反馈机制来提高代码质量。团队层面的宏观趋势更有用。

缺点:过于关注负面因素,因为只有在发现缺陷并且我们需要有人为此负责时才会调用此目标。开发人员不愿意记录他们发现的缺陷,简单的计数意味着小错误与严重问题一样糟糕。由于每个人的缺陷数量仍然很低,轻微和严重缺陷的数量并没有像更大的样本那样均匀。旧缺陷不包括在内,因此该小组在代码质量方面的声誉(基于发现的所有错误)并不总是与今年引入的可衡量数量相匹配。

项目交付的及时性

我们将及时性衡量为在规定的截止日期前交付给内部 QA 团队的工作的百分比。

优点:与计算缺陷不同,这是一项由开发人员直接直接控制的措施,因为他们有效地决定了工作何时完成。目标的存在将注意力集中在完成任务上。这有助于团队投入实际的工作量,并提高内部客户对开发组兑现承诺能力的看法。

缺点:作为开发人员直接控制的唯一目标,它以牺牲代码质量为代价最大化:在截止日期的那天,如果选择说任务完成或进行进一步测试以提高对其质量的信心,开发人员会选择将其标记为完成,并希望任何由此产生的错误永远不会浮出水面。

来自内部客户的投诉

为了衡量开发人员在软件开发和后续支持期间与内部客户的沟通情况,我们决定记录收到的关于每个人的投诉数量。投诉将由经理验证,以避免任何可能的报复行为。

优点:我真的什么都想不起来了。在足够大的群体水平上衡量,它成为更有用的“客户满意度”分数。

缺点:不仅是高度消极的,而且是主观的衡量标准。与其他目标一样,每个人的数字都在零分附近,这意味着对某人的单个评论可能意味着“无限超过”和“未达到”之间的差异。

普通的留言

官僚主义:虽然我们的任务管理工具保存了这些指标的大部分数据,但仍然需要大量的人工来整理这些数据。获得所有数字所花费的时间并不愉快,通常集中在我们工作的负面方面,甚至可能没有通过提高生产力来回收。

士气:对于那些将问题归咎于个人的措施,不仅那些得分“差”的人感到士气低落,而且得分“好”的人也感到士气低落,因为他们不喜欢团队士气的损失,有时会觉得他们是排名更高不是因为他们更好,而是因为他们更幸运。

概括

那么我们从这一集中学到了什么?在后来的几年里,我们试图以一种“更温和”的方式重用一些想法,减少对个人责任的强调,而更多地强调团队的改进。

  • 不可能为个别开发人员定义客观可衡量的目标,为公司增加价值并且不能被游戏,所以不要费心去尝试。
  • 客户问题和缺陷可以在更广泛的团队级别计算,如果缺陷的位置明确是该团队的责任——也就是说,你不必玩“责备游戏”。
  • 一旦您仅在代码模块的责任级别上衡量缺陷,您就可以(并且应该)衡量旧错误和新错误,因为消除所有缺陷符合该团队的利益。
  • 在组级别测量缺陷计数会增加每组的样本量,因此可以消除轻微缺陷和严重缺陷之间的异常,并且简单的“错误数量”测量可能意味着一些事情,例如查看您是否在逐月改进月。
  • 包括高层管理人员关心的事情,因为让他们开心是您作为开发团队的主要目的。在我们的案例中,这是客户可见的中断,所以即使测量有时是武断的或看似不公平的,如果这是老板正在测量的,那么你也需要注意。
  • 高层管理人员不需要查看他们在自己的目标中没有的指标。这样就避免了将错误归咎于个人的诱惑。
  • 衡量项目交付的及时性确实改变了开发人员的行为,并将重点放在完成任务上。它改进了估计并允许小组做出现实的承诺。如果收集及时性信息很容易,那么我会考虑在团队级别再次使用它来衡量随时间的改进。

当您需要为单个开发人员设定可衡量的目标时,所有这些都无济于事,但希望这些想法对团队改进更有用。

于 2010-01-13T15:06:36.827 回答
19

指标的关键在于了解您使用它们的目的。您是否将它们用作改进的工具、奖励的工具、惩罚的工具等。听起来您正计划将它们用作改进的工具。

设置指标时的首要原则是保持信息的相关性,以便接收信息的人可以使用它来做出决定。高级经理很可能无法从微观层面决定您是否需要更多的测试、更少的复杂性等。但是团队领导可以做到这一点。

因此,我认为代码覆盖率的衡量标准不会对单个团队之外的管理有用。在宏观层面,该组织可能对以下方面感兴趣:

  • 交货成本
  • 交货及时性
  • 交货范围和外部质量

内部质量在他们要掩盖的事情清单上不会很高。开发团队的任务是明确内部质量(可维护性、测试覆盖率、自记录代码等)是实现其他三项的关键因素。

因此,您应该将指标定位于涵盖这三个方面的更高级管理人员,例如:

  • 总体速度(请注意,比较团队之间的速度通常是人为的)
  • 按约定时间交付的预期与实际范围
  • 生产缺陷数量(可能是人均)

并在团队级别测量代码覆盖率、代码复杂性、剪切'n'粘贴分数(使用 flay 或类似的代码重复)、方法长度等,在这些信息的接收者可以真正发挥作用的团队级别。

于 2010-01-06T20:35:42.213 回答
4

软件写作

  • 必须优化什么?

CPU 使用、内存使用、内存缓存使用、用户时间使用、运行时代码大小、运行时数据大小、图形性能、文件访问性能、网络访问性能、带宽使用,代码简洁性和可读性,电力使用,使用的不同 API 调用的(计数),使用的不同方法和算法的(计数),也许更多。

  • 必须优化多少?

必须将其优化到通过验收测试、便于维护、便于审核和满足用户要求所需的最小合理量(在需要超过验收测试标准的区域除外)。

(“......对于所有当前和未来测试集成场景的所有所需测试数据量和测试请求量的所有测试状态中的合法/非法输入测试数据和合法/非法测试事件。”)

  • 为什么是最低合理金额?

因为优化的代码更难编写,因此成本更高。

  • 需要什么样的领导?

所需的编码标准、基本结构、验收标准和优化水平指南。

如何衡量软件编写的成功?

  • 成本
  • 时间
  • 验收测试通过
  • 期望超过的验收测试被超过的程度
  • 用户认可
  • 易于维护
  • 易于审核
  • 没有过度优化的程度

在评估程序员的总体表现时应该忽略哪些成本/时间?

  • 由于需求(包括架构)更改而浪费的成本/时间
  • 由于平台/工具的缺陷而产生的额外成本/时间

但是这个成本/时间应该包括在评估团队(包括架构师、经理)的总体绩效中。

如何衡量建筑师的成功?

其他措施加上:

  • 受平台/工具缺陷影响的“提早回避”实例
  • 建筑没有变化的程度
于 2010-01-13T00:22:54.130 回答
4

指标是回答有关项目、团队或公司的问题的一种方式。在你开始寻找答案之前,你需要决定你想问什么问题。

典型问题包括:

  • 我们的代码质量如何?

  • 随着时间的推移,质量会提高还是下降?

  • 团队的生产力如何?是改善还是退化?

  • 我们的测试效果如何?

  • ...等等。

每个问题都需要一组不同的指标来回答。在不知道要回答什么问题的情况下收集指标充其量是在浪费时间,在最坏的情况下会适得其反。

您还需要注意,有一个“不确定性原则”在起作用——除非您非常小心,否则收集指标的行为会改变人们的行为,通常以意想不到的方式,有时甚至是有害的方式。如果人们认为他们正在根据指标进行评估,或者更糟糕的是指标仍然与某些奖励或惩罚计划相关联,则尤其如此。

我推荐阅读 Gerald Weinberg 的Quality Software Management Vol 2: First Order Measurement。他详细介绍了软件指标,但表示最重要的通常是他所谓的“零阶测量”——询问人们对项目进展情况的看法。该系列的所有四卷都很昂贵且难以掌握,但非常值得。

于 2010-01-12T08:48:27.497 回答
2

正如我在什么是代码指标的魅力中所说的那样?,指标包括:

  • 不同的人群,意味着开发人员或经理的兴趣范围不一样
  • 趋势意味着如果没有相关趋势,任何指标本身都是毫无意义的,以便做出对它采取行动或忽略它的决定。

我们使用的工具能够提供:

  • 许多微观级别的指标(对开发人员来说很有趣),带有趋势。
  • 许多具有多级(UI、数据、代码)静态分析功能的规则
  • 大量的聚合规则(意味着这些大量的指标被浓缩在几个感兴趣的领域,足以满足更高层次的人群)

结果是可以从高级聚合(安全性、架构、实践、文档……)一直到某些代码行的深入分析。

目前的反馈是:

  • 当某些规则不被遵守时,项目经理会很快采取防御措施,从而显着降低他们的全球关注度。
    每项研究都必须重新调整以尊重每个项目的怪癖。
    好处是定义了合同,其中承认例外但定义了要遵守的规则。
  • 更高级别(IT 部门、利益相关者)使用全局注释作为他们评估所取得进展的要素之一。
    他们实际上会根据交付周期更仔细地研究其他元素:我们能够多久迭代一次应用程序并将其投入生产?在发布之前我们必须解决多少错误?(就合并而言,或就未正确设置的预生产环境而言),应用程序的新版本会生成哪些即时反馈?

所以:

哪些指标对哪些利益相关者有用,以及在什么级别的聚合

高水平:

  • (静态分析)指标实际上是低级指标聚合的结果,并按域组织。
  • 其他指标(更“面向操作”,基于应用程序的发布周期,而不仅仅是代码的静态分析)被考虑在内
  • 实际的投资回报率是通过其他行动实现的(如六西格玛研究)

在较低级别:

  • 静态分析就足够了(但必须包含多层应用程序,有时需要多语言开发)
  • 这些行动以趋势和重要性为先导
  • 该研究必须得到所有层级的批准/支持才能被接受/采取行动(特别是,必须验证随后重构的预算)
于 2010-01-11T08:36:39.240 回答
2

这是主要问题的一个旁注,但我的经历与上面的 Paul Stephensons 回答非常相似。我要补充的一件事是关于数据的收集和指标的可见性。

在我们的案例中,开发主管的目的是整理来自各种不同系统的大量数据,并每月分发一次单独的指标结果。这通常不会发生,因为这是一项耗时的工作,而且他很忙。

结果是:

  1. 不满意的开发人员,因为绩效奖金是基于指标的,人们不知道他们的进展如何。

  2. 将数据多次输入到各种不同的系统中会耗费一些时间。

如果您走这条路,您需要确保所有指标数据都可以自动整理,并且对其影响的人很容易看到。

于 2010-01-14T12:16:18.607 回答
2

如果您有一些精益背景/知识,那么我会建议 Mary Poppendieck推荐的系统(我已经在上一个答案中提到过)。该系统基于必须作为一个整体进行的三个整体测量:

  1. 周期
    • 从产品概念到首次发布或
    • 从功能请求到功能部署或
    • 从错误检测到解决
  2. 商业案例实现(没有这个,其他一切都无关紧要
    • 损益或
    • 投资回报率或
    • 投资目标
  3. 顾客满意度

聚合级别是产品/项目级别,我相信这些指标对每个人都有帮助(开发人员永远不应忘记他们编写代码不是为了好玩,他们编写代码是为了创造价值,并且应该始终牢记这一点)。

团队可能(并且实际上确实)使用技术指标来衡量集成在完成定义中的质量标准一致性(如“不增加技术债务”)。但高质量本身并不是目的,它只是实现短周期(成为一家快速的公司)的手段,这是真正的目标(业务案例实现和客户满意度)。

于 2010-01-12T00:05:19.040 回答
1

目前得到一些炒作的有趣方法之一是看板。它相当敏捷。特别有趣的是,它允许应用“已完成工作”的度量。我还没有在实际实践中使用/遇到过这个,但我想努力让看板式的流程在我的工作中进行。

于 2010-01-08T20:47:56.117 回答
1

软件指标已经存在了很长时间,据我所知,到目前为止,没有任何单独或整体出现能够在开发过程中指导项目的指标。问题的关键在于我们想要使用客观的衡量标准,而这些衡量标准只能衡量已经发生的事情,而不是正在发生或即将发生的事情。

当我们测量、分析和解释一系列指标时,我们正在对已经出错或偶尔出错的事情做出反应。我不想低估从客观指标中学习的重要性,但我想指出这是一种被动而非主动的反应。

制定“信心指数”可能是监测项目是否步入正轨或陷入困境的更好方法。尝试开发一个投票系统,要求来自每个感兴趣的项目领域的合理数量的代表不时匿名投票他们的信任。信心在两个方面进行投票:1)事情在轨道上 2)事情将继续在轨道上或回到轨道上。这些纯粹是来自最接近“行动”的人的主观测量。将结果输入到看板类型图表中,其中的列代表投票区域,您应该非常清楚将注意力集中在哪里。使用问题 1 来评估管理层是否对上一个投票周期做出了适当的反应。使用问题 2 来确定管理层接下来应该关注的地方。

这个想法是基于我们每个人在我们自己的责任范围内都有一个舒适的水平。我们的信心水平是经验的产物,我们专业领域内的知识,我们面临的问题的数量和严重程度,我们完成任务的时间,我们正在使用的信息的质量以及一大堆的其他因素。

MBWA(走动管理)经常被吹捧为我们拥有的最有效的工具之一——这是它的一种变体。

这种技术在单个团队的层面上用处不大,因为它只反映了团队的总体情绪。有点像用某人的手表告诉他们时间。但是,在更高级别的管理中,它应该提供很多信息。

于 2010-01-13T17:38:12.120 回答
1

有趣的是,我刚读完PeopleWare,作者强烈反对让上级(甚至是直接经理)看到单个指标,但聚合指标应该非常明显。

就代码特定指标而言,我认为团队最好了解当前代码的状态,并了解随着代码的成熟和增长而影响代码的趋势。

这个问题显然不是针对 .NET,但我认为 .NET 产品NDepend已经做了很多工作来定义和记录有用的常用指标。

度量标准的文档部分是教育阅读,即使您不使用 .NET。

于 2010-01-13T03:13:52.983 回答