指南●●●5 分钟 · +40 XP
用 AI 理解并现代化改造老旧代码库
没有测试的遗留代码不能随便改写——特征测试(Characterization Tests)和小步骤能让 AI 辅助的现代化改造变得安全。
遗留代码的特殊之处
软件开发者 Michael Feathers 曾简洁地将遗留代码(Legacy Code)定义为"没有测试的代码"。这正是它在改动时危险的原因:如果没有测试记录下当前的行为,没有人——包括 AI 智能体——能够判断某个改动是否破坏了原有行为。
第一步:记录行为,而不是改进它
在动手改造任何东西之前,你需要先写特征测试。这些测试记录的是代码现在做了什么——即使这看起来很奇怪甚至是错的。它们不是对代码质量的评判,而是一张快照,用来保障后续的改动。
第二步:逐步迁移
完全重写风险很高:在新版本完成之前,系统运行都不可靠,而且旧代码中一些细微的行为往往会丢失。更成熟的做法是逐步迁移——一种被称为"绞杀者模式"(Strangler Fig)的做法:新的部分一点一点地围绕旧代码生长,直到旧代码最终可以被彻底关闭。
AI 智能体在这里特别有用的地方
智能体可以快速总结庞大、没有文档的模块,并提出可能的特征测试建议——这在缺乏文档的情况下通常非常耗费精力。但重点始终不变:先理解并做好保障,然后才能改动。
示例
提示词:"这个1800行的模块没有测试也没有文档。先总结一下它在业务上做了什么。然后为最重要的五个函数写特征测试,记录下当前的行为——即使它看起来很奇怪。先不要改动任何代码。"
🛠️ 练习——自己动手试试
从你自己的(或某个开源)项目中找一个没有测试、结构混乱的模块,在改动之前先用特征测试保障它。
- 先让智能体总结一下该模块在业务上做了什么,不要改动代码。
- 一起找出3-5个典型的输入/调用,让智能体写测试,把当前的输出记录为预期值。
- 之后再进行第一次小的、独立的改动,检查特征测试是否仍然通过。
✅ 自查清单
- ☐ 这些测试是否覆盖了最重要的路径,而不只是最简单的情况?
- ☐ 你是否有意识地记录了当前的行为,而不是在写测试的时候就顺手'改进'了它?
- ☐ 第一次改动之后是否一切仍然通过——或者有一个失败的测试恰好显示出发生了什么变化?
小测验
什么是特征测试(Characterization Test)?
来源
- Characterization test — Wikipedia ↗ en.wikipedia.org
- Legacy code — Wikipedia ↗ en.wikipedia.org
- Strangler Fig Application — martinfowler.com ↗ martinfowler.com
- Strangler Fig pattern — Microsoft Learn ↗ learn.microsoft.com
- Legacy Seam — martinfowler.com ↗ martinfowler.com