研发团队的「技术债」如何进行量化管理?

我共事过的每个团队都会讨论技术债。有些团队知道如何管理它,也有些团队因此崩溃瘫痪,甚至有一家公司因为技术债务没有得到解决而宣告失败。

什么是技术债务?

在这里插入图片描述

「债务」这个比喻非常恰当。最早提出「技术债务 Technical Debt」比喻的工程师 Ward Cunningham 对此做了详细的解释:

有了借来的钱,你可以比采用其他方式更快地做某件事情,但在还清这笔钱之前,你需要支付利息。我认为借钱是个好主意,我也认为赶快对外发布软件以获得经验是个好主意,但当然,你最终会回到这来,并且随着你愈加了解软件,你会通过重构程序来偿还那笔贷款,以此反映你所获得的经验。

本文将与你讨论技术债是如何产生的。但在那之前,我们先了解一些与技术债的产生原因和本质有关的常见误解。

误区一:技术债务 == 坏代码

到底什么是「坏代码」?

好的代码或许是整洁的代码,也可以概括为不会迫使你在未来做出特定决策的代码,它保留了选择的余地。而坏代码则不留余地,还会强加上一些原本不存在的约束。

我几乎没见过由「糟糕的开发者」编写的「坏代码」,至少在生产项目中没有(这正是代码审查的作用)。我遇到的大多数「坏代码」都出自受到约束影响的优秀的开发者。

在这里插入图片描述

误区二:技术债是错误的

技术债务和金融债务一样不分对错好坏。在非理想状态下——即没有足够的「现金」来满足需要——它就是产品开发工具箱中的一个有效工具。

误区三:构建完成就万事大吉

最常见的软件开发的比喻是修建建筑。在建筑行业,工作是按顺序进行的:

  • 建筑设计师设计建筑并绘制图纸;
  • 工人们挖掘地基、修建上层建筑、铺设管线并进行室内装修;
  • 业主和租户高兴地搬进来,如有任何问题,再找维修人员解决。

这是一个通俗易懂的比喻,但却和软件行业不怎么类似。

与建筑相比,软件更像是园艺——它比混凝土更有机。你根据最初的计划和各种条件在花园里种植许多花木。有些花木茁壮成长,另一些注定要成为堆肥。你可能会改变植株的相对位置,以有效利用光影、风雨的交互作用。过度生长的植株会被分栽或修剪,颜色不协调的会被移栽到从美学上看更怡人的地方。你拔除野草,并给需要额外照料的植株施肥。你不断关注花园的兴旺,并按照需要(对土壤、植株、布局)做出调整。——《程序员修炼之道》

在(错误的)建筑比喻中,大部分成本是预先产生的。维护成本要么是名义上的,要么被视作偶发事件而忽略不计。

在园艺的比喻中,构建功能是漫长工作中的一个步骤(就像种植作物)。花园越大,所需的维护就越多。这是在重新种植以改变布局(重构),或扩大花园并种植新作物(添加新功能——这也需要维护)之外的工作。

90% 的软件成本均与维护有关——我很多年前就知晓这个数据,但每每想到还是觉得难以置信。

技术债是怎么产生的?

那么,技术债究竟从何而来?它可以避免吗?

技术债务的另一种理解可能是,项目当前所处的状态与「假设利用积累的知识重新开始而现在应处的状态」之间的差值。

技术债有两个来源

  • 决策的权衡和取舍(鲁莽 vs 谨慎)

  • 制定和执行决策时所具备(或缺乏)的知识,即有意和无意

在这里插入图片描述

(图:技术债务象限)

理想情况下,你会在充分了解情况且不向约束条件妥协的前提下做出决策。但现实可能是,你在没有全盘了解信息和背景时就启动了项目,还要根据时间限制(如利益相关者给的截止日期)或成本限制等约束做出权衡。

如何避免技术债是一门学问,而对「技术债可否避免」这一问题,我的回答是:

“可以避免,但技术债是一种工具,不是敌人。”

如何量化技术债?

「现在有多少技术债?」这么抽象的概念真的能被量化吗?

真的很难,或者说你无法可靠地跟踪技术债。如果向软件工程师了解如何实现某个功能或修复产品的某个部分,他们可能会提供一个估算结果,并将需要偿还的技术债务涵盖在内,但你仍然无法追踪它。

