2946 字
约 9 分钟
15
S24-X15 · 从需求到实现:AI 参与的工作流

把 AI 接进开发流程,失败的常见原因不是模型不够强,而是人把不可审查的环节当成了可审查的环节。需求没写清就让它开工,它写完后你只能读 500 行 diff 去猜它想干什么。

这套流程的核心只有两条:计划必须先被人看过,实现必须分步可验证。


1. 四种角色与各自的可信度

同一个模型在不同环节的可靠程度差别很大,混为一谈就会用错地方。

角色 它产出什么 可信度 人的动作
需求澄清助手 追问、列举歧义点、反例场景 较高(它擅长指出漏洞) 逐条回答,把回答写进需求
设计草案生成 方案对比、接口草案、数据模型 中(方案合理但缺项目背景) 人工选择并补约束
实现执行 具体代码、配置、脚本 中偏下(细节失误多) 必须验证
审查与测试生成 边界用例、检查清单、负向用例 中(查不到"为什么"层面) 挑出可执行的,丢弃泛泛的

用法上有个反直觉的结论:让它当审稿人比让它当作者更划算。同一段逻辑,让它生成往往有边界遗漏;让它审一段已有代码,它挑出的空对象、异常吞掉、缺超时这类问题命中率明显更高。


2. 一条可执行的工作流

1) 写清需求与验收标准      ← 人主导,AI 只做追问
2) 让它先出计划(不动代码) ← 只允许读仓库、列步骤
3) 人工确认计划            ← 砍范围、定顺序、指定验证命令
4) 分步实现                ← 一步一个可运行改动
5) 每步验证                ← 跑指定命令,看输出
6) 汇总审查                ← 通读全部 diff,确认无夹带

一次完整的第 2 步输入长这样:

只做计划,不要改任何文件。

需求:订单支持部分取消,取消数量可以小于订单总量。
给出:
1. 涉及的文件与类(用 rg 找到真实路径,不要猜)
2. 分几步做,每步能编译、能独立验证
3. 每步的验证命令与预期输出
4. 你不确定、需要我确认的点

注意"用 rg 找到真实路径,不要猜"这句:计划阶段最容易出现的失误,是它凭目录直觉写出不存在的文件路径,而后面所有步骤都基于这个错误前提。


3. 为什么"先出计划"是关键

计划 实现
体量 十几行 几百行
审查成本 读一遍 2 分钟 逐行读 + 跑,看情况
发现问题时 改一句话 全部返工
暴露歧义 是 否(歧义被代码固化)

结论:计划是可审查的,实现是不可审查的。人在实现阶段只能做"验证",做不了"审阅"——你没有精力逐行判断 300 行里的每一处设计选择。

计划里必须出现的三样东西:

  1. 真实文件路径(检索得到,不是推测);
  2. 分步顺序(哪一步先,为什么);
  3. 验证方式(命令 + 预期输出)。

缺第 3 项的计划等于没计划,因为无法判断"做完了没有"。


4. 任务拆分的粒度

粒度 表现 判断
太粗 "实现部分取消功能" 无法验证,diff 一大片
合适 "给 OrderService.cancel 增加 quantity 参数并校验,测试用例 X 通过" 能编译、能跑、能回退
太细 "改第 42 行的变量名" 往返开销大于收益

判断标准只有一条:这一步结束后能否跑一条命令判断对错。能,就是合适粒度;不能,就再拆或再合。

一条经验:单个改动涉及文件数超过 3 个,通常可以再拆(典型量级,按你项目单文件规模核对)。


5. 验收标准怎么写

验收标准是这次任务唯一的"评分规则",写虚了就全盘失效。

虚的写法 可判定的写法
体验良好 接口在 200 条并发下错误率 0(按你的压测口径核定阈值)
处理好异常 下游返回 500 时接口返回 {"code":50301},不抛栈
性能优化 同一输入下 SQL 从 N 次降到 1 次,用 EXPLAIN 确认
兼容旧数据 amount 为 null 的老订单走 ERR_LEGACY_ORDER 分支
代码规范 ./mvnw spotless:check 通过

写验收标准时反复问一句:这句话能用一条命令或一个断言表达吗? 不能就重写。

【验收】
- 命令:./mvnw -q test -Dtest=OrderPartialCancelTest
- 预期:5 passed;其中 quantity > 剩余量 的用例返回 400 + code=40012
- 回归:./mvnw -q test -Dtest=OrderCancelTest 保持 3 passed

6. 自我检查机制

不要问"你确定吗",要它跑指定命令并贴输出。

现在执行以下检查并把原始输出贴出来,不要复述结论:
1. ./mvnw -q -DskipTests compile
2. ./mvnw -q test -Dtest=OrderPartialCancelTest
3. git diff --stat
若第 2 条失败,贴完整堆栈的前 20 行。

更进一步是"对比预期输出":

