技术债重写陷阱:为何推倒重来往往适得其反

系统重写成功率极低,渐进式迁移与测试驱动重构才是偿还技术债的可靠路径。
工程师面对遗留代码时往往产生"推倒重来"的冲动,但资深工程师 Simon Willison 的亲身经历和业界规律均表明,完整系统重写的成功率出奇地低。其核心原因有三:旧系统在重写期间持续运行并累积新债,成为"移动靶";新团队低估了旧系统行为边界的隐性复杂度;以及长周期无交付导致的管理压力最终逼出妥协,形成"两套生产系统并存"的更糟局面。文章推荐 Will Larson 的渐进式迁移框架与"先补测试、再重构"策略作为替代方案,两者共同保证在持续交付价值的同时控制风险。只有在技术栈已不可维护、系统规模极小或已有完善测试规范这三种情况下,重写才是合理选项。真正负责任的技术决策,应优先评估渐进式改进的可行性,而非将重写作为逃避复杂度的捷径。
技术债的终极诱惑:推倒重来
每一个在老旧代码库里挣扎过的工程师,都曾有过这个念头:与其在这堆腐烂的代码上缝缝补补,不如彻底推倒,从头写一个干净的系统。这个想法有着强烈的感情力量——新项目、绿地开发、没有历史包袱。然而,资深工程师 Simon Willison 在 Lobste.rs 技术社区的一篇评论中,以亲身经历道出了一个残酷的现实:完整的系统重写,成功率低得出奇。
这不是个人偏见,而是软件工程领域一个被反复验证的规律。理解它为何如此,以及应对技术债的更可行路径,对任何团队都有现实意义。

系统重写的三大死亡螺旋
旧系统变成移动靶
当你宣布旧系统"技术债严重、无可救药"并启动重写项目时,第一个问题就随之而来:旧系统不会停止运转。它仍在承载核心业务,仍然需要响应新需求。而此时负责维护旧系统的开发者,清楚地知道自己的工作即将被取代,自然倾向于以最小投入应付新功能。于是技术债非但没有停止累积,反而加速恶化。
话说回来,旧系统在生产环境中依然稳定运行这一事实,会不断消耗管理层对重写项目的耐心。毕竟,一个"坏掉"但还在跑的系统,比一个"正在建造中"的替代品更有说服力。
新团队低估了未知的复杂度
承担重写任务的团队,往往是公司里最有雄心的工程师。绿地开发的初期进展飞快,一切都那么美好。但随着时间推移,一个残酷的真相浮出水面:没有人真正完整地理解那个旧系统的行为边界。
Willison 一针见血地指出:如果旧系统有完善的文档和测试,它就不需要被重写了。 正因为它缺乏这些,新团队才会在开发过程中不断踩到未知的地雷——某个边缘 case 的处理逻辑,某个只有老员工口耳相传的业务规则,某个在特定时区才会触发的 bug 修复。
交付压力下的妥协
在数月乃至数年没有交付可见价值之后,来自管理层的压力会骤然上升。最终,新系统往往以一种尴尬的形态上线:它只处理旧系统功能的一个子集,或者仅用于承接某个"旧系统太难实现"的新功能。
结果就是 Willison 描述的那个噩梦场景:你最终拥有了两套生产系统——一个没人愿意碰的老旧系统,加上一个只承担少量功能、80% 代码都是"将来用于替换老系统"的新系统。如果公司运气不好,在完成全量迁移之前"战略优先级发生了变化",那么这两套系统就会永久共存,复杂度翻倍。
更可行的替代方案:渐进式迁移
Will Larson 的迁移框架
Willison 推荐的权威参考是 Will Larson 的文章《Migrations: the sole scalable fix to tech debt》(迁移:解决技术债的唯一可扩展方式)。Larson 的核心论点是:技术债问题的根本解决路径不是重写,而是有计划、可验证的渐进式迁移。
这一框架的关键在于把迁移工作拆解为一系列小的、可独立交付的步骤,每一步都让系统变得稍微更好一点,而不是押注于一次大爆炸式的替换。每个迁移步骤都需要有清晰的成功标准和回滚方案。
先用测试覆盖,再做重构
Willison 基于自身经验给出了具体建议:用尽可能多的自动化测试覆盖现有系统,然后通过针对性的重构让它逐步达到期望的状态。
这个策略的逻辑很清晰:测试不仅是质量保障工具,更是对系统行为的精确文档化。当你开始为一个混乱的遗留系统补写测试时,你会强迫自己真正理解它的每一个行为——包括那些没有人记得为什么要这样写的"奇怪逻辑"。有了测试覆盖,重构就从一场赌博变成了一个可控的工程过程。
相比完整重写,渐进式迁移有几个显著优势:
- 持续交付价值:每一次重构都直接改善生产系统,不存在"等新系统上线"的漫长等待期
- 风险可控:测试提供了安全网,每次改动都可以立即验证
- 知识留存:重构过程本身就是团队深入理解旧系统的过程,而不是绕过它
- 避免双系统困境:始终只有一套生产系统需要维护
何时重写才是合理的选择
当然,这不是说重写永远不对。以下几种情况下,重写可能是合理的:
技术栈已无法支撑业务需求:比如系统依赖的运行时或框架已经停止维护,安全漏洞无法修补,而渐进式迁移在技术上不可行。
代码库规模极小且边界清晰:对于一个几千行代码、职责单一的服务,完整重写的风险是可控的。Joel Spolsky 在经典文章《Things You Should Never Do》里批评的"推倒重来",主要针对的是大型复杂系统。
有充分的测试规范可以驱动重写:如果旧系统有非常完善的测试套件,或者业务规则有清晰的文档,新系统可以以此为验收标准,重写的成功率会大幅提高——但这恰恰说明,好的测试和文档是一切的前提。
技术领导者的核心判断
对于技术领导者而言,"是否重写"的决策往往不只是技术问题,更是一个组织问题和优先级问题。重写项目需要长期的资源投入,需要在没有明显进展的漫长周期内维持管理层的信任,还需要管理两套系统并行期间的协调成本。
在做出这个决策之前,值得认真问自己几个问题:我们是否真正理解了旧系统的完整行为?我们是否已经用测试覆盖了关键路径?渐进式重构是否真的走不通,还是我们只是不愿意做那些枯燥的补测试工作?
Willison 的洞察提醒我们:推倒重来的冲动,往往来自于对现有系统的厌倦,而不是对问题的深刻理解。 真正负责任的技术决策,是在充分评估渐进式改进的可行性之后,才考虑更激进的选项。技术债是可以被系统性地偿还的,但这需要的是耐心和纪律,而不是一次赌博式的全面重写。
相关推荐

Claude+Obsidian自组织AI第二大脑:开源知识管理新范式
claude-obsidian是一款将Claude Code与Obsidian深度结合的开源项目,实现AI自动整理、链接和归档知识,以纯Markdown本地存储,打造自组织的AI第二大脑,是重视数据主权的知识工作者的理想选择。

10小时从零构建AI SaaS并获得付费用户:独立开发者创业实验全记录
一位16岁创作者用10小时从零构建AI SaaS产品Polymind并获得真实付费用户。详解产品定义、品牌设计、MVP搭建、定价策略与多渠道分发的完整流程,揭示分发比构建更难的创业真相。

公共厕所都去哪了?城市公共设施消失背后的深层危机
从Hacker News热门讨论出发,深入分析公共厕所消失的多重原因:财政压力、治安问题、私有化趋势,以及智能化技术能否拯救城市公共基础设施的未来。