持续交付2.0

如何不增加人手的情况下,让技术团队增加 25% 的开发效率

关注我,每天收获一个新技能!

1 什么是 #技术债务 ?

在软件研发团队中,我们经常会遇到大量『计划外工作』,比如修复缺陷、紧急返工等。造成这些问题的原因有很多:
  • 内部软件质量缺乏可见性,这些额外成本往往表现为『新功能上线周期长』、『错过项目节点』以及『技术团队压力山大』等现象。
  • 由于缺乏透明度,团队很难针对根本原因采取有效措施,也难以判断到底是流程、团队协作还是代码本身出了问题。
本文将介绍一种计算、可视化和传达『技术债务』及『代码质量』问题成本的方法。 通过这些方法,技术管理者可以建立基线,设定改进目标,并将其转化为可衡量的成本节省、产品风险降低,以及预期收益的显著提升。 正如下文所示, 『 高效的软件开发团队通过管理技术债务,至少可以将功能交付效率提升 25% 』。 这意味着在不增加人手、不增加成本的情况下,团队产能可以提升四分之一。

2 技术债务是一个业务问题

技术债务是一个形象的比喻,就像金融领域的债务一样,会产生利息。也就是说,技术债务让我们的代码维护成本变得更高。
这对企业来说影响巨大。可持续的软件开发需要在短期目标和长期发展之间取得平衡。产品要不断推出新功能,同时还要保证代码库的可维护性、可扩展性和易理解性。如果没能平衡好这些目标,技术债务就会不断累积,最终导致成本失控、承诺无法兑现。由此带来的代码质量问题还会影响客户满意度,用户会频繁遇到 bug,创新速度也会变慢。我们先来看一些真实的数据。

技术债务的成本

关键要点 — 平均来看,企业因技术债务浪费了 23-42% 的开发时间。
一项北欧的研究显示,开发者平均因技术债务浪费 23% 的时间(Besker, T. 等,2019)。而 Stripe 的数据更为惊人,显示开发者每周有 42% 的时间都在处理技术债务和糟糕的代码(Stripe, 2018)。

招聘更多开发者并非解决之道

关键要点 — 招聘更多开发者会带来更多沟通和协调成本,反而可能让效率更低,尤其是在技术债务严重的团队中。
这些数字值得每个中国企业深思,也揭示了一个更深层次的问题:人才供应。既然 23-42% 的生产力被浪费,公司必须采取措施提升交付能力。 常见的做法是『多招人』,但现实中我们不可能无限制地招聘开发者。人才资源有限,国内外都在争夺优秀开发者。即使能随意扩招,也未必能解决问题。请看下图: Brooks定律:给一个已经延期的项目增加人手只会让项目更延期 本质上,团队成员越多,沟通路径增长更快,最终会导致效率下降。新增人手带来的产能提升会被沟通和协调成本抵消,甚至变成负担(参见 CodeScene 博客)。 如果我们能把浪费在技术债务和糟糕代码上的时间转化为高效产出,会怎样?让我们先建立一个衡量改进效果的基线。

3 计算技术债务的影响

建立基线,估算技术债务成本

关键要点 — 如果你的团队在计划外工作上的投入超过 15%,那就是一个危险信号,说明交付潜力被浪费,技术债务很可能是主因。
实施任何改进措施时,最大的障碍往往是不确定的回报:投入后到底能省多少钱?技术债务管理也一样。大多数团队:
  1. 不清楚当前软件质量状况;
  2. 不知道技术债务每天要花多少钱;
  3. 不清楚质量问题对业务的具体影响。
所以,管理技术债务的第一步就是建立基线,让团队有『全局视角』。在此之前,我们先澄清一个常见误区:技术债务不能单纯从源代码中计算出来。

误区:技术债务不能靠代码扫描得出

关键要点 —— 技术债务常被误认为是『普遍的劣质代码』。这是个危险的误区,会让团队在一些没有明确业务价值的改进上浪费大量时间。
更具体地说,传统的静态代码分析工具无法准确识别技术债务,因为:
  • 技术债务无法直接在源代码中检测到;
  • 技术债务不等同于代码质量问题;
  • 技术债务的成本不是重构代码所需的时间。
因此,技术债务的计算必须基于结果导向的指标。我们可以通过『计划外工作』来衡量。

用计划外工作计算投资回报率

关键要点 —— 许多团队为 100 名开发者付工资,但实际产出只有 75 人的水平。 『计划外工作』指的是因 bug、服务中断或软件缺陷等原因产生的临时任务。 计划外工作会占用团队产能,让交付变得不可控,团队从主动变成被动。 大多数团队通过 Jira、飞书、企业微信等工具间接跟踪计划外工作。我们可以用这些数据计算计划内与计划外工作的比例: 过去一年计划外工作占比趋势图。平均来看,40-50% 的开发时间被浪费在计划外工作上。 有了基线后,我们就能计算改进的投资回报率(ROI)。 接下来要设定目标:什么样的计划外工作比例是合理的?

