Clipping 微信公众号

SDD 实战手记 [02-10] - Code Is Cheap. Show Me Your Spec.

by Dolphin7 原文 ↗
Created: 2026-06-18

公众号名称:dolphin07

作者名称:Dolphin7

发布时间:2026-06-10 20:34

上周团队里一个核心开发跟我说:「我试了 OpenSpec,生成的 spec 我看不懂,不如我自己和 Claude 聊几轮,让它出一份详细的技术方案,然后按方案来写代码。SDD 到底有什么用?」

我想了想,发现他说的方式其实已经在做 SDD 了——只是他没意识到。

他和 AI 反复对话收敛出来的那份”详细技术方案”,本质上就是一份 Spec。区别在于:这份 Spec 留在了他一个人的聊天记录里,下次换个人做类似需求,得从头再来一遍。

SDD 不是”多写一份文档”,是把你已经在做的事情(反复 Prompt 收敛路径)的结果固化下来,让它可复用、可审核、可传递。


一、SDD 是什么——先看学术定义

官方定义

在软件工程中,Specification(规格说明) 有一个经典定义:

“A specification describes what the system should do but not how it should do it.”
— IEEE Std 830-1998 (Software Requirements Specification)

将这个定义代入 AI 时代的语境:

Spec-Driven Development(SDD)= 通过显式的、结构化的规格说明(Specification)将 Intent 到 Code 的非确定性映射,收敛为可审计、可验证的高确定性交付路径。

换句话说:SDD 要解决的核心问题是——在 Intent → Code 的组合级路径空间中,建立确定性的工程交付保障。

关键要素:

要素含义
显式写出来的、可版本控制的、可审查的——不是聊天窗口里的一次性对话
结构化分层描述 What / How / Plan——方便人 Review、方便 AI 执行
高确定性同一份 Spec → 不同人/不同模型执行 → 产出在约束边界内收敛(注意:Spec→Code 仍有损,不保证完全一致,但关键路径锁定)
可审计每条约束有编号、有判据,出了问题可以追溯到决策源头

SDD 不是一个具体工具,是一种研发范式。OpenSpec、Superpowers、Plan Mode、Kiro 都是这个范式下的不同实现。


二、为什么需要 SDD——Intent → Code 的路径爆炸

核心矛盾:Intent → Code 无数条路径,只需要一条

每一个需求(Intent)到实现(Code)之间,存在指数级的路径可能:

Intent: "实现一个抓球扣费功能"

         ├─ 先扣后抓?先抓后扣?
         ├─ 幂等用数据库唯一键?还是 Redis SET NX?
         ├─ 失败重试 3 次?5 次?不重试?
         ├─ 余额校验放网关?放 Service?放 Repository?
         ├─ 并发锁粒度:用户级?订单级?全局?
         └─ ……
         
路径数 = 决策点₁ × 决策点₂ × … × 决策点ₙ → 爆炸

实际工程需要的不是”某条能跑的路径”,而是确定性的、可审计的、团队共识的那一条。

三种编程范式,本质上是三种不同的”路径收敛策略”。

三代编程范式——各自怎么解决路径爆炸

古法编程——人脑逐行决策,收敛靠经验

工程师在写代码的过程中逐行做路径选择——靠脑中的隐性上下文(经验、偏好、团队规范)完成收敛。确定性高,但慢。 每条路径都是人用时间换来的。

Vibe Coding——AI 替你选路径,Code 成本降了一个量级

公平地说:Vibe Coding 比古法编程进步了。 Code 的生产成本从”小时”降到”秒”——这是质变。对于探索性工作、原型验证、脚本工具,Vibe Coding 是正确选择。

但它有一个结构性问题:路径选择变成了 AI 的随机采样。

Vibe Coding 的收敛困境

你第一次 Prompt 得到的代码大概率不完全对。于是你开始迭代:

Prompt v1 → 代码不对 → 补充约束 → Prompt v2 → 部分对了 → 再补 → v3 → …

