昨天开篇里我们说过,AI 写代码”快”和”烂”并存的根源,往往不在写的过程,而在写的起点——需求没想清楚。今天进入六阶段流水线里的第一个:DEFINE。
DEFINE 阶段在 agent-skills 里由五个技能组成(interview-me、idea-refine、spec-driven-development、source-driven-development、doubt-driven-development)。这五个不是同一件事,它们有先后关系:先问对问题,再打磨想法,再把规约写下来,动手前最后用对抗性视角审视一遍。本文重点讲前三件——也是日常最常用的三件。
一句话定位
如果用一句话讲清三件套的分工:
interview-me 把”你以为的需求”挖成”真实的需求”;
idea-refine 把”一个模糊的想法”打成”几个可选的方案”;
spec-driven-development 把”选中的方案”写成”可以验收的规约”。
三件套覆盖了从”用户嘴里的一句话”到”模型能照着写的文档”的全部转化。
interview-me:一次只问一个问题
很多人让 AI 写代码,第一句话就是”做一个登录功能”。模型顺着这句话开始动手,写出来八成不是你想要的——因为”登录功能”对不同的人意味着完全不同的东西。
interview-me 这个技能的核心动作只有一条:一次只问一个问题,每个问题都附带自己的最佳猜测。
它不停下来等你”再想想”,而是带着猜测往下走,让你确认或纠正。这种做法的妙处在于:它把”挖掘需求”这件成本极高的事,拆成了一个又一个可以秒回的小决策。
来看一段示例对话。假设用户最初说:”做一个通知系统”。
1 | AI: 你说的"通知系统",我理解是要让系统能在某个事件发生时 |
每一轮都是同一个模式:先给猜测,再求确认。这比”你补充一下需求吧”高效得多——后者把思考负担全压给用户,而前者把草稿先抛出来让用户改,改比写容易。
什么时候不要用这个技能?interview-me 的 SKILL.md 明确写了 NOT for 场景:
- 需求已经写得很清楚,且用户明确说”按这个做”;
- 改动只动一行、一个变量;
- 是用户主动召请它(比如用户直接说”先别动手,先 grill 我一下”)。
否则,只要拿到的需求是”模糊的””常规的””没有量化指标的”,都应该先走 interview-me。
idea-refine:发散→收敛
拿到一个打磨过的需求之后,下一步不是写代码,而是看有没有更好的解法。idea-refine 干的就是这件事——结构化的发散与收敛。
它的流程分三步:
flowchart LR
A["理解与扩展
发散"] --> B["评估与收敛"]
B --> C["锐化与产出
一页纸"]
第一步是发散。把需求重述一遍,主动问”还有没有别的可能”,生成多个变体。比如需求是”通知系统”,可能的解至少有:
- 中心化消息队列(Kafka / RocketMQ)
- 轻量级嵌入式方案(数据库轮询 + WebSocket)
- 第三方 SaaS(SendGrid / 极光 / 个推)
- Serverless 事件总线(AWS EventBridge + SES)
每一种都有完全不同的成本结构和维护负担。在没列出来之前,你不知道你选的是不是最差的。
第二步是收敛。把这些变体聚类、做权衡比较、暴露隐藏假设。”如果用第三方 SaaS,那用户数据会出境吗?””如果自建队列,团队现在有人能 oncall 吗?” 这些问题在评审时才暴露就晚了,要在收敛阶段就挑明。
第三步是产出。一页 Markdown,把选中的方案、备选方案、关键假设、风险点都写清楚。SPEC 的草稿从这里开始。
spec-driven-development:PRD 先行
走到这一步,需求已经从”一句话”变成”一页纸”。下一步是把它写成模型能照着写的规约。spec-driven-development 这个技能定义了规约的四个阶段门控:
flowchart TB
S1["1. 目标与非目标
Goals & Non-goals"] --> S2["2. 结构与边界
Structure"]
S2 --> S3["3. 测试与边界
Tests & Edge cases"]
S3 --> S4["4. 完成定义
Definition of Done"]
S4 -->|未通过| S1
每一步都必须通过门控才能进入下一步。门控不是一个动作,而是一个判断:
- 目标与非目标门控:能一句话讲清楚”为谁、解决什么问题”吗?非目标是否同样明确?
- 结构门控:模块划分是否稳定?接口边界是否清晰到可以独立 review?
- 测试与边界门控:有没有把验收测试列出来?边界场景(空、并发、超长输入、异常)是否覆盖?
- 完成定义门控:所有测试是否跑通?文档是否同步?监控/告警是否就位?
很多团队跳过了前两步直接写代码,结果是:
- 目标模糊 → 写完才发现做错了目标;
- 结构未定 → 写完发现要在三个模块之间大动;
- 测试/边界未列 → 评审时被问”这个 case 怎么处理的”答不上来;
- 完成定义缺失 → 写完不知道什么时候算”做完了”。
spec-driven-development 把这四个门控变成显式动作,每个动作都有”必须产出物”。比如目标门控必须产出一段不超过三句话的目标描述;测试门控必须列出一份场景清单。
反合理化表堵住了什么
DEFINE 阶段最容易出现的偷懒借口,agent-skills 已经替我们列了一张清单:
| 借口 | 为什么是错的 |
|---|---|
| “这个需求太小,写个 SPEC 太重” | 越小的改动越容易漏边界;SPEC 不重,三句话就够 |
| “用户已经说清楚了” | 用户嘴里的话和他脑子里的需求通常差三层 |
| “我可以先写代码,等遇到问题再改 SPEC” | SPEC 是设计,不是文档;写完代码再补 SPEC,等于先盖楼再画图纸 |
| “发散浪费时间,我直接选最优解” | 你以为的最优解 70% 不是最优解;发散的成本远小于做错返工的成本 |
| “完成定义不重要,写完代码就是完成” | 没有 DoD,团队永远在争论”做完了没有” |
这张表的存在很关键。SKILL.md 里它被叫做”Common Rationalizations”,每一行右边那一栏叫”Reality”。它的作用不是给用户看,而是给 AI 看——当 AI 想跳步时,右栏就是强制反驳。
三件套之外的补充
DEFINE 阶段还有两个技能今天没展开:
- source-driven-development:要求每一条框架特定的代码都必须有官方文档支撑。这是另一种”反幻觉”机制。
- doubt-driven-development:在新上下文中对决策做对抗性审视,专治”长会话里的越聊越自信”。
这两个技能更适合长链路项目和敏感改动,平时的小改动用上前三件就够。
写在最后
DEFINE 阶段听起来很慢。三件套走下来可能要花 30 分钟到 2 小时。但它解决的问题是”做错返工”——这个成本通常以天为单位。
工程上有句话:前期 1 小时的设计,能省后期 8 小时的实现。AI 编码时代这条经验没变,反而更重要——因为模型的产出太快了,错得也快。
明天我们进入一个有意思的话题:agent-skills 是怎么用 Anti-Rationalization 表和 Red Flags,把”AI 找借口跳过流程”这条路堵死的。
参考资料