Coding Agent 实现前,先审一遍计划
计划审查:AI 编程中 ROI 最高的质量关卡
Barry Boehm 在 1981 年给出了缺陷修复成本的 1-5-10-100 模型——需求阶段花 1 块钱能修的问题,拖到生产环境就是 100 块。计划审查的价值,就是把 100 块的修复成本压回 1 块。
AI 编程让这个等式更极端:Agent 从接到指令到完成实现可能只需二十分钟,你用来审查代码的窗口被极度压缩,返工的代价却没有同步降低。不在计划阶段拦截方向性错误,就只能等代码写完再推翻。
为什么计划审查比代码审查 ROI 更高
修复成本随阶段递增
Boehm 在 Software Engineering Economics 中量化了这个规律——需求阶段引入的问题,拖到生产环境修复成本可能翻 50 到 100 倍。IBM System Science Institute 的缺陷修复成本模型得出了类似结论。我把这个规律映射到 AI 编程场景:
| 发现阶段 | 相对修复成本 | 典型耗时 |
|---|---|---|
| 计划审查 | 1×(基准) | 几分钟 |
| 实现过程中 | 5× | 几十分钟 |
| Code Review | 10× | 几小时 |
| 生产环境 | 100× | 一天到数天 |
传统开发中,程序员花一天写代码,你有充足时间在 Code Review 阶段发现问题。但 Coding Agent 完成一个任务可能只需二十分钟——审查窗口被压缩了,返工代价却没有同步降低。不把审查前置到计划阶段,窗口就只剩更昂贵的 Code Review 或生产环境回滚。
Agent 为什么容易在错误边界内高效执行
这里有一个根本性的张力:Agent 的目标函数和你的人类意图之间存在偏差。
你说「给旧文章补 cover 字段」,脑子里的完整意思是:
检查所有缺少 cover 字段的文章,补上合理的封面图 URL,同时确保 frontmatter schema、TypeScript 类型定义、首页渲染、分类页卡片、详情页头部、sitemap 和 RSS 输出都能正确使用这个新字段。
Agent 接收到的是:
cover 字段 → 文章文件 → 改 frontmatter
这不是 Agent「笨」——它只是缺少你脑子里那些隐含的上下文。它不知道首页依赖 cover 字段做渲染,不知道 sitemap 需要这个字段,不知道类型定义需要同步更新。这些信息分散在你的项目结构、架构决策和过往经验里,Agent 只能从它看到的代码和上下文推断。
2026 年初的一篇分析文章 The Understanding Gap: Why Agentic Coding Systems Fail Before Coding 把这个现象称为「理解鸿沟」——Agent 在实际编码之前就已经在任务理解上产生了偏差,后续代码质量再高也无力回天。另一项 dev.to 案例研究更直接:一个 AI Agent 在同一任务上只获得了人类开发者大约 15% 的可用信息,却在这个信息子集上自信地做出了完整决策。
计划审查就是用来弥合这条鸿沟的。 让 Agent 先输出计划、你来审一遍,几行文字就能发现理解偏差,用不着在几百行代码里事后挖掘。
从 Scope Creep 到 Scope Leap
AI 编程还带来了一种新现象——Hacker News 上有人把这种变化叫「scope leap」:传统范围蔓延是渐进式的,今天加一点明天加一点;AI 编程里,Agent 可以在一个任务中一口气引入大量额外改动——新依赖、跨目录重构、过度抽象。
Frostbyte 的一篇分析指出:AI 工具同时降低了做对和做错事情的成本。构建一个不必要的抽象,和实现一个正确的功能一样快。不审计划的话,你很难分辨哪些改动是任务必需的,哪些是 Agent 自己加戏。
计划审查的三个维度
维度一:任务理解——Agent 要解决的是什么问题
审查计划的第一步,看 Agent 是否抓住了你要解决的问题本身。
好的计划把目标写成行为结果(用户可见的变化),不写成技术动作(改了什么文件)。两者的差别微妙但关键:
| 维度 | 坏的计划描述 | 好的计划描述 |
|---|---|---|
| 目标表述 | 「修改 Markdown 文件」 | 「旧文章在首页和分类页能正确显示封面图」 |
| 验收标准 | 「所有文件都加了 cover 字段」 | 「缺失 cover 的文章补上默认封面,页面渲染无 fallback 占位」 |
| 范围感知 | 只提到了源文件 | 提到了受影响的页面、类型定义、SEO 输出 |
| 手段与目标 | 「更新组件代码」 | 「分类页能合并展示本地和接口文章」 |
| 非目标 | 未说明 | 「不改动路由结构,不引入新依赖」 |
我的检验方法:把计划的目标描述给一个不了解技术细节的产品经理看,他能不能判断任务是否完成了? 如果不能,计划还停留在技术动作层面。
维度二:改动范围——Agent 打算改什么、不改什么
范围审查重点看两类风险:
一类是触达了不该改的模块。Agent 为了完成一个小任务,引入了跨目录重构、过度抽象或新依赖。
另一类是遗漏了必须改的边界。Agent 改了列表页,没检查详情页;改了组件,没检查类型定义;改了渲染逻辑,没检查 sitemap 和 SEO 输出。
| 风险类型 | 信号特征 | 审查动作 |
|---|---|---|
| 过度抽象 | 计划中出现「通用化」「抽取公共逻辑」 | 确认是否只有一处使用,如果是,要求内联 |
| 不必要依赖 | 计划中出现新 npm 包 | 要求说明替代方案,对比已有能力是否满足 |
| 跨目录改动 | 改动文件跨越 3 个以上目录 | 确认每个目录的改动是否必要 |
| 遗漏边界 | 只提到组件层,没有提到类型/配置/SEO | 要求补全受影响的完整文件清单 |
| 隐式假设 | 没有提到验证方式 | 要求列出具体命令和人工验收点 |
好的计划应该同时包含「做什么」和「不做什么」。缺少非目标声明的计划,等于给了 Agent 自由发挥的空间——在 AI 编程中,这种模糊通常意味着更多改动。
维度三:验证证据——Agent 怎么证明没搞坏
计划必须把验证写具体。「运行测试」不算验证计划,「运行 pnpm typecheck 并通过、pnpm build 零错误、浏览器打开首页确认封面图渲染正常」才算。
| 任务类型 | 自动化验证 | 人工验证 |
|---|---|---|
| 内容/数据变更 | typecheck、build、frontmatter 校验脚本 | 浏览器验收关键页面 |
| UI 组件变更 | typecheck、build、组件单测(如有) | 浏览器截图对比、多分辨率验收 |
| API/逻辑变更 | typecheck、build、单元测试 | 接口返回值人工检查 |
| SEO/元数据变更 | sitemap 生成、llms.txt 校验 | 搜索引擎预览工具检查 |
| 配置/环境变更 | dry-run 命令、diff 检查 | 部署到 staging 后验收 |
验证计划还应该包含回滚方式——改动上线后出问题,怎么快速恢复。对 AI 生成的代码,这一点尤其重要,因为你对 Agent 的每一行改动未必都有充分的理解。
三个返工案例
案例一:cover 字段的链路遗漏
Agent 把「给旧文章补 cover 字段」理解为「修改 Markdown 文件」。计划里以下问题都没提到:
- 哪些文章缺少 cover?判断和填充逻辑是什么?
- frontmatter schema 是否需要扩展?
- TypeScript 类型定义是否需要同步更新?
- 首页、分类页、详情页的封面图渲染是否依赖 cover?
- sitemap 和 RSS 输出是否需要包含?
计划阶段发现这些问题,修正只要两分钟。实现后才发现,就得回滚、重规划、重实现、重验证。
案例二:分类页合并展示的范围盲区
任务:「让分类页能合并展示本地文章和接口文章」。Agent 的计划是「更新分类列表组件,合并两个数据源」。
问题出在哪里:
- API 层被忽略了。本地文章和接口文章数据结构不同,需要在 API 层做适配,不能直接在组件层拼接。
- 分页逻辑没有提及。合并后分页的 offset 计算、去重逻辑都要重新设计。
- SEO 影响没有评估。分类页的 URL 结构、canonical 标签、结构化数据是否需要调整?
- 缓存策略没有考虑。两种来源更新频率不同,缓存失效策略需要区分。
| 审查维度 | Agent 的计划 | 审查后补充的计划 |
|---|---|---|
| 数据层 | 未提及 | API 层新增合并查询,定义统一 Article 接口 |
| 组件层 | 「合并两个数据源」 | 组件接收统一接口,不关心数据来源 |
| 分页 | 未提及 | 基于合并后的总数重新计算分页 |
| SEO | 未提及 | 验证分类页 URL、canonical、JSON-LD 不变 |
| 缓存 | 未提及 | 本地文章用 ISR,接口文章按 staleTime 刷新 |
正确的做法是把 API 适配层、分页逻辑、SEO 验证作为独立步骤列出,不要把所有复杂度塞进组件层。
案例三:一个不必要的依赖
任务:「给文章列表加一个虚拟滚动」。Agent 的计划:「安装 react-virtuoso,用 Virtuoso 组件替换列表渲染」。
审查时发现:
- 文章列表最多几十条记录,虚拟滚动的性能收益可以忽略。
- 新增一个运行时依赖,增加 bundle size。
- CSS
content-visibility: auto可以作为零依赖的过渡方案。
计划阶段砍掉不必要的依赖,用更轻量的方案先解决问题。计划审查除了检查 Agent 做对了没有,还要检查 Agent 做的事情是否值得做。
计划审查流程
好的计划 vs 坏的计划
用一个具体任务——「给文章详情页添加阅读时间估算」——对比两种计划的质量差异:
| 对比项 | 坏的计划 | 好的计划 |
|---|---|---|
| 目标 | 「添加阅读时间组件」 | 「用户在文章详情页能看到预计阅读时间,数值基于正文字数计算」 |
| 实现手段 | 「新建组件,在详情页引入」 | 「在 apps/src/components/article/ 下新建 ReadingTime 组件,接收 wordCount prop,在服务端计算」 |
| 受影响文件 | 只提到新组件文件 | 新组件 + 详情页 + 文章数据查询层 + 类型定义 |
| 非目标 | 未说明 | 「不修改编辑器逻辑,不新增依赖,不做国际化」 |
| 验证方式 | 「运行测试」 | typecheck、build、浏览器打开详情页确认显示、检查阈值是否合理 |
| 回滚方式 | 未说明 | 「组件独立,回滚只需还原详情页引用」 |
坏的计划只说了「做什么」,好的计划同时说了「做什么、怎么做、不做什么、怎么验证、怎么回滚」。
一份计划审查清单
下次审查 Agent 计划时,我按这个清单逐项过一遍。任何一项未满足,通常意味着计划需要补充或修正。
任务理解
- 计划是否用行为结果描述了目标(用户可见的变化),而非纯技术动作
- 计划是否用一句话描述了用户/开发者可感知的最终状态
- 计划是否区分了目标(要解决什么问题)和手段(用什么技术实现)
改动范围
- 计划是否列出了所有受影响的文件和模块,而非只提到了主要改动点
- 计划是否明确声明了非目标——哪些不在本次任务范围内
- 计划中是否涉及跨目录重构、新依赖或过度抽象?如果有,是否给出了理由和替代方案
- 计划是否考虑了间接影响:类型定义、配置文件、SEO 输出、缓存策略
验证证据
- 计划是否列出了具体的自动化验证命令(如
pnpm typecheck、pnpm build、pnpm test) - 计划是否列出了人工验收点(浏览器验收、截图对比、接口检查)
- 计划是否区分了自动化验证和人工验证的边界
风险控制
- 计划是否写明了回滚方式——如果改动出问题,如何快速恢复
- 计划是否提到了可能的副作用或对其他模块的影响
三个问题挡住大部分返工
审计划比审代码省成本。计划阶段发现问题,改几行文字就够;实现后才发现范围错了,就得回滚、返工、重新验证。
AI 编程让这个问题更突出——Agent 执行速度远快于人类审查速度,不把审查前置到计划阶段,就只能用更贵的 Code Review 或生产环境回滚来弥补。
下次让 Agent 动手之前,我先问它三个问题:
- 你要实现的行为结果是什么?(用户看到什么变化,而非改了什么文件)
- 你不改什么?(明确不在范围内的东西)
- 你怎么证明没有搞坏?(具体命令和人工验收点)
这三个问题能挡住大部分返工。Agent 的代码能力通常够用,问题在于它在错误边界内执行得越快,返工成本越高。计划审查就是确保边界正确的最低成本手段。
参考资料
- After months of running Plan → Code → Review every day… - Reddit r/ClaudeAI — 社区对 Plan-Code-Review 工作流的实践经验
- How to build an AI coding workflow that scales code review - Formation.dev — 实现前投入时间审查计划的 ROI 分析
- The Understanding Gap: Why Agentic Coding Systems Fail Before Coding - LinkedIn — Agent 在编码前就产生的理解偏差分析
- The Information Design Gap: Why Our AI Agent Was Coding Blind - dev.to — Agent 仅获得人类开发者约 15% 可用信息的案例研究
- How AI coding tools can make scope creep worse - Frostbyte — AI 工具如何同时降低做对和做错事情的成本
- Tell HN: AI programming has turned my "scope creep" to "scope leap" - Hacker News — AI 编程中的范围跳跃现象讨论
- Minimizing code defects to improve software quality - IBM — IBM 关于缺陷修复成本随阶段递增的研究
- The "bugs are 100x more expensive to fix in production" study - Hacker News — 对 Boehm Software Engineering Economics 中缺陷修复成本模型的讨论与质疑