对于工程经理和首席技术官(CTO)来说,定义和衡量一个程序员的生产力是非常复杂的任务。这主要是因为软件开发的产出通常是无形的(比如代码、算法等),与传统的物理产品(比如汽车、电器等)不同,这使得生产力很难用传统的衡量方式来量化。
在软件行业中,定义和衡量程序员的生产力有点像追寻“白色巨鲸”,这是一个几乎无法捉摸的目标。
尽管如此,这个问题仍然非常重要,因为它关系到公司的投资决策和价值观,也是开发者自己职业焦虑的一个重要来源:你怎么知道你是否做得足够多,无论是工作中还是工作外?当你所做的一切都是无形的,应该如何衡量它?它到底能否被衡量?
在这篇文章中,我们将讨论生产力衡量的最大陷阱,以及几种有效的衡量方式。
在软件开发中,就像在任何其他领域一样,很多人认为生产力是输入和输出的问题。”输入”包括全职开发者每周的工作时间和年均薪水,这些都是容易量化的。而”输出”则包括开发者定期产生的软件特性、文档、部署以及修复漏洞等。人们可能认为提高开发者的生产力就是简单地增加他们的工作时间或提高他们的薪水。但现实远比这复杂,开发者和软件的运作方式并不是那么直接或容易量化的,因此不能仅通过增加工作时间或薪水来简单地提高生产力。
一、输入衡量的问题
工作时间常常被默认地用作衡量工作绩效的代理指标,这种方法通常是公司未经深思熟虑地默认采用的,因为它简单易行。然而,这样的方法可能导致一个过于注重工时而不是实际工作成果的工作环境。
除了远程工作成为常态的疫情时期之外,仅限工作时间的环境的症状很容易识别。在这样的环境中,人们过于关注在办公室度过多少时间,而不是关注完成了多少有质量的工作。尝试提前几个小时离开办公室的员工可能会遭遇其他人的批评或怀疑,而那些经常加班或周末工作的员工则可能被视为更有价值或更高效。这种以工时为中心的文化有一个明显的缺陷,那就是它鼓励开发者把更多时间花在工作上,而不是关注他们实际完成了什么工作。
长期下来,这种文化会导致一个大家都在忙于工作,但实际完成的工作却很少的环境。这与提高员工或团队生产力的目标是相悖的,因为它不鼓励有效、高质量的工作,而只是鼓励长时间的工作。这样的环境不仅无法准确地衡量或提升生产力,还可能导致员工过度劳累和士气低落。
问题还不止于此。
如果我们简单地认为所有的工作都是积极有效的,那是错误的。开发者在身体或心理状态不佳(比如疲惫、分心或生病)时所做的工作可能会是“负面工作”,即效果不佳到需要后续修正,这实际上会增加总体的工作量。软件开发是一项复杂、抽象和需要高度专注的工作,因此受到开发者心理状态的强烈影响。
不仅如此,除了明显的输入因素(如工作时间)之外,还有一系列隐藏的输入因素(如焦虑、抑郁、职业倦怠、有毒的工作文化等)也会影响生产力。如果公司文化过于严格,不允许有灵活的工作时间或休假安排,那么开发者就很可能会做出负面工作。加班可能会导致他们完成的工作量反而比早点回家要少,而且由于疲劳,他们第二天的工作效率也可能会降低。这样的环境不仅不会提高生产力,反而会产生负面效果。
另一方面,尽管使用工作时间作为衡量标准是不理想的,并可能在多数情况下削弱生产力,但它至少在表面上具有一定程度的“公平性”。如果两个开发者的工作时间相同,至少在这个方面,他们被视为平等。也就是说,他们在时间投入方面都没有偷懒,也没有做超过他们应当做的工作。
这意味着,如果他们的生产力未达到预期,他们至少在时间上做了投入。与其他某些绩效指标相比,“工作时间”这一指标并没有明确地激励人们去产出低质量的代码。虽然以工作时间作为唯一的衡量标准是一个不够好的方法,而且在很多情况下甚至会削弱生产力,但还有更糟糕的指标值得我们讨论。
考虑一下软件开发的另一个明显的输入:金钱。
给人们更多的金钱并不会直接使他们更有生产力,尽管在某种程度上和在一定范围内,更高的薪资可能会有助于提高生产力,但这种影响相对较弱。时间和金钱都是一种“辅助性”的输入,与真正的生产力只有微弱的联系。换句话说,这些都是外部给予的东西(一个由雇主给出,另一个由员工给出),但它们与创造有用软件的能力只是次要关联的。
总结来说,依靠这些输入指标来衡量生产力是不够准确的。软件开发不是一个可以用简单方程式来描述的过程,也不是一种可以通过流水线方式来完成的工作。相比于过分关注输入(如时间和金钱),更应该关注输出,即实际完成的工作质量和量。
输出衡量的陷阱
一些人错误地以代码行数或者版本控制中的提交次数来衡量一个软件开发者的生产力。然而,这些指标实际上并不能反映出软件开发的真正价值或质量。代码行数和提交次数更像是开发过程中的副产品,而不是最终结果。代码的目标应该是解决实际问题,所以一个没有解决问题的代码行可能比根本没有代码还要糟糕。这就像用电厂产生的废料量或国会通过的法案数量来衡量其实际价值,这些指标与实际价值只是有一定的关联,但并不是直接反映价值。
其次,这些指标很容易被操纵。例如,如果一个开发者的薪酬与他们写的代码行数挂钩,那么他们可能会在很短的时间内写出大量无用或冗余的代码,从而赚取更多的钱,而这对实际的项目或企业并没有任何价值。
“当一个衡量标准变成目标,它就不再是一个好的衡量标准。” ——古德哈特定律
尽管许多开发者明白这一点,但令人尴尬的是,代码提交和代码行数仍然被用作一种显示能力的“孔雀羽毛”。例如,当人们听说谷歌有超过二十亿行代码,或者Windows团队每天有超过8400次代码推送时,他们可能会觉得非常震惊,即使这些数字并不是使这些产品有价值的原因。
无论如何,我们可以把这些指标加入到无效指标的列表中。即使一些看似更合理的指标(比如修复的错误数、完成的任务或发布的新功能)也可能导致不良行为或不希望出现的结果。如果以修复错误数量作为目标,开发者可能故意编写有问题的软件,然后再修复它,以达到高的“生产力”水平。如果目标是发布更多的新功能,开发者可能会急于完成任务,从而编写出质量较低、性能差的软件。如果目标是完成更多的任务,这可能导致团队成员之间的竞争,大家都可能去争取那些相对容易或被高估的任务,而不是真正对项目有价值的任务。即使在最好的团队中,这些糟糕的测量标准也会成为一个难以忽视的障碍,影响团队的整体表现和产出。
一些组织出于极度的偏执,为了监控员工生产力而在员工的电脑上安装间谍软件。这种软件可以跟踪员工的每一个动作,包括鼠标移动、键盘敲击和屏幕截图。在这种高度审查的环境下,很难想象员工如何能够进行有创造性的工作。这种做法的最大失败在于它不能准确地衡量对企业或其客户真正有意义的事情。
举例来说,如果一个很有生产力的开发者在Reddit上花费了大量时间,或者他们的鼠标移动不是很活跃,是否应该因此对他们进行惩罚?或者,如果一个开发者在编程工具(比如Visual Studio)中输入了很多文字,但人际交往能力很差,是否应该提拔他们?有些经理可能会根据这些表面指标来作出决策,但希望大多数人会有更高的判断力,不会因为这些浅层次的数据而做出错误的决策。
如何正确地衡量生产力
现在你已经了解了一些最糟糕的可能用于衡量生产力的指标,让我们讨论一些好的指标。个人绩效很难用具体指标来衡量,通常只能二分地表示某个团队成员是否有贡献。而且,远程衡量个人绩效更加复杂。
软件开发团队的工作不是由一群孤立的个体独自完成的,而是由团队中每个成员的工作产出相互依赖和相互影响的结果。个体成员的工作互动和贡献之间存在复杂的相互依赖关系,而这些细微的差异和互动通常难以由外部观察者准确衡量。
举例来说,有些团队成员可能在个人工作量方面不是很高,但他们对团队的影响是积极的,因为他们的帮助和影响使得其他团队成员更加高效。这些个体对于高效的工程团队来说是一种秘密武器,但他们的生产力很难用个体层面的指标来衡量。另一些团队成员可能不会频繁地发布新功能,但他们在代码的维护、测试和重构方面发挥作用,以帮助团队成员更快速、更顺畅地开发功能。同样,他们的个体绩效也难以量化,但他们对整个团队生产力的贡献是巨大的。即使对于那些经常发布新功能的程序员来说,他们的个体生产力也会在短期内有所波动,这使得尝试用具体的指标来追踪生产力变得困难。
因此,最好让个人贡献者自行和互相衡量他们的个人绩效。
团队的绩效要比个人绩效更容易观察和衡量。最有效地跟踪团队绩效的方法可能是询问:这个团队是否能够在几周到几个月的时间内连续交付有用的软件?这与敏捷开发原则中的第三项原则相一致:“经常性地交付工作的软件,时间跨度从几周到几个月,更短的时间跨度更佳。”一个能够定期交付有用软件的团队被认为是高效的。而不能做到这一点的团队应该被追问为什么无法如此做。通常情况下,团队缺乏生产力背后都有合理的原因;大多数生产力低下的团队都渴望提高生产力,而大多数高效的团队也渴望进一步提高他们的绩效。
团队生产力可以相对容易地在组织层面进行观察和衡量。因为团队成员通常非常了解彼此的贡献,无论这些贡献是否可以用具体数据来衡量,所以任何个人生产力方面的严重不足都可以通过良好的组织习惯来发现。这包括经理和直接下属之间经常进行一对一的面谈,定期收集匿名的诚实反馈,以及鼓励每个团队成员积极报告他们的成就并对他们的失败负责。
在软件开发领域,人的因素比趋势图和原始数据更为重要。软件开发更依赖于人际关系和沟通,而且应该注重培养积极的工作文化。当责任心和健康的沟通融入工作文化时,可以更容易地发现影响生产力的关键问题,并由最有能力解决这些问题的人来处理。
速度通常被许多组织用作衡量团队生产力的首选指标。速度是一个综合度量,衡量团队随时间完成任务的能力,通常考虑到开发者对每个任务相对复杂性的估算。它可以回答类似于“这个团队在接下来的两周内可以完成多少工作?”这样的问题。速度主要用于规划工作,而不是用于回顾性评估,因此,任何试图将激励机制与速度关联的人都会发现,在受到压力时,速度的准确性会受到影响。了解团队、部门或公司的速度对于优先考虑功能开发、与客户设定期望以及规划产品未来非常重要。
在衡量团队生产力时,没有比“任务乘以复杂性”更具有用处的度量标准。一些工具尝试通过测量提交、代码行数或编码所花费的时间来进行衡量,但这些度量在团队规模上并不比在个人规模上更具有实际意义。团队完成的代码工件数量或他们在这些工件上花费的时间与他们的贡献价值之间根本没有直接关系。
许多组织在没有明确的硬性度量的情况下也可以取得成功。在这些组织中,他们深刻理解有用的软件是他们的最终目标,同时也是开发工作的主要结果,虽然这很难用具体数字来衡量。在这种情况下,开发人员有更大的自由度,可以在他们感到最富生产力的时间和地点发挥他们的最佳能力。工作时间可能不一定遵循传统的9点到5点,有些人可能更喜欢在早晨或深夜工作,而其他人可能会分散工作时间,这种灵活性被视为一种优势而非问题。这种方法强调了真正的生产力,而不是试图通过可观察的启发式规则来加以限制,同时也使得更广泛的人才,包括有孩子的家长和残疾人,可以更容易地参与职场。关于结果导向工作环境(ROWE)、远程工作、减少开会时间和弹性工作时间的好处已经有很多文章和言论,这些都只是明智的生产力措施的体现。
衡量的选择会影响你最终获得的结果。因此,你应该只衡量那些你真正、真正关心的事情,无论它们是否可以用图表或数字来表示。对于一些人来说,处理那些无法用数字表示的工作可能会感到沮丧。然而,在像软件开发这样具有微妙和抽象性质的工作中,如果我们过于深陷于细节,就会适得其反,不符合我们的目标,即创造有用的软件。因此,我们应该专注于真正重要的事情,而不是试图通过数字或图表来衡量一切。
国内比较主流的2款研发绩效度量工具盘点
1.PingCode
覆盖研发管理全生命周期,研发效能上满足:企业研发效能评估、研发团队效能度量、项目交付数据分析、个人效能指标统计等场景的需求。具备自动采集研发全生命周期数据、效能度量指标体系(比如交付质量、交付效率、交付能力,流程上覆盖了需求、开发、CI/CD、测试、发布)、自定义的数据分析报表、建立效能度量分析模型。(官网:PingCode)
2.思码逸
为研发团队提供了研发数据汇总分析的一站式入口,度量指标包括效率、质量及人才三方面,从高管、团队Leader、项目/产品经理、开发者等视角,帮助研发团队各角色成员客观、全面地洞察研发流程及成果。(官网:https://www.merico.cn/ )
以上就是关于如何衡量研发部门绩效的陷阱、方法、工具的讨论,希望对大家有所启发。
常见问答(FAQ)
为什么传统的生产力指标在衡量研发人员生产力时可能不适用?
答:传统的生产力指标,如任务完成速度或产出量,通常不适用于衡量研发人员的生产力,主要有以下几个原因:创造性和复杂性:研发工作通常涉及高度的创造性和复杂性,这些因素难以用简单的数字或速度来衡量。质量与数量的权衡:在研发中,质量通常比数量更重要。快速完成任务但牺牲了代码质量或项目可维护性是不可取的。长期影响:研发项目通常有长期的影响,而传统的生产力指标往往只关注短期成果。
如何平衡个体和团队生产力的衡量?
答:在衡量研发人员生产力时,个体和团队两者都是重要的。以下是一些平衡两者的方法:个体目标与团队目标的对齐:确保个体目标与团队和组织的长期目标一致。团队合作的考核:除了个人的技术能力,团队合作和沟通能力也应纳入考核范围。集体责任和个人责任:在项目失败或成功时,应识别是团队整体的问题还是个别成员的问题,并据此进行评估。
如何避免衡量生产力的过程导致的不良影响?
答:衡量生产力的过程有时可能导致不良影响,如过度竞争或压力。以下是一些避免这些问题的建议:透明和公平:确保衡量标准和过程对所有人都是透明和公平的。持续反馈和调整:不应仅在年终或项目结束时进行评估,而应提供持续的反馈和机会进行调整。避免单一指标:依赖单一指标可能导致员工“玩弄”系统以提高自己的评分。应使用多维度的评估方法。