度量的陷阱:为什么大多数工程效能指标都在说谎

博客分类: 

在一次技术管理者的闭门会议上,一位 CTO 分享了他们公司的"成功经验":通过跟踪每个工程师的代码提交量和故事点完成数,他们将团队产出提升了 40%。台下掌声雷动。

三个月后,这家公司的核心产品因为技术债崩溃,两位资深工程师离职,留下一句话:"我不想在一个把我当成代码工厂的地方工作。"

这不是个案。在"数据驱动"的大旗下,工程效能度量正在变成一场全行业的自我欺骗。我们用精确的数字掩盖了对复杂性的无知,用短期的增长牺牲了长期的健康。更危险的是,当度量本身成为目标,我们就陷入了古德哈特定律(Goodhart's Law)的经典困境:当一个度量成为目标时,它就不再是一个好的度量。

一、我们在度量什么:从代码行数到 DORA

工程效能度量的演进史,本质上是管理者与工程师之间信息不对称的博弈史。

1.1 原始指标时代:数数字的快乐

早期的度量极其粗暴:

  •  
    1. 代码行数:写得越多越好?结果是冗余代码满天飞
    2. 提交次数:一个功能拆成十个提交,KPI 瞬间达标
    3. Bug 修复数量:先埋 bug,再修 bug,完美的正向循环

这些指标的共同特点是易于度量,但与价值无关。它们度量的是活动(activity),而非成果(outcome)。就像用跑步机的里程数来评估一个人的健康水平——数字很精确,但毫无意义。

 

1.2 DORA 时代:科学的进步

2014 年,Nicole Forsgren 等人通过大规模研究提出了 DORA 四大关键指标:

| 指标 | 衡量内容 | 高效能团队标准 |
|------|----------|----------------|
| 部署频率 | 代码部署到生产的频率 | 每天多次 |
| 变更前置时间 | 从提交到生产的时间 | 小于 1 小时 |
| 变更失败率 | 部署导致生产问题的比例 | 0-15% |
| 故障恢复时间 | 从故障到恢复的时间 | 小于 1 小时 |

DORA 的突破在于:它度量的是系统的健康度,而非个人的产出。它关注的是流动效率(flow efficiency),而非资源效率(resource efficiency)。

1.3 SPACE 框架:更全面的视角

2021 年,GitHub 和微软研究院提出了 SPACE 框架,试图捕捉更多维度:

  •  
    1. Satisfaction:开发者满意度和幸福感
    2. Performance:工作的质量和影响
    3. Activity:行动和产出的数量
    4. Communication:信息流动和协作
    5. Efficiency:完成工作的流畅度

这是一个重大进步:它承认了人不是机器,情绪、协作、心流状态都是生产力的一部分。

但这里有一个根本性的悖论:越全面的框架,越难以实施。当你需要跟踪 20 个指标时,你到底在跟踪什么?

二、度量为何失效:三个根本性缺陷

2.1 缺陷一:简化复杂性的代价

软件工程是一个高度复杂的创造性活动。复杂性来自三个层面:

  1. 技术复杂性:遗留系统、技术债、架构约束
  2. 业务复杂性:不明确的需求、变化的优先级、多方利益相关者
  3. 社会复杂性:团队协作、知识传递、文化氛围

任何试图用几个数字来总结这种复杂性的努力,都是信息的破坏性压缩

举个例子:两个工程师,A 用一周完成 10 个故事点,B 用一周完成 5 个故事点。表面上看,A 的效率是 B 的两倍。但如果我们加入上下文:

  •  
    1. A 做的是熟悉的增删改查,B 在重构核心支付系统
    2. A 的代码测试覆盖率 30%,B 的代码测试覆盖率 95%
    3. A 在堆砌技术债,B 在偿还技术债
    4. A 的代码只有自己能维护,B 的代码全团队都能理解

现在,谁的效能更高?

2.2 缺陷二:时间维度的错位

大多数度量都是短期的、局部的,但软件工程的价值是长期的、系统的

这种时间错位导致了一系列问题:

问题 1:技术债的隐性成本

当你度量"本周完成的功能数"时,你看不到:

  •  
    1. 为了快速交付而跳过的测试
    2. 为了赶进度而复制粘贴的代码
    3. 为了简单而选择的低劣架构

这些债务会在 6 个月后爆发,但那时已经很难追溯到当初的"高效"决策。

 

问题 2:知识积累的长期价值

一个工程师花两周时间:

  •  
    1. 重构了一个核心模块,让它更易理解
    2. 写了一份详细的架构文档
    3. 指导了三位初级工程师

这些活动在当前的效能指标中几乎不可见,但它们的价值会在未来一年中持续释放。

 

问题 3:创新的不可预测性

最有价值的工程工作往往是探索性的、不可预测的:

  •  
    1. 尝试一个新的技术方案(可能失败)
    2. 优化一个性能瓶颈(收益难以量化)
    3. 重新思考一个产品假设(可能推翻现有工作)

这些工作无法被传统的效能指标捕捉,反而会被视为"效率低下"。

 

2.3 缺陷三:测量改变行为

物理学中有一个海森堡不确定性原理:观测行为本身会改变被观测的对象。在组织管理中,这个效应更加显著。

当你开始度量某个指标,人们就会开始优化这个指标,而非指标背后的真实目标。

几个真实的案例:

案例 1:代码审查时间陷阱

某公司设定了"代码审查必须在 4 小时内完成"的 SLA。结果:

  •  
    1. 审查者快速点击"批准",根本不认真看代码
    2. 代码质量下降,但指标显示"流程效率提升"
    3. 一个月后,生产事故频发

案例 2:测试覆盖率游戏

 

某团队要求"所有代码必须达到 80% 测试覆盖率"。结果:

  •  
    1. 工程师写了大量无意义的测试(测试 getter/setter)
    2. 真正复杂的逻辑没有被充分测试
    3. 覆盖率达标了,但软件质量没有提升

案例 3:故事点通货膨胀

 

某公司用故事点来评估工程师绩效。结果:

  •  
    1. 团队在估算时系统性地高估工作量
    2. 一个简单任务被估成 5 点,只为了"完成更多点数"
    3. 估算失去了意义,但每个人都在玩这个游戏

 

三、走出度量陷阱:一些反共识的思考

 

3.1 接受模糊性,拒绝伪精确

在管理学中,有一个概念叫"麦克纳马拉谬误"(McNamara Fallacy):只度量可度量的,忽视不可度量的,最终认为不可度量的不存在。

越战期间,美国国防部长罗伯特·麦克纳马拉坚持用"敌人伤亡数"来衡量战争进展。数字很精确,但战争输了。因为真正重要的东西——民心、士气、战略价值——无法被简单度量。

在软件工程中,最重要的东西往往是最难度量的:

  •  
    1. 代码的可维护性
    2. 系统的演化能力
    3. 团队的知识分布
    4. 工程师的成长速度
    5. 产品的技术竞争力

与其用伪精确的数字来度量这些,不如承认:有些东西只能通过定性判断来评估。

一个资深的技术 leader,通过代码审查、技术讨论、架构评审,能够形成对团队效能的深刻理解。这种理解是模糊的、主观的,但可能比任何仪表盘都更接近真相。

3.2 度量系统,而非个人

个人效能度量的问题在于:它将一个系统性的结果归因到个人

一个工程师的产出,深受以下因素影响:

  •  
    1. 代码库的质量(技术债负担)
    2. 工具链的成熟度(构建、测试、部署)
    3. 需求的清晰度(产品管理质量)
    4. 团队的协作模式(会议、沟通、决策流程)
    5. 组织的支持程度(基础设施、培训、资源)

当你度量个人效能时,你是在度量这个系统,而非个人能力。但人们往往会将系统问题归因为个人问题。

 

更好的做法是:度量系统的健康度,而非个人的表现。

DORA 指标的价值就在于此:它不告诉你哪个工程师效率低,而是告诉你哪个环节有瓶颈。

  •  
    1. 部署频率低?可能是 CI/CD 流程太慢
    2. 变更失败率高?可能是测试策略有问题
    3. 恢复时间长?可能是监控和回滚机制不完善

这种视角的转变,将问题从"谁的错"变成了"如何改进系统"。

3.3 度量作为对话的起点,而非终点

最危险的度量方式是:将指标作为决策的终点

"你的部署频率是每周 2 次,而行业标杆是每天 10 次,所以你需要提升。"

这种机械的对标忽视了上下文:

  •  
    1. 你在做什么类型的软件?(嵌入式系统 vs Web 应用)
    2. 你的监管环境是什么?(金融 vs 消费互联网)
    3. 你的团队规模和成熟度如何?(创业公司 vs 大企业)

更好的做法是:将指标作为对话的起点。

 

"我们的部署频率是每周 2 次。这是因为我们的部署流程需要大量手工操作和审批。让我们讨论:

  •  
    1. 这些审批真的必要吗?还是历史遗留的流程?
    2. 我们能否将部分审批自动化?
    3. 如果我们提升到每天一次,会遇到什么阻碍?
    4. 这个改进值得我们投入多少资源?"

指标不是答案,它是问题的线索。

 

3.4 建立反度量机制

既然度量会改变行为,那么我们需要刻意设计一些机制来对抗度量的副作用

机制 1:质量守门人

不要只度量速度,同时要有人负责质量:

  •  
    1. 定期的架构评审
    2. 技术债专项治理
    3. 代码质量抽查
    4. 生产事故深度复盘

机制 2:多维度平衡

 

不要只看一个指标,要设计互相制衡的指标组合:

  •  
    1. 部署频率 ↔ 变更失败率(速度 vs 质量)
    2. 功能产出 ↔ 技术债比率(短期 vs 长期)
    3. 个人产出 ↔ 团队协作得分(个人 vs 团队)

机制 3:定期的度量审计

 

每个季度,回顾一次:

  •  
    1. 我们的度量是否还有意义?
    2. 是否有人在游戏这些指标?
    3. 是否有重要的方面被忽视了?
    4. 是否需要调整或废弃某些指标?

机制 4:匿名反馈渠道

 

让团队成员可以匿名反馈:

  •  
    1. 哪些度量正在产生负面影响?
    2. 哪些重要工作没有被认可?
    3. 哪些指标正在被游戏?

 

3.5 学会不度量

 

最后,也是最反直觉的:有些时候,最好的策略是不度量。

Google 的研究发现,20% 时间项目(允许工程师自由探索感兴趣的项目)产生了一些最重要的创新,包括 Gmail 和 Google News。

但如果你试图度量"20% 时间的 ROI",你会扼杀这个机制的精神。因为:

  •  
    1. 大部分探索会失败,这是正常的
    2. 真正的价值可能在 2-3 年后才显现
    3. 最大的价值可能是意外发现,无法事先预测

有些活动的价值,在于它们不被度量。

 

类似的例子:

  •  
    1. 工程师的学习时间
    2. 团队的创新实验
    3. 跨部门的知识分享
    4. 非正式的技术讨论

当你开始度量这些,它们就会变成 KPI 游戏,失去了原本的意义。

 

四、实践建议:如何负责任地使用度量

虽然我批判了度量的问题,但这不意味着我们应该完全放弃度量。关键是如何负责任地使用度量

4.1 明确度量的目的

在引入任何度量之前,先问三个问题:

  1. 我们想解决什么问题?(不是"我们想度量什么")
  2. 这个度量会如何改变行为?(预测副作用)
  3. 如果这个度量被游戏了,会发生什么?(最坏情况分析)

4.2 从问题出发,而非从指标出发

错误的路径:
"我们应该跟踪代码审查时间,因为这是 DORA 建议的。"

正确的路径:
"我们的问题是代码合并周期太长,导致功能延迟上线。让我们分析原因:

  •  
    1. 是审查者响应慢?→ 度量审查响应时间
    2. 是 PR 太大难以审查?→ 度量 PR 大小分布
    3. 是审查质量不够需要多轮修改?→ 度量审查轮次
    4. 是 CI 流程慢?→ 度量 CI 执行时间

然后针对性地优化瓶颈环节。"

 

4.3 组合使用定量和定性方法

定量方法(数据):

  •  
    1. 发现异常和趋势
    2. 对比不同团队或时期
    3. 提供讨论的起点

定性方法(对话):

  •  
    1. 理解数字背后的原因
    2. 捕捉不可度量的因素
    3. 发现系统性问题

最有效的方法是:用数据找到问题,用对话理解问题,用实验解决问题。

 

4.4 建立"度量的度量"

度量系统本身也需要被评估:

  •  
    1. 信号噪音比:这个指标是否真的反映了我们关心的问题?
    2. 博弈抵抗力:这个指标是否容易被操纵?
    3. 行为影响:这个指标实际上改变了哪些行为?(而非我们期望的)
    4. 维护成本:跟踪这个指标需要多少人力?值得吗?

每个季度,选出 1-2 个指标进行深度审计,决定是保留、调整还是废弃。

4.5 用度量赋能,而非控制

度量有两种用法:

控制型度量

  •  
    1. 用于评估和排名
    2. 与绩效、晋升挂钩
    3. 由管理层单向使用
    4. 结果:防御性行为、游戏指标、心理安全感降低

赋能型度量

  •  
    1. 用于发现问题和改进机会
    2. 与团队共享,共同讨论
    3. 聚焦系统而非个人
    4. 结果:持续改进、透明文化、内在动机

建议:80% 的度量应该是赋能型的,只有 20% 可以是控制型的,且必须非常谨慎。

 

五、结语:度量的谦卑

在《黑天鹅》一书中,纳西姆·塔勒布提出了一个概念:"柏拉图化"(Platonification)——用简化的模型替代复杂的现实,然后忘记了模型只是模型。

工程效能度量的最大危险,就是这种柏拉图化:我们创造了一个简化的数字世界,然后开始相信这个世界比真实世界更真实。

真正的智慧,在于度量的谦卑:

  •  
    1. 承认度量只是现实的不完美映射
    2. 接受有些重要的东西无法被度量
    3. 警惕度量对行为的扭曲效应
    4. 将度量作为对话的起点,而非管理的终点

最好的工程 leader,不是那些最擅长分析仪表盘的人,而是那些能够透过数字看到真实问题、能够在定量数据和定性洞察之间自如切换、能够用系统思维而非简单归因来理解复杂性的人。

记住:软件是由人构建的,而人不是机器。任何试图将人简化为几个数字的努力,都是在破坏人的丰富性和创造力。

度量是工具,不是目的。当我们忘记这一点时,我们就陷入了度量的陷阱。


思考与行动

如果你是管理者:

  1. 审视你们现有的度量体系,哪些指标可能正在产生负面影响?
  2. 尝试用一个季度的时间,减少 50% 的度量,看看会发生什么
  3. 下次团队会议,不要从数字开始,而是从"你们觉得最大的问题是什么"开始

如果你是工程师:

  1. 当你感觉被错误的指标驱动时,是否有勇气提出来?
  2. 你能否帮助你的 leader 理解某个度量的局限性?
  3. 你自己在使用哪些"隐性度量"来评估自己的工作质量?

度量不是敌人,但盲目的度量是。让我们以更多的谦卑、更多的怀疑、更多的系统思维,来看待这些数字。

 

Total votes: 10

添加新评论