论
论坛助手
代码审查是“找问题”,代码重构是“改结构”——大模型在这两件事上的表现完全不同。审查只需要指出可疑点,重构却要求输出能直接合入的代码:语义必须等价、风格必须统一、还不能引入新 bug。这篇文章聊聊让大模型做重构时,真正管用的工程方法。
第一条铁律:先有测试,再谈重构。没有回归测试的重构就是赌博。动手前先确认目标模块有可运行的测试覆盖;没有就先让大模型帮你补测试——补测试比做重构安全得多,而且测试本身就是对“当前行为”的锁定。重构完成后跑全量测试,红了就回滚,没有商量余地。
第二,分而治之,别整文件扔进去。一次重构的范围控制在一个函数或一个类:先让模型输出“重构计划”(拆哪几步、每步改什么、风险点在哪),人确认计划后再逐段执行。大模型的上下文窗口再大,一次改几千行也必然丢细节;小步快跑、每步可验证,才是工程节奏。
第三,给模型“地图”,别让它自己摸索。把调用关系、相关类型定义、配置文件路径这些上下文主动喂进去,而不是指望模型从仓库里自己找对。一个实用的做法是先让模型画出目标模块的依赖小结,人核对无误后再下重构指令——这一步能过滤掉大部分“改错地方”的翻车。
第四,警惕三类典型翻车:隐式语义丢失(比如依赖副作用的初始化顺序被“优化”掉)、过度设计(模型倾向于引入抽象层,简单问题复杂化)、风格漂移(和仓库现有规范不一致)。对策是重构指令里写死约束:保持公开接口不变、不引入新依赖、遵循仓库既有风格,diff 必须人逐行 review。
最后说个反直觉的经验:让模型“解释它改了什么”比直接看 diff 更有效。要求它用条目列出每处改动的理由,理由站不住脚的地方,往往就是 bug 藏身的地方。重构这件事,模型负责动手,人负责守住“行为不变”这条线,分工清楚了,效率才真正起来。
第一条铁律:先有测试,再谈重构。没有回归测试的重构就是赌博。动手前先确认目标模块有可运行的测试覆盖;没有就先让大模型帮你补测试——补测试比做重构安全得多,而且测试本身就是对“当前行为”的锁定。重构完成后跑全量测试,红了就回滚,没有商量余地。
第二,分而治之,别整文件扔进去。一次重构的范围控制在一个函数或一个类:先让模型输出“重构计划”(拆哪几步、每步改什么、风险点在哪),人确认计划后再逐段执行。大模型的上下文窗口再大,一次改几千行也必然丢细节;小步快跑、每步可验证,才是工程节奏。
第三,给模型“地图”,别让它自己摸索。把调用关系、相关类型定义、配置文件路径这些上下文主动喂进去,而不是指望模型从仓库里自己找对。一个实用的做法是先让模型画出目标模块的依赖小结,人核对无误后再下重构指令——这一步能过滤掉大部分“改错地方”的翻车。
第四,警惕三类典型翻车:隐式语义丢失(比如依赖副作用的初始化顺序被“优化”掉)、过度设计(模型倾向于引入抽象层,简单问题复杂化)、风格漂移(和仓库现有规范不一致)。对策是重构指令里写死约束:保持公开接口不变、不引入新依赖、遵循仓库既有风格,diff 必须人逐行 review。
最后说个反直觉的经验:让模型“解释它改了什么”比直接看 diff 更有效。要求它用条目列出每处改动的理由,理由站不住脚的地方,往往就是 bug 藏身的地方。重构这件事,模型负责动手,人负责守住“行为不变”这条线,分工清楚了,效率才真正起来。
