InfoQ

新闻

讨论:衡量程序员的工作效率

作者 Sadek Drobi译者 郑柯 发布于 2008年10月10日 上午8时58分

社区
Architecture
主题
编程,
人力资源
标签
质量,
生产力

与其他领域一样,在软件开发领域中,管理者需要评估程序员的绩效和项目的进度。然而,如何定义恰如其分的评价体系,很令人挠头。

计算代码行数(source lines of code, SLOC)是最常用的方式之一。不过,最近Shahar YairSteve McConnell指出了该方法的一系列重要缺陷。首先,使用代码行数之和无法有效评估一个项目的实际进度,因为它更注重行为而不是结果。最终产品在多大程度上依赖于代码的性能和质量,这也是代码行数无法说明的。因此,聚焦于此实际上是非常有限的工作效率测量方式。

SLOC无法表明要解决的问题的复杂性,也不能以可维护性、灵活性、扩展性等等因素来说明最终产品的质量。说到质量,它反而可能起到负面作用。通过重构、使用设计模式会减少代码行数,同时提升代码质量。代码量大,可能意味着有更多不必要的代码、更高不必要的复杂性、更加僵化难懂。

更危险的是,要用这样一种不完整的视角来评价开发人员的绩效,会起到错误的激励作用。开发人员会因此更注重代码的数量,而不顾其对产品质量的损害,也不会从最终产品的角度考虑去优化他们的工作,他们甚至可能有意编写更多冗长无益的代码。“测量什么,就得到什么”,Steve McConnel回忆。

他指出,有些问题可以通过测量度量功能点数解决掉。那么决定程序大小的因素就变成了输入、输出、查询和文件的数目。不过这种方式也有其缺陷。McConnell提出一些操作性上的问题,比如必须要有一个大家认可的功能点测量机制,而且要想把每个功能点映射到程序员身上也不容易。Daniel Yokomizo是一位经过认证的功能点专家,他在评论中明确指出了这种方式的其他问题:缺少测量功能点复杂度的工具;还需要考虑诸如代码共享、框架、程序库之类的事情。这些都会影响到完成一个功能的时间。

有很多人参与了对于测量方式的讨论,他们都同意这些做法有其局限,不过他们都觉得衡量开发人员的绩效还是有必要的。实际上,不少人认为SLOC可以作为基础,在其之上通过考虑多种不同因素来进行更复杂的分析。McConnell提出了四条分析开发人员工作效率的必备指导原则,他们也都同意。这四条原则如下:

  1. 不要指望单一维度的工作效率测量方式能告诉你每个人的真实情况。
  2. 不要指望任何测量方式可以在很小的粒度上区分出每个人的工作效率差异。这些方式可以为你提出问题,却不会告诉你答案。
  3. 牢记:趋势总是比单独一点的测量来得重要。
  4. 问问你自己:为什么要测量个人的工作效率?

测量开发人员的工作效率在什么样的上下文中才是有意义的?有哪些条件?这些条件该如何组合?许多问题仍没有答案。如果你有过类似经验可以分享,请不要犹豫。

查看英文原文:Opinions: Measuring Programmers’Productivity


在InfoQ英文站新闻的后面,大家就测量开发人员工作效率的话题展开热烈的讨论。Bruce Rennie指出:
我为什么要关注开发人员的工作效率?……这种测量开发人员工作效率的想法是从哪里冒出来的?……如果从团队的角度来看,就让人更迷糊了。在一个团队中,从个人层面进行测量和优化,这感觉好像没有考虑约束理论的因素。应该测量和优化整体的有效产出。最后一个问题:测量一个失败项目的工作效率有任何意义吗?
John Reynolds指出:
测量一个团队的下列指标更有意义:实际开发时间和预估时间,返工以及修复bug的时间与实际开发时间,客户满意度与反馈调查。
Mark Levison明确说明: 危险,这会毁掉团队!
如果测量个人的绩效,这就等于是在摧毁团队。如果我知道人家在测量我的代码开发速度,下面这些事情我就永远不会做了:
  • 参加规划和回顾会议
  • 指导初级团队成员
  • 结对编程
  • 代码复查
  • 简化代码、去除荣誉,任何可能减少我的功能点数的行为
  • 除创建功能点之外的其他任何事情
而且,我会搞清楚功能点到底是什么,然后学着编写可以将功能点数最大化的代码。

随便找一种测量方式,我都可以告诉你它是如何毁掉团队的。我推荐将注意力放在产出上。
对于Mark Levison的说法,John Jimenez提出:
我相信你身处一个能力很强、产出很高的团队中。但是,如果你的团队不能按时完成任务或者表现不佳呢?我想你需要历史数据(或者类似的东西)来发现哪些成员表现不好。要是不这么做,就会有人怪罪管理层对有些比较偏心,甚至可能会有更坏的情况。在理想的企业文化中,人们希望可以在同事之间互相公平竞争、彼此评价,。然而,如果现状并非如此,管理层就应该努力制造类似的氛围,而对工作效率的测量就变得至关重要了。
Mark Levison给出了自己的回答:
问题在于这种“工作效率低下”确实是问题么?还是意味着别的什么?要是衡量我在团队的工作效率,那一定不高。因为我充当了mentor的角色,我帮助审查了很多代码,而且总是在重构,并试图改进团队的运作机制。我所在的团队中,代码质量在不断上升。那你说我的效率高不高?这种测量有意义么?

最重要的,是团队的产出,而且他们可以一起快乐工作。如果团队在产生高质量、通过测试、而且简单的代码,那他们的工作效率又有什么关系?如果他们很高兴,就算有人只是充当胶水的角色,又待如何?