Chelsea Troy 提出了一个与技术债务高度相关的可量化指标:维护负载(maintenance load)

维护负载描述了开发团队花费多少精力来保持现有功能同以前一样运行。—— Chelsea Troy

维护负载是有关项目年限和构建实践的函数,其衡量单位是持续付出维护精力的开发者数量(ongoing developer effort)。

需要说明的是,维护负载 != 技术债务

但它依然是一个非常不错的技术债务指标。如果需要更多的工程师来防止系统/项目崩溃,那么很可能意味着你有很多技术债。如果仅靠十几个人就能建立一家价值 10 亿美元的公司,那么他们大概率很好地控制住了技术债。

(作者 Jacob Bennett,内容经 LigaAI 翻译整理。)


了解更多技术干货、研发管理实践等分享,请关注 LigaAI。

邀您体验 LigaAI-智能研发协作平台,开启 AI 驱动的智能研发协作!

相关推荐

技术分享 | SpringBoot 流式输出时,正常输出后为何突然报错?

最近在一个 SpringBoot 项目中遇到了一个很有意思的问题:正常通过过滤器和拦截器的线程变量,在正常输出后突然报错。这是咋回事?

LigaAI的博客 2280

用 MVP(最小可行性产品) 做低成本快速验证,为什么不灵了?| Liga译文

有数据称,九成的初创公司在成立五年内将走向失败。难道号称能快速验证市场的 MVP(最小可行性产品)失效了吗?

LigaAI的博客 1303

技术分享 | 弹窗开发中,如何使用 Hook 封装 el-dialog?

本文将分享如何使用 useDialog Hook 封装 el-dialog,实现更灵活、更易用的弹窗组件。

LigaAI的博客 1508

LigaAI x 极狐GitLab,共探 AI 时代研发提效新范式

LigaAI 和极狐GitLab 达成战略合作,联手打造 AI 赋能的一站式研发效能解决方案,共探 AI 时代研发效能新范式。

LigaAI的博客 1403

精彩回顾 | 「AI 驱动增长,研发数智化升级」分享沙龙成功举办

AI 应用元年,人工智能技术将如何助力企业发展新质生产力,构建增长动能?

LigaAI的博客 847

LigaAI 的 8 个年度关键词 | 2023 年度盘点

一起盘点回顾 2023 年的精彩文章!

LigaAI的博客 1241

我的效率自救之路:对低效的会议说“不!”

如果你也陷入了「会议 - 效率」悖论怪圈,一定不要错过这篇经验分享!

LigaAI的博客 1218

宁波银行:在「金融科技」引擎上,沉浸式提效减负

金融科技企业如何利用有限的研发资源,发挥更高的能效,创造更高的商业价值?

LigaAI的博客 1353

ChatGPT API 调用总超时?破题思路在这 | 技术分享

本文使用 monkey_patch 方式重写 API 参数,解决 ChatGPT API 调用超时问题。

LigaAI的博客 2088

技术分享 | 在 IDE 插件开发中接入 JCEF 框架

本文分享如何用 JCEF 框架解决 IDE 插件开发中“代码难复用”、“用户体验难统一”等问题,释放研发资源。

LigaAI的博客 3672

准「AI 时代」下,如何衡量程序员的工作效率和生产力?

都夸 AIGC 好,说 AI 工具可以提高工作效率,但是你真的知道如何判断和衡量 AI 工具对组织的影响吗?

LigaAI的博客 871

SaaS 出海,如何搭建国际化服务体系?(三)

SaaS 企业出海,跨国、跨时区的异步团队如何展开高效的协作与工作?

LigaAI的博客 516

SaaS 出海,如何搭建国际化服务体系?(二)

SaaS 出海潮下,不同规模的企业如何搭建并落地国际化服务团队?

LigaAI的博客 540

SaaS 出海,如何搭建国际化服务体系?(一)

SaaS出海潮下,一个主要由中国人构成的团队在推进海外产品落地的过程中,可能会遇到哪些困难?

LigaAI的博客 619

生成式 AI 如何释放开发者的生产力?

