RSS

第 5 章 / 共 10 章

让 agent 先采访你

约 6 分钟 更新于

5.1 你写不出规格,是因为你在自己憋

看到这里,最常见的反应是:「道理都对,但我懒得写。」

这个反应是合理的。从空白文件开始写一份规格,需要你一次性把所有隐含条件想全——而人类恰恰不擅长凭空穷举,人类擅长的是被问到时回答。

所以更省力的做法是反过来:让 agent 采访你。它问,你答,它整理成规格。你付出的是十分钟的问答,得到的是一份结构完整的文档。

Claude Code 的官方最佳实践直接给出了这个做法:对较大的功能,先让 Claude 采访你,把结论写成一份 SPEC.md,然后开一个全新会话去执行。

第5章:采访生成规格的循环
图 5.1:注意闭环回到「补充回答」而不是「直接开工」——采访的价值在于逼出你没想过的那几条。

5.2 采访提示词模板

下面这段可以直接用,把方括号里的内容换成你的需求:

我想做:[一句话描述需求]。

先不要写代码,也不要写实现方案。请先采访我,把这个需求问清楚。

要求:
- 一次问 3-5 个问题,等我回答后再问下一轮
- 重点问我可能没想到的部分:边界条件、异常路径、不做什么、和现有模块的关系
- 不要问显而易见的问题
- 当你认为信息足够时,告诉我「可以定稿了」

定稿后,把结果写成 SPEC.md,包含这几节:
目标 / 范围 / 非目标 / 接口与约束 / 验收标准 / 验证方式。
验收标准请用「当……时,系统应……」和「若……,则系统应……」的句式,
每一条都要能对应一个会失败的测试。

如果你用的 agent 支持结构化提问工具(Claude Code 的 AskUserQuestion 就是为此设计的),可以在提示里明确要求使用它——这样问题会以选项形式出现,回答成本更低。

采访会问出什么? 以导出功能为例,实际跑一轮,通常会被问到这些你原本没想过的:

  • 导出的文件名是否需要包含日期?重复导出会覆盖吗?
  • 订阅里如果有失效的源,导出时要不要跳过?
  • 分组是单层还是可嵌套?
  • 导出后要不要有成功提示?提示多久消失?
  • 这个功能要不要写进用户文档?

其中至少有两三条是你在自己憋规格时会漏掉的。这就是采访的全部价值。

5.3 计划模式:先只读,再动手

采访阶段有一个硬性要求:agent 不能动文件。否则它会一边问你问题,一边已经开始改代码了。

Claude Code 提供了专门的计划模式来保证这一点。进入方式有两种:启动时加参数,或者会话中切换。

claude --permission-mode plan

会话中则连按 Shift+Tab,直到状态栏出现 ⏸ plan mode on。在这个模式下,Claude 只读文件、只回答问题、只产出计划,不会写入磁盘。计划出来后按 Ctrl+G 可以把它拉进你的编辑器直接手改——这一步很重要,规格的最终定夺权应该在你手里,而不是它写完你点同意。

Codex CLI 等其他工具也有等价的只读/计划档位,具体键位以你当前版本的文档为准。原理是一样的:把「想清楚」和「动手」用一道权限闸门隔开。

5.4 换一个新会话去执行

规格定稿后,不要在同一个会话里接着让它实现。原因是上下文工程的老问题:采访过程往往有十几轮问答,里面包含大量被否决的方案、绕过的弯路、中途改变的想法。这些内容留在上下文里,会持续干扰实现阶段的判断。

正确做法是:规格落盘 → /clear 或开新会话 → 让新会话读 SPEC.md 开始执行。新会话的上下文里只有一份干净的、已定稿的规格,没有那些噪音。

这也是规格驱动开发和上下文工程真正咬合的地方:规格是一次「把状态写到上下文之外」的动作。写完之后,你可以随时丢弃对话历史,因为结论已经在文件里了。

5.5 回顾:把定稿权留在你手里