软件开发的指标和报告

33
最近我参与了一些关于软件开发指标的有趣讨论,特别是如何在一个相当大的组织中使用它们来帮助开发团队更好地工作。我知道有Stack Overflow的问题询问哪些指标是好的 - 比如这个,但我的问题更多是关于哪些指标对于哪些利益相关者以及在什么层次的聚合级别上有用。
例如,我的看法是代码覆盖率在以下方面是有用的(也许还有其他方面):
  • 与其他测量相结合时,供团队自身内部使用。
  • 用于促进/启用/辅导团队,在以团队为基础作为趋势考虑时可能是有教育意义的(例如,如果A和B团队本月的覆盖率分别为75和50,如果上个月他们的覆盖率分别为80和40,我会更加关注A团队而不是B团队)。
  • 在汇总多个团队或整个部门的统计数据时,向高级管理人员呈现。
但我认为在以团队为基础考虑时,这个指标对于高级管理层并没有用处,因为这会鼓励人为地试图通过测试来增加覆盖率,而不是真正地测试代码。
我所在的组织有几个管理层级,但其中绝大多数经理都有技术头脑和能力(其中许多人仍然深入实际)。一些开发团队正在带头推动敏捷开发实践,但其他一些团队落后,现在高层已经严令要求以这种方式工作。我们中的几个人正在启动一个计划来鼓励这种做法。在这样一个组织中,你认为哪些指标对于谁、为什么以及在什么聚合级别上有用?

我不希望人们觉得他们的绩效评估是基于他们可以人为影响的指标; 同时,高级管理层将需要某种证据表明进展正在取得。根据你自己组织的经验,你能提供什么建议或警告吗?

编辑

我们肯定希望将指标作为组织改进的工具,而不是个人绩效评估的工具。


值得注意的是,一般来说,软件开发人员的定义之一可能是当他们面对任意的绩效衡量标准时,他们会找到某种方式来操纵它。这通常并不是出于恶意,而只是开发人员思维中的一些东西,我们喜欢系统和找到巧妙的解决方法。 - Paddy
1
是的,确切地说。不仅仅是软件开发人员,在任何职业中,如果使用度量衡来衡量绩效,都会被操纵。看看英国国家医疗服务体系的目标吧...! - David M
这里有一些非常有用的答案,我几乎希望我能够分开奖赏。不过,我必须接受其中一个... - David M
10个回答

47

个人经验故事。对于长度的道歉。

几年前,我们的开发团队尝试为个人和团队领导者制定“适当”的可衡量目标。这个实验只持续了一年,因为硬指标并不适用于个人目标(有关此主题的一些链接和进一步讨论,请参见我的提问)。

请注意,我是一名团队领导者,并与我的技术主管和其他团队领导者一起规划了所有内容,因此这些目标并不是由无能的高层管理层所要求的——当时我们确实希望它们能够奏效。还值得注意的是,奖金结构意外地鼓励了开发人员之间的竞争。以下是我们尝试过的东西的观察。

客户可见问题

在我们的情况下,我们计算了我们向客户提供的服务中的故障次数。在一个收缩包装产品中,可能是客户报告的错误数量。

优点: 这是唯一真正可见于高层管理层的措施。它也是最客观的,因为被测量是在开发组之外。

缺点: 故障不多——整个年度每位开发人员只有大约一个故障——这意味着失败或超过目标取决于矛盾责备那些每个团队中发生的几次故障。这会导致矛盾和士气下降。

完成的工作量

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

缺点: “工作量完成”的度量基于开发人员提供的估计(通常是件好事),但将其纳入他们的目标鼓励了系统游戏以夸大估计值。我们没有其他可行的工作完成度量方式:我认为衡量生产力的唯一有价值的方式是“对公司底线的影响”,但大多数开发人员距离直接销售如此遥远,以至于这在个人层面上很少实用。

新生产代码中发现的缺陷

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

优点: 惊人地少。引入缺陷和其被发现之间的时间滞后意味着没有及时的反馈机制来改善缺点:由于这个目标只在发现缺陷并需要指责某人时才被调用,因此它过分关注了负面。开发人员不愿记录他们自己发现的缺陷,而简单的计数意味着轻微的错误和严重的问题一样糟糕。由于每个人的缺陷数量仍然相当低,所以轻微和严重的缺陷数量不会像在更大的样本中那样平衡。旧缺陷没有被包括在内,因此基于所有已发现错误的代码质量声誉(而非今年引入错误的可测量数量)并不总是匹配。