这段解析逻辑的输入输出对:
  输入 "a,b,,c"      → ["a","b","c"]
  输入 ""            → []
  输入 "a,,,b, c "   → ["a","b","c"]
先写出预期的断言,再实现,最后跑给我看。先写断言能防止它把实现迁就成测试。

"先写断言再实现"这一条挡住了最常见的偷懒路径:改测试以让代码通过。


7. 失败回退

跑偏时不加提示继续堆补丁,是成本最高的处理方式。正确做法是回到上一个已验证点。

# 1. 先看清偏了多少
$ git status --short && git diff --stat

# 2. 未提交:直接丢弃这部分改动
$ git stash push -m "ai-wip-order-partial"

# 3. 已提交但还没推:硬回退到上一个验证点
$ git reset --hard HEAD~1

# 4. 回退后重新描述任务,把导致跑偏的那句话改掉

判断该不该回退的三个信号:

信号 含义 动作
diff 里出现你没要求的文件 它扩大了范围 回退,明确边界重来
它开始改测试 实现被迁就 回退,要求先写断言
连续两次修复引入新问题 前提就错了 回退,重写计划

第 3 条的关键:连续两轮修不好,问题一定在需求描述或计划,不在提示词措辞。继续调措辞只是重复消耗。


8. 人的位置

环节 谁做 理由
定验收标准 人 标准就是取舍,取舍不能被生成
方案选择 人(AI 只给候选) 需要项目历史与团队约束作为前提
写代码 AI 为主 可验证,错了能重来
跑验证 人复核 AI 的结果 它说跑过不等于跑过
不可逆操作 人 迁移、删除、发布、--force 推送
最终合入 人 责任在人不在工具

不可逆操作清单值得单独写在 AGENTS.md 里:

## 禁止 AI 直接执行
- 任何 `DROP` / `TRUNCATE` / 无 WHERE 的 `UPDATE` / `DELETE`
- `git push --force`、`git reset --hard` 到已推送的历史
- 生产环境部署、重启、扩缩容命令
- 修改 `application-prod.yml` 与数据库迁移脚本
以上操作只允许生成脚本内容,由人审阅后手动执行。

9. 团队协作

事项 写法
提交信息 写清"做了什么 + 怎么验证的",例:feat(order): 支持部分取消(test: OrderPartialCancelTest 5 passed)
PR 说明 分"生成的改动"与"人工修改的部分"两栏
标注 大段生成代码在 PR 描述里注明来源与已验证范围,便于评审者决定读到什么深度
评审重点 标注过的部分重点看错误分支与边界;人工部分按常规

标注的价值不是合规,是分配评审注意力。一个 400 行的 PR,如果标出"其中 350 行是生成的脚手架,逻辑集中在 OrderService.cancel 的 40 行",评审者就知道往哪看。

反过来,无差别标注"本 PR 含 AI 生成内容"等于没标——它不减少任何阅读量,只会让评审者放弃判断。


10. 排错:工作流跑不动的情况

现象 原因 处理
一次改了十个文件 没定范围,或计划里没写边界 拆成多轮,每轮声明"只改 X,其他只读"
反复问同样的澄清问题 验收标准写得太虚,它无法据此决策 把标准改成可断言的句式
说改好了但测试没过 它只跑了编译,或没跑 固定要求"贴命令与输出"
越改越乱 前提错误却持续打补丁 回退到上一个验证点,重写计划
计划里的路径不存在 它凭直觉推测目录结构 计划阶段强制要求用 rg/glob 检索
每个模块都要重新交代背景 约定没落进 AGENTS.md 把重复出现的约束沉淀到项目级文件

最后一条是这套流程的长期收益所在:每一次纠正都应该变成一条约定,否则同类错误会在每个新任务里复发。


11. 边界:这套流程管不到的地方

场景 流程的作用 局限
清楚的增量需求 效果最好 无
需求本身在探索 只能用于"验证假设" 需要人来定义探索方向
架构级改造 可用于拆步骤 方案取舍必须人做
遗留代码库(无测试) 先补测试再让 AI 改 补测试本身就是大工程
强合规/审计场景 流程可用于留痕 验证责任人仍需人工承担

一句话:这套流程放大的是已经清楚的意图,不是替你产生意图。


12. 自测

  1. 为什么说"计划可审查、实现不可审查"?这决定了流程里的哪一步不能省?
  2. 任务拆分粒度的唯一判断标准是什么?
  3. 验收标准从"虚"改到"可判定",改的是什么?
  4. 让它自我检查时,为什么"先写断言再实现"能挡住一类偷懒?
  5. 哪些信号说明该回退而不是继续加提示?
  6. PR 里标注"哪段是 AI 生成"真正的作用是什么?
S24-X15 · 从需求到实现:AI 参与的工作流
https://www.clxhxhhr.top/posts/5972/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。