技术债务的真正代价不是重写,是决策瘫痪
每次技术债务的讨论,最后都会落在同一个分歧点上:要不要重写?
主张重写的人说,这堆代码已经烂到没法维护了,缝缝补补不如推倒重来。反对重写的人说,重写的失败率太高了,你重写的时候业务还在跑,最后往往是新系统写了一半、老系统还在加功能,两个系统一起维护到崩溃。
两边都有道理。但两边都忽略了一个更根本的问题:这个讨论本身,可能才是技术债务最贵的那部分。
技术债务的隐性利息
技术债务这个比喻本身就有误导性。金融债务是清晰的——你借了多少钱,利率多少,每月还多少,到期日是哪天,一目了然。但技术债务不是。没人能准确告诉你当前系统积累了多少"债务",也没人能说清楚这些债务的"利率"是多少。
我见过一个场景:团队花了三个月讨论要不要重写核心模块。三个月里,有人写方案,有人做技术调研,有人估算工作量,有人在会上争论渐进式重构还是大爆炸重写。这三个月的产出是什么?一个PPT,一份技术方案,和N次没有结论的会议。
而这三个月里,那个"债务模块"依然在跑,业务需求依然在堆,新加的代码依然在旧架构上打补丁。讨论结束的时候,技术债务又多积了三个月的利息。
这就是我想说的核心论点:技术债务最大的代价,从来不是维护成本,也不是重写成本,而是决策成本。团队在"该不该修"、"怎么修"、"什么时候修"这些问题上反复拉扯,消耗的注意力和时间远超技术债务本身。
为什么我们总是无法决策
技术债务的决策之所以困难,根本原因在于信息不对称。
争论重写还是重构的人,其实是在争论两种不确定的未来。主张重写的人不知道重写能否在预算内完成——这件事历史上翻车率极高。主张修补的人不知道修补能撑多久——也许还能撑两年,也许下个月就崩。两种主张都拿不出令人信服的数据,因为技术债务的影响本身就是难以量化的。
你不能跟业务方说"这个模块的技术债务导致我们开发效率降低了30%",因为你没有对照组。你也不能说"重写之后开发效率会提升多少",因为你还没重写。所有讨论都建立在主观判断上,而主观判断的差异是无法通过讨论弥合的。
更深一层,技术债务决策之所以瘫痪,还因为它牵扯到利益分配。谁来做这件事?如果选择重写,哪个团队来承担?这个团队在重写期间,业务需求谁接?这些问题本质上不是技术问题,是组织问题。而组织问题从来不是靠技术方案能解决的。
还有一个很少被提到的原因:对"正确决策"的执念。很多技术管理者觉得,重写还是重构,必须做出一个正确无悔的选择。但现实是,两种选择都有可能对也都有可能错,关键不在于选哪个,而在于选完之后执行的力度和节奏。然而"选完再执行"这件事太朴素了,远不如"深度分析、全面评估"听起来有技术含量,于是团队又回到分析循环里。
决策瘫痪的三个典型模式
观察下来,技术债务的决策瘫痪有三种常见模式。
第一种是"永恒评估"。每隔一段时间就有人提出技术债务的问题,然后启动一轮评估。评估报告写完了,放在落了灰的Confluence里,下次有人再提,再来一轮。每次评估的结论都差不多——"需要重构",但行动永远停在评估阶段。某个高频变更的业务模块可能被评估了四五遍,每次评估花的功夫加起来,都够重构一回了。
第二种是"完美方案陷阱"。团队倒是决定了要动手,但陷入了方案细节的无尽打磨。是渐进式重构还是绞杀者模式?新架构用微服务还是保持单体?数据层要不要一起改?接口版本怎么管理?每一个问题都能牵出一堆子问题,讨论的颗粒度越来越细,范围越来越大,直到方案的复杂度吓退了所有人。最后结论变成了"时机不成熟,以后再说"。
第三种是"局部最优博弈"。不同角色对技术债务的感知和诉求完全不同。产品经理觉得现在能跑就行;一线开发每天被烂代码折磨,恨不得明天就推倒;技术Leader要平衡业务交付和技术健康;老板只关心投入产出比。每个人都在从自己的局部最优出发,没人能做到全局最优,而全局最优的方案可能让某个角色的利益受损,于是被否决。博弈的结果就是维持现状——因为现状是唯一没有人需要主动为结果负责的选择。
拆解决策成本的构成
如果认真拆开看,技术债务导致的决策成本至少包含以下部分:
重复评估的成本。 同一个模块被不同的人、在不同的时间反复评估,每次都要做技术调研、写文档、拉会议。这些重复劳动几乎没有累积效应——第N次评估和第一次评估用到的信息可能差不了多少。
机会成本。 团队花在讨论技术债务上的时间,本可以用来做其他事情。这些事情不一定是业务需求,也可能是真正有价值的技术创新。决策瘫痪让团队的注意力被锁死在一个没有产出的循环里。
信任磨损。 每次提出技术债务问题却没有行动,都会消耗开发团队对管理层的信任。"说了也没用"的心态一旦形成,后面即便真的想推动重构,也没人愿意投入了。我见过有团队的项目变成这样:一线开发不再提技术债务,不是问题消失了,而是他们对解决问题的预期降为零。
补偿性成本。 决策做不出来,但业务不能停。于是团队只能在旧架构上不断打补丁,这些补丁本身又增加了系统的复杂度,让未来的决策更加困难。这不是技术债务的利息,这是决策瘫痪的利息——比技术债务本身的利息更高,而且复利增长。
那怎么办
我不打算给出一套"正确处理技术债务的方法论"——那又掉进完美方案的陷阱了。但有一些观察可能是值得参考的。
首先,降低决策的权重。技术债务不是非修不可的绝症,也不是可以永远忽略的小毛病。把它当一个持续管理的问题,而不是一个需要"正确决策"的重大事件。不要试图一次性解决所有技术债务,而是找到一个最小可行动的部分先动起来。动起来的价值远大于选对方案的价值。
其次,用时间盒替代完美方案。给自己两天的方案设计时间,到了时间就定,不再继续打磨。方案不需要完美,需要可执行。"先用绞杀者模式改掉最痛的那块"比"设计一个完善的重构蓝图"更有价值。大部分情况下,你不需要一套完美的架构,你需要的是打破死循环的第一步。
另一个观察是,技术债务的决策权不应该只属于技术团队。如果业务方不愿意为技术债务的偿还投入资源,那说明在他们的认知里,这个债务还不够痛。与其在技术团队内部反复讨论,不如让业务方直接看到代价——比如,每次因为技术债务导致的需求延期,都明确标注出来。不是为了甩锅,是为了让决策建立在对等的信息上。
还有一点可能有点反直觉:有时候,重写失败也没有想象中那么可怕。很多人拒绝重写的理由是"重写失败率很高",但失败也分很多种。最差的结果是重写了一半放弃,但你在重写过程中对业务逻辑的理解、对新架构的探索,这些收获不会因为项目终止而归零。真正可怕的不是重写失败,而是永远不敢开始。
最后,我越来越觉得,技术债务的讨论需要一种心态转变:从"要不要解决"变成"今天能解决多少"。前者是一个二元决策,容易陷入对立和僵局;后者是一个执行问题,天然导向行动。不信你看,那些技术债务处理得比较好的团队,通常不是因为他们做了多英明的决策,而是因为他们有一种持续消化的习惯——每次需求迭代顺手修一点,不做大动作,但绝不原地踏步。
决策本身就是成本
回头看,技术债务这个隐喻最大的问题在于,它把我们的注意力引向了"偿还"——仿佛只要把钱还上就好了。但现实中,技术债务更像是一种慢性病:重要的不是找到一剂猛药根治它,而是别让对"找到猛药"的执念耽误了日常的控制和管理。
一个团队在技术债务上真正应该警惕的信号,不是"代码有多烂",而是"讨论了多久还没动"。前者是成本,后者是成本的成本。前者有上限,后者可以无限膨胀。
我看过不少项目的复盘,真正拖垮项目的往往不是技术债务本身,而是在技术债务面前的长期不作为——但这种不作为又不同于怠工,团队其实也做了很多事,只不过做的都是评估、讨论、写方案、开会议。忙碌的瘫痪,比躺平的瘫痪更隐蔽,也更贵。
所以我的判断是:技术债务的讨论该结束了——不是因为它不重要,而是因为继续讨论的边际收益已经为负。你已经有足够的信息做判断了,缺的不是信息,是行动的勇气。选一个方向,动手做,做到一半发现方向不对就调整。这比再写一份评估报告值钱得多。
添加新评论