SDD 规范驱动开发实操手册 · 第 2 篇 / 共 8 篇
全系列按「说明 → 介绍 → 使用 → 实操 → 排障 → 收益」推进,每篇都可独立阅读,收藏专栏后按序看不会断。
上一篇讲了为什么要做,这一篇讲它凭什么成立:一次典型的失败、三句话定义、与既有方法论的差异,以及决定成败的「规范四个层次」。2.6 节的 EARS 句式是全系列最该背下来的东西。
第二章 介绍:SDD 到底是什么
2.1 从一次典型的失败说起
一个真实场景(几乎每个用 AI 写代码的团队都经历过):
需求是"给结算页加优惠券"。你跟 AI 说了一句,它给了 200 行代码,跑起来了,你很满意。第二天产品说"一人只能领一张",改。第三天说"退款要把券退回来",再改。第四天测试发现"并发下超卖了 3 张券",AI 说"我帮你加个锁",加完把原本正常的过期逻辑弄坏了。
到第二周,你打开这个文件,发现自己也说不清现在的业务规则到底是什么——规则散落在 17 次对话、43 个 commit 和 3 个人的记忆里。
这不是 AI 不行,是输入不行。AI 一直在从你的对话历史里猜意图,而对话是会衰减的:上下文一满,前面的约束就被挤掉了。你以为是"它忘了",其实是你从来没把约束写在一个不会忘的地方。
2.2 SDD 的三句话定义
第一句:规范是唯一真源,代码是规范的产物。 需要改变系统时,先改规范,再由规范驱动代码变更。代码可以重写,规范不能丢。
第二句:规范必须先于代码存在,且以可验证的形式存在。 "可验证"是关键词。它把 SDD 和"写设计文档"区分开了。
第三句:规范是人与机器共读的。 给人看,用于评审与交接;给 AI 看,作为每次生成的输入约束。所以它必须结构化、短句、可编号、可追溯——这恰好也是好需求文档的标准。
2.3 与既有方法论的差异
| 方法论 | 核心产物 | 谁读 | 与代码的关系 | 主要失效点 |
|---|---|---|---|---|
| 瀑布 | 需求规格说明书(SRS) | 人 | 文档完成后基本脱离,代码另行演进 | 文档与代码脱钩,改代码不改文档 |
| 敏捷 / Scrum | 用户故事 + 验收标准 | 人 | 故事卡在迭代结束后废弃 | 粒度太粗,边界条件永远在"实现时再说" |
| TDD / BDD | 测试用例 | 人 + 机器 | 测试即规范,但只覆盖已想到的路径 | 先写测试要求你已想清楚设计,且不描述"为什么" |
| SDD | 分层规范(宪法/行为/方案/任务) | 人 + AI | 规范驱动生成,变更回写规范 | 规范腐败、流程过重(见第五章) |
一句话概括区别:TDD 用测试锁住行为,SDD 用规范产生行为。 测试回答"它现在对不对",规范回答"它应该是什么、为什么"。
2.4 四个核心理念
意图显式化。 把"我想要一个能用的筛选"变成"用户可选择起止日期;只填一端按开区间;清空恢复全量;状态可分享"。隐含假设一旦写出来,就能被发现、被质疑、被测试。
约束前置。 技术选型、性能底线、安全要求、兼容范围,在生成代码之前就定下来。事后补约束的代价是重构,事前定约束的代价是十分钟。
任务可追溯。 每个任务能追回一条需求,每条需求能追回一个用户故事,每个用户故事能追回一个问题陈述。这条链断了,就会出现"这个字段是谁加的、能不能删"的经典困局。
变更走提案。 需求变化不是"直接改代码",而是产生一个变更单元(提案 + 规范增量 + 任务),实施后归档,规范随之演进。这让"系统现在的行为"永远有一份可查的答案。
2.5 规范的四个层次(落地成败的分水岭)
这是全书最重要的一张表。大部分团队 SDD 失败,是因为把所有东西塞进一个文件。
| 层次 | 文件 | 回答的问题 | 长度上限 | 变更频率 | 谁批准 |
|---|---|---|---|---|---|
| L0 宪法 | constitution.md |
我们团队做技术决定的底线是什么 | 1 页 | 半年 | 技术负责人 |
| L1 行为规范 | spec.md / requirements.md |
系统应该表现出什么行为(做什么,不做什么) | 2-4 页 | 每个需求 | 产品 + 技术 |
| L2 技术方案 | plan.md / design.md |
用什么结构、什么技术、怎么迁移和回滚实现它 | 2-3 页 | 每个需求 | 技术负责人 |
| L3 任务清单 | tasks.md |
按什么顺序、由谁、以什么验证标准完成 | 1-2 页 | 每个需求 | 开发自管 |
纪律只有一条:上一层不写下一层的内容。 spec 里出现"用 Redis 做原子扣减"就是越界——那是 L2 的事。越界的后果是:技术方案一变,行为规范跟着作废,规范再也追不上代码。
2.6 EARS:让需求可测试的最小语法
EARS(Easy Approach to Requirements Syntax)是需求工程里的一套受限句式,被 Kiro 采纳为标准写法。它的价值不在学术,在于逼你把触发条件写出来。
中文场景下,我建议固定用这五种句式:
| 类型 | 句式 | 用途 | 示例 |
|---|---|---|---|
| 通用 | 系统应…… | 恒成立的行为 | 系统应为每次库存变更记录一条不可修改的流水。 |
| 事件驱动 | 当〔触发〕时,系统应…… | 由动作触发 | 当用户点击"领取"且库存大于 0 时,系统应创建一张"未使用"状态的券并返回券码。 |
| 状态驱动 | 当处于〔状态〕时,系统应…… | 持续状态下的约束 | 当券处于"已锁定"状态时,系统应拒绝除核销与解锁外的所有状态变更。 |
| 非期望 | 如果〔异常条件〕,则系统应…… | 错误与防护 | 如果用户已达到该券的每人限领上限,则系统应拒绝领取、返回 COUPON_LIMIT_REACHED,且不扣减库存。 |
| 可选特性 | 当启用〔配置〕时,系统应…… | 开关型功能 | 当启用"仅限新用户"配置时,系统应仅允许注册 7 天内且无已支付订单的用户领取。 |
反例对照,这四句都是不合格的规范:
| 不合格写法 | 问题 | 改写成 |
|---|---|---|
| 系统应支持高并发领取 | 无法验证 | 当同一券模板在 1 秒内收到 500 次领取请求时,系统应成功发放不超过库存数量的券,且不出现负库存。 |
| 提示要友好 | 主观 | 如果领取失败,则系统应展示包含失败原因的提示文案,且文案中不出现内部错误码原文。 |
| 优惠券要能过期 | 缺触发与边界 | 当券实例的 expire_at 早于当前时间时,系统应在下一次读取该券时将其状态置为"已过期"。 |
| 退款时处理券 | 缺分支 | 如果订单退款成功且该订单使用的券仍在有效期内,则系统应将券状态恢复为"未使用";如果券已过期,则系统应仅记录一条"过期退回"流水,不恢复可用状态。 |
写作时守住三条:一句一条(不要用"并且""同时"连接两个行为)、给编号(FR-001 起,永不复用)、禁形容词(快速、友好、合理、尽量——全部删掉换成数字或明确条件)。
2.7 边界:什么该用、什么不该用
SDD 有明确的性价比拐点。用错场景,它就是纯负担。
| 改动特征 | 判断 | 处理方式 |
|---|---|---|
| 改文案、调样式、一行修复、改配置 | 不需要 | 直接改,不写任何规范 |
| 单文件、单函数、逻辑清晰、无状态、可 1 小时回滚 | 不需要 | 直接改,PR 描述写清意图即可 |
| 跨 2-3 个文件、有分支逻辑、有边界条件 | 轻量规范 | 只写 L1 的验收标准(5-10 条),plan 用口头 + PR 描述 |
| 跨模块、涉及数据模型变更、有并发或状态机 | 完整 SDD | L0-L3 全走,含 analyze 门禁 |
| 多人并行、需要交接、有合规或审计要求 | 完整 SDD + 归档 | 全流程 + 变更提案 + 归档留痕 |
| 探索期原型、一次性脚本、技术验证 | 不需要 | 明确标注 throwaway,禁止进主干 |
手册建议的强制线:凡是涉及数据库结构变更、跨服务调用、资金或库存计算、权限判定的需求,一律走完整 SDD。 这四类改动的返工成本最高,规范投入产出比最好。其他按上表分级。
2.8 主流工具怎么选
| 维度 | GitHub Spec Kit | Amazon Kiro | OpenSpec | 纯 Markdown 自建 |
|---|---|---|---|---|
| 形态 | CLI + 斜杠命令,注入到任意 AI 助手 | 独立 IDE(基于 Code OSS) | CLI + 斜杠命令 | 无工具 |
| 核对心 | 宪法 → 规范 → 方案 → 任务 → 实施,带澄清与一致性分析门禁 | 需求(EARS)→ 设计 → 任务,与 IDE 深度集成,有 hooks 与 steering | 面向存量系统的变更提案与规范增量(ADDED/MODIFIED/REMOVED),归档机制强 | 全靠约定 |
| 产物目录 | .specify/memory/constitution.md、specs/〔feature〕/ |
.kiro/steering/、.kiro/specs/〔feature〕/ |
openspec/specs/、openspec/changes/〈id〉/ |
自定义 |
| 最擅长 | 新项目、需要正式评审的产品需求 | 单人深度开发、需要 IDE 内闭环 | 存量系统、频繁小步变更 | 任何场景的兜底 |
| 主要短板 | 流程偏重,小改动承担不起 | 绑定自家 IDE,团队统一成本高 | 对新项目引导弱 | 无自动化,靠自觉 |
| 选它的信号 | 团队已在用 Claude Code / Copilot / Cursor 等 | 团队愿意统一换 IDE,且以单人/小队为主 | 项目已上线 2 年以上,代码量大、规范为零 | 公司禁止引入新工具,或只想先试水 |
我的建议:新团队从 Spec Kit 起步(生态最广、可换 AI 助手、Markdown 全透明)。存量系统改造用 OpenSpec 的"增量规范"思路,避免一上来要求补全历史文档。无论用哪个,第四章的实操流程是通用的——工具只是帮你把文件生成出来,判断标准在你脑子里。
下一篇:方法论清楚了,怎么装进现有工程?三个开工决策、命令行安装、目录约定、五阶段流程与四道门禁。
系列目录见专栏。如果这篇对你有用,点个赞让更多被 AI 写崩过项目的人看到。