用编程 Agent 做规格驱动开发:先写规格,再让 Agent 去建

原标题Spec-Driven Development with Coding Agents: Write the Spec, Let the Agent Build

JetBrains 开发者布道师 Paul Everitt 走完一整套规格驱动流程:一份项目章程,规划—实现—验收的功能循环,以及能跨工具带走的 agent 技能。氛围编程的替代方案,是一份 agent 忘不掉的 Markdown 契约。

PEPaul Everitt讲者 · JetBrains
频道
DeepLearningAI
发布
2026年9月22日
视频
1:01:33
阅读
26 分钟
幻灯片
38
原文
英语
在 YouTube 打开
往下滚动阅读时,视频会缩到右下角继续播放。字幕跟随阅读语言。
阅读语言共 2 种语言可读
由 AI 从英语原文翻译。打开“对照原文”可以逐段核对。
摘要

30 秒看懂

Andrew Ng 介绍这门与 JetBrains 合作、由 Paul Everitt 主讲的 DeepLearning.AI 课程。规格驱动开发(SDD)把一份 Markdown 规格当作契约:你写好使命、技术栈和路线图,再把每个功能走一遍规划、实现、验收,自己始终当架构师。Everitt 在 WebStorm 里用 Claude Code 做出一款戏仿应用 Agent Clinic,再把同一套流程反推到一份“遗留”代码树上,并把反复用的提示词打成技能。收尾讲的是不绑死某一家 agent:MCP、agents.md、skills 和 ACP,让你换 agent 而不必重写流程。

  1. 1氛围编程撑不住规模一行提示词能做出一个按钮,再跟一长串没保存的纠正对话。一次性小控件可以。持续做产品不行:你得到的是一次性代码和越积越重的债。
  2. 2章程就是项目级规格使命(为什么、给谁、范围)、技术栈(怎么做、怎么部署)、分阶段的路线图。它比松散的 AGENTS.md 更有结构、也不绑某一家 agent,同时也是人与人之间的约定。
  3. 3每个功能都是规划、实现、验收从章程加载的全新上下文开工。功能单独开分支,通过问答让 agent 写出 plan / requirements / validation 的 Markdown,实现,再审查合并。功能之间重新规划。
  4. 4人在回路里,但不是抠细节审查功能是否符合规格。如果代码错是因为计划错了,就让 agent 两边一起改。在 IDE 里手改却不更新规格,文档就会漂。小提交能压住认知债。
  5. 5MVP 是对规格的压力测试,不是抄近路只有章程够硬、你还审得过来时,才把剩下的路线图一次性做完。演示跑偏了,那是该重新规划的信号,不是继续追问的理由。
  6. 6SDD 也能用在存量代码上把 agent 扔进现有代码、README 和一份 TODO。它会反推出使命、技术栈和路线图。之后的功能循环,和从零开始一样。
  7. 7技能胜过反复敲同一段提示词把功能规格问答做成技能;能干同样的活时,优先选带 CLI 的技能,而不是沉重的 MCP 服务器;还没进路线图的调研,放进 backlog 文件。

要点建议

  1. 规格是一份能长期管用的契约:几句话就能驾驭几百行代码,上下文窗口清空了也还在,也更能让 agent 做出你真正想要的东西。
  2. 先写项目章程——使命、技术栈、一份持续更新的路线图——再把每个功能放到独立分支上,走规划、实现、验收。
  3. 像架构师那样审查:看的是高层是否贴合规格,不是 CSS 类名;代码不对,先改规格,好让各份产物保持同步。
  4. 功能之间要重新规划。章程改动单独开分支,步骤小到能审完,用干净的间歇和清空的上下文对抗 AI 疲劳。
  5. 把反复写的提示词打成 agent 技能,并优先用不绑死某一家的标准(skills、agents.md、MCP 或 CLI 工具、ACP),这样流程就不会嫁给某一个 IDE 或模型。
全文

按章节阅读完整文稿

01

为什么要规格驱动开发