这个反复沟通的过程,本质上就是在逐步收敛路径。但问题在于:

  1. 1. 收敛过程不可沉淀:你和 AI 对话了 15 轮才把路径定下来——但这 15 轮对话是一次性的。下次做类似需求,你得从头来。

  2. 2. 收敛结果不可复用:你好不容易通过反复 Prompt 把路径收敛了,但换一个人做同类需求,他得重新走一遍同样的试错。因为你的”收敛经验”留在了聊天记录里,不是可传递的资产。

  3. 3. 不同人收敛到不同路径:同一个 Intent,5 个人各自 Prompt,得到 5 种不同实现。团队协作时,这些不同路径在代码合并时才暴露冲突。

  4. 4. 无法审计收敛结果:代码出问题后,你无法回溯”AI 当时基于什么约束选了这条路径”。

Vibe Coding 的本质:用廉价的 Code 生成 + 昂贵的反复沟通来完成路径收敛。收敛成本从”写代码”转移到了”反复 Prompt”——但没有降低,只是换了个地方花。

从 Vibe Coding 到 SDD——对 Prompt 的蒸馏

如果你把反复 Prompt 最终收敛出来的那些约束(“要幂等""余额不能为负""失败不重试”)提前写下来、结构化、固定住——那就是 Spec。

Spec = 对 Prompt 反复试错过程的蒸馏。 把 15 轮对话收敛出来的路径选择,压缩成一份可复用、可审计、可传递的产物。

范式路径收敛策略Code 成本收敛成本可复用?
古法人脑逐行决策高(但隐式)留在人脑,不可转移
VibeAI 随机采样 + 反复 Prompt高(反复沟通)不可复用(对话即弃)
SDDSpec 提前锁定一次投入,多次复用✅ 跨人、跨模型、跨时间

实践中 Spec 也是 AI 写的——人表达 Intent,AI 生成 Spec 初稿,人审核冻结。Spec 的价值不在于”人亲手写”,在于它把收敛结果固化成了可复用资产。

Prompt 像口头对话——说完即弃,下次从零开始。Spec 像按业务场景蒸馏出的操作手册——同类需求再来时,直接复用已有的收敛路径。

常见误区:一套 Spec 模板打天下

既然 Spec 是对特定业务场景 Prompt 的蒸馏,那么不同业务场景蒸馏出来的 Spec 结构必然不同。这是很多团队踩的坑——搞一套标准模板,所有需求都往里塞。

举例:

业务场景Spec 的重心模板差异
支付/资金状态机 + 幂等约束 + 异常补偿必须有资金流转图、对账规则
CRUD 后台数据模型 + 权限矩阵Design 层可以很薄
算法策略输入输出契约 + 效果指标需要 A/B 实验设计,不需要 DDL
基础设施性能约束 + 容灾方案 + SLA必须有容量模型,可以没有 AC

就像不同公司的技术方案模板不一样——Spec 模板也应该按业务域定制。支付团队的 Spec 和内容团队的 Spec,结构可以完全不同。强行统一只会让 Spec 变成”为了填而填”的形式主义。

好的 Spec 模板是从团队真实踩坑中蒸馏出来的,不是从方法论文章里抄来的。


三、Spec 到底是什么——三层产物,不是一份文档

从 Intent 推导:Spec 需要描述什么

上一节推导出了 Spec 存在的必要性。现在问:Spec 里到底该写什么?

一个常见误区:很多人认为只有 Requirement(What)才是 Spec,Design 和 Plan 不算。 这是狭义理解。

从我们的核心模型出发——Intent → Code 中间的所有显式约束都是 Spec:

图中绿色部分全部是 Spec。 在 OpenSpec 的实践中,specs/ 目录下同时存放 spec.md(Requirement)、design.md(Design)、plan.md(Plan)——它们作为一个整体被生成、被审核、被消费。


狭义 Spec广义 Spec(本文采用)
包含只有 Requirement(What)Requirement + Design + Plan
理论依据学术定义:spec 描述 what not how工程现实:Intent→Code 中间的所有显式约束都是 spec
问题Design 不锁定 → AI 每次选不同路径

为什么广义理解更合理? 因为 Spec 的本质是”在 Intent 和 Code 之间插入的确定性约束”。只要这个约束能帮助路径收敛、能被人审核、能指导 AI 执行——它就是 Spec 的一部分,无论它描述的是 What 还是 How。

