当前位置:首页 > 科研成果库

代码里的高利贷:软件工程开发中,技术债是怎么让你加班还利息的

2026-10-23 16:16:08小研科研成果库9

去年冬天,我接手了一个“祖传”项目。打开代码库的那一刻,我盯着屏幕愣了十秒——某个核心类的注释写着:“这里别动,动了会炸,具体原因问老王。” 老王?老王去年就离职去卖保险了。这感觉,就像你翻开一本菜谱,上面写着“盐少许,糖适量,火候自己看着办”。

说实话,当时我特想摔键盘。但忍住了。因为我自己写的代码,也没好到哪儿去。

这就是今天想聊的:软件工程开发里的技术债。别听到“债”字就划走,它跟你每个月还花呗的体验,本质上是一回事。

程序员深夜面对复杂代码库抓狂表情程序员深夜面对复杂代码库抓狂表情

你以为是赶工,其实是签了张高利贷合同

先讲个真事儿。我之前带过一个需求,产品经理说“三天后上线,功能特简单”。我一看,确实简单,一个表单提交。于是为了快,我直接把校验逻辑硬编码在接口里,数据库字段也没加索引,想着“反正数据量小,以后再说”。结果呢?一个月后数据量涨了十倍,那个没索引的查询直接把数据库拖垮。半夜两点我被电话叫醒,后台报错狂刷屏。修了四个小时,临时加了索引,加了缓存,还顺手把硬编码的校验重构了一遍——花的时间够我当初认真写三遍。

你看,这就是技术债的经典套路。你借了一笔“时间债”,当时觉得占了便宜,省下两天。但利息是按复利算的。第二次修改这个功能时,你得多花半天理解当时的骚操作;第三次,你得绕开那个坑;第四次,新来的同事直接开骂:“这谁写的烂代码!”——没错,就是你。

技术债不是贬义词,它是个中性的金融比喻。 就像企业借钱扩大生产,只要投资回报率高于利息,就是良性负债。软件工程开发也一样。有些债是该借的:比如为了赶一个市场窗口期,临时写个丑陋的脚本跑数据,上线后再补。但问题在于,大多数人只借不还,然后假装看不见。

技术债复利增长曲线与维护成本对比图技术债复利增长曲线与维护成本对比图

它不是“烂代码”三个字能概括的

它不是“烂代码”三个字能概括的它不是“烂代码”三个字能概括的

很多人一提技术债,就想到“代码写得丑”。不对。丑代码只是表象。真正的债分好几种,有些甚至代码本身很漂亮。

比如架构债。你早期为了快,把用户模块和订单模块塞在一个服务里。后来业务膨胀,想拆都拆不动,因为数据库表互相交叉,改一行代码要测五个场景。代码写得再优雅,架构烂了,就是背着水泥板游泳。

再说测试债。你有没有过这种经历:每次发版前,测试同学手动点点点,心里默念“千万别出问题”。没有自动化测试,改个按钮颜色你可能得重新回归登录、下单、支付全流程。这叫什么?人力当编译器用。借了不写测试的债,利息就是每次发布的心跳加速。

还有文档债。就是开头那个“问老王”。注释和文档过期,比没有更可怕。没有文档你知道去读代码,有了错误文档,你反而会被带进沟里。这就像导航地图上标着一条路,开过去发现是悬崖——你骂不骂人?

最隐蔽的是认知债。团队里只有一个人懂某个模块,其他人碰都不敢碰。那个人一旦请假,整个项目停摆。这种债你没法用代码行数衡量,但它比任何bug都致命。

还债不是搞一场“代码大扫除”

还债不是搞一场“代码大扫除”还债不是搞一场“代码大扫除”

我见过不少团队,平时对技术债视而不见,等到季度末搞一次“重构周”,把老大难模块重写一遍。结果呢?重写往往引入新bug,新bug催生新债,循环往复。

我自己踩过的坑:曾经觉得某个模块太乱,花两周重写。上线后性能反而下降了20%,因为原代码虽然丑,但做了各种奇怪的缓存优化。我重写时把这些“丑但有用”的逻辑干掉了。你看,你以为在还债,其实是借了笔新的。

更靠谱的思路是:把技术债当日常开销来管,而不是搞运动式清偿。怎么做?三个土办法,亲测有效。

第一,给债打标签。不用搞复杂的债务清单,就在代码里加上特定注释,比如// DEBT: 临时方案,下个迭代必须处理,然后把这些注释汇总到某个看板上。每次迭代规划时,留出10%左右的工时专门还债。别贪多,就10%。多了老板不干,少了不够用。

第二,让利息可视化。你光说“代码烂”,没人理你。得算账。比如:“这个没索引的查询,每天平均拖慢系统响应200ms,按用户量折算相当于每天损失X单转化。”或者:“这个模块每次改动平均需要额外2小时回归测试,一个月就是16小时。”当你能把技术债翻译成时间或钱,排期就容易多了。

第三,小步还,别梭哈。不要想着一次性把架构拆干净。每次修改旧代码时,顺手把周边那几行烂代码改掉。这叫“童子军军规”——离开营地时让它比来时干净一点。持续小剂量还债,比大动干戈安全得多。

有些债,真的不用还

说实话,网上很多文章把技术债说得像洪水猛兽,好像代码里有一行硬编码就天理难容。没必要。

你得看边界。如果这个功能下个月就要下线,或者只是内部工具,一辈子就几个人用,那硬编码就硬编码,没测试就没测试。还债也是要算ROI的。你花三天重构一个即将废弃的模块,那不叫敬业,叫浪费。

还有一类债,叫“可接受的丑陋”。比如某些性能极其敏感的热点路径,为了极致优化,代码写得像天书一样。你看着难受,但它运行得飞快,而且三年没改过。这种债,利息极低,甚至为零。那你就忍着。别手贱去“优化”它。

我的经验是:技术债最怕的是“不知道”。只要你清楚哪里借了债、利息多高、什么时候还,那就没问题。怕的是那种所有人都觉得“应该没事吧”的隐性债,最后在半夜两点炸给你看。

所以下次你写代码时,如果为了快而走了捷径,不妨在注释里诚实地写一句:“此处借债,原因:赶双十一大促。预计还债时间:下个迭代。利息:每次改动多花半小时。” 你看,连未来的自己都会感谢你——至少他不会对着屏幕骂“这傻X谁写的”。

毕竟,软件开发不是变魔术,是盖房子。地基歪了,楼越高越危险。但偶尔歪一块砖,记得住它在哪儿,以后有空再敲正。别学老王,跑了还留个谜语。