遗留代码会随时间推移而恶化
遗留代码不会随着时间的推移而变得更好。它只会变得更糟。
上周,我花了三个小时修复一个 bug。本来只需要 20 分钟。问题出在 2019 年的一个验证模块上。因为“它能运行”,所以大家都忽略了它。但它根本没法运行。我在文件里发现了一个 2020 年的 TODO 注释。
许多人将遗留代码视为一种“可选债务”。他们认为等有时间了再还。但遗留代码更像霉菌。它会蔓延,并污染系统的其他部分。你忽视它的时间越长,清理它的成本就越高。
这会形成一个恶性循环:
- 你接手了一个混乱的项目。
- 为了让你的功能正常运行,你又多加了一个
if语句。 - 六个月后,别人也做了同样的事。
- 一年后,这个文件有了 800 行代码,而且一个测试都没有。
这种“能运行”的代码隐藏着成本:
- 开发速度下降。你花在阅读上下文上的时间比写代码的时间还多。
- Bug 增加。修好一个问题,却搞坏了另一个。
- 上手变得困难。新开发者很难理解为什么逻辑在到处重复。
注意这些危险信号:
- 无用或具有误导性的注释。
- 不同文件中重复的业务逻辑。
- 循环依赖和高耦合。
不要试图重写一切。全量重写有 80% 的失败率。你会花费数月时间去重建已经存在的东西,而业务方却在苦苦等待新功能。
使用带有特征测试(characterization tests)的增量重构:
- 用测试来捕捉当前的逻辑行为,哪怕它很奇怪。
- 在不改变该行为的情况下进行重构。
- 重复此过程,直到代码变得易读。
- 只有在那之后,才通过真正的测试来改变行为。
遵循这些规则以避免陷阱:
- 永远不要在没有测试的情况下进行重构。
- 重构期间不要改变行为。一个 bug 可能是客户赖以生存的、未记录的功能。
- 别动那些“安静”的代码。如果一个模块三年没变过且没出过问题,就别碰它。
把精力集中在你经常接触的代码上。
Source: https://dev.to/taina_costa_f/legacy-code-nao-envelhece-como-vinho-quanto-mais-espera-pior-fica-132h