未来模型变强,Design 和 Plan 会逐渐变薄——模型能从更少的约束推断更多细节。但当下工程实践中,Design 层仍然是 Spec 中最重要的部分——因为大多数路径爆炸发生在”怎么做”而不是”做什么”。“要幂等”大家都同意,但”幂等怎么实现”才是真正需要锁定的决策。

对应三层 Spec 产物:

回答什么产物为什么需要
Requirement做什么、不做什么、验收标准Boundary + AC(验收标准)锁定”正确”的定义——没有它,AI 不知道什么叫对
Design技术方案、架构选型、数据模型设计文档(DDL / API / 时序图 / 选型对比)锁定实现路径——在路径爆炸中选定一条,且让人能快速审核方案合理性
Plan按什么顺序、分几步执行Tasks 列表 + 依赖关系当下模型有上下文窗口限制,大任务必须拆分才能保证每步质量

为什么 Spec 必须包含技术方案(Design)

一个常见误解:Spec 只描述 What,不描述 How。这在学术上成立,在工程中不够。

原因很简单——Spec 的核心价值是人审。不审核的 Spec 没有意义。 而人审核需要看到方案才能判断:

  • • “要幂等”(Requirement)→ 人点头,没问题

  • • “幂等用 Redis SET NX + 30s TTL”(Design)→ 人才能判断:这个 TTL 够不够?集群故障时 key 丢了怎么办?

如果 Spec 只有 What 没有 How,人审的时候只能审”要什么”,审不了”怎么做”——等到代码出来再审,成本就爆炸了。

所以 Spec 要同时满足两个消费者的需求:

消费者需要什么Spec 怎么满足
人(审核者)快速理解方案全貌,判断路径是否合理结构化描述:选型对比表、时序图、DDL、边界条件——让人在 10 分钟内做出 approve/reject 决策
AI(执行者)无歧义的约束 + 足够的上下文来生成代码编号化 AC、明确的数据模型、API 契约——让 AI 不需要猜

Spec 的设计原则:方便人 Review,同时方便 AI 执行。 两者缺一不可——只方便人看的是技术文档,只方便 AI 读的是 Prompt。Spec 是两者的交集。

为什么需要 Plan(Task 拆分)

这是一个务实的工程约束。2026 年的模型上下文窗口虽然很长(100K-200K tokens),但一次性生成一整个服务的所有代码,质量会显著下降

Plan 把大任务拆成可独立验证的小步骤,每步聚焦在有限上下文内完成——这是当下模型能力边界下的最优策略。

随着模型能力增强,Plan 这一层会逐渐变薄——模型能在更少的指导下自行拆解。但 Requirement 和 Design 不会消失——因为它们锁定的是人的意图决策,不是模型的执行策略。

SDD 的真正成本不是写 Spec,是审 Spec

这是很多团队上了 SDD 之后撞的墙。

写 Spec 的成本在急剧下降——AI 辅助生成 Requirement、AI 辅助画架构图、AI 辅助拆 Tasks——一份完整 Spec 从 Intent 到初稿,10 分钟搞定。

但审 Spec 的成本没有下降。 审核需要人理解业务上下文、判断方案合理性、预判风险——这些是模型替代不了的(至少当下替代不了)。

当团队并行 5 个需求,每个需求产出 20 条 AC + 一份设计方案——审核者一天要审 100 条 AC。这时候两种退化模式会出现:

  • Rubber Stamp(橡皮图章):审了等于没审,点 approve 只是走流程

  • 审核积压:Spec 堆着没人审,AI 等不到 approve 开不了工,效率反而比 Vibe Coding 还低

SDD 的规模化瓶颈不在 AI 侧(生成),在人侧(审核)。 这就是为什么 Spec 必须设计得”方便人快速审”——不是锦上添花,是生死线。

这个问题怎么解?后续篇章会展开。但认知先到位:如果你的 Spec 不能让审核者在 10 分钟内做出决策,那它就不是好 Spec——不管内容多完整。

Spec 不是 Truth——是契约

最后一个认知校准。业界爱说”Spec 是 source of truth,代码只是投影”——这句话在误导人。

一条信息论常识:Spec 若比代码短,就必然省略了某些实现决策。 一份无损到能完整生成全部代码的 Spec,信息量不可能小于代码本身——那它就不是 Spec 了,是一门新的编程语言。

