跳到主内容

用 AI 重构遗留代码:接手老项目的三步法与三条红线

100%
用 AI 重构遗留代码:接手老项目的三步法与三条红线

用 AI 重构遗留代码,正确顺序是先补测试网再动手,不是让模型直接改——没有可回退的基线,你得到的只是「看起来更干净」的错误代码。 AI 在这个场景真正的价值是把读代码的成本压到接近零:它能在几十分钟内给出模块依赖、风险分级和业务规则摘要,而人只需要守住「每次改动都能验证」这条底线。

为什么老项目重构总在半途死掉

Anthropic 在《 Code Modernization Playbook 》里把遗留系统改造分成几个成熟度阶段,最底层那一档的共同特征是:代码行数、年龄、重要性的清单有,但没有 ROI 分析,也没有可自动验证的手段。于是团队只能靠人肉核对每一次翻译结果,进度必然卡住。

常见失败原因其实就三条:

  • 没人知道这段代码到底干什么:原作者已离职,注释与实现早已脱节。
  • 没有测试,改完不敢发:改动的正确性只能靠”看起来对不对”。
  • 重构和功能改动混在一次提交里:出问题时无法二分定位。

三步法:画像 → 基线 → 小步

第一步:先让 AI 产出模块画像,不要让它改代码

把仓库路径交给 AI,只要求它输出三样东西:模块依赖图、风险分级(改动影响面)、以及每个模块的业务规则摘要。这个阶段禁止任何写操作。用 Claude Code 时可以直接开只读会话;用 Cline 这类插件则把 Plan 模式当作默认,确认后再进 Act 模式。

阅读 src/order 目录,输出:
1. 模块间依赖列表(谁调用谁)
2. 按"改动影响面"给模块分高/中/低三档
3. 用中文写出每个模块的业务规则,不超过 5 条
不要修改任何文件。

有了这份画像,你才知道该从哪儿下刀。我们的经验是先动低风险、高重复的模块,把 AI 的产出与人工判断做一次校准,再往核心业务推进。

第二步:建立可回退基线(characterization test)

这是最容易被跳过、也最要命的一步。对要重构的模块,先写一批”描述当前行为”的测试——注意,是记录它现在怎么跑,而不是它应该怎么写。哪怕当前行为本身就是 bug,也先固化下来,等重构完成、行为保持一致的证据拿到手之后,再单独修 bug 。

这层测试正是 Michael Feathers 在《修改代码的艺术》里讲的”接缝”:没有它,后面每一步都是在赌。 AI 在这里效率很高,把模块喂给它让它生成覆盖测试即可,但生成完必须自己抽查断言是否真的检查了行为,而不是只验证了”没抛异常”。

第三步:小步重构,一次提交一个动作

每次只做一种重构手法:提取函数、消除重复、以卫语句替换嵌套条件、拆分大模块。每一步都要满足三个条件——能编译、测试全绿、提交信息写清用了哪种手法。 Anthropic 团队在内部实践里反复强调的一点很实用:把工具设计成让模型不容易犯错,比如文件操作工具强制要求绝对路径,模型就不再会在切换目录后写错相对路径。

四类优先动刀的点

类型判断标准AI 提效程度风险
死代码清理从入口追踪调用图后不可达高(自动追踪调用链)低
重复逻辑提取相同代码块出现 3 次以上高低
嵌套条件化简缩进超过 3 层、函数超过 30 行中高中(易改行为)
大模块拆分单文件超过 800 行且职责混杂中高(依赖方向易乱)

拆模块这一步建议留到最后,并且先让 AI 画出目标依赖方向,人工确认没有循环依赖了再动手。

三条不能碰的红线

  • 禁止重构与功能改动混提交:一次 PR 只做一件事,否则无法二分定位回归。
  • 禁止在无测试覆盖的核心计费 / 权限路径上让 AI 自由发挥:这类模块必须人工逐行 review 。
  • 禁止把”AI 说它完成了”当作验收标准:验收只看测试是否变绿、覆盖率是否下降、静态分析告警数是否变少。
经验值:一轮重构里 AI 改的代码行数和人工 review 的时间比,控制在 10:1 左右比较舒服。超过这个比例,review 就成了走过场,等于把风险原样搬进了主干。

成本与产出的现实预期

别指望”一键现代化”。真正能压缩的是理解成本——以前两个人周才能摸清的模块,现在一个下午能出画像;真正压不动的是业务决策——哪些行为是历史包袱、哪些是刻意设计,AI 不知道,只有人和业务方能判断。所以合理的分工是:AI 负责读、负责改、负责跑测试;人负责定义”什么才算改对了”。

相关阅读


没有测试的老项目,第一步到底该做什么?
先补 characterization test(描述当前行为的测试),而不是补”正确行为”的测试。目标是拿到一条可回退的基线,让后续每次改动都能被自动验证。等重构完成、行为一致被证明之后,再单独修 bug 。

AI 生成的重构代码能直接合并吗?
不能。 AI 擅长枚举和批量改写,但不理解哪些奇怪行为是历史业务规则。至少要在核心路径上人工逐行 review,并确认测试覆盖率没有下降、静态分析告警数没有增加。

大文件几千行,AI 上下文塞不下怎么办?
不要整文件塞进去。先让 AI 产出依赖画像确定边界,再按模块逐个处理;处理时只喂”目标模块 + 它的直接调用方”,比整仓塞入效果好得多。也可以让 AI 用脚本做结构化分析,而不是让它读完再改。

重构后性能和行为都变了,怎么定位是哪一步引入的?
这就是”一次提交一个动作”的意义。用 git bisect 在提交序列上二分,每个提交只对应一种重构手法,定位成本几乎为零。如果当时混着提交,就只能靠人肉 diff 了。

看 Claude Code Hooks 实战
这篇有帮助吗?
云上的幻象
云上的幻象查看主页

七彩云博客,分享 WordPress 建站实战与 AI 工具测评,覆盖服务器运维、站长工具、软件资源与电商运营干货,专注原创实用的主题插件、网站加速与安全优化教程。

795文章4评论

相关文章

评论 (0)

欢迎你,新朋友,感谢参与互动!文明发言,理性交流 · 首次评论将在审核后展示