规范驱动开发(Specification-Driven Development, SDD)是把整个软件开发过程组织在单一规格中心上的一种做法:团队先协作产出结构化的 Spec——领域模型、API Contract、质量约束,然后反向驱动设计、实现、测试、运维。

说人话,Spec Coding 就是把 AI Coding 从”凭感觉写”拉到”看规范说话”,用一份可维护、可验证的 Spec 让 AI Coding 真正变得可靠。

为什么现在谈 Spec Coding

原理上 SDD 把 Design by Contract 的契约视角和 Specification by Example 的可执行 Spec 结合起来,要求 Spec 既能被工具消费,又能作为业务、测试、运维之间共享的通用语言。

这种实践本身我们并不陌生。API 设计优先流程、CI 里自动审计、从同一份规范派生文档/SDK/契约测试/监控配置——这些都是传统 SDD 在人类生产里的常见形态。真正变化的是 AI Coding 的普及:Vibe Coding 带来的漂移和不一致在小项目里还能容忍,到了生产级系统就会系统性地出问题,SDD 正是因为能对抗这种漂移才重新被放到台面上,成为 spec-first / documentation-first 路径的代表。

当代 SDD 的代表性项目包括 Spec Kit、OpenSpec,以及围绕 AWS Kiro 和 Specmatic 构建的各类示例仓库。往前的探索空间还很大。

Vibe Coding 的代价与 Spec 的两个角色

开发者给一串模糊 prompt、让 AI 生成代码、修修补补”感觉对了就收工”——对快速原型没问题,对生产系统立刻暴露几个硬伤:

  • 质量参差:输出强依赖 prompt 质量和上下文完备性,结果不稳
  • 维护黑洞:缺乏明确的设计意图,后续开发者(人或 AI)都很难接手
  • 协作障碍:各自和 AI 互动就会各自形成心照不宣的做法,团队很难对齐
  • 交付难验证:需求本身就模糊时,无从证明”交付是正确的”

SDD 把 Spec 推到 AI 协同开发的核心位置,扮演两个角色。一是可执行的上下文:一份好的 Spec 给 AI 提供了完成任务所需的全部背景、约束、验收标准,让它能一次就接近对的答案,减少来回磨。二是对齐契约:Spec 成为产品、开发、测试共同遵守的单一事实源,让人和 AI、人和人之间的目标保持一致。

好的 Spec 像是你为明天失忆的自己留下的笔记。

SDD 的指导原则

当我们自发地用一套文档描述项目,要求 agent 遵循流程和规范,并在过程中检查和校准,实际上已经在做 Spec Coding 了。SDD 的精髓不在文档本身,而在这套指导原则:

提供项目契约

  • 目标为中心:Spec 的主要内容是”系统应该做什么”,“怎么实现”相对次要
  • 面向用户故事:每个功能点都挂在具体用户场景和明确验收条件上(Given-When-Then 或类似格式)

明确约束与边界:清晰定义 contract、领域模型、边界条件、异常处理——这些都是 AI Coding 幻觉的重灾区,只要 Spec 里不写清楚,模型就会自己编。

面向验收标准:设计时提供可量化的 Gate,聚焦外部可观测行为和业务成果;流程上把检查和准出做成规范动作。

活文档:Spec 不是一次性产物,必须随项目演进持续更新、可追踪、可验证,和代码保持同步。这一条非常重要,腐化的 Spec 比没有 Spec 更糟。

Gate 这个词很好用。它同时包含”规范”、“通过后才准出”、“程序化检查”、“TDD”的意味。spec-kit 模板里用的是 ## Delivery Workflow & Quality Gates——考虑到这种说法有知名度、可以扩散、进 coding 类训练数据,以后在 PE 里用 gate 触发”验收”类任务没准也有奇效。“人不读、但 AI 会读”的 AI Friendly 技巧本身就是个值得单独展开的话题。

SDD 不是替代,是既有实践的延伸

SDD 不是凭空发明的概念,而是把既有的好实践重新打包,让它在 AI 协同里站得住:

  • BDD / TDD / SBE 都强调用具体例子和测试定义需求。SDD 继承了这个思想,把这些”例子构成的规格”作为喂给 AI 的核心输入。
  • API-First & Contract Testing 强调先约定 API 契约(OpenAPI / GraphQL Schema)。SDD 把契约作为 Spec 的关键组成部分,再叠加 Pact 这类契约测试工具保证服务间交互符合约定。

可以把 SDD 理解成这些实践在 AI 时代的一次现代化打包升级——它提供的是一个更统一的框架,把需求、设计、编码、测试、文档串成一条线,再把 AI 智能体作为核心执行引擎。

端到端的 Spec Coding 流程

先看传统开发里 Spec 的生命周期:

阶段做什么
Specify / SpecPM 和 RD 把模糊的 PRD 提炼成结构化 Spec,问答是常用手段
Review & Sign-off各方评审达成共识,形成版本记录
AI Generate以 Spec 为高质量上下文,喂给 AI Coding Agent,生成设计/框架/完整实现
Gate / Verify按 Spec 的验收标准选合适的校验手段:单元测试、端到端测试、必要时人介入
Version Management需求变更先落在 Spec 上,Spec 与代码一起纳入版本控制
Measure & Improve持续度量 Spec 质量和 AI 生成对齐度,优化模板和 prompt 策略(这一步最重要)