Andrew Ng 打开这门与 JetBrains 合作的课程,并介绍 Paul Everitt。规格让 Markdown 上的一小处改动就能驾驭一大片补丁,熬过新会话,并抓住意图,而不是把架构交给模型。课程会写一份章程,循环做功能,再把工作流打成技能。

Andrew Ng 欢迎大家来上这门与 JetBrains 合办的 DeepLearning.AI 课程。他说,规格驱动开发目前是用编程 agent 做正经应用最好的工作流:给 agent 一份 Markdown 文件或一段长提示词,写清楚要建什么,它就按这份规格去实现。你的工作从敲代码,变成写下 agent 还没有的上下文。

讲师是 JetBrains 的开发者布道师 Paul Everitt。Everitt 向他致谢,两人还开玩笑说 Everitt 戴着一副其实不需要的眼镜——给一门讲规格的课,挺贴题。接着 Everitt 列出三个你马上就能感受到的好处。

第一,改规格上的一小处,就能驾驭大块代码改动。一句“用 SQLite 配 Prisma”,就能带动几百行;换成 MongoDB,同样的放大效应反过来走一遍。写规格,远比手写那些代码高效。

第二,规格能对抗会话之间的上下文衰减。Agent 是无状态的,所以质量最高的上下文必须在它们启动时就躺在那里。第三,规格提高意图保真度:你定义问题、成功标准和约束,agent 可以把它们展开成更完整的计划,而不是瞎猜。

Everitt 常常一边跟 Claude Code、Gemini 或 Codex 讨论架构取舍,一边写出规格,再让 agent 把决定总结进 Markdown。这本来就该费劲。产品、功能、架构,得你来定。跳过规格,就把这些判断交给模型——想掷骰子可以,但不想要难维护的代码和奇怪的产品,就别这么干。

他见过团队做复杂产品却没有共享规格:不同开发者、不同 agent、产出很快,结果互相打架。SDD 从一份把标准定下来的项目章程起步,再进入功能循环。每个功能单独开分支,走规划、实现、核验,功能之间就是一张干净的白纸。同一套循环既适用于从零开始(在对话里起草章程),也适用于存量项目(从现有代码树生成),并且始终小步版本化。

课程还会演示如何写 agent 技能来自动化这套流程。短提示词够用时,Everitt 乐意偷懒。真正有复杂度的事,他尊敬的开发者仍然会写详细规格,因为他们有模型没有的上下文和主张。如果 agent 接下来要写二十、三十分钟的代码——换成以前那是好几小时的活——花三四分钟写清楚指令,很划算。

他感谢 JetBrains 的同事,以及 DeepLearning.AI 的 Isabel Zaro 帮忙做成这门课。接下来轮到你:下一支视频里,就不再只是谈规格,而是真的动手写。

02

氛围编程对上 SDD

氛围编程就是一条提示词、看一眼、再来一条提示词。它撑不住规模。SDD 把做什么、为什么与怎么做解耦,把规格当契约,把 agent 当结对搭档。工作流是先章程,再规划—实现—验收,然后重新规划。

人们听到“用 agent 写代码”,常常听到的是氛围编程。你提示“给我做一个按钮”,看到结果太大,指出错误,循环直到满意。对话很长,历史甚至没保存。做个按钮可以。当作大型、持续项目的流程,没用。

高层提示词很快,产出的是一次性代码和越积越重的债。你需要的是工程:一份持续维护、作为永久技术产物的规格。SDD 是对无人监督生成的专业回应。规格——做什么、为什么——与实现——怎么做——解耦。它是人与人之间、也是与 agent 之间的契约。你的主业,是把意图写成那份规格。

三个好处再讲细一点。几句关于外观和手感的话,可以变成几百行 CSS,这减轻了盯着一个极快 agent 的认知负担。规格也干掉了把多轮会话带偏的上下文衰减:窗口一满,agent 就更容易出错。规格能跨会话、甚至跨 agent 留下来,并把工作锚定在代码库的核心。