公式:计算技术债务导致的产能浪费

『计划外工作』无法彻底消除。高绩效团队的基线是 15%(参见《Accelerate》一书)。 有了这个基线,我们可以用如下公式:
浪费 (%) = 计划外工作% – 0.15未利用的产能 (¥) = 开发人数 * 人均成本 * 浪费 (%)

举例: 当计划外工作占 40%,100 名开发者人均月成本为 7,000 元时,未释放产能为:
浪费 (%) = 0.40 – 0.15 = 25%未利用的产能: 100 * 7000 * 0.25 = 175,000 元/月

换句话说,『你为 100 名开发者付工资,却只拿到 75 人的产出。25% 的产能被浪费了。』这样可持续吗? CodeScene 收集了大量全球团队的数据,发现很多组织有 25~40% 的开发产能被计划外工作消耗,极端情况甚至高达 70~80%。 这个区间与前文提到的技术债务导致的生产力浪费(23-42%)基本吻合。 但要注意,『 技术债务只是导致计划外工作过多的原因之一,不能孤立处理技术债务 』。 具体来说,提升软件交付效率时,需要关注以下三个方面:
  1. 代码质量与相关性 —— 并非所有技术债都要优先解决;
  2. 软件架构与组织目标一致性;
  3. 流程损耗 —— 关注团队协作和人员因素。
下面分别展开。

4 代码质量与相关性:并非所有技术债都要解决

技术债务通常意味着严重的代码质量问题,但反过来并不成立:代码质量不高未必就是技术债,也未必紧急。 而且,团队不可能一次性解决所有问题,优先处理最关键、最有业务价值的技术债才是正道。
结合开发活动背景可视化代码质量,优先评估相关性

5 确保组织与软件架构一致

软件架构不是孤立存在的,必须与组织结构(如开发团队)相匹配。架构与组织不一致会导致沟通成本上升、缺陷风险增加。用团队视角衡量和可视化架构很重要。 资源: 阅读更多关于如何可视化跨团队边界的逻辑依赖:https://codescene.com/blog/codescene-release-3_6

流程损耗:关注团队协作和人员因素

团队的开发实践也可能成为瓶颈。要关注等待审批、长期分支等流程损耗。 代码也可能变成『知识孤岛』,即某个模块只有一人熟悉,带来关键人员依赖。
可视化代码库中的知识分布,检测瓶颈和问题代码

6 衡量预期成果

关键收获 —— 技术债务的真实影响远超计划外工作的节省,本文的计算只是底线。技术债务还带来机会成本,比如计划工作耗时变长。

用现有团队实现更高产出

管理技术债务的回报不一定体现在成本节约上,更重要的是释放团队潜力。如果你知道团队的真实产能,并通过偿还技术债释放出来,你会怎么用这些新增能力? • 上市时间 —— 产品迭代速度能提升多少? • 积极性 —— 消除技术债务后,开发者的积极性和生产力能提升多少? • 质量 —— 缺陷处理速度提升后,客户满意度会有多大变化?

更多影响 —— 技术债务也会影响计划内工作

技术债务让修改现有代码变得更难、更有风险。 开发者会预留更多缓冲时间,影响产品和市场。 交付周期变长,创新优先级被迫降低。 在商业语境下,新功能交付周期变长,上市时间延后,甚至影响客户承诺的兑现。
技术债务影响新产品特性实施的前置时间

7 小结

技术债务在软件行业同样普遍,导致 23~42% 的生产力损失。 技术债务的核心挑战:
  1. 缺乏可见性,难以量化其成本和影响;
  2. 技术债务不仅是技术问题,更影响业务需求的实现和效率,需要与业务目标对齐;
  3. 不能也不应该一次性解决所有技术债务;
  4. 『靠加人头抵消技术债务』不可持续,也难以规模化。

8 互动环节

在管理技术债务的实践中,每个中国团队都会遇到独特挑战。我们很想知道:
  • 你的团队是如何量化技术债务成本的?是否尝试过文中的方法?
  • 在平衡新功能开发和技术债务偿还时,你采用了哪些优先级决策框架?
  • 有没有通过管理技术债务显著提升团队效率的成功案例?
欢迎在评论区分享你的经验和见解,让我们一起探索更高效的软件交付之道。正如文中所说,管理技术债务不仅是技术挑战,更是业务机遇——你的实践也许能为其他中国团队提供宝贵参考。

参考:

[1] 如何基于开发相关性和业务影响对技术债务进行优先级排序: https://codescene.com/blog/evaluate-codequality-at-scale/