5年前,我发誓绝不欠技术债
2019年,我接手了一个创业公司的技术团队。前任CTO留下了一个"技术债博物馆":8000行的UserService.java,没有测试,没有文档,注释写着"TODO: refactor this mess" —— 发布于2017年。
我发誓:在我的任期内,绝不欠技术债。
5年后,我在给团队做技术债管理培训。不是因为我没有欠债,而是因为我学会了识别"好债"和"坏债",学会了在合适的时候借,在合适的时候还。
技术债不是你想不借就能不借的
2021年,我们签下了一个大客户。合同要求30天内上线定制化功能。如果拒绝,公司现金流撑不过两个月。
“完美架构"需要6周,但客户只给4周。我们做了一个妥协:把定制化逻辑硬编码在核心服务里,用if (clientId == "bigco")作为分支条件。
这个决定让公司活了下来。这笔债的利息是:之后两年,每次修改核心服务都要小心翼翼地绕开这些定制化逻辑。2023年,我们花了3个月重构,把这部分逻辑抽成了插件系统。
技术债的真相:它是你用时间换时间的金融工具。 你借的是"现在的开发时间”,还的是"未来的重构时间",利息是"维护成本上升"。
问题的关键不是"不要借债",而是"借了债要记账,要算利息,要在到期前还"。
好债和坏债的区别
五年的经验告诉我,技术债分为三类:
第一类:战略性技术债(好债)
这是你主动选择的、有明确还款计划的债务。比如:
- 用MVP快速验证市场需求,之后重构
- 为了赶上黑色星期五,先上线,再优化
- 技术选型暂时用简单方案(单体应用),等业务量上来了再拆分
这类债的特征是:你有意识地在借,你知道利息是多少,你定了还款日期,你预留了还款预算。
第二类:无知性技术债(坏债)
这是你不知道自己在借的债。比如:
- 不知道数据库索引应该怎么建,但先上线了再说
- 不知道SQL注入是什么,用户输入直接拼接SQL
- 不知道分布式事务的复杂性,以为"加个try-catch就行"
这类债的特征是:你不知道它的存在,直到它炸了。它的利息不是"维护成本上升",而是"生产事故"。
第三类:腐蚀性技术债(致命债)
这是明知是债但一直不还的债务。比如:
- 三年前写的8000行Service类,每次都有人在上面加代码
- 从不更新的第三方依赖,CVE漏洞已经攒了47个
- 没有测试的代码,没人敢改,但业务需求不断往上面堆
这类债的特征是:它像一堵越垒越高的墙,最终阻止一切变化。等到系统必须重构时,成本和风险已经高到不可接受。
技术债管理的三个黄金法则
法则一:技术债登记簿
我们团队维护了一个"技术债登记簿",就是Confluence上的一个页面。每笔技术债包含:
- 产生原因(为什么借)
- 影响范围(哪个模块)
- 利息估算(当前的维护成本)
- 还款计划(什么时候还)
- 负责人
这个环节最关键的是"产生原因":如果原因是"赶进度",OK,我们记下来,以后还。如果原因是"不知道怎么做",这是技能缺口,需要培训。
法则二:20%还债配额
每个Sprint,我们预留20%的时间专门还技术债。不是"有时间就还",是"必须还"。这20%的时间让技术债从未失控。
具体做法:每个Sprint Planning,从技术债登记簿里拉出TOP 3最紧急的债务(按"利息成本"排序),安排到Sprint里。
法则三:重构≠重写
团队最大的技术债还债错误是"推倒重写"。重写一个8000行的Service类,风险极高,而且往往新写的代码也有新问题。
正确的做法是"绞杀者模式":每次只改一小部分。比如这个Sprint,目标是把8000行Service里的"用户校验逻辑"抽成独立的Validator。下个Sprint,把"数据转换逻辑"抽成独立的Transformer。每次改动小到可以在一周内完成、测试、上线。
哪些债永远不要借
有些技术债是"高利贷",利息高到永远还不清:
不写测试。 这是最贵的技术债。没有测试,每次改代码都像拆盲盒。三个月后,没人敢改那段代码,技术债的利息变成"代码无法演进"。
不处理错误。 try { ... } catch (Exception e) { // ignore } 这种代码,利息是"生产环境出问题完全不知道发生了什么"。
硬编码配置。 把数据库密码、API Key、业务参数硬编码在代码里。利息是"每次改配置都要重新部署,而且要部署到所有环境"。
不做数据迁移。 “加个字段,给个默认值就行” —— 利息是"三个月后,没人知道这个字段的含义,数据一致性是个谜"。
一个反直觉的结论
五年下来,我最大的心得是:技术债管理的目标不是"零债务",而是"债务可控"。
就像企业需要银行贷款来扩大生产一样,技术团队也需要技术债来加速交付。只要你对每一笔债都心中有数,知道利息是多少,定了还款日期 —— 技术债就是你的杠杆,不是你的负担。
怕的不是有债,怕的是不知道欠了多少债,不知道利息滚到了多少,不知道什么时候该还。
记好你的技术债登记簿,这是CTO最重要的管理工作之一。