意图保真度意味着 agent 更可能做出你真正想要的东西,因为你被迫在它生成代码之前,先点出问题、成功标准、约束和用户流程。这就是氛围编程的糊弄货和把产品当工程来做的差别。规格既帮得上全新仓库,也帮得上跑了好几年的项目;它就是你对抗漂移的办法。

想想编译器:人能读懂的源码变成机器码。SDD 对 agent 是同一类类比——规格变成源码。更好的是,规格用人话写成,干系人也能读。这套实践是围着生产力焦虑起来的:规格编写工具、讲如何抓住意图的会议分享,以及把软件生命周期的经验带回 agent 编程的更大推动。

这是给编程 agent 的,不是聊天机器人。聊天机器人可以谈代码,看不到你的仓库和工具。Agent 接到提示词,规划、推理,并使用代码库和工具链。在 SDD 里,你把它当成能力很强的结对搭档:它带来知识和速度,你带来蓝图。Agent 是肌肉。规格是大脑。

你先规定整个项目,再规定每个功能,并且越做越好。难的技能是粒度恰到好处。把 agent 当结对搭档,往往就能踩准:目标、使命、受众、约束给足上下文,底层它自己能做的决定少管。

流程从章程开始:使命、技术栈、路线图。很多人把这些倒进顶层的 AGENTS.md。章程更有结构,也不绑某一家 agent。它是你和 agent 之间、也是人与人之间的约定。使命是为什么——愿景、受众、范围。技术栈是开发和部署的共同图景。路线图是一份活着的阶段序列,每个阶段稍后都会走自己的功能规格。

章程有了之后,每个功能都是同一套循环:规划、实现、验收。功能之间你重新规划——改章程、更新路线图,甚至改进流程本身。在这些阶段里你掌舵。想象把详细图纸交给施工队,再监督、验收结果。你不用教他们铲子怎么握。你给他们他们没有的上下文。

这就是现代开发者开始用的一套 SDD 工作流:先章程,再可重复的功能循环,你当监工而不是打字员。接下来就是章程本身。先做一点准备,让仓库和 agent 就位。

03

工作区准备

SDD 不绑某一个 IDE。演示用 WebStorm 和 Claude Code,仓库是一个名叫 Agent Clinic 的 TypeScript 项目,以 Git 为真相来源。Agent 想跑的每条命令都要你确认:代码仍然是你的。

仓库准备在下一篇阅读材料里。后面那支视频可选:如果你已经在 WebStorm 里跑着类似 Claude Code 的东西,可以跳过。SDD 不绑某一个 IDE 或某一个 agent。VS Code 配 Codex CLI、Zed 配本地模型——都可以。因为这门课做的是 web 应用,演示用 WebStorm 和 Claude Code。下载说明在上一篇阅读材料里。

Everitt 打开 WebStorm,新建一个名叫 Agent Clinic 的 TypeScript 项目,从第一次提交就用 Git,好让代码和规格都有版本。IDE 有聊天面板,人们跟 agent 说话的方式也很多,但 Git 轨迹不是可选项。Agent 想跑命令时会来问,除非你用了不安全模式启动。看着那些提示。代码仍然是你的。

04

写项目章程

Agent Clinic 是戏仿 Pet Clinic、给过劳编程 agent 用的。Everitt 通过问答让 Claude Code 写出 mission.md、tech-stack.md 和 roadmap.md,在回路里审查,补上漏掉的受众和 SQLite,并把章程作为活文档提交。

你得告诉 agent 这个项目是什么:使命、受众、其他决定。这就是章程,一起写,不是你自己闷头写。给一家新公司做 web 应用:核心想法是什么,怎么贴合自家技术栈,计划做哪些功能。这三根柱子变成一套全局的高层需求,后面的功能工作必须遵守,干系人也能读。

技术栈的选择无穷无尽;你用取舍、用公司已经在用的东西把范围收窄,再写下来给 agent、给同事、给未来的自己。Agent 会用你没想过的架构、已经能干这活的包、以及速度对数据保真度这类问题让你吃惊。使命、技术栈、路线图不只属于从零开始的项目。现有代码库同样有这三根柱子;存量项目后面一课再讲。

