重写系统很少是技术债的解药

Simon Willison2026-09-07 05:02

当一个系统被技术债拖到难以维护时,团队很容易产生一个直觉:干脆推倒重写。

但在实际经验中,这种做法很少真正成功。

推倒重写的常见剧本

通常,事情会这样展开:

团队宣布旧系统已经被技术债淹没,无法挽救。于是公司组建一个新团队,从零开始重写。项目启动,一切看起来都很有希望。

与此同时,旧系统并不会停下来。

它仍然承载核心业务,所以仍然需要不断变更。维护旧系统的开发者知道它很快会被新系统取代,因此也缺乏动力去做长期改进。他们更可能用最小代价补上新需求。结果是,旧系统的技术债继续增加。

另一边,负责新系统的团队往往雄心勃勃,也可能有些天真。刚开始时进展很快,毕竟是绿地项目,没有历史包袱。但随着时间推移,团队会逐渐发现:没人真正完整理解旧系统的行为、边界和所有细节。

如果旧系统有完善文档和测试,它也许本来就不需要被整体替换。

新系统上线后,问题不一定减少

几个月,甚至几年过去后,新系统还没有交付足够业务价值,压力开始出现:必须上线。

于是新系统通常会先承接旧系统的一部分功能,或者承接某个在旧系统上已经很难实现的新功能。

结果是,组织现在有了两个生产系统:

  • 一个没人愿意碰、但仍在运转的旧系统;
  • 一个只处理少量生产功能的新系统;
  • 新系统里还可能存在大量“未来用于替换旧系统”的闲置代码。

如果运气足够好,公司还愿意继续投入,让迁移工作推进下去。

但时间拖得越久,旧系统继续稳定运行的时间越长,风险就越高:业务优先级改变,彻底替换计划被搁置。最终,原本只有一个难维护系统,现在变成了两个需要维护的系统。

更稳妥的方向:测试与定向重构

关于如何负责任地完成这类迁移,Will Larson 的《Migrations: the sole scalable fix to tech debt》是一篇值得参考的文章。

如果未来再次遇到类似情况,更稳妥的建议可能是:

  1. 先尽可能为旧系统补充自动化测试;
  2. 用测试保护现有行为;
  3. 再通过有针对性的重构,把系统逐步调整到理想形态。

相比从零重写,这种方式在许多场景下成功概率可能更高。

推倒重写的诱惑很强,尤其是在旧代码已经让团队痛苦不堪的时候。但现实中,绿地替换往往不是捷径,而是另一种更大规模的迁移项目。如果没有清晰边界、测试保障和持续交付价值的路径,它很容易把一个技术债问题变成两个系统的长期负担。

评论

请登录后发表观点

暂无数据