传统流程里 Spec 天然存在,但是人有容错——开发过程中不断有场外输入,未必需要严谨。AI 的容错差得多,所以 AI Coding 里的 SDD 新实践其实是把传统 SDD 进一步结构化和规范化,从人和 AI 的共同视角回答同一个问题:如何让 Spec 每个环节都尽量清晰、可准出、可复现。

示例:GitHub Spec Kit

github/spec-kit 提供了一个命令式 SDD 流程,Cross Agent 设计可以让 Codex、Claude Code、Gemini CLI 等多种 Coding Agent 基于同一份 Spec 协同工作。流程的核心是——开发者负责想清楚”AI 应该做什么”,并把它维护在一份高质量 Spec 里,剩下的从设计到编码到测试由 AI 围绕这份 Spec 完成。理论上,随着模型迭代,一份足够好的 Spec 就等于成品项目

基于模板和 init 的 Sub Command 实现,是很聪明的一个设计。

# 1. 初始化项目并创建 spec,AI 生成初始的 spec.md
/specify "Create a coupon service API with endpoints for creating, retrieving, and applying coupons."
# 2. 迭代细化 spec,手动编辑 spec.md 添加业务规则、数据模型、验收标准
/refine "Add a validation rule that coupons cannot be applied to already discounted items."
# 3. 生成执行计划,AI 分析 spec.md 产出详细的实现步骤清单
/plan
# 4. 执行计划,AI 根据计划生成和修改代码
/implement
# 5. 验证,AI 根据 spec.md 的验收标准生成并运行测试
/verify

OpenSpec 走的路径类似。

工具选择

SDD 的工具生态还在快速发展,目前几条主要分支:

  • Kiro:Agentic IDE,把 Spec 当一等公民,提供从原型到生产的端到端 SDD 体验。Kiro 是较早的 Spec 标准实践者,把 Spec 规范化带入了大众视野。适合需要高度集成开发环境的团队。
  • GitHub spec-kit:开源、轻量、命令行式工具集,可以灵活嵌入既有流程和 IDE,适合渐进式引入 SDD、想保持工具链灵活性的团队。觉得 spec-kit 还是太重可以试 OpenSpec。
  • 各类 Agent OS

一份好的 Spec 长什么样

分层结构

复杂项目里 Spec 是分层体系,保证从宏观战略到微观实现的一致性。

和面向人的开发一样,好的体系要有一些横切面保证按预期运行。比如”观测”——追踪人的做事精准度时观测未必重要,基本就是匹配”人员/需求/技术实现”,统计意义大于实践指导。但对于几十上百个基于同一份 Spec 并行跑的 agent,情况完全不同。我们可能需要专门设计观测方法,确保代码变更都能追溯到具体的 Spec 定义,每个特性 Spec 都能对齐到产品目标。

在这样的背景下,Gate 就不再只是代码质量准出的概念,而会影响整个开发过程的方方面面,那是更大的话题,按下不表。

研发视角的典型结构

高质量的 Spec 通常是结构化的,信息完备且无歧义。按技术设计来看大致长这样:

组成核心内容
目标与需求目标与范围(Goal & Scope)这次变更要解决的核心问题、业务价值,以及明确的”做”和”不做”
技术标准用户场景与业务规则(User Scenarios & Business Rules)典型用户如何与系统交互,背后必须遵守的业务逻辑
接口 / 数据模型(API / Data Models)API 端点、请求 / 响应格式、数据结构、字段约束
状态与错误处理(State & Error Handling)系统可能存在的状态,以及异常情况下的响应方式
依赖与约束(Dependencies & Constraints)对外部系统、特定技术栈或环境的依赖和限制
非功能需求(NFRs)性能(延迟、吞吐)、安全、可用性、合规性
准出与观测验收标准(Acceptance Criteria / Gate)用 Given-When-Then 或类似格式列出所有需要被满足、可测试的条件
迁移与回滚计划(Migration & Rollback)涉及数据结构或重大架构变更时,明确的上线和回滚策略

实际创建时应该取舍,不必每一项都顶格写。

如何落地

团队角色与 Spec 构建

把 agents 当成一个团队而不是工具,是写好 Spec 的起手式。各角色在 SDD 里的分工:

  • 产品经理:提供清晰的业务目标和用户故事,参与验收标准的定义
  • 开发工程师:主导 Spec 编写,把业务需求翻译成技术上可执行的细节,监督 AI 实现
  • 测试工程师:保证 Spec 里的验收标准是可测的,构建自动化验证框架
  • 架构师:评审 Spec 里的技术方案、接口设计、NFR,确保符合整体架构蓝图

其中相当一部分角色可以由 AI 替代。搭 Spec 某种程度上就是通过制定规范让 agent 替代更多角色——当 AI 无法替代的剩余部分能被一个人 cover,就变成了一人团队。我认为团队协作模式接下来会快速从”工种配合”过渡到”上下文配合”,每个人独特的价值主要来自他独特的上下文。

