
旧项目最怕一句话帮我把整个项目重构一下。这类任务看起来目标明确实际却没有边界。Codex可能同时拆文件、改命名、升级依赖、调整接口、补测试最后产生几十个文件的Diff。即使代码能够运行开发者也很难判断每一处修改是否必要。大型重构真正需要控制的不是AI能改多少代码而是每一步修改能不能独立检查、独立验证并在出错时快速回退。OpenAI在Codex重构实践中也强调应将删除死代码、拆分大文件、合并重复逻辑和升级旧模式等工作拆成小而可审查的修改而不是一次完成全部重构。一、为什么一次性重构容易失控旧项目通常同时存在多类问题文件过大重复逻辑较多命名不统一依赖版本较旧测试覆盖不足模块边界模糊历史兼容逻辑没人敢动。如果把这些问题放进同一个任务Codex需要同时判断哪些代码可以删除哪些逻辑应该抽取哪些接口必须兼容哪些依赖可以升级哪些测试需要补充。任务越大修改之间越容易互相影响。一个测试失败后也很难判断是拆文件、改接口还是升级依赖造成的。所以大型重构不能按照“整个项目”拆而应该按照行为保持不变的小目标拆。二、第一步不是修改而是建立重构清单在让Codex写代码之前先让它只做分析。可以这样输入先不要修改代码。 请分析当前项目中 1. 超过500行的大文件 2. 重复出现的业务逻辑 3. 已经没有调用方的代码 4. 循环依赖 5. 缺少测试保护的核心模块。 按风险和收益排序输出一份重构清单。 每个候选项说明 - 涉及文件 - 当前问题 - 推荐修改 - 可能影响 - 验证方式。这一步不是让Codex决定全部方案而是把模糊的“项目很乱”变成若干可以选择的具体任务。例如候选任务A拆分订单服务中的价格计算逻辑。候选任务B合并三个重复的时间格式化函数。候选任务C删除已经没有调用方的旧导出接口。开发者先选一个风险最低、验证最清楚的任务再开始修改。三、什么是“小步Diff”小步Diff不是简单限制修改行数。它要求每一次修改只解决一个清晰问题并满足三个条件可以独立解释可以独立测试可以独立回退。例如“重构用户模块”太大可以拆成抽取用户状态判断函数为新函数补充测试替换第一个调用方替换剩余调用方删除旧逻辑运行完整验证。每一步产生的Diff都比较集中。如果第三步出现问题可以只回退第三步而不必撤销整个重构。Codex官方重构案例同样建议先选择一个较小目标让Agent提交有限范围的修改再检查Diff和验证结果后继续下一阶段。四、一次任务只允许一种变化重构最常见的失控原因是一个任务同时包含多种变化。例如拆分大文件统一命名升级依赖并优化性能。这四类修改应该拆开。更稳妥的顺序是先整理结构→ 再替换调用→ 再删除旧代码→ 最后考虑依赖和性能原因很简单。如果结构、依赖和行为一起变化测试失败时无法快速定位原因代码审查时也很难区分哪些修改只是移动代码哪些修改真正改变了行为。可以在任务中明确写本轮只拆分文件不改变公开接口、不升级依赖、不优化业务逻辑。完成后再开启下一轮任务。五、给每一步定义验收条件重构不应该以“代码看起来更整洁”作为完成标准。每一步都要定义可以验证的结果。例如抽取订单价格计算函数目标 将订单价格计算逻辑从OrderService中抽取到独立模块。 约束 不改变输入、输出、金额精度和异常行为。 不修改接口层。 不升级依赖。 完成条件 1. 原有测试全部通过 2. 为独立计算模块补充单元测试 3. 对比重构前后五组典型输入结果 4. 输出修改文件和剩余风险 5. 确认不存在无关Diff。Codex最佳实践建议在任务中说明目标、相关上下文、约束和完成条件。任务边界越明确Agent越不容易把局部重构扩大成全局改造。六、重构过程中怎样检查Diff每完成一步不要马上继续下一步。先检查是否修改了计划外文件是否改变公开接口是否删除兼容逻辑是否新增依赖是否通过降低断言让测试变绿是否夹带格式化或无关重命名是否存在可以继续缩小的修改。Codex CLI支持对未提交变更、指定提交或相对于目标分支的Diff运行独立Review并在不修改工作区的情况下返回按优先级排列的问题。例如可以在每一步后要求请审查当前未提交Diff。 重点检查 1. 是否改变原有行为 2. 是否存在无关修改 3. 是否遗漏调用方 4. 测试是否足以证明行为保持不变。 只输出问题不继续修改。让“实现”和“审查”分开比让同一个Agent修改后直接宣布完成更可靠。七、测试不足的旧项目怎么重构很多旧项目最大的问题不是代码乱而是没有足够测试。这时不要直接重构核心逻辑。先补充“特征测试”也就是记录当前系统真实行为的测试。它不一定证明旧行为完全正确但可以保证重构前后行为一致。例如一个没有测试的价格计算函数可以先准备普通订单优惠订单边界金额无效输入历史兼容数据。记录当前输出后再进行结构调整。如果旧行为本身需要修改应把“修复行为”和“重构结构”拆成两个任务第一轮保持行为不变只重构第二轮明确修改业务逻辑。否则测试失败时无法判断是重构错误还是业务规则主动变化。八、什么时候使用Worktree当重构时间较长或者开发者仍需在主工作区处理其他任务时可以让Codex在独立Worktree中工作。Codex管理的Worktree通常与一个独立会话关联可以让重构任务使用单独的工作目录不直接干扰开发者当前未完成的文件。Worktree适合尝试两种不同拆分方案处理持续时间较长的重构与日常Bug修复并行保留主工作区的稳定状态。但Worktree只能隔离文件状态不能自动证明重构正确。最终仍然需要检查Diff→ 运行测试→ 比较行为→ 人工决定是否合并不要因为任务在独立Worktree中运行就放松对修改范围的检查。九、出现问题时怎样快速回退小步Diff最大的价值是让回退变得简单。建议每完成一个稳定阶段就建立一个检查点第一步只补测试第二步抽取函数第三步替换一个调用方第四步替换全部调用方第五步删除旧代码。如果第四步失败可以回到第三步而不是重新开始整个任务。还可以要求Codex在每一步结束时输出当前完成内容修改文件测试结果未完成内容下一步建议安全回退方式。这样即使会话中断开发者也知道任务进行到哪里。十、可直接复制的重构任务模板目标 重构【具体模块】解决【单一结构问题】。 当前问题 说明重复逻辑、大文件、循环依赖或旧模式的位置。 本轮范围 只处理【文件、目录或函数】。 本轮只进行【一种变化】。 约束 不改变公开接口。 不改变业务行为。 不升级依赖。 不修改无关文件。 需要扩大范围时先暂停并说明原因。 执行方式 1. 先分析调用关系 2. 提交修改计划 3. 一次完成一个小步骤 4. 每一步运行相关测试 5. 每一步检查Diff 6. 等待确认后再继续。 完成条件 测试通过 重构前后行为一致 不存在无关Diff 输出修改文件、验证结果、剩余风险和回退方式。结语Codex重构旧项目越改越乱通常不是因为Agent能力不足而是重构任务太大、变化类型太多、验证节奏太慢。可靠的大型重构应该形成这样的节奏先分析→ 建立清单→ 选择一个小目标→ 产生小步Diff→ 独立测试→ 独立Review→ 建立检查点→ 再进入下一步不要让Codex一次重构整个项目。让它一次完成一个能够解释、验证和回退的小改动最终反而能更快地完成大型重构。AI可以提高修改速度但真正决定旧项目能否安全演进的是开发者是否把重构拆成了可控步骤。