项目交付及时性:我们将及时性定义为按规定期限交付给内部 QA 团队的工作百分比。
优点:与计算缺陷不同,这是一个开发人员能够直接控制的度量,因为他们可以有效地决定何时完成工作。这个目标的存在使得人们集中精力完成任务。这有助于团队承诺适量的工作,并改善内部客户对开发组在兑现承诺方面的能力的印象。
缺点:作为唯一一个直接受到开发人员控制的目标,它被最大化,以牺牲代码质量:在截止日期当天,如果在说任务完成或进行进一步测试以提高其质量信心之间选择,开发人员会选择标记任务完成,并希望任何可能出现的错误永远不会浮出水面。
来自内部客户的投诉:为了评估开发人员在软件开发及其随后的支持过程中与内部客户交流的情况,我们决定记录每个个体收到的投诉数量。经理将验证投诉,以避免任何可能的报复行动。
优点:真的没有什么我可以回忆起来的。在足够大的团队级别上测量,它成为了一个更有用的“客户满意度”得分。
缺点:不仅非常负面,而且是一个主观的度量。与其他目标一样,每个个体的数字都接近于零点,这意味着一个人的单个评论可能意味着“无限超出”和“没有达到”的差距。
总的来说,虽然我们的任务管理工具包含了这些指标的许多数据,但在整合所有数据时仍涉及相当多的手动工作,这是一种繁琐的工作。花费时间获得所有数字的过程不仅令人不愉快,通常还侧重于我们工作的负面方面,并且可能无法通过提高生产力来回收。对于那些被指责问题的人,不仅是那些得分“差”的人会感到失落,而且那些得分“好”的人也会感到失落,因为他们不喜欢团队士气的损失,有时觉得自己排名较高并不是因为他们更优秀,而是因为他们更幸运。从这个情节中,我们学到了什么?后来的几年中,我们试图以“更柔和”的方式重新使用一些想法,其中对个人责任的强调较少,更多地关注于团队改进。
- 不要试图定义个人开发者的客观可衡量目标,这些目标能够为公司增加价值且不会被操纵,因此不要费力去尝试。 - 如果缺陷明确是团队的责任,并且没有必要玩“责备游戏”,则可以在更广泛的团队层面上计算客户问题和缺陷。 - 一旦您仅在代码模块的责任级别上测量缺陷计数,就可以(并且应该)测量旧缺陷以及新缺陷,因为消除所有缺陷符合该组的利益。 - 在团队层面上测量缺陷计数会增加每个团队的样本量,因此轻微和严重缺陷之间的异常情况得到平滑处理,并且简单的“错误数量”指标可能意味着一些东西,例如查看是否正在每月改进。 - 包含一些上级管理关心的内容,因为让他们满意是开发组的首要任务。在我们的情况下,这些内容是客户可见的停机时间,因此即使度量有时是任意的或看似不公平的,如果这是老板在衡量的内容,那么您也需要注意。 - 上级管理不需要看到他们自己目标中没有的指标。这样可以避免责备个人的诱惑。 - 测量项目交付及时性确实改变了开发者的行为,并关注完成任务。它提高了评估能力,并使团队能够做出现实承诺。如果容易收集及时性信息,那么我会考虑再次在团队层面上使用它以测量随时间的改进情况。
所有这些都不能帮助您设置个人开发者的可衡量目标,但希望这些想法对团队改进更有用。

1
嘿,不要为它的长度道歉。非常感谢! - David M
3
谢谢!+1代表终身智慧的浓缩,我希望我能给你+2。 - Chris Huang-Leaver

19
关于指标的关键是知道你在使用它们做什么。你是将其作为改进工具、奖励工具、惩罚工具等。听起来你计划将其用作改进工具。
制定指标的首要原则是保持信息的相关性,这样接收信息的人可以用它来做出决策。最高级别的管理者可能无法决定是否需要更多的测试、更少的复杂度等微观层面的事情。但团队领导可以做到这一点。
因此,我认为代码覆盖率的衡量对于个体团队之外的管理层并不会有用。在宏观水平上,组织可能关心:
成本交付
交付及时性
交付范围和外部质量
内部质量不会成为他们需要涵盖的重点内容。开发团队的使命是使内部质量(可维护性、测试覆盖率、自说明的代码等)成为实现其他三项任务的关键因素。
因此,你应该针对更高级别的管理者制定指标,涵盖这三个方面,例如:
整体速度(注意,比较不同团队之间的速度往往是虚假的)
按预期交付的范围与时间表与实际交付的范围进行比较
产品缺陷数量(可能以人均计算)
在团队层面上衡量代码覆盖率、代码复杂度、剪切和粘贴分数(使用flay或类似工具的代码重复),方法长度等,这些指标可以真正对接收信息的人产生影响。

