知识卡片
重构的悖论:变更越频繁的系统越需要重构,却越难被停下来重构
内容
很多团队把重构当作一种一次性的集中运动——代码烂到没法改,或者暂时没有新需求时,才召集一批人专门腾出一段时间来做重构。这种模式在传统企业开发里多少能奏效,但在互联网开发场景下很难适用,原因有两个:一是互联网开发讲究快速迭代,如果要做大型重构,往往意味着要暂停正常的需求开发,这在业务高速推进的环境下基本不现实;二是那些”没什么新需求”、看起来终于有空闲时间可以重构的项目,往往恰恰意味着这个项目本身已经过了业务发展的活跃期,即使投入精力重构,实际能带来的收益也很有限——重构真正有价值的地方,是让”未来还会被持续修改”的代码变得更好维护,而一个几乎不再变化的项目,重构收益天然接近于零。这两点叠加起来构成了一个真正的悖论:那些变更最频繁、最需要靠重构去控制不断累积的复杂度的系统,恰恰是最难被抽出大块时间专门重构的系统;而那些真的能腾出时间专门做重构的系统,往往又是重构收益最小的系统。面对这个悖论,一种消极的应对方式是干脆放弃重构,任由代码质量自然下降,直到项目生命周期结束再选择放弃或重来——这种方式在某些场景下确实”有效”(省去了重构投入),但代价是让工程师把大量精力持续消耗在应对越来越难维护的烂代码上,本质上是把重构这件事的成本,转移成了长期、持续、更隐蔽的日常开发效率损耗。这个悖论提示了一条思考”该不该重构、什么时候重构”的重要前提:不能简单地问”这段代码烂不烂”,而要同时追问”这段代码未来还会不会被持续修改”——重构决策的核心变量是代码的活跃度,而不是代码当下的整洁程度。
参考来源
- 位置:《高可用架构(第1卷)》第5章《运维保障》"5.7 系统运维之如何应对烂代码"节,"5.7.1 改善可维护性"(源文件:_epub-src/OEBPS/Text/Chapter5_7_2.xhtml)
- 结论依据:原文说明"互联网开发讲究快速迭代,如果要做大型重构,往往需要暂停需求开发,这个基本上很难实现……对于没有什么新需求的项目,往往意味着项目本身已经过了发展期,即使做了重构也带来不了什么收益。这就形成了一个悖论:一方面那些变更频繁的系统更需要重构;另一方面重构又会耽误开发进度,影响变更效率",直接支撑本卡片结论。
- 原始内容:这就形成了一个悖论:一方面那些变更频繁的系统更需要重构;另一方面重构又会耽误开发进度,影响变更效率。面对这种矛盾,一种解决方案是放弃重构,让代码质量自然下降,直到工程的生命周期结束。