所以 Spec 的正确定位是:

Spec 是契约(锁定关键路径和约束),不是蓝图(描述所有实现细节)。


Spec(契约)Code(实现)
回答系统该做什么、关键路径怎么走系统具体怎么跑的每一个细节
信息量故意不完整——只锁关键约束和关键路径完整但包含大量 AI 自主决策的细节
维护责任人审核、可演进AI 生成、可重新生成
判据角色判定”对不对”的标准被判定的对象

Spec 是”可接受实现空间”的边界描述——在边界内的实现都算对,边界外的细节由 AI 自主决策。

一个推论:Spec 不维护就会腐烂。 需求变了但 Spec 没更新 → Spec 和代码脱节 → 团队不再信任 Spec → 回到 Vibe Coding。Spec 不是写一次就完事的静态文档——它需要随系统演进而演进,否则就是换了个名字的过期 PRD。


补:和传统技术方案的关系

常见疑问:「这不就是以前的技术方案吗?AI 为什么不能直接根据技术方案生成代码?」

老实说——它可以。 Spec 和技术方案的区别没有很多人想象的那么大。核心差异只有两点:

  1. 1. 服务对象不同:技术方案只服务人(可以模糊,人能脑补);Spec 同时服务人 + AI(AI 不脑补,模糊 = 随机)

  2. 2. 验证闭环不同:技术方案写完即弃;Spec 的 AC 要能转测试——因为 AI 生成的代码你没法靠直觉判断对错,需要外部判据

Spec 是技术方案的进化形态:同时满足人的审核需求和 AI 的执行需求,并且自带验证闭环。 你完全可以把现有技术方案稍作结构化改造(加 AC 编号、加边界条件),它就变成了 Spec。门槛没有想象的高。


四、落地指南——不是所有需求都值得写 Spec

不是对立,是光谱

理解了前面的推导,就不会把 Vibe Coding 和 SDD 对立起来了。它们是同一根轴上的不同位置:

选型原则:写 Spec 的成本 < 它省下的返工成本时,SDD 划算。

风险/复杂度最佳策略为什么
(脚本、原型、内部工具)Vibe Coding试错成本低,Spec 成本 > 收益
(功能迭代、CRUD)Plan Mode + 轻量 Spec一页 Requirement 锁住核心约束就够
(支付、权限、数据删除、合规)Full SDD返工成本太高,必须前置锁定路径

我们团队的经验:大约 70% 的日常需求落在”中”,用 Plan Mode + 一页 Spec 就够。真正需要全流程 SDD 的只有 15-20% 的高风险需求——但这 15% 如果出事,后果是前面 70% 的总和都兜不住。

3 分钟自测

你正在做的需求,问自己三个问题:

  1. 1. 一段 Prompt 能说清所有约束吗? → 能,且试错成本低 → Vibe Coding 够了

  2. 2. AI 生成后你怎么判断对不对? → 如果答不上来 → 你至少需要 Requirement(AC)

  3. 3. 技术方案有多个可选路径,需要人拍板吗? → 需要 → Design 层也要走审查

三个都是 No → 不需要 Spec。任何一个是 Yes → 你需要对应层级的 Spec。

SDD 不是银弹,是手术刀。不是所有伤口都值得开刀——但当你需要开刀时,创可贴救不了你。


到这里,SDD 的全貌展开了。回到开头那个问题——“SDD 到底有什么用?“——答案是:你已经在做了,只是做得不够系统。 把反复 Prompt 的收敛结果固化、结构化、让它可以被别人审核和复用——这就是 SDD 在做的事。

但一个更尖锐的问题紧跟着来——2026 年模型这么强了,我们真的还需要 Spec 吗?下一篇从第一性原理推导答案。


💬 你和 AI 写代码时,通常要对话几轮才能得到满意的结果?3 轮?10 轮?还是 30 轮? 留言区说个数字——这个数字越大,说明你越需要把收敛结果固化成 Spec。


下一篇: 2026 年还需要 Spec 吗?OpenAI 说不太写了,但我们的数据说提质 98%。到底听谁的?


内容效果不满意?点此反馈

输入关键词开始搜索