发布于 2026-04-20 · 更新于 2026-04-20AI 让写代码的速度翻了几倍,但线上 bug 并没有同比例下降。原因不在 AI 写错了代码——大多数时候类型能过、语法能过、跑起来也能过——而在两件事:进入 AI 之前需求就是模糊的,离开 AI 之后验证手段还停在”UI 走查 + 类型检查”。这篇把前端从需求到上线拆成 4 个阶段,每个阶段点名它最容易踩的失败模式,给出一套可以抄的防御动作。
4 阶段 × 对应失败模式
阶段 1 · 需求反向梳理
这是最被忽视的阶段。大多数团队上手就写,结果写到一半发现 PRD 里有坑,回头再沟通成本翻倍。防御动作不是”把 PRD 写得更完整”(这是另一个工种的事),而是在写代码之前,让 AI 帮你把隐藏问题暴露出来。把所有素材一次性喂进去
不要预先筛选。PRD、群聊记录、设计稿截图、现有代码、上次类似需求踩过的坑,全部喂进 AI 的同一个会话。 尤其不要只喂 PRD 正文——群聊里 PM 的反悔、临时改口、设计师的吐槽,往往才是真实意图。这些半成品信息单独看是噪声,放在一起才能让 AI 找出 PRD 和现实的差异。三段式输出
让 AI 按这个顺序产出:- 明确需求清单:每一条附带验收标准和优先级(P0/P1/P2)
- 隐含假设清单:PRD 没写但实现时必须确定的事,格式是 “假设是 A,如果是 B 会导致 Y”
- 歧义冲突清单:文档自相矛盾、文档和群聊不一致、设计稿和文字不一致
迭代追问
AI 第一轮通常把”假设”写得很笼统。挑最关键的一条让它给 3 种可能方案 + 实现复杂度差异,第二轮才能压榨出有用细节。产出一条对齐消息
把歧义冲突清单整理成一条消息发给 PM。比如 “关于订单筛选功能我确认 5 个点” 要比 “这个需求不清楚” 便宜 10 倍。PM 回复后把结论写进docs/requirements/<需求名>.md,这份文档是下一个阶段(写代码)的上下文输入——也是阶段 3 review 时的评分标准。
三个陷阱
- 不要让 AI 自己决定”假设”,它会默默选一个方案写下去
- 群聊记录超过 500 行先让 AI 摘要 “关键决策点” 再做输入
- 第一次做某类需求多问一轮 “这类功能业界常见的坑”
对应的可复用 skill:requirement-analysis。Claude Code / Codex 读取到 PRD、群聊、需求梳理等关键词会自动触发。
阶段 2 · 编码 · 三工具分工
Claude Code、Codex CLI、Cursor 各有真正擅长的场景。按任务选工具比”一把锤子砸到底”效率高得多。三工具的真实强项
按任务类型选工具
典型 end-to-end workflow(中型需求)
三个 AI 编码坏习惯
坏习惯 1:让 AI 改它没读过的文件。Cursor Agent 最容易犯。AI 基于”它以为的文件内容”写 diff,覆盖你的真实修改。对策:Claude Code 有强制 Read 保护;Cursor 里手动用@file 把目标文件拉进 context 再改。
坏习惯 2:一次让 AI 生成完整 feature。“给我写个订单筛选面板,带 API、状态管理、错误处理” 这种一大坨结果看起来对,细节全幻觉。对策:拆成 类型 -> 接口 -> hook -> 组件 四步,每步审完再下一步。
坏习惯 3:信赖 AI 声明的 API。AI 很擅长编造不存在的函数签名和配置项,尤其是小众库和新版本。对策:用 Context7 MCP,先 resolve-library-id tanstack-query,再 query-docs useSuspenseQuery——不要让 AI 凭记忆写 API。
阶段 3 · 验证 · 双重扫描
大多数团队这个阶段的防线是”UI 走查 + 类型能过” ≈ 90%,线上 bug 恰恰集中在剩下的 10%。补两个轻量防御——边界 case 扫描 和 业务逻辑 review,不追求完备,但要能命中高危漏洞。3a · 边界 case 扫描
让 AI 对着具体代码扫这 7 大类边界。泛泛的清单自己也能背,价值在于把清单和当前实现映射起来。3b · 业务逻辑 review
关键:只从业务逻辑正确性角度找问题,不关心代码风格、性能、测试。 评分标准就是阶段 1 产出的需求清单——逐条核对:- 哪些需求点实现了但有偏差?
- 哪些需求点完全漏了?
- 哪些地方多做了需求没说的事?(也是问题,引入预期外行为)
双会话互审
- 会话 A 有上下文偏见——自己写的代码自己读起来”都对”
- 会话 B 没有预设,更像真实的 QA
- 两个会话不共享 thinking,视角天然不同
跳过规则
- 必须跑:新功能 0 到 1 / 核心交易、登录、支付 / 共享组件 / 重构
- 可以跳:纯文案、纯样式微调、demo 页、README
单测的定位
AI 写单测没问题,但要加一条纪律:让 AI 先列”要测的 case 清单”,人审一遍,再写实现。render() 不报错。先列清单能看出它有没有覆盖逻辑分支。
阶段 4 · 上线(待续)
这部分留给后续文章。几条要点先标记出来:- Feature flag:大功能用 flag 包住,出问题直接关闭不走回滚
- 关键路径埋点 + 报警:登录、下单、支付埋错误日志(Sentry 或自建),线上出问题比 PM 先知道
- “能在 5 分钟内止血”才敢紧急上线:没 flag 没监控的紧急上线就是裸奔
落地:三个 Skill
上面的流程里提到的三个 skill 已经落地到本地,单一 master + symlink 模式让 Claude Code 和 Codex 共用一份源文件:@~/.agents/skills/<name>/SKILL.md 引用同一份。
skill 会被 agent 按 description 自动匹配触发,不需要手动
/command。一个 skill 的价值不是写 prompt 模板,而是把”应该怎么想这个问题”编码成 agent 的默认动作。
为什么阶段 2 的”工具分工”不做成 Skill
skill 适合”给数据、出结果”的流程化任务。阶段 2 的分工是决策框架,价值在脑子里——让 agent 按它执行反而奇怪。所以这部分保持成文档。反常识总结
- AI 写的代码多数是对的,但”需求理解偏差 + 边界漏测”这两个阶段的漏洞会被放大——速度起飞的同时,漏洞上线的速度也起飞
- 群聊记录比 PRD 更有价值。反悔、改口、吐槽里藏着真实意图,不要只喂正文
- 写代码的工具不等于 review 代码的工具。同一个会话的 “再审一遍” 基本没用
- 需求清单是一份文档、两次使用:开发的输入 + review 的评分标准
- worktree 是物理隔离,session 是逻辑隔离,两者合用比单用任何一个都强
- AI 写单测前先列 case 清单,否则容易产出
render()不报错这种没意义的测试 - 涉及用户数据、金钱、权限就必须过验证阶段,其余场景可以按需跳过
- Skill 不是 prompt 模板,是把”应该怎么想”编码成 agent 默认动作——所以并非所有流程都值得封装成 skill
