Ward Cunningham 在 1992 年提出「技术债务」这个概念时,他可能没想到三十年后这个词会成为每一个技术团队的噩梦。技术债务不像金融债务那样可以精确计算,它更像是一种熵——在看不见的地方悄悄增长,直到系统变得不可维护。

技术债务不是一种债

很多人把技术债务理解为「欠下的代码质量」,觉得只要花时间重构就能还清。这个理解有一个根本性的错误:技术债务不是贷款,而是复利。

金融债务:
  借 100 万,年利率 5%,每年还 5 万利息
  债务总额是确定的,还款计划是可预测的

技术债务:
  写了一段快速但丑陋的代码来赶 deadline
  第一个月:需要在这段代码旁边加个功能 → 多花了 2 小时
  第三个月:新人入职看不懂这段代码 → 多花了 2 天
  第六个月:这段代码的 Bug 引发了线上事故 → 多花了 1 周
  第十二个月:这段代码和其他模块的耦合太深,无法重构 → 被迫放弃

技术债务的利息不是线性的,而是指数增长的

这就是为什么技术债务不能「等有空了再还」——因为等你有空的时候,利息可能已经超过了本金。

技术债务的四种类型

Martin Fowler 在《Refactoring》中把技术债务分为四个象限:

                    鲁莽的                审慎的
              ┌──────────────────┬──────────────────┐
    故意的     │ "我们不需要测试"  │ "我们知道这里耦合   │
              │ "先 copy paste  │  太紧,但现在重构   │
              │  以后再重构"     │  会延误发布,下个月  │
              │                 │  专门处理"         │
              ├──────────────────┼──────────────────┤
    无意的     │ "什么是分层?"    │ "我们现在才理解    │
              │ "把 SQL 写在     │  应该怎么做"       │
              │  Controller 里"  │(随着认知深入发现   │
              │                 │  之前的设计有问题)  │
              └──────────────────┴──────────────────┘

鲁莽且故意的债务最危险——团队明知故犯,而且不考虑后果。