把 Spec 当代码管

Docs-as-Code 是关键。所有 Spec 文档进 Git,和对应源码放一起。重大变更走正式流程——RFC 或 ADR,评审通过才合并。决策因此是透明和可追溯的。

反模式与防御

不要过度设计

Spec 应该聚焦”刚好”的细节,不要陷入无休止的文档编写失掉敏捷性。我的经验是,Spec 往往是在过程中迭代出来的,而这恰恰是当前 Spec 系统处理得最不好的环节。

不要让 Gate 粗糙

  • 避免描述偏差:实际描述过程中的偏差很常见。让 agent 一上来先复述规范是个不错的校验方式。不只写清楚直接目标,也要说明目标背后的目的——这和给人描述需求一样。
  • 提供清晰的 Gate:“系统应该跑得很快”这种标准等于没有。标准必须具体、可量化。评测才是一切。

防止 Spec 腐败

  • 避免腐坏:代码实现后要立刻更新 Spec,并且祭出”彻底实现、删除旧文件、不留任何 TODO”这样的清理指令。缺乏维护的 Spec 很快就会变得毫无价值,甚至反过来成为阻碍。
  • 避免僵化:不要把 Spec 当成最终真理。实现过程中肯定会发现 Spec 里的问题,该更新就更新,并要求 agent 重新读取。

持续要回答的问题

底层逻辑还是做好 Context Engineering。怎么压缩、索引、动态加载这些都会让 Spec 变得更好执行。

怎么控制 Spec 粒度

遵循”刚好够用”原则,Spec 详细程度应和功能的复杂性、风险成正比——这里其实有点像做架构,有基本原则但妙到毫巅处法无定法。简单的 UI 调整甚至不需要 Spec;复杂的计费逻辑,把状态机、错误处理、代码实现一次写清楚也不为过。

这也说明了 AI Coding / PE 的手艺不会过时——Spec 的边界定义和描述方式很多时候取决于手感。

怎么让 AI 严格遵循

  • 前提是提供高质量、结构化的 Spec,尤其避免规则内部互相冲突
  • 通过多轮 prompt 纠偏,过程中注意:上下文是否脏了、任务是否已经不适合当前 agent(换 agent、拆任务、或补工具)、是否出现 Spec 偏差
  • 建立 Gate,尤其是程序化 Gate。最有效的始终是 TDD——基于 Spec 生成自动化测试,从结果上保证 AI 生成的代码确实遵循了 Spec

初创 / 快速迭代阶段怎么避免过度设计

  • 区分主干和枝节:主干是稳定且高风险的部分(核心业务规则、API Contract、数据/安全相关),按高粒度写;枝节是可接受精度损失、易变的部分(UI 布局这类),保持低粒度
  • 留变更空间:容忍可控的模糊,不要过拟合
  • 主动迭代:说清楚的标准未必会被一次性遵循;一定的开放性也可能带来意想不到的好结果。提前对这些情况保持开放心态,设想可能发生的状况,及时更新 Spec

怎么做快速迭代

SDD 不排斥探索,但要聪明地协调:

  • 试原型:不确定性高的任务,利用 AI 快速产出大量实现的特点,做一个有时间限制的冲刺。过程中能拿到 insight,也能借机摸清 AI 在你这个场景是否擅长,或者哪个 AI 更擅长。
  • 自上而下:改代码时要求先改文档,分层情况下从上往下改,确保文档一致无矛盾后再落实到具体实现
  • 产出 Spec 而非代码:把这一轮的产出定位成”一份更清晰的 Spec”,然后基于新 Spec 走正式 SDD 流程

最简迁移路径

全面转到 SDD 不用一次到位,可以分阶段:

  1. 构建最简 Spec:新功能配一个极简 Spec,至少包含目标、关键 Contract、Gate。可以直接让 AI 总结,比写一份 AGENTS.md 还简单。
  2. 用 Spec 方式开发关键增量:选项目里新的、核心的或复杂的功能,强制走完整 Spec 编写和评审。这个阶段可以引入 OpenSpec 这类工具,但要删繁就简,聚焦效果。
  3. 重构并建立治理:找到或沉淀出心水的规范后推广到整个项目,建立完善 Spec,作为团队默认工作方式——通常会伴随一次重构。

还可以继续聊的话题

  • 从 Spec Coding 的视角看,Vibe 还能做什么、适合做什么
  • 打磨项目、提升完成度,从 80% → 95% → 99% → 99.9% 每一段各有什么技巧
  • 做 AI 算法优化和用 AI Coding 之间有什么有趣的关联
  • 人与 AI 的协作聊完了,非人类之间的 AI Coding 方式有哪些

小结

Spec 驱动把开发的核心从模糊的 Vibe 转到明确的 Spec 上,就有机会把系统做得更可靠、更可维护、更能适应变化。

再往外说一步,这套逻辑不仅用在软件开发上。它的底层是人与 AI 的高效协同,Spec XXX 会是一整套方法论——不再是一种选择,而是高效构建系统的必经之路。