用 AI 理解和重构遗留代码的实用方法
几乎每个工作多年的团队都有这样一套系统:代码量庞大、文档缺失、原作者早已离职,大家都不敢动它,但业务又离不开它。AI 编程助手在“读代码”这件事上表现出色,能够显著降低理解遗留系统的门槛。 但从“读懂”到“安全地改”,中间还需要严格的方法。
第一步:用 AI 建立整体认知
从结构开始
不要一上来就问某个函数做什么,先让 AI 帮你梳理整体:项目有哪些模块、各自负责什么、入口在哪里、核心数据结构是什么、依赖了哪些外部系统。对于仓库级理解能力较强的工具,可以直接让它阅读整个目录后输出架构概览。
追踪关键流程
选择一两个最重要的业务流程,例如“用户下单”,让 AI 从入口开始追踪调用链,列出经过的函数、读写的数据表、调用的外部接口。这比逐个文件阅读高效得多。
生成文档草稿
让 AI 为核心模块生成说明文档:职责、输入输出、关键业务规则、已知的特殊处理。这些文档必须经过熟悉业务的人核对,但作为起点能节省大量时间。
提问技巧
- 提供上下文:告诉 AI 这是一个什么业务的系统、使用什么技术栈、你想解决什么问题;
- 追问“为什么”:遗留代码中常有看似奇怪的处理,比如特殊的判断分支、硬编码的数值。让 AI 推测可能的原因,再通过版本历史或询问业务方验证;
- 要求标注不确定性:让 AI 区分“从代码中可以确定的”和“推测的”,避免把猜测当成事实;
- 交叉验证:对于关键结论,换个角度再问一次,或者直接运行代码验证。
第二步:建立行为基线
重构遗留代码最大的风险是改变了原有行为却不自知。在动手修改之前,需要先用测试把当前行为“固定”下来:
- 特征测试:不评判当前行为对错,只记录给定输入下的实际输出。AI 可以帮你快速生成大量这类测试;
- 覆盖关键路径:优先覆盖核心业务流程和你准备修改的区域;
- 记录真实数据样本:在合规前提下,用脱敏后的真实输入作为测试数据,往往能覆盖到人想不到的边界情况。
生成测试时的质量注意事项见 AI 生成单元测试。
第三步:小步安全重构
一次只做一件事
每次重构只做一种变换:重命名、提取函数、拆分模块、替换依赖。不要让 AI 一次性“把这个模块重写得更现代化”。
每步都验证
每完成一个小步骤,运行行为基线测试,确认全部通过再提交。出问题时可以准确定位到哪一步。
先改结构,再改行为
把重构(不改变行为)和功能修改(改变行为)分开提交,评审时更容易看清楚。
保留回退路径
对于高风险的替换,可以采用新旧逻辑并行运行、比对结果的方式,确认一致后再切换。
需要警惕的风险
- AI 的“合理化”倾向:它可能把看似多余的代码当作冗余删除,而这段代码实际处理着某个罕见但重要的业务场景;
- 隐性依赖:通过反射、配置文件、数据库触发器、定时任务产生的调用关系,静态阅读代码时容易遗漏;
- 环境差异:遗留系统往往依赖特定版本的运行环境和库,AI 建议的“现代写法”可能不兼容;
- 数据安全:把公司代码提供给外部 AI 服务前,确认符合公司的数据和代码保密政策。
小结
AI 极大降低了读懂遗留代码的成本:梳理结构、追踪流程、生成文档、推测设计意图。但重构的安全性依然依赖传统方法:先用测试固定行为,再小步修改、逐步验证。把 AI 当作经验丰富但不了解业务历史的新同事,充分利用它的阅读能力,同时保持对关键结论的核查。更多日常用法见 AI 编程助手怎么用才真的提效。