是的,测量的动机绝对是为了改进而不是奖励或惩罚。在我接受这个角色之前,我就坚持这一点了。 - David M
这是一个很好的答案 - 不过我希望能得到更多不同的回复,所以你如果我开启悬赏模式也不要生气哦。 - David M
@mopoke - 当第一个人如此彻底时就会发生这种情况... ;) - David M
不要把长度误认为彻底性 :-) - mopoke

4
一个度量标准是回答有关项目、团队或公司问题的一种方法。在开始寻找答案之前,您需要决定要问什么问题。
典型的问题包括:
- 我们的代码质量如何? - 质量是在改善还是恶化? - 团队的生产力如何?是否在改善或恶化? - 我们的测试有效吗? - …等等。
每个问题都需要不同的度量标准来回答。在不知道想要回答的问题的情况下收集指标最多只是浪费时间,最坏的情况是适得其反。
您还需要注意到有一个“不确定性原理”在起作用——除非您非常小心,否则收集度量标准的行为会改变人们的行为,通常是以意想不到的甚至有害的方式。特别是如果人们认为他们正在根据度量标准进行评估,更糟糕的是将度量标准与某些奖励或惩罚计划联系起来。
我建议阅读杰拉尔德·温伯格的《优质软件管理第2卷:一级测量》。他在软件度量方面深入探讨,但表示最重要的常常是他所称之为“零阶测量”的东西——询问人们对一个项目的看法。该系列的所有四卷都价格昂贵、难以获取,但非常值得阅读。

4

软件编写

  • 什么需要优化?

CPU使用率,内存使用率,内存缓存使用率,用户时间使用率,运行时代码大小,运行时数据大小,图形性能,文件访问性能,网络访问性能,带宽使用率,代码简洁性和可读性,电力使用量,使用的不同API调用数量,使用的不同方法和算法数量,可能还有其他方面。

  • 需要优化多少?

必须进行最小合理的优化(除了在超过验收测试标准是必要的领域),以通过验收测试,便于维护、审核和满足用户需求。

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

  • 为什么是最小合理的优化?

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

  • 需要什么样的领导力?

编码规范、基本结构、验收标准以及所需优化水平的指导。

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

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

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

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

但这些成本/时间应包含在评估团队(包括架构师、经理)的总体表现中。

如何衡量架构师的成功?

其他指标加上:

  • “避免过早”实施是否受到平台/工具缺陷的影响的情况
  • 架构变更的缺乏程度

2
如我在什么是代码度量的魅力?中所说,度量包括:
  • 不同的人群,意味着开发者和管理者的关注范围不同。
  • 趋势,这意味着任何度量本身都是没有意义的,除非有与之相关的趋势,以便决定是否采取行动或忽略它。

我们正在使用一种能够提供以下内容的工具:

  • 大量的微观层面度量(对开发者很有趣),并且具有趋势。
  • 许多规则具有多级别(UI、数据、代码)静态分析能力。
  • 大量的汇总规则(意味着这些大量的度量被压缩成几个适合更高层次人群的领域)。

结果是可以从高层汇总领域(安全、架构、实践、文档等)一直深入到某行代码的分析。

目前的反馈是:

项目经理在某些规则没有被遵守时很容易变得防御,并使他们的总体评分显著降低。每项研究都必须重新调整以尊重每个项目的怪癖。好处是定义了一个合同,其中承认了异常情况,但也定义了必须遵守的规则。
更高层次(IT部门、利益相关者)将全局注释仅用作其评估进展的一个元素。实际上,他们将更仔细地查看基于交付周期的其他元素:我们能够多频繁地迭代并将应用程序投入生产?在发布之前,我们需要解决多少错误?(在合并方面或未正确设置预生产环境方面),新应用程序版本的立即反馈会生成什么?
因此:
哪些指标对哪些利益相关者有用,以及在什么层次上进行聚合
在高层次上:
  • 静态分析指标实际上是低级别指标聚合的结果,并按领域组织。
  • 其他指标(更加“操作导向”,基于应用程序的发布周期,而不仅仅是代码的静态分析)也会被考虑进去。
  • 实际的投资回报是通过其他行动(例如six-sigma研究)实现的。

