技术债量化与偿还计划 别拿情怀填无底洞
饭吃到一半。
老周把筷子往搪瓷碗一撂,说上次赶大促欠的债,把今年团队的季度奖金都赔进去了。
他是南京软件大道那边做美妆电商的技术负责人,去年双11赶预售功能,为了省三天开发时间,把库存扣减逻辑直接堆在接口层,连个事务边界都没加。当时拍着胸脯说“大促过了就重构”,结果大促过了,新需求一个接一个,重构的事就被扔在了待办清单最底下。
今年3月做满减活动,用户集中下单把库存扣成了负数。三天出了七次超卖,赔了小二十万,客服消息爆到系统崩溃。
你眼里的技术债,为啥老板永远不认
很多团队聊技术债,开口就是“代码太烂,要重构”。
老板听了就皱眉。
你说代码烂,烂在哪?重构要花多少钱?花完钱能多赚多少钱?说不出来,那就是开发想摸鱼。
老周之前给老板报过一次重构预算,说库存模块耦合太严重,要抽人重构。老板批了20万,结果两个开发吭哧吭哧做了俩月,把重复代码抽成了公共方法,线上故障一次没少。为啥?因为他们从头到尾没算过,这块代码到底产生了多少实际成本。
真正的量化从来不是数代码里有多少坏味道。要算三本账:
第一本是故障账。把过去12个月,这块代码引发的所有线上问题拉出来,算平均每次要花多少人天排查修复,算上用户赔付、运营临时补单、客服接投诉的人力成本。别把故障损失算成“系统不稳定”,要算成实打实的真金白银。
第二本是效率账。每次在这块代码上开发新功能,要比正常模块多花多少时间。比如老周团队改优惠券叠加规则,正常模块3天能做完,在库存这块要12天,多出来的9天,就是技术债吃掉的开发效率。
第三本是协作账。新人接手这块代码,要花多少时间才敢动。比如新来的后端开发,对着库存模块看了一周都不敢写代码,光导师陪他做code review就花了8个小时,这些隐形成本,之前从来没人算过。
把所有坏味道都算成债,你会还到破产
说实话,我见过最离谱的团队,把所有没写单元测试的代码全列成技术债,算下来要还3年。
真没必要。
技术债本质是会持续产生成本的负资产,不是所有“不优雅”的代码都算债。
比如老周之前列的技术债清单里,有一条“用户中心的某个工具函数命名太随意,要改成标准驼峰”。算下来改完要2个人天,改完能减少多少成本?零。因为那个函数只有两个老员工在用,三年没出过一次bug,就算业务规模涨十倍,它也不会突然出问题。这种东西,直接从清单里划掉就行。
量化的时候给每个条目打两个分:一个是当前年成本,就是这块代码一年要吃掉多少人力和赔付;一个是未来增长系数,就是随着业务量上涨,这块的成本会涨得有多快。
比如那个命名不规范的函数,年成本是0,增长系数是1,直接淘汰。比如库存扣减的逻辑,年成本是120人天,增长系数是3——因为用户量涨三倍,故障的概率也会涨三倍,这个才是要优先还的债。
你别笑,很多团队的技术债清单,80%都是这种没什么实际成本的“精神洁癖”条目。花了半年时间把这些东西改完,真正的高成本债还在那躺着,等爆的时候损失翻好几倍。

还债不是抽整段时间重构

我见过最傻的还债操作,就是团队专门抽两个礼拜,停掉所有新需求开发,把老代码全重构一遍。
结果呢?重构到一半,业务那边催着上618的活动,代码半新半旧,比之前耦合还严重。压测都没过就上线,大促当天直接挂了,赔的钱比之前三年的故障损失加起来都多。
老周后来的做法就聪明多了。
他把算出来的60人天还债任务,拆成了碎块,揉进了每一个跟库存模块相关的日常需求里。比如每次开发跟库存有关的新功能,就强制留20%的开发时间,把当前接触到的那部分债还一点。上次做预售库存锁的功能,开发花了3天做新功能,花了1天把之前堆在接口层的扣减逻辑拆到独立服务层,加上了分布式锁。改完之后,这块的故障成本直接降了60%。
没有额外占业务时间,老板也没意见——他看到的是新功能按时上线了,线上故障少了,客服的投诉量降了。
算下来,他用6个月的时间,总共花了60人天的工作量,就把库存模块的年成本从120人天降到了10人天以内。折算下来,投入的成本两年就能收回来,之后每年都是净省。
对吧?
你跟老板说要抽时间重构代码,他觉得你在摸鱼。你跟他说,投60个人天,每年能省30万,还能少出三次线上故障,他比谁都积极。
别信什么零技术债的神话。不存在的。你写代码的时候,永远有更优的写法,永远有可以优化的地方。你要做的不是把债清零,是把那些会涨成高利贷的债,在它把你利润啃光之前,慢慢还掉。