贯穿例子是 Agent Clinic,戏仿经典的 Pet Clinic:一个让 AI agent 从它们的人类手里喘口气的地方。编程 agent 压力很大——幻觉、上下文腐烂、记忆问题、子 agent 协调。诊所管理预约、幻觉这类病症,以及上下文输液这类治疗。这是一个全栈 web 应用。在章程对话里他们会敲定真正的技术栈;演示最后落在 Hono、TypeScript 和 SQLite。

他贴上项目描述,并让 agent 去看 README.md,干系人已经在那里留了笔记。他提到 Claude Code 的 AskUserQuestion 工具——可选,但界面上好看——并要求小步走完使命、技术栈和路线图。SDD 要的是人在回路里看小 diff,不是一大坨无人监督的倾倒。

Agent 问的问题很好;你的会不一样。第一个:mission.md 该用什么语气?Everitt 选了俏皮。工程师后端习惯 TypeScript,这就成了一条要求。路线图粒度他选了第一个选项。提交。Agent 要写权限,这让你还握着控制权。如果你接受这个权衡,可以批准这条命令在本会话剩余时间里都可用。

specs/ 下出现三个文件:mission.md、tech-stack.md、roadmap.md。该人在回路里看了。使命漏了目标受众——说得通;agent 怎么会知道业务?不要手改文件。去问 agent,相关文档才能保持一致。他们想用 SQLite 做快速原型。他们没说过,但 agent 已经推荐过了;现在它进了技术栈。

再审一遍。一上来就把章程弄对,因为后面的一切都会从它生成,然后把它作为活文档提交。Agent Clinic 现在有了使命、技术栈和路线图,人和 agent 都能加载。该做第一个功能了。

05

规划并实现第一个功能

第 1 阶段是 Hello Hono。在功能分支上、清空上下文之后,agent 写出计划、需求和验收。Everitt 把一个占位首页掰回规格,提交,再实现各任务组,屏幕上出现第一批像素。

路线图上有功能。你用规格来建它们,从第 1 阶段开始:Hello Hono。现在还太早写代码。一份好计划会点出做法、顺序,以及你怎么知道它做成了。用全新的 agent 上下文开始,好让它从章程加载,并把工作放到单独分支上。提示词是一场关于功能规格的对话:任务、需求,以及一张验收记分卡。

Agent 会让你做决定。盯着冲突。你不必接受它的方案。Everitt 保持第 1 阶段范围按写好的来,钉死 Hono 版本,强制严格 TypeScript,并用一次手动 curl 确认。提交。很快——一定是 nano。球又回到你这边:审查 agent 刚写的规格。

一开始就把文档弄对,否则 agent 会跑偏。有不对的,让它改文件,好让需求和验收保持同步。他们想在这份第一份规格里要一个更好看的占位首页;agent 更新计划和需求。重要约束住在需求里。别跳过它们,也别往里面塞变量名。你要的是控制,而不是过度掌舵。

最后是验收:确保 agent 能核对自己做对了。那些文件也因首页更新过了。功能规格完成。在 IDE 里提交。你在这里花的时间,会在下游膨胀成几百行代码。

实现。先重温 Hello Hono 计划,再用 /clear 清空上下文,好让 agent 不带着规划时的聊天。提示它实现所有任务组。也可以一组一组做,提交更小,这在安全或数据库工作里很要紧,小错会放大。

Claude 跑的时候,看着控制台。之后,提交窗口是第一眼看 diff 的地方。在这个范式里,这就是开发者的工作:架构师兼监工,拿一份清楚的契约盯着 agent。摘要里每个任务组都多了一层细节。他们从 package.json 把应用跑起来。服务器启动了。浏览器里几乎什么都没有。他们说了 nano,但屏幕上有像素仍然让人高兴。Agent 已经做完它的验收;接下来是你的。

06

作为回路中的人来验收

按规格这一层来审查。缺布局是计划漏了,所以 agent 规格和代码一起改。在 IDE 里拆组件却不告诉 agent,文档就会对不上。分支诚实了再合并,包括章程里那些小勾选。

