定义技术债务
当我下个月要发表演讲时,我正在寻找技术债务的定义,这时我发现了一些令我震惊的事情:我在互联网上找不到技术债务的简单定义。
本文旨在清晰地定义技术债务、其影响和成因。在此过程中,我还会重点介绍一些与他人讨论技术债务时有用的比喻。
我对技术债务的定义
我尝试自己对技术债务做出一个全面的定义。我的想法是:
不必要的复杂性、重复、不合格的代码或其他有缺陷的代码的状态,会以时间、质量、安全、团队士气或其他形式引入风险。
通常是过去行动或不行动的结果。
马特·埃兰德(我)
虽然这个定义相当广泛和全面,但读起来不太好,而且感觉很冷淡。
Adam Tornhill 的定义
几周后,我读了 Adam Tornhill 的优秀著作《软件设计 X-Rays》,发现了这样的定义:
技术债务是指维护成本高于应有成本的代码。
Adam Tornhill,软件设计X-Rays
我喜欢这个定义。
具体来说,我喜欢它的简洁却又开放。 “维护成本更高”这个说法涵盖的范围很广,足以涵盖:
- 生产力/时间损失
- 缺陷增多带来的质量风险
- 糟糕的代码导致士气低落
虽然我不能说亚当有意涵盖这些内容,但我很高兴它确实如此。
技术债务的成因
Adam 的定义很好,但它并没有过多地阐述技术债务的成因。公平地说,我的定义也并没有太多地阐述这一点,所以现在我们来讨论一下。
我写了很多关于技术债务的文章,偶尔会收到这样的评论:“如果你们的工程师第一次就做对了,我们就不会有技术债务了”。
我认为这些类型的评论是常见的想法,但说明了对技术债务的性质和起源的轻微误解。
当然,技术债务的产生可能是因为我懒惰或者感觉有点不舒服,犯了一些愚蠢的错误,在我的代码中留下了一些未完成的 TODO 注释,或者偷工减料。
是的,技术债务可能源于开发人员缺乏技能或知识来正确完成他们正在尝试做的事情。这种情况通常发生在开发人员首次处理线程、数据库或 Web 服务通信代码时。
战略债务与金融隐喻
然而,技术债务也常常具有战略性——例如,当团队需要紧急修复一个我们未曾预料到的问题,而需要偷工减料时。此外,在紧迫的截止日期下运营的团队也会在业务部门接受的截止日期的鼓励或要求下偷工减料。
这意味着技术债务可以是一个战略决策。这正是金融隐喻最能发挥作用的地方。
用金融的比喻来说,我们可以把承担债务看作一笔贷款,所有不利影响都是贷款利息,如下面的瀑布图所示:
有关此图表的内容以及技术债务如何随时间推移对我们产生影响的更多信息,请参阅我关于了解技术债务的真实成本的文章。
农业与技术债务的影响
要谈论技术债务的影响,我想谈谈农业领域(没有双关语的意思)。

大多数人都知道,如果你年复一年地在田里种植同样的作物而不让田地休息,你最终从田地中获得的收益就会递减。
这是因为农作物耗尽了土壤中的养分,因此同样的努力会随着时间的推移而导致回报减少。
同样的道理,如果你不断地让你的开发团队疲于奔命地实现一个又一个的功能,那么由于代码质量下降,错误就会更加普遍,而且你会发现将功能推向市场需要更多的时间。
农业生产中的解决办法是让田地休耕一个季节,或者轮作种植能够补充土壤养分的作物。
对于技术债务,答案是分配时间来偿还技术债务。请参阅我关于偿还技术债务策略的专题文章,了解更多详情。
萎缩和技术债务
技术债务也可能以软件萎缩和老化的形式出现。假设我用 SomeNewWebFramework 2.0 编写了一个漂亮的应用程序。它在各个方面都很完美。用户喜欢它,代码简洁易维护。
几年过去了,SomeNewWebFramework 4.2 正式发布。我们的代码仍然停留在 2.0 版本,这意味着我们需要花费一些时间和精力才能升级到更现代的版本。此外,4.2 版本的发行说明中提到,他们修复了一些之前未知但自 1.0 版本就存在的安全漏洞。
这个例子说明了应用程序如何在短时间内从尖端代码转变为遗留代码——而无需对其代码进行任何更改。
软件萎缩是真实存在的,它是一种不常被认识到的技术债务形式。
管道和动脉
我不太喜欢使用这个比喻,因为它有点病态,但你可以将技术债务比作管道中积累的腐蚀或动脉中的斑块。
随着时间的推移,糟糕的代码会像我们比喻中的腐蚀或斑块一样自然地在系统中积累。这种积累会降低新工作在系统中的流通能力,从而有效地降低速度。
这也使得系统中的工作流程更有可能导致堵塞或释放沉积物并将其推向下游,从而引发相当于人类中风和心脏病的重大问题。
就像我说的,这个更病态,但如果你发现有人不理解农业隐喻,将你无疑遇到的质量问题与管道和动脉中的积聚进行比较可能会有所帮助。
这种比较是必要的,因为解决方法是停止(或严重减少)系统中的工作,并投资侵入性程序来偿还技术债务,以免它毁掉你的产品。
结束语
因为我不想结束关于心脏病和中风与软件相关的讨论,所以我们以一些不同的东西来结束。
以组织能够理解并优先处理的方式讨论技术债务至关重要。更重要的是,它是技术领导工作量的关键部分,他们必须平衡多种因素,包括:
- 招聘、培训和留住开发人员
- 规划业务发展所需的架构和代码
- 管理业务技术重点的实施
- 帮助企业实现战略目标
- 降低 IT 基础设施成本
- 向组织传达技术债务和质量缺陷方面的关键风险
如果您想了解有关沟通技术债务的更多信息,我强烈建议您阅读我关于沟通技术债务的文章或参加我于 2020 年 1 月 9 日在 CodeMash 上的演讲。
定义技术债务一文首先出现在Kill All Defects上。
鏂囩珷鏉ユ簮锛�https://dev.to/integerman/defining-technical-debt-2e08