比喻
Ward Cunningham 在 1992 年提出这个概念:
为了快速交付,走了"捷径"——就像借了一笔钱。
这笔钱让你可以更快拿到想要的东西,但要付利息:后续在这部分代码上工作的成本会增加。
技术债 = 为了短期速度而牺牲的长期质量。
常见形式
一、设计债:架构不合理,模块耦合严重,改一处要动多处。
二、代码债:命名混乱、重复代码、超长函数、缺乏注释。
三、测试债:没有测试或测试覆盖不足,改动不敢下手。
四、文档债:没有文档或文档过时,新人上手困难。
五、依赖债:使用了过时、不再维护、或有已知漏洞的第三方库。
六、基础设施债:部署流程手工化、缺少监控和告警、环境不一致。
并非全是坏事
技术债不总是错的。
有些债是有意的、战略性的:
- 为了验证一个产品假设,先用最快的方式做出来;
- 赶一个关键的时间窗口;
- 某个模块可能很快会被废弃,不值得投入高质量实现。
关键区别:
- 审慎的、有意识的债:知道自己在欠债,有计划偿还;
- 鲁莽的、无意识的债:不知道自己在欠债,也没有偿还计划。
后者才是真正危险的。
利息是怎么产生的
技术债的成本不是立即显现的,而是随时间累积:
- 在一个设计糟糕的模块上新增功能,耗时是新设计的数倍;
- 没有测试的代码,每次改动都要手工回归,且容易引入新的 bug;
- 过时的依赖最终会强制升级,届时可能要一次性完成多年的变更。
最危险的情况:债累积到某个临界点,系统的修改成本超过了重写成本——这时团队往往会选择"重写",而重写本身风险极高。
如何管理
一、让债可见。
把已知的技术债记录下来(如用 issue tracker 标记),定期审视。
看不见的债无法管理。
二、在迭代中预留偿还时间。
常见的做法是:每个迭代预留 15%–25% 的时间用于偿还技术债、重构和改进。
三、"童子军规则"(Boy Scout Rule):
每次经过一段代码,都让它比你来时干净一点。
不需要专门立项,而是把改进融入日常工作——改一个 bug 时顺便清理相关的混乱代码。
四、在代码评审中把关。
评审是防止新债产生的最有效环节。
五、量化影响。
向非技术干系人解释技术债,最好的方式是关联到业务影响:
- "这个模块改一个需求需要 3 周,而设计良好的情况只需要 3 天";
- "上次线上事故中,有 40% 的排查时间花在定位一个没有日志的模块"。
一个平衡
过度追求"零技术债"也是问题。
有些代码不需要完美——如果它稳定、很少改动、能正常工作,投入重构的收益可能低于成本。
判断标准:这段代码的变更频率和重要性。
- 高频修改、核心路径的代码 → 要保持高质量;
- 低频、边缘的代码 → 可以容忍一些"债"。
说明:本文为软件工程实践的知识整理。