promptgarten 🌱
🌍 DE
指南●●●5 分钟 · +40 XP

用 AI 理解并现代化改造老旧代码库

没有测试的遗留代码不能随便改写——特征测试(Characterization Tests)和小步骤能让 AI 辅助的现代化改造变得安全。

遗留代码的特殊之处

软件开发者 Michael Feathers 曾简洁地将遗留代码(Legacy Code)定义为"没有测试的代码"。这正是它在改动时危险的原因:如果没有测试记录下当前的行为,没有人——包括 AI 智能体——能够判断某个改动是否破坏了原有行为。

第一步:记录行为,而不是改进它

在动手改造任何东西之前,你需要先写特征测试。这些测试记录的是代码现在做了什么——即使这看起来很奇怪甚至是错的。它们不是对代码质量的评判,而是一张快照,用来保障后续的改动。

第二步:逐步迁移

完全重写风险很高:在新版本完成之前,系统运行都不可靠,而且旧代码中一些细微的行为往往会丢失。更成熟的做法是逐步迁移——一种被称为"绞杀者模式"(Strangler Fig)的做法:新的部分一点一点地围绕旧代码生长,直到旧代码最终可以被彻底关闭。

AI 智能体在这里特别有用的地方

智能体可以快速总结庞大、没有文档的模块,并提出可能的特征测试建议——这在缺乏文档的情况下通常非常耗费精力。但重点始终不变:先理解并做好保障,然后才能改动。

示例

提示词:"这个1800行的模块没有测试也没有文档。先总结一下它在业务上做了什么。然后为最重要的五个函数写特征测试,记录下当前的行为——即使它看起来很奇怪。先不要改动任何代码。"

🛠️ 练习——自己动手试试

从你自己的(或某个开源)项目中找一个没有测试、结构混乱的模块,在改动之前先用特征测试保障它。

  1. 先让智能体总结一下该模块在业务上做了什么,不要改动代码。
  2. 一起找出3-5个典型的输入/调用,让智能体写测试,把当前的输出记录为预期值。
  3. 之后再进行第一次小的、独立的改动,检查特征测试是否仍然通过。

自查清单

  • 这些测试是否覆盖了最重要的路径,而不只是最简单的情况?
  • 你是否有意识地记录了当前的行为,而不是在写测试的时候就顺手'改进'了它?
  • 第一次改动之后是否一切仍然通过——或者有一个失败的测试恰好显示出发生了什么变化?

小测验

什么是特征测试(Characterization Test)?

来源

相关主题

用 agent 做测试:让它写测试,再把测试当成 gate ●●○用 AI 维护文档 ●○○用 AI agent 调试:系统化排查,而不是瞎猜 ●●○Agent 卡住了?这样解套 ●●○