在较低层面:

  • 静态分析足够了(但必须包括多级应用程序,有时还涉及多语言开发)。
  • 行动由趋势和重要性进行引导。
  • 研究必须获得所有层次的层级的批准/支持才能被接受/执行(特别是,后续重构的预算必须得到验证)。

2
如果您有一些精益背景/知识,那么我建议采用玛丽·波彭迪克推荐的系统(我已经在这个之前的回答中提到过)。这个系统基于三个整体度量,必须作为一个整体来考虑:
  1. 周期时间
    • 从产品概念到第一次发布或
    • 从功能请求到功能部署或
    • 从错误检测到解决
  2. 业务案例实现(如果没有这个,其他所有都是无关紧要的
    • P&L或
    • ROI或
    • 投资目标
  3. 客户满意度
聚合级别是产品/项目级别,我相信这些指标对于每个人都很有帮助(开发人员永远不应该忘记他们写代码不是为了好玩,而是为了创造价值,并且应该始终记住这一点)。
团队可能会(实际上也确实会)使用技术指标来衡量质量标准的符合性,这些指标已经集成在“完成定义”中(作为“技术债务不增加”的条件)。但高质量并不是一个自我目标,它只是实现短周期时间(成为一个快速的公司)的手段,这才是真正的目标(与业务案例实现和客户满意度一起)。

2
这是主题问题的一个侧面,请容许我提供一个类似的经验分享。其中一个需要补充的是关于数据收集和指标可视性。
在我们的情况下,开发主管应该从各种不同的系统中汇总大量数据,并每月分发个人度量结果。但由于这是一项耗时的工作,而他又十分忙碌,因此通常不会这样做。
这样会导致以下问题:
  1. 开发人员不满意,因为绩效奖金是基于指标计算的,而人们不知道自己的表现如何。

  2. 一些数据需要输入到不同的系统中,非常耗时。

如果您选择这条路,请确保所有指标数据都可以自动汇总,并且易于被影响的人看到。

1

目前正受到一些热捧的有一个有趣的方法是看板。它相当敏捷。特别有趣的是,它允许应用“完成的工作”指标。我还没有在实际实践中使用/遇到过这个,但我希望在我的工作中朝着建立类似看板流程的方向努力。


我从关于精益流程的书籍中了解了看板卡。不过还值得进一步阅读。谢谢。 - David M
看板非常灵活,真正让你有能力定义自己的流程,并且有坚实的基础。我绝对推荐这篇介绍看板的优秀论文:http://blog.crisp.se/henrikkniberg/2009/04/03/1238795520000.html - mopoke

1

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

就代码特定指标而言,我认为团队了解当前代码状态以及随着其成熟和发展而受到影响的趋势是很好的。

问题显然不集中在.NET上,但我认为.NET产品NDepend已经做了很多工作来定义和记录有用的常见指标。

指标文档部分是有教育意义的阅读,即使你没有使用.NET。


谢谢John。我已经熟悉了NDepend - 我自己的团队在这个组织中是.NET团队,但整个部门混合使用,可能Java比.NET稍微多一点。 - David M

1

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

当我们测量、分析和解释一系列度量标准时,我们是在对已经出现的问题做出反应,或者极少数情况下,对已经成功的事情做出反应。我不想低估从客观度量标准中学习的重要性,但我想指出的是,这是一种被动而非主动的响应。

开发一个“信心指数”可能是监测项目是否在正轨或走向麻烦的更好方法。尝试开发一个投票系统,要求每个感兴趣的项目领域的合理代表匿名投票他们的信心水平。信心分为两个方面:1)事情正在按计划进行;2)事情将继续按计划进行或重新回到正轨。这些都是来自最接近“行动”的人的纯主观测量。
将结果输入到看板类型的图表中,其中列代表投票区域,您应该有一个相当好的想法,应该关注哪些方面。使用问题1来评估管理层是否适当地对先前的投票周期做出反应。使用问题2来确定管理层下一步应该关注哪些方面。
这个想法基于我们每个人在自己的责任范围内都有一个舒适水平。我们的信心水平是经验、专业领域内的知识、我们面临的问题数量和严重程度、完成任务的时间、我们正在处理的信息质量以及许多其他因素的产物。
MBWA(四处走动管理)通常被誉为我们拥有的最有效的工具之一 - 这是它的一个变体。

这种技术在个人团队层面上并没有太多用处,因为它只反映了团队的总体情绪。有点像用别人的手表告诉他们时间。然而,在更高层次的管理中,它应该是相当有信息量的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接