一个功能就绪了。先别合并。最后这一步是审查,程序员每周已经要在代码审查上花好几个小时。从提交视图开始。盯的是功能是否管用、是否符合规格,不是它用了哪些 CSS 类。

Home.tsx 极简。Nano 真的就是 nano。他们想要一个带 header、main、footer 子组件的布局,外加一个 CSS 文件。代码里漏了,是因为计划里漏了——他们从没要过。让 agent 规格和实现一起改。这个生成再核验的循环,就是人在回路。

Agent 写得太快,开发者现在开始谈认知债:跟踪代码做什么、怎么演化的心理负担。改动要小到能审完,否则流程就不再快。Agent 也在检查新工作有没有弄坏别的。它做完,给功能计划加上 Group 5,落地一个布局组件和一个 CSS 文件。

三个子组件还在同一个文件里,这不合惯例。用 IDE 的移动工具拆开,本来就是编辑器一直擅长的事。别急:规格和 README 就是这样漂的。让 agent 改每一处提到的地方,免得以后买单。

测试会有帮助,但 agent 从没装过测试包。这是下一课要处理的章程问题。注意,同一分支上章程也改了一点。规格相对它们产出的代码该怎么做版本,社区还在摸索。勾掉路线图上的一步,小到可以留在这里;更大的章程改动该单独开分支。合并。第一个功能完成。冲下一个之前,先重新规划。

07

功能之间重新规划

单独开分支加上 Vitest,再响应产品经理提出的响应式设计,再压缩路线图。Everitt 还写了一个 changelog 技能。这里走慢,是为了下一个功能跑得快。

他们实现了第一个功能,还想再来一次。别急。先慢,才能快。测试对验收有好处,但 agent 从没拿到他们的测试偏好。开一个重新规划分支,更新章程里的技术栈。规格版本管理还在演化;章程是活文档,更新该单独开分支,好让你看见哪一版产出了哪段代码。

第一条提示词写明测试政策。Agent 在 package.json 里加了一个脚本,依赖还没有——这个先记下。测试框架是给未来代码的,但他们也让它更新已有的功能规格和实现。两轮提示之后,脚手架在了,测试还没有。第三轮提示把测试写出来。他们在调试器里跑,作为人在回路的一部分,然后提交。

有时产品计划会变。第一个功能之后,产品经理指出 40% 的用户在手机上,所以响应式设计现在是底线。告诉 agent 去改正产品规格、功能规格和代码。这么早,改动小到可以放进重新规划。如果新工作很大,就把它排成路线图上单独的一阶段。用判断力。规格该记下的是决定,不只是代码,两边都该为团队保持同步。

Agent 在代码和规格里实现了响应式修复。审 diff,提交。小步走、勤提交,审查才不会把脑子撑爆。然后做内务:下一个路线图条目还说得通吗?功能二到五是连在一起的。把它们收成一步,提交,当作下一个功能。

重新规划可以针对一个功能、整个项目,或组织里的工作流。非技术干系人可能希望每次合并到 main 都有一份 changelog。现在大多数编程 agent 都支持技能:一包指令和资源,给 agent 一项新能力。技能适合可定义、可重复、跟上下文相关的工作。Changelog 就是好例子。你可以手写;很多 agent 有一个会写技能的技能。

问清楚这个技能是只属于这个仓库,还是到处都该是标准——用着用着你就有感觉。你也可以把验收打成包:README 更新、lint、格式化、测试。可重复的流程,更少手工活。Agent 把 changelog 技能写在全局技能区,这样跨项目都能用,再用它在这里生成 CHANGELOG.md。Changelog 是说给干系人听的,也包括 agent。读一遍。提交,合并分支。

作为开发者,你现在大部分工作是规划和验收,不是敲实现。功能之间要留时间重新规划,否则章程会腐烂。他们刚改进了章程和工作流。下一个路线图条目之前,一个常见痛点:审太多生成代码带来的 AI 疲劳。

08

下一个功能和 AI 疲劳