技术管理者有望通过 AIGC 应用,大幅缩短四类关键开发任务的完成时间,进而提升组织生产力。

LigaAI的博客 612

新晋技术管理者如何推动组织变革?

技术管理者通过系统流程、行为和奖励三个重要工具,能够积极推动组织变革,优化团队工作方式,并改善成员评估体系。

LigaAI的博客 419

向上管理:三个技巧,教会你如何与上级、老板高效协作

向上管理是什么?刻板印象中,它总与“职场政治”、“拍马屁”、“奸逆之臣”密不可分,但本文将向你展示向上管理的全新打开方式:领导资源化。

LigaAI的博客 667

如何提高技术领导力?与你分享 5 个心得

「如何培养和提高技术领导力」是开发者成长旅程中最重要的命题之一。无论你想成为技术专家,还是技术管理者,都能从本文获得可复制的实践经验。

LigaAI的博客 1064

产品路线图如何制定?斯坦福大学产品管理课程为你支招

一个合格的产品路线图依赖哪些输入?需要输出哪些信息? 本文将与你分享,笔者在斯坦福大学产品管理课程中习得的路线图管理方法。

LigaAI的博客 533

「程序员转型技术管理」必修的 10 个能力提升方向

本文将为有意走向技术管理的开发者们,提供 10 条具象的成长和转型建议,但别忘了,技术管理转型并不是开发者的唯一出路。

LigaAI的博客 583

产品管理经验分享:删掉 500 个产品待办事项后,我逃离了「假敏捷」

灵魂三问:你的产品待办列表中有多少项工作? 最早的一项在什么时候被创建?列表中有多少维护过但从没进入迭代的待办事项?

LigaAI的博客 336

如何用 NPS 确定研发优先级,打破技术与业务的次元壁?

VUCA 时代下,研发团队应当如何培养、平衡客户视角与商业视角,专注于价值交付,避免陷入「僵尸 Scrum」困境?

LigaAI的博客 402

这 4 个系统可靠性评估指标,可能比 MTTR 更靠谱!

VOID研究报告指出,对复杂的软件系统而言,MTTR 可能不是一个合适的可靠性管理指标。这是怎么回事?

LigaAI的博客 515

LigaAI:从效率、度量和价值维度,成为研发团队的智能医生

「拿不到团队数据」和「无法衡量研发价值」是困扰千万研发团队的难题,LigaAI 将以 AI 为矛,打破定式,以全新的方式赋能研发管理。

LigaAI的博客 442

高绩效团队的 5 个优秀习惯,看看你占了几个?

卓越的团队不一定在才能、技术或者机会上比别的团队更具优势,但是好的工作习惯和工作方式一定会让他们脱颖而出。

LigaAI的博客 351

研发质量指标大 PK:MTTR vs MTBF,谁是靠谱王?

研发管理中,「提高代码/测试质量」更重要,还是「提升故障响应能力」更重要?今天我们从管理指标量化的角度展开解读。

LigaAI的博客 720

介绍 9 个研发质量度量指标

研发质量度量指标中的 MTTR、MTBF、MTTF、MTTD、MTRS 都是什么?今天一次性讲清楚!

LigaAI的博客 1783

3 个技巧,让你像技术专家一样解决编码问题

于开发者而言,比学习语法更重要的,是用代码解决实际问题。本文从技术专家解决问题的技巧出发,提出了三个帮助开发者提升复杂问题解决能力的方法。

LigaAI的博客 904

ChatGPT 之后,B 端产品设计会迎来颠覆式革命吗?| Liga妙谈

ChatGPT 掀起了国内的大模型革命,当一部分先行者正在努力探索中国 LLM 的形态,LigaAI 关心起了 GPT 类人工智能在 B 端产品的落地与影响。

LigaAI的博客 1691

技术分享 | 如何编写同时兼容 Vue2 和 Vue3 的代码?

资深前端倾情分享:如何实现同时兼容 Vue2 与 Vue3 的代码?业务实践中有哪些代码精简和优化的小技巧?

LigaAI的博客 1636
上一篇: 技术分享 | SpringBoot 流式输出时,正常输出后为何突然报错?
LigaAI
LigaAI 企业官方账号 企业官方账号
博客等级 码龄6年 258粉丝 85原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值