技术债务:欠债总是要还的

技术债不是“烂代码”这么简单,它是一种用未来成本换今天速度的融资行为。小明带你拆解技术债的本金与利息、如何识别与量化、什么时候可以欠、如何用制度化方式还债,避免项目被债务拖死。

16 分钟阅读
小明

技术债务:欠债总是要还的

你有没有过这种项目体验:

  • 第一个月:需求飞起,功能像下饺子
  • 第三个月:每次改动都要祈祷“别炸”
  • 第六个月:一个小需求要改两周,大家开始互相甩锅

然后你会听到一句熟悉的总结:

这项目技术债太多了。

但“技术债”经常被用成一个万能骂人词:

  • 代码难看 = 技术债
  • 没时间重构 = 技术债
  • 项目出 bug = 技术债

这样说没用,因为你无法行动。

今天我们把技术债讲成一件可操作的事:

  • 技术债到底是什么(不是鸡汤)
  • 它的“本金”和“利息”怎么理解
  • 什么债可以欠,什么债千万别欠
  • 怎么还:不是靠激情,是靠制度

1. 技术债到底是什么?一句话定义

最准确的定义其实很冷酷:

技术债 = 用未来的额外成本,换取今天的交付速度。

它是一种“融资行为”。

你今天走捷径,未来就要用更多时间把路修回来。

关键点:技术债不是天然坏。

  • 有意识地欠债:为了抢窗口期,有计划地后续偿还(可控)
  • 无意识地欠债:因为不懂/乱改/随便拼凑(失控)

你真正怕的是第二种。


2. 本金与利息:为什么债务会越滚越大?

2.1 本金:你欠下的“工程缺口”

比如:

  • 没写测试
  • 模块边界混乱
  • 复制粘贴的逻辑没有抽象
  • 过度耦合导致改一处牵一片

这些是债务本金。

2.2 利息:你每次开发都要多付的“额外成本”

利息更可怕,因为它会每天收:

  • 你要花更多时间理解代码
  • 你要花更多时间回归测试
  • 你要花更多时间处理副作用
  • 你不敢改,只能绕路 → 更大债务

技术债最阴险的一点:

你以为自己在“省时间”,其实只是把成本移到了未来,并且加了利息。


3. 技术债从哪里来?最常见的 6 个来源

  1. 赶进度的临时方案没回收:临时 if/开关/补丁永久化
  2. 复制粘贴驱动开发:逻辑散落,修 bug 修出连锁反应
  3. 缺失测试与边界保护:每次改动都像拆炸弹
  4. 过度抽象或抽象不足:要么太复杂,要么全靠重复
  5. 依赖/架构失控:循环依赖、层级倒挂、跨层访问
  6. 组织层面的问题:需求频繁变更、没有技术规划、评审走过场

注意:最后一条很重要。

技术债不只是代码问题,很多时候是组织决策在代码里的投影。


4. 什么债可以欠?什么债千万别欠?

你可以用一个简单标准判断:

4.1 可以欠:可隔离、可回收、影响面小

例如:

  • 做一个临时开关(feature flag)快速上线
  • 做一个可替换的适配层(adapter)
  • 把“脏逻辑”关进一个模块,后续再重写

关键是:

  • 你知道它是债
  • 你知道怎么还
  • 你知道影响范围

4.2 别欠:基础设施层面的债

例如:

  • 权限体系乱写
  • 数据模型随意变更
  • 核心链路没有可观测性
  • 故障恢复/备份缺失

这种债会把利息收在所有功能上:项目越大越痛。


5. 怎么量化技术债?让它从“情绪”变成“指标”

技术债难在:大家都知道它存在,但没人知道“有多严重”。

你可以用这些可执行的信号:

  • 交付速度趋势:同等规模需求耗时是否持续上升?
  • 变更失败率:发布失败/回滚次数是否增加?
  • 缺陷密度:同类 bug 是否反复出现?
  • 代码健康指标:重复率、复杂度、圈复杂度、依赖环
  • 开发者体验:本地跑起来要多久?改动一次回归要多久?

这些不是为了 KPI,而是为了让“还债”有一个可讨论的依据。


6. 还债策略:不是靠“周末加班重构”,而是靠系统

6.1 建一个“债务清单”(Debt Register)

把债务写下来:

  • 债务描述
  • 影响范围
  • 风险等级
  • 预计偿还成本
  • 触发还债的条件(比如:下次碰到该模块就顺手还)

写下来很关键:

  • 不写出来就永远是“大家都知道,但没人管”

6.2 给还债留预算:10%~20% 的制度化时间

常见做法:

  • 每个迭代固定留 10%~20% 做重构、补测试、清理依赖
  • 或者设立“技术债务日”

你不需要一次还清。

你需要的是:让债务不再增长,且利息逐步下降。

6.3 还债优先级:先还“利息最高”的

别被“看起来很脏”的代码骗了。

优先还:

  • 改动频繁的核心路径
  • 经常引发事故的模块
  • 影响多个团队的公共组件

因为这里的利息最高。

6.4 用测试做“还债的货币”

很多重构失败不是技术能力问题,是缺少安全网。

  • 没测试 → 不敢改 → 只能继续欠
  • 有测试 → 能改 → 债务能还

测试不是“写给 QA 的”,是“写给未来自己和团队的”。


7. 面试怎么讲技术债?

你可以这样回答:

  • 技术债是用未来成本换当前速度。
  • 关键在于有意识欠债、可回收、可量化。
  • 我会用交付速度/变更失败率/缺陷趋势等信号衡量。
  • 偿还策略上,用债务清单 + 固定预算 + 测试安全网,优先处理利息最高的债。

这比“我们项目技术债很多”专业太多。


总结

  • 技术债不是骂人词,它是一种“工程融资”。
  • 它有本金与利息,最可怕的是利息会滚。
  • 可以欠可隔离、可回收的债;别欠基础设施级的债。
  • 还债要制度化:债务清单、固定预算、测试安全网。

小明金句收尾:

技术债不可怕,可怕的是你以为自己没欠。