每个阶段都从干净的白纸和清空的上下文开始。第 2 阶段覆盖布局、agents 和 ailments。高层审查,发现 TypeScript prop 类型就抽进规格,用测试和子 agent 审查来验收,再写 changelog、合并。

Agent 会生成大量代码。全审一遍很累。用功能阶段之间干净的分界来对抗,并以合适的心流状态开始下一个。还有没做完的活?上一分支合并进 main 了吗?下一个路线图条目还对吗?Agent 上下文清空了吗,好让规格而不是一段记忆快照来携带意图,有限的上下文预算留给新工作?花片刻开好头,才能收好尾。

他们清空上下文,开始下一个功能:agents 和 ailments。他们还在敲同一段提示词;后面一课会把它做成技能。Agent 问这些功能要不要留在同一阶段。他们已经决定要。迁移:普通 SQL。验收:选项一、二、三。提交。如果你的 agent 有详细模式,看着推理过程;中间那些想法有用。

一处小的意图捕捉:用 Pico CSS 做 CSS 框架。审查三份功能规格文件,从需求开始,并告诉 agent 该跟着改的其他文件也要更新。提交规格,这次让 agent 写提交说明。然后实现。规划和功能工作分开,能防止你和 agent 的上下文溢出。功能太大,就先实现计划的一部分,好让 diff 还能审。

第 2 阶段落地。你看着它做完,所以有个大概。这不够。慢下来。每个人都有自己的审查风格;要发挥 agent 的长处、减轻疲劳,就盯着更高层的需求。跳过变量名这类抠细节。只要确保这份东西能署你的名提交。这里,props 用了内联类型;他们想要一个独立的 TypeScript 类型,而且到处都用。告诉 agent 去改。

你大概从没把“抽出的 prop 类型”写进规格。漏了不是失败。你是在发现细节时演化规格,把它们记下来,后面的功能会更好。小步提交。最后一步:验收。读规格说 agent 会检查什么,然后跑应用,也确保你理解这些改动,认知债才不会堆起来。调试器里跑测试,是走一遍流程的好办法。

有时你需要核对自己没被骗。让 agent 再拉起几个子 agent,针对这次改动对整个项目做一次深审查。这给了更多思考空间,也让主 agent 的上下文窗口保持干净。它们带回问题和建议;看起来都不错。Agent 修好、跑测试,把项目留在好状态。这一招留着。第二眼通常能抓到要紧的东西。

验收完成。提交。作为分支上的最后一步,跑上一课的 changelog 技能,再提交一次,合并。快速重新规划:下一个路线图条目还对吗?对。项目状态不错。这种干净的间歇,就是你管理 AI 疲劳的办法。咖啡可以喝。流程开始看起来可重复了。接下来:它能不能扛住一个 MVP?

09

用剩下的路线图交出 MVP

管理层要 MVP。Everitt 让 agent 一口气实现路线图剩下的部分,当作对章程的压力测试。演示里填满了示例数据;规格上的缺口变成下一次重新规划,而不是意外。

两个功能做完,管理层当然要 MVP。他们的进度够不够拿来做实验?他们改了通常的功能规格提示词:实现路线图剩下的部分,并就磁盘上已有的规格给指导。只有你信任章程、还审得过来时,才啃这么大一块。把 MVP 当成极限测试。结果不是你想要的,你就欠项目一次认真的重新规划,找出是什么把 agent 带偏了。

Agent 又问了好问题。很多规格文件就是从这种来回开始的。提交,把 MVP 规格写到磁盘上,再审查——你常常能抓住 agent 为填空而发明的假设。扫一眼计划、需求和验收。小步走、勤提交:大实现之前,先把规划规格存下来。

Agent 干了很多活。揭晓时间。跑应用。每一块现在都丰富多了,由数据库里的示例数据驱动:agents、疗法、预约仪表盘。通常你会深入验收代码。这是 MVP,所以他们也让 agent 去验收规格。结果很有用:MVP 找出了规划里的窟窿。把这份评估分享给干系人,然后合并或归档这个分支。