当我充当教练角色的时候,我鼓励管理层为团队设定目标,再看他们能否达成这些目标。任何个人层面上的测量都会破坏团队层面来之不易的成果。
Zachary Shaw指出:
我同意考核绩效会造成负面影响,但如果测量大家关心的指标,比如代码覆盖率、测试编写数目、移除警告数目、成功构建次数等这些数据,这样的测量就会有正面效应。……让团队同意对他们的某些工作进行测量,这也是很重要的。如果团队买你的账,那就能带来健康的竞争。
Zachary Shaw还建议大家去尝试Hudson游戏
我们已经开始玩“Hudson持续集成游戏了。……基本的要点在于,你会根据自己签入的代码得到或丢失分数。签入次数越多,测试编写越多,去掉的TODO和警告越多,你就能得到越高的分数。“测量什么,就得到什么”,确实是这样,自打我们玩了这个游戏之后,警告不见了,测试更多了,人们签入代码也更加频繁了。……
Mark Levison又说:
我真正担心的,是把工资、奖金之类跟个人的测量结果挂钩。可以去http://gojko.net/2008/08/07/paying-programmers-are-bonuses-bad-and-what-to-do-about-it/看看这两者之间的关系。

我很熟悉Hudson,而且觉得它也是提升质量一种很好的方式,只要信息能够限制在团队内部就可以。如果团队对其过于认真,或是有管理层介入,那我就会开始担心了。
最后,Robert Merrill指出:要知道测量的原因,而且不要造成混乱。他说:

我在一个小型(15-20个人)项目工作室中进行测量活动已经5年多了。我们的测量只有一个原因:在给客户的提案中给出项目估算。我们通过两种方式估算,一种是敏捷式的规划游戏,另一种使用功能点数分析(我在2002-2005年期间是认证功能点专家[CFPS])。我计算每个项目,并根据时间记录算出每个功能点所耗小时数。

要估算的时候,我会根据需求和项目的历史来预测每个功能点所耗小时数。这样一个独立的估算方式很有帮助。在面临客户压力时,这比完全主观的方式要更有效。(用功能点分析也可以发现需求缺口。)

为了不造成混乱(即使组织中互相的信任程度已经相当高了),我是唯一可以读取项目历史的人。除了总结报告之外,管理层看不到详细的数据。

测量机制是放大器。它会使得内部信程度高的组织更有成效,而信任程度低的组织则会变得更加孱弱不堪。

2 条回复

回复

英文站的讨论很不错啊 发表人 Yi Xu 发表于 2008年10月14日 上午3时27分
很实际,也很痛苦 发表人 中华 关 发表于 2008年10月15日 上午2时15分
  1. 返回顶部

    英文站的讨论很不错啊

    2008年10月14日 上午3时27分 发表人 Yi Xu

    我的看法和“我真正担心的,是把工资、奖金之类跟个人的测量结果挂钩。”一致嘛。

  2. 返回顶部

    很实际,也很痛苦

    2008年10月15日 上午2时15分 发表人 中华 关

    恩,软件开发组的绩效考核的确是一件头疼的事情! 而公司中的人力资源部似乎并没有进一步完善考核的意思,没有专业的有针对的考核就更痛苦了!

独家内容

应用JSF、Ajax和Seam开发Portlets(1/3)

本文主要讲述了如何用JBoss Portlet Container 和JBoss Portlet Bridge创建新项目,怎样配置一个JSF应用去使用JBoss Portlet Bridge,以及JBoss Portlet Bridge所具备的功能。

AtomServer:数据分发的发布动力(第二部分)

在这篇文章里,Bryon Jacob和Chris Berry将和我们继续探讨AtomServer,它是基于Apache Abdera的完整Atom存储实现。作者还创建了几个Atompub规范扩展,其中包括自动标记、批处理和Feeds聚合。

架构师(试刊第二期)

InfoQ中文站的电子杂志《架构师》试刊第二期出版了!相比于上期,我们在内容的选择安排和版式上都根据读者的意见重新做了修正。“细节决定成败”,我们希望基于InfoQ中文站的专业内容,《架构师》能逐渐成为大家喜欢的电子刊物!

一种正规的性能调优方法:基于等待的调优

在本文中,Steven Haines探讨了Web应用性能调优问题。该领域过去更像是一门艺术而不是一门科学。他提出了一种称为基于等待调优的方法,使整个调优过程更加可度量,也因此更具科学性。

Java程序员ActionScript 3入门

通常来说,改变技术路线时最艰难的部分是辨别语言语法之间的不同。这篇文章就为Java开发者提供了一份如何转向Flex基础语言ActionScript的指南。

浅谈如何创建Rails应用

本视频主要以财帮子为例,介绍了如何创建一个PV为百万级的Rails应用。其中包括:Rails应用的服务器架构、Rails Cache的优化、负载均衡的处理、Web服务器的调试、分布式解决方案、Open API的设计等等。

Alexandru Popescu谈InfoQ.com网站架构

InfoQ首席架构师Alexandru Popescu在采访中谈论了InfoQ架构、Webwork与DWR、Hibernate与JCR、Hibernate可扩展性、最新的InfoQ视频流系统和InfoQ的未来规划。

揭示常见的重构误区

相对于Java,.NET在持续重构方面所给与的重视仍然少为人知,大多数人对于重构是否真正属于开发过程,以及如何将其应用到开发过程中持观望态度。Danijel Arsenovski试图为你揭示这些谜题。