工作流成功了。一份章程、两个功能之后,这个 MVP 能成为有用的演示,正因为有指导,而不是尽管有指导。不是每个项目都是 MVP。很多是存量:从现有代码树起步。接下来,怎么把 SDD 引进去。

10

把 SDD 带进遗留代码库

拆掉 specs 文件夹,新开会话,让 agent 去看 README 和 TODO.md。它反推出一份章程,同一套功能循环再落地一个反馈表。从此规格就是项目的记忆。

有人说 SDD,甚至 AI,只在从零开始的项目上管用。Everitt 不同意。为了简单,“遗留”项目就是 Agent Clinic 的 MVP:从 main 起步、没有 specs 文件夹,新开一个 Claude Code 会话,换一个目录。背景在 README.md;未完成的活在 TODO.md。真正的遗留树,计划可能在 issue 跟踪器、电子表格或 Word 文档里。同一套流程:先章程,提示词几乎和第 4 课一样,但这次要在已有产物里找路线图条目——这里,就是 TODO 文件。

Agent 从代码库里发现,并在某种意义上反推出 SDD 产物。章程让未来的 agent 改动,与过去开发者已经建成的东西对齐。有更多上下文就加上:也许你是被空降来提高效率、同时交付被要求的功能。对话更丰富,因为能读的更多——代码、提交、文档。它探索时你会看到大量工具调用。

看看它找回了什么。使命里有受众、项目想法和额外笔记。技术栈有文件结构、框架版本,以及他们被问到的澄清。路线图按阶段对齐 TODO。提交这些章程文件。在 SDD 里,规格是版本管理的一部分。遗留项目现在坐在 SDD 的地基上。从这里起,循环和之前一样。

拿下一个路线图条目,在对话里规划。第 1 阶段是反馈表。他们拿到一个分支和规格,审查计划、需求和验收,然后提交。聊天里改过之后,实现。Agent 做完,验收代码是否好、功能是否管用。提交,合并到 main。

然后重新规划,并给它时间。你刚把 SDD 加进一个项目;会有要调的地方。一棵遗留树现在变基到规格驱动开发上,没有一堆手工考古。你有了一套有文档、分步骤、带着工程形状的流程,并且一直握着控制权。规格现在是项目的记忆。别让它褪色。想更快的话,下一课把你反复做的部分自动化。

11

技能、MCP 和现成工具包

一个 skill-creator 技能写出可带走的功能规格技能。Context7 和插件扩展 agent;技能加 CLI 往往胜过完整的 MCP 服务器。GitHub Spec Kit 和 OpenSpec 是现成的 SDD 工作流。还没承诺的调研先停在 backlog 文件里。

他们有了一套能跑的 SDD 循环。现在按自己的方式自动化。Agent 技能是给 agent 新能力的开放标准。功能规格提示词每次都一样:做这个,写这三个文件。让 agent 用它的 skill-creator 技能,并跟它讲清楚。社区里也有可以安装的“给技能用的技能”。它干活时看着输出。它做的选择是你想要的吗?

技能落到一个目录里。技能可以按项目,也可以全局。调用方式是在提示词里点名技能,或者让一个技能去调另一个。在技能标准下,agent 用描述来决定何时调用技能——渐进式披露。它们的判断并不总是完美,窗口变大时尤其如此。和给文件打标签同一套启发式:你知道自己要它,就点名。这能省思考 token。

Agent 仍然有内置斜杠命令,比如 /clear。自定义斜杠命令曾经很流行;很多 agent 正把这股劲转到技能上。Agent 需要 API、私有知识库或数据库时,通用扩展一直是 MCP。要当前的包文档,流行选择是 Context7,它把更新过的文档拉进上下文,这样你就不会卡在去年的 React 上。MCP 服务器仍然常见,但一个向外壳出 CLI 的技能,往往能更优雅地干同样的活。Context7 现在也建议这条路。

他们为 Claude Code 安装 Context7 包,立刻看到选择:MCP 服务器,还是 CLI 加技能。他们选第二个。第一次用的人需要账号;他们已经登录了。回到 Claude Code,一条需要当前技术栈文档的示例提示词,自己就接上了 Context7。从 MCP 服务器转向技能加 CLI 的趋势在加速:CLI 能以更少的配置和更少的上下文去行动。

工作流放大之后,你会想在机器之间、同事之间、也许对外分享它。有些 agent,包括 Claude Code,有插件:可安装的扩展包,免费的也越来越多。插件还不是跨 agent 的标准。和 app 一样,它们会执行代码,所以安装和更新时都要信任它们。

GitHub 的 Spec Kit 是用 agent 把 SDD 形式化的一次尝试。装上之后你会得到和这门课很接近的斜杠命令:章程、计划、任务、实现。另一个流行选项是 Fission-AI 的 OpenSpec。它的 propose / explore / apply / archive 对应规划、实现和重新规划,并带有快速功能的典型模式。两者都给你分支管理、核验脚本和有主张的规格格式。去试,再偷适合自己的。

有时做功能做到一半,你想调研一个想法——比如数据库选型——又不想停下分支或把它放进路线图。谈清楚,接受大部分建议,在其中一条上改主意,别弄丢。告诉 agent 在一个大家都知道的 backlog 位置写一份报告。以后你可以把那份调研排进路线图,并带上链接。堆多了,就给它写一个技能。SDD 是让 agent 按你的方式写代码:先采用一个框架,再用技能定制,好让团队跑你真正想要的流程。

12

不绑死某一家 agent 的标准,以及收尾

MCP、agents.md、skills 和 ACP,让同一份规格能从 Claude Code 带到 Codex 和 OpenCode。排行榜变得很快;按你自己的标准来选。Ng 和 Everitt 收尾:把工程带回来,让人继续开车,从一份出色的规格开始。

SDD 把工作从怎么做,挪到做什么和为什么。Agent 和模型变得太快,你不想让工作流绑死在其中一家。标准帮你换 agent 并保住流程:MCP 接外部工具,AGENTS.md 放规则,agent 技能承载带额外上下文的可重复工作流,ACP 把 agent 接到客户端。

Codex,OpenAI 的编程 agent,能在桌面应用、编辑器和终端里跑。Everitt 把前面一课的功能规格技能,复制进 Codex 不同的路径。它能跑。你可以在同一个项目上来回切换,并保住 SDD 工作流。不同编辑器可以通过 Agent Client Protocol 跟不同 agent 说话,两边都支持时就能对上。

ACP 注册表把在客户端里查找、安装、连接 agent 自动化了,覆盖整个生命周期。在 JetBrains 里,AI 聊天窗口通向那个注册表和一份兼容 agent 列表。OpenCode 是流行的开源 agent;点安装可以按需拉取 OpenCode 本身,并把它接到 IDE 里。然后你可以在同一个编辑器里、同一套 SDD 产物上,让它和其他 agent 并排跑。

ACP 到底怎么工作?它被设计成把 agent 和客户端插在一起,协议和 LSP 用的是同一路。覆盖的不只是聊天:编辑器里的下一步编辑建议、计划模式。你还可以更进一步,写一个安装在本地工具里的自定义 agent。选哪家 agent?排行榜冒出来了,而且变得很快。保持跟上,按对你要紧的标准来选。规格坐在更高一层,不绑任何一家 agent 或 IDE。这一课要说的是,工作流被建成独立的,随着更多标准出现,这种灵活应该还会长。

Andrew Ng 收尾:你已经从氛围编程——盼着 agent 做出你想要的——走到规格驱动开发,更接近你真正需要的东西。章程、在对话里规划的功能、人在回路的验收、技能和标准。你今天写的规格,明天会成为项目的记忆。让它们保持锋利。持续改进流程。最好的代码,从一份出色的规格开始。

你,以及 Ng 认识的许多工程师,都见过走得太快会怎样。把一些工程带回来。继续当你软件的驾驶员。他在意在工作里找到快乐和目的,也想看看你拿这些去做什么。放松一点。去做点酷的事。