规范驱动开发(Spec-Driven Development)深入解析——从方法论演进到 AI 时代的软件工程范式转移
一、引言:为什么我们需要规范驱动开发
软件工程从不缺乏"写代码"的方法,真正稀缺的是——如何让"正确的系统"稳定、可控、可复现地诞生。
当项目规模变大、参与角色变多、系统生命周期变长时,很多团队都会遇到同一类问题:
- 需求写得很清楚,但代码实现总是"跑偏" —— 开发人员对需求的理解偏差,导致最终交付物与预期不符
- 测试补得很全,但系统整体行为仍然不可预测 —— 单元测试覆盖率高,但集成后系统行为依然难以预测
- 架构设计文档写完就没人看,和代码长期脱节 —— 设计文档沦为"一次性产物",无法指导后续演进
- AI 生成代码的能力越来越强,但我们不敢让它直接进生产 —— 缺乏对 AI 生成代码的信任机制和质量控制
这些问题的背后,本质上指向同一个核心矛盾:
系统意图,缺少一种足够强健的表达形式。
这正是规范驱动开发(Spec-Driven Development,SDD)试图解决的问题。在本文中,我们将深入探讨 SDD 的核心思想、历史演进、架构模型、工程实践以及未来展望,为你呈现一幅从理论到实践的完整图景。
二、核心概念:什么是规范驱动开发(SDD)
2.1 工程视角下的定义
我们先给出一个工程视角下的定义:
规范驱动开发(Spec-Driven Development)是一种以“规范(Specification)”作为软件开发的第一性产物,并以规范驱动设计、实现、验证与演进的开发方法论。
这个定义中有三个关键词需要特别强调:
- 第一性产物:规范不是辅助文档,而是开发过程中最先产生、且最具权威性的工件。它决定了系统的“基因”。
- 结构化与可验证:规范不是自然语言描述,而是结构化、可验证、可演化的技术工件,能够被工具和 AI 稳定解析。
- 实现与对齐:代码不再是“唯一事实来源”,而是规范的一个实现结果,必须持续与规范对齐。
用一句更工程化的口号来概括:
SDD = Spec-First,而非 Code-First
这意味着在 SDD 中,我们不再从编写代码开始,而是从编写规范开始。规范成为整个开发过程的“北极星”。
2.2 什么是“规范(Specification)”
在 SDD 语境下,“规范”并不等同于我们熟悉的需求文档或设计说明书。它更接近于系统在某个阶段的“正式合同”,明确规定了系统应该做什么、不应该做什么,以及如何验证。
一份合格的 Specification,通常具备以下特征:
| 维度 | 说明 |
|---|---|
| 明确性 | 对系统行为、约束、边界条件有明确描述,避免歧义 |
| 结构化 | 可被工具或 AI 稳定解析(常用格式:Markdown / DSL / Schema) |
| 可验证 | 能映射到测试、校验规则或自动化验证,确保规范与实现一致 |
| 可演进 | 支持版本化、Diff、回滚,随系统一起成长 |
| 面向实现 | 能直接指导代码生成或人工实现,降低翻译成本 |
请注意:
- 规范 ≠ Word 文档(后者难以被工具解析和验证)
- 规范 ≠ 需求原型图(后者缺乏结构化描述和可验证性)
规范更像是:
“系统在这个阶段应该长成什么样”的正式合同
这份“合同”不仅对人类开发者有约束力,对 AI 同样有效。它让系统的意图变得可传递、可检验、可演化。
2.3 规范示例:一个简单的 OpenAPI 规范
理论总是抽象的,让我们看一个具体的例子。以下是一个简化的 OpenAPI 3.0 规范,定义了一个用户注册接口:
openapi: 3.0.3
info:
title: 用户服务 API
version: 1.0.0
description: 用户注册、登录、信息管理接口
paths:
/api/v1/users/register:
post:
summary: 用户注册
description: 创建新用户账户
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/RegisterRequest'
responses:
'201':
description: 用户创建成功
content:
application/json:
schema:
$ref: '#/components/schemas/RegisterResponse'
'400':
description: 请求参数无效
'409':
description: 用户已存在
components:
schemas:
RegisterRequest:
type: object
required:
- username
- email
- password
properties:
username:
type: string
minLength: 3
maxLength: 20
pattern: '^[a-zA-Z0-9_]+$'
email:
type: string
format: email
password:
type: string
minLength: 8
format: password
RegisterResponse:
type: object
properties:
userId:
type: string
format: uuid
username:
type: string
createdAt:
type: string
format: date-time
这个规范告诉了我们什么:
- 接口定义:POST
/api/v1/users/register - 请求格式:JSON,包含 username、email、password 字段
- 验证规则:username 3-20字符,email 格式,password 至少8位
- 响应格式:成功返回 userId、username、createdAt
- 错误处理:参数无效(400)、用户已存在(409)
这份规范可以:
- 生成代码:自动生成 Go/Java/Python 的结构体和接口
- 生成文档:自动生成 API 文档
- 生成 Mock 服务:快速搭建测试环境
- 生成测试用例:自动生成接口测试代码
这正是 SDD 的核心:一份规范,多重价值。
三、核心架构:五层执行模型
在展开历史脉络之前,有必要先把 SDD 的“骨架”讲清楚。SDD 把系统视为一套由规范驱动演进的整体,并用五层执行模型把“意图 → 实现 → 验证 → 治理”串成一条可落地的链路。
3.1 五层模型详解:从意图到实现的完整链路
SDD 的五层模型是一个自顶向下、逐级约束的体系。每一层都有明确的输入、输出和职责,确保规范的权威性贯穿始终。
┌─────────────────────────────────────┐
│ 5. 治理层 (Governance Layer) │ ← 版本控制、安全策略、人机决策
├─────────────────────────────────────┤
│ 4. 验证层 (Validation Layer) │ ← 合约测试、模式验证、漂移检测
├─────────────────────────────────────┤
│ 3. 执行层 (Execution Layer) │ ← 生成的代码 + 业务逻辑
├─────────────────────────────────────┤
│ 2. 生成层 (Generation Layer) │ ← 规范→代码的编译器
├─────────────────────────────────────┤
│ 1. 规范层 (Specification Layer) │ ← 声明式意图(What)
└─────────────────────────────────────┘
各层职责详解
| 层级 | 核心职责 | 关键能力 |
|---|---|---|
| 规范层 | 定义系统行为 | API 模型、消息契约、领域模式、策略约束 |
| 生成层 | 意图→可执行形式 | 跨语言代码生成、类型定义、SDK 生成 |
| 执行层 | 运行时实现 | 骨架架构(人工治理)+ 业务逻辑(AI 生成) |
| 验证层 | 实时对齐 | 合约测试、模式验证、漂移拦截 |
| 治理层 | 规范演化 | 版本管理、安全策略、Human-in-the-Loop |
工作流示例:
- 规范层:定义用户注册接口的请求/响应格式、错误码、安全要求。
- 生成层:自动生成对应的 Go 结构体、OpenAPI 文档、客户端 SDK。
- 执行层:AI 根据规范生成业务逻辑代码,人工负责核心架构。
- 验证层:持续比对生成的代码与规范,发现任何偏离立即告警。
- 治理层:规范版本升级、权限控制、人工审核关键变更。
3.2 架构决定论:从“代码即真理”到“规范即真理”
传统开发往往默认“代码即真理”——代码是唯一的事实来源。而 SDD 试图把“真理”上移到规范:
架构决定论(Architectural Determinism):规范是最高权威,实现必须持续对齐规范。
漂移检测是这一理念的关键技术。它把架构从“设计期文档”变成“运行期约束”:任何偏离规范的行为都会被尽早发现并拦截。这就像给系统安装了一个“规范 GPS”,确保它始终行驶在正确的轨道上。
3.3 代码生成示例:从OpenAPI规范到Go结构体
为了更直观地理解“生成层”的价值,让我们看一个具体的代码生成示例。假设我们有以下简化的 OpenAPI 3.0 规范片段,定义了一个用户查询接口的响应结构:
components:
schemas:
UserResponse:
type: object
required:
- id
- username
- email
properties:
id:
type: string
format: uuid
description: 用户唯一标识
username:
type: string
minLength: 3
maxLength: 20
description: 用户名
email:
type: string
format: email
description: 用户邮箱
createdAt:
type: string
format: date-time
description: 创建时间
status:
type: string
enum:
- active
- inactive
- suspended
description: 用户状态
通过一个代码生成工具(如 oapi-codegen),我们可以自动将其转换为 Go 语言的结构体定义:
// Code generated by oapi-codegen; DO NOT EDIT.
package api
import (
"time"
)
// UserResponse 用户查询响应
type UserResponse struct {
// 用户唯一标识
ID string `json:"id"`
// 用户名
Username string `json:"username"`
// 用户邮箱
Email string `json:"email"`
// 创建时间
CreatedAt time.Time `json:"createdAt"`
// 用户状态
Status UserStatus `json:"status"`
}
// UserStatus 定义用户状态枚举
type UserStatus string
const (
UserStatusActive UserStatus = "active"
UserStatusInactive UserStatus = "inactive"
UserStatusSuspended UserStatus = "suspended"
)
这个生成过程带来了哪些价值?
- 零偏差:生成的代码与规范 100% 一致,消除了人工翻译的误差。
- 一致性:跨语言、跨团队的接口定义保持统一。
- 效率:开发人员无需手动编写重复的、易出错的结构体代码。
- 可维护性:当规范变更时,只需重新生成代码即可同步更新。
这正是 SDD 五层模型中“生成层”的核心使命:将结构化的规范自动转换为可执行的形式,为后续的实现与验证奠定坚实基础。
四、历史演进:规范驱动开发的四个阶段
很多人误以为 SDD 是 AI 编程火了之后才出现的概念,其实不然。规范驱动开发的思想源远流长,其演进历程恰恰反映了软件工程从“手工作坊”走向“工业化生产”的必然路径。
4.1 第一阶段:形式化规范时代(1980s~1990s)
在软件工程早期,规范这个概念就已经存在,甚至比敏捷还早。这一阶段的典型代表包括:
- Z Language:基于集合论和一阶逻辑的形式化规范语言
- VDM(Vienna Development Method):模型驱动的形式化方法
- B-Method:从规范到代码的完整形式化开发方法
- TLA+(Temporal Logic of Actions):用于并发和分布式系统的形式化规范
这些方法的核心特点是:
- 数学精确:使用数学逻辑精确定义系统状态和行为
- 正确性证明:强调正确性证明(Correctness by Construction),通过形式化验证确保系统符合规范
- 高成本:学习曲线陡峭,工程实施成本高昂
历史评价:
这是一条“理论上极其优雅,但工程上难以普及”的路线。它证明了规范的严谨性可能,但也暴露了纯粹形式化方法在工程实践中的局限性。
4.2 第二阶段:契约与测试驱动(1990s~2010s)
随着软件工业化进程加速,规范思想开始以更工程化的方式演进。
Design by Contract(DbC)
由 Bertrand Meyer 在 Eiffel 语言中提出,首次将“规范”直接绑定到代码接口:
- 前置条件(Precondition):调用方必须满足的条件
- 后置条件(Postcondition):函数执行后必须保证的结果
- 不变式(Invariant):对象生命周期内必须保持的属性
测试驱动开发(TDD)
测试用例成为一种可执行规范:
“这段代码应该如何行为,由测试说了算。”
TDD 将规范从“文档”变成了“可执行的验证逻辑”。
行为驱动开发(BDD)
进一步把规范拉向业务侧,使用自然语言描述系统行为:
“系统在这个业务场景下,应该表现出什么行为。”
这一阶段的关键突破是:
规范开始"能跑"了。
从形式化的数学逻辑,到可执行的测试用例,规范第一次具备了自动化验证的能力。
4.3 第三阶段:接口与系统级规范(2010s~2020s)
随着微服务、分布式系统成为主流,规范进一步升级为系统级契约:
- OpenAPI / Swagger:HTTP API 的标准化描述
- AsyncAPI:事件驱动架构的消息契约
- GraphQL Schema:数据查询的强类型接口
- JSON Schema:数据结构的验证规范
这时,规范开始具备几个重要能力:
- 前后端并行开发:前端可根据 API 规范先行开发
- 跨团队协作:规范成为团队间的“接口合同”
- Mock / Contract Test / Codegen:规范可直接生成 Mock 服务、契约测试和客户端代码
但仍然存在一个根本性问题:
规范写完了,但"实现阶段"仍然高度依赖人。
规范与实现之间的“最后一公里”,仍然需要人工翻译和编码。
4.4 第四阶段:AI 驱动的规范驱动开发(2023 至今)
真正的拐点,源于大模型与代码生成能力的融合。当 AI 能够:
- 理解长上下文:解析完整的规范文档和领域知识
- 稳定解析结构化规范:准确理解 OpenAPI、AsyncAPI 等格式
- 批量生成可运行代码:从规范直接生成高质量的业务逻辑
规范第一次具备了"直接驱动实现"的能力。
于是,Spec-Driven Development 从一种“理想主义思想”,正式升级为可工程化落地的显性方法论。我们不再需要讨论“规范是否重要”,而是开始探索“如何让规范更有效地驱动开发”。
五、三大流派:规范与代码的关系定位
随着 SDD 进入工业界,围绕“规范”与“代码”的关系产生了三种主要流派。这三种流派代表了不同的工程哲学,也对应着不同的适用场景和控制强度。
5.1 激进派:规范即源(Spec-as-Source)
核心主张:代码只是规范到二进制之间的中间产物
规范 → (自动生成) → 代码 → (编译) → 二进制
↑
唯一需要维护的
特征:
- 规范是唯一真理:只有规范需要长期维护,代码可随时丢弃和重新生成
- 禁止手动修改代码:任何对生成代码的手动修改都被视为“污染”,必须回馈到规范
- 高度依赖生成器:需要高保真、可逆的代码生成工具链
- 极致一致性:确保规范与实现之间零偏差
适用场景: 对一致性要求极高的系统(金融核心、电信协议、密码学算法)。这些领域一旦出现偏差,可能导致灾难性后果。
典型代表: 电信领域的 ASN.1 规范驱动代码生成、金融领域的 FpML 衍生品合约生成。
5.2 传统派:规范锚定开发(Spec-Anchored Development)
核心主张:规范是锚点,代码仍是可维护的真理
规范 ←→ 双向同步 ←→ 代码
↑ ↑
意图 实现
特征:
- 双向同步:规范变更驱动代码更新,代码优化也可能反向更新规范
- 人类点睛:核心业务逻辑仍由人类把控,AI 负责机械性编码
- 灵活与纪律平衡:既保证规范的权威性,又允许实现层的合理优化
- 渐进式采纳:可在现有代码库中逐步引入规范驱动
适用场景: 大多数企业级应用开发(ERP、CRM、电商平台)。这些系统需要长期演进,且业务逻辑复杂,需要人类深度参与。
典型代表: 基于 OpenAPI 规范开发的后端服务,结合人工编写的业务逻辑。
5.3 轻量派:规范先行(Spec-First)
核心主张:规范是开发初期的“超级提示词”
规范 → 指导 AI 生成 → 代码
↓
规范权威性逐渐减弱
特征:
- 轻量规范:使用 Markdown 清单、任务描述等简单形式
- 思维澄清:强制开发前明确“要做什么”,避免氛围编程
- 规范归档:代码生成后,规范作为决策记录存档,不再强制同步
- 快速启动:极低的学习成本和启动开销
适用场景: 快速原型、探索性开发、小团队内部工具。这些场景下,完整规范的成本可能超过收益。
典型代表: 使用 AI 辅助编码时,先写一段需求描述,再生成代码的日常工作流。
5.4 流派选择指南:如何根据项目特征决策
| 维度 | 激进派 | 传统派 | 轻量派 |
|---|---|---|---|
| 规范地位 | 唯一真理 | 锚点 | 初始指导 |
| 维护成本 | 高 | 中 | 低 |
| 控制强度 | 极强 | 强 | 弱 |
| AI 自由度 | 极低 | 中 | 高 |
| 适用阶段 | 核心基础设施 | 企业级应用 | 快速迭代/原型 |
| 团队规模 | 中大型 | 中型 | 小型 |
| 错误成本 | 极高 | 中高 | 低 |
选择建议:
- 从 0 到 1 的核心系统 → 考虑激进派
- 长期演进的企业应用 → 选择传统派
- 短期、探索性项目 → 采用轻量派
真正的成熟团队往往混合使用这三种流派:核心模块用激进派,业务模块用传统派,工具脚本用轻量派。
六、SDD 与 TDD / BDD / DDD 的关系
这是一个非常关键、也极容易混淆的问题。很多团队在接触 SDD 时会问:我们已经在用 TDD/BDD/DDD 了,还需要 SDD 吗?
6.1 结论先行:SDD 是“元方法论”
SDD 不是 TDD、BDD、DDD 的替代,而是一个更高层级的"元方法论"。
它们之间的关系可以这样理解:
┌───────────────┐
│ Spec-Driven │ ← 系统级规范
│ Development │
└───────────────┘
▲ ▲ ▲
│ │ │
TDD BDD DDD
│ │ │
代码级 功能级 业务级
SDD 并不取代这些已有的优秀实践,而是为它们提供统一的规范底座和驱动引擎。
6.2 TDD:单元级规范驱动
TDD 的本质是什么?
用测试代码描述"一个最小行为规范"
- 规范载体:单元测试(可执行代码)
- 粒度:函数 / 类
- 驱动力:失败的测试
- 验证方式:自动化测试套件
从 SDD 视角看,TDD 是规范驱动开发在代码层的具体实现:
TDD = 代码层面的 SDD
TDD 确保每个函数都符合其“微规范”(测试用例)。SDD 则确保整个系统的规范被统一管理、可验证、可演进。
整合建议:在 SDD 流程中,TDD 可以作为“生成层”到“执行层”的验证手段,确保生成的代码符合单元级规范。
6.3 BDD:业务行为规范驱动
BDD 的核心价值在于:
- 写给人类:使用自然语言描述业务场景
- 可执行:场景描述可以直接转换为自动化测试
- 统一语言:业务、测试、研发使用同一套表述
它解决的是:
- 业务需求到技术实现的“翻译损耗”
- 不同角色之间的理解偏差
从 SDD 视角看:
BDD = 业务层规范的一种成熟表达方式
BDD 场景可以作为 SDD 规范层的重要组成部分,特别是在定义用户故事和验收标准时。
整合建议:将 BDD 场景作为 SDD 规范层的输入,通过生成层自动转换为集成测试代码。
6.4 DDD:规范的“语义基础设施”
DDD 并不关心“先写什么”,而关心:
- 统一语言(Ubiquitous Language):确保团队对核心概念有一致理解
- 领域模型:识别核心领域、子域、边界上下文
- 架构模式:聚合、实体、值对象等模式
DDD 为 SDD 提供的是:
- 规范的语义基础:确保规范中的术语准确、一致
- 稳定的领域边界:避免规范随时间推移变得模糊
- 长期演进能力:领域模型为规范演化提供指导
一句非常工程化的总结是:
DDD 决定"规范写什么",SDD 决定"规范怎么用"。
整合建议:在 SDD 的规范层中,明确引用 DDD 的领域模型和统一语言,确保规范建立在坚实的语义基础之上。
6.5 对比总结表:四者如何协同工作
| 方法 | 驱动核心 | 规范载体 | 粒度 | 在 SDD 中的角色 |
|---|---|---|---|---|
| TDD | 测试 | 单元测试 | 代码级 | 执行层验证工具 |
| BDD | 行为 | 场景描述 | 功能级 | 规范层业务场景描述 |
| DDD | 领域模型 | 统一语言 | 业务级 | 规范层语义基础 |
| SDD | 规范 | 结构化 Spec | 系统级 | 元方法论,整合前三者 |
最佳实践组合:
- DDD 定义领域模型 → 提供规范的语义基础
- BDD 描述业务场景 → 作为规范层的重要输入
- SDD 管理结构化规范 → 驱动整个开发流程
- TDD 验证单元实现 → 确保代码符合规范
这种组合确保了从业务概念到代码实现的全链路规范驱动。
七、AI 时代的工程范式:重规范与轻规范
理解了 SDD 的理论源流与方法论定位后,我们需要直面一个工程问题:在 AI 深度参与开发的今天,规范究竟应该如何落地?
在 AI 参与软件研发之后,一个核心问题被反复验证:
AI 的能力上限,不取决于模型,而取决于"规范如何被组织和执行"。
因此,规范驱动开发(Spec-Driven Development, SDD)在 AI 时代并不是一个"新概念",而是被迫从方法论升级为工程基础设施。
从实践来看,目前最具代表性的两种工程范式,可以分别用 Spec-Kit 和 OpenSpec 来抽象说明。
7.1 两种 SDD 范式的本质差异:重规范 vs 轻规范
在进入具体工具之前,先明确一个关键结论:
SDD 并不存在"对错",只有"工程阶段是否匹配"。
抽象来看,SDD 有两种形态:
-
重规范 SDD
- 规范是系统的"宪法"
- 所有实现必须逐级受控
- 目标是长期一致性与可预测性
-
轻规范 SDD
- 规范是一次"工程决策记录"
- 允许快速推进与快速结束
- 目标是效率与最小成本对齐
而 Spec-Kit 与 OpenSpec,正好分别落在这两个极端上。
7.2 重规范范式:以 Spec-Kit 为代表
7.2.1 Spec-Kit 的核心定位
Spec-Kit 并不是一个"写 Spec 的工具",而是一个强约束的 AI 编程工作流体系。
它隐含的工程假设是:
如果规范不完整、不稳定,就不应该进入实现阶段。
因此,Spec-Kit 的设计目标非常明确:
- 把 AI 的"自由度"压缩到最低
- 把 工程决策前移到规范阶段
- 把 不可控风险,提前暴露
7.2.2 Spec-Kit 的完整规范链路(为什么它"重")
Spec-Kit 的典型流程可以抽象为五个层级:
Constitution
↓
Specification
↓
Plan
↓
Tasks
↓
Implementation
各层级的工程含义
-
Constitution(工程宪章)
- 不可违背的全局原则
- 架构约束、技术选型边界、质量红线
- AI 在任何阶段都必须遵守
-
Specification(系统级规范)
- 功能边界、状态机模型、接口契约
- 明确"允许做什么 / 不允许做什么"
-
Plan(实现计划)
- 将 Spec 转化为可执行步骤
- 明确顺序、依赖、阶段目标
-
Tasks(任务级拆分)
- 可被 AI 单独完成的最小单元
- 强调输入、输出、验收条件
-
Implementation(实现)
- 严格执行,不允许自由发挥
- 偏差必须回溯到上层规范修正
7.2.3 Spec-Kit 适用的工程场景(非常明确)
Spec-Kit 不适合"所有开发",但在以下场景几乎是最优解:
-
0 → 1 的新系统
-
底层平台 / 基础设施
-
跨团队协作的大功能
-
一次错误成本极高的模块
- 共识算法
- 账本模型
- 权限与安全系统
一句话总结:
Spec-Kit 的核心价值并非效率,而是可控性。
7.2.4 Spec-Kit 规范示例
为了更好地理解“重规范”的具体形态,我们来看一个简化的 Spec-Kit 规范示例。假设我们正在构建一个用户权限管理系统,以下是一份可能的“工程宪章”和“系统级规范”片段:
1. 工程宪章(Constitution)—— 全局不可违背的原则
# 工程宪章:权限管理系统
version: "1.0"
effective_date: "2025-01-01"
# 质量红线
- 所有 API 必须通过 OpenAPI 3.0 规范定义
- 核心权限校验逻辑必须 100% 单元测试覆盖
- 生产环境部署前必须通过安全扫描
# 架构约束
- 禁止直接依赖数据库:必须通过 Repository 模式访问数据
- 禁止业务逻辑中出现硬编码的权限判断:必须通过策略模式抽象
- 禁止跨层调用:Controller → Service → Repository 严格分层
# 技术选型边界
- 后端语言:Go 1.21+
- 数据库:PostgreSQL 14+
- 消息队列:RabbitMQ 3.12+
- 缓存:Redis 7.0+
2. 系统级规范(Specification)—— 接口契约与状态模型
.
├── checklists
│ └── requirements.md # 前置检查
├── contracts
│ └── XXX-api.json # 接口契约
├── data-model.md # 数据模型
├── plan.md # 实现计划
├── quickstart.md # 快速上手
├── research.md # 调研和选型
├── spec.md # 业务需求规范
└── tasks.md # 任务拆解
这份规范的价值:
- 明确约束:工程宪章定义了质量红线和技术边界,确保系统在可控范围内演进。
- 无歧义接口:OpenAPI 规范提供了精确的接口契约,前后端可并行开发。
- 可验证性:规范可直接用于生成 Mock 服务、契约测试和客户端 SDK。
- 风险前置:所有关键决策都在规范阶段明确,避免实现阶段的不可控偏差。
这正是 Spec-Kit “重规范”哲学的体现:通过完整、严谨的规范,将不确定性尽可能提前暴露和解决,从而获得最高的可控性。
7.3 轻规范范式:以 OpenSpec 为代表
7.3.1 OpenSpec 的核心定位
与 Spec-Kit 相反,OpenSpec 的出发点非常现实:
不是所有需求,都值得一套完整的规范链路。
因此,OpenSpec 关注的不是"规范完整性",而是:
- 规范是否足够表达决策
- 是否低成本
- 是否用完就可以结束
7.3.2 OpenSpec 的极简规范流程(为什么它"轻")
OpenSpec 抽象出的流程只有四步:
Propose → Confirm → Implement → Archive
各阶段的工程含义
-
Propose(需求提案)
- 明确要做什么
- 解决什么问题
- 不追求完备,只追求共识
-
Confirm(确认)
- 对齐目标与边界
- 明确"做到什么程度算完成"
-
Implement(实现)
- AI 或人工快速完成
- 允许局部调整
-
Archive(归档)
- 作为一次工程决策记录
- 不强制长期维护
7.3.3 OpenSpec 适用的工程场景
OpenSpec 非常适合:
- 小功能 / 增量需求
- UI、接口、配置类改动
- 试验性功能
- 短生命周期需求
一句话总结:
OpenSpec 解决的是"值不值得重规范"的问题。
7.3.4 OpenSpec 规范示例
与 Spec-Kit 的“重规范”形成鲜明对比,OpenSpec 的规范追求极简、务实。以下是一个典型的 OpenSpec 规范示例,用于一个用户头像上传功能的增量需求:
需求提案(Propose)
# 用户头像上传功能
## 背景
当前用户个人页面缺少头像展示,影响用户体验。需要增加头像上传功能。
## 目标
1. 用户可上传图片作为头像
2. 支持常见图片格式(JPG、PNG、WebP)
3. 限制图片大小不超过 2MB
4. 自动生成缩略图(100x100、200x200)
## 边界
- 不涉及第三方存储服务集成(先用本地存储)
- 不涉及图片高级处理(裁剪、滤镜等)
- 不涉及多尺寸动态适配
## 验收条件
- 前端:上传按钮、预览区域、格式提示
- 后端:上传接口、格式校验、存储逻辑
- 测试:上传成功/失败场景覆盖
确认(Confirm)
# 技术确认清单
confirmed_items:
- 存储方案: 本地文件系统,路径 /var/uploads/avatars/
- 支持格式: [".jpg", ".jpeg", ".png", ".webp"]
- 大小限制: 2MB
- 缩略图尺寸: [100, 200]
- 接口路径: POST /api/v1/users/{userId}/avatar
- 完成时间: 2人天
实现(Implement)
AI 或开发者根据上述规范快速实现代码,过程中允许局部调整(如发现 WebP 格式需要额外依赖,可临时改用 JPG/PNG)。
归档(Archive)
# 归档记录:用户头像上传功能
- 完成时间: 2025-03-15
- 负责人: 张三
- 实际耗时: 1.5人天
- 变更记录: 因依赖问题,暂不支持 WebP 格式
- 后续建议: 如需支持 WebP,可单独安排技术调研
这份规范的价值:
- 极低成本:使用 Markdown 和简单 YAML,无需学习复杂 DSL。
- 快速共识:团队在 10 分钟内即可对齐目标、边界和验收条件。
- 灵活调整:实现阶段允许合理偏离,避免过度约束。
- 决策记录:归档作为历史记录,无需长期维护。
这正是 OpenSpec “轻规范”哲学的体现:用最小成本达成共识,快速推进,快速结束,不追求完美,只追求足够好。
7.4 工程决策视角下的选择指南(非常关键)
下面这张表才是第六章真正的“工程结论”:
| 维度 | Spec-Kit | OpenSpec |
|---|---|---|
| 规范重量 | 重 | 轻 |
| 适合阶段 | 0→1 / 大功能 | 增量 / 小功能 |
| 决策成本 | 高 | 低 |
| AI 自由度 | 低 | 中 |
| 风险控制 | 极强 | 足够即可 |
| 是否长期生效 | 是 | 通常否 |
一个必须强调的结论
真正成熟的团队,一定是两种范式并存,而不是二选一。
- 大功能:Spec-Kit
- 小需求:OpenSpec
- 同一个项目中动态切换
7.5 总结:AI 时代,规范是"可调节的工程杠杆"
在 AI 编程时代:
- 规范太重 → 效率低
- 规范太轻 → 系统失控
Spec-Kit 和 OpenSpec 的真正价值,不在于工具本身,而在于:
它们让“规范的重量”成为一个可工程化选择,而不是拍脑袋。
带着这把“可调节的杠杆”,下面我们从落地角度给出一些实践建议,并把常见误区提前摊开,避免走弯路。
八、实践建议与踩坑经验
结合实际工程经验,给出几条非常现实的建议。
8.1 什么时候适合 SDD
适用场景:
- 多人协作
- 生命周期长
- 对稳定性、一致性要求高
- 开始引入 AI 编码到主流程
不适用场景:
- 快速原型验证
- 探索性开发
- 短期一次性脚本
8.2 常见误区与避坑指南
| 误区 | 后果 | 正确做法 |
|---|---|---|
| ❌ 把 README 当规范 | 规范无法验证 | 使用结构化 DSL 或 Schema |
| ❌ 规范写成散文 | AI 无法稳定解析 | 采用结构化格式 |
| ❌ 规范和实现不做 Diff 校验 | 规范与代码脱节 | 引入漂移检测工具 |
| ❌ 没有版本化策略 | 无法回溯 | 规范纳入 Git 管理 |
| ❌ 过度细化规范 | 效率低下 | 平衡规范粒度 |
8.3 一条核心经验
规范不是一次性写完的,而是"随着系统一起演进的核心资产"。
九、总结与展望
9.1 核心价值总结
规范驱动开发,并不是要否定 TDD、BDD、DDD,而是:
在 AI 成为“主力工程师”的时代,为软件工程重新建立秩序。
如果说:
- TDD 保证“代码对”
- BDD 保证“事情对”
- DDD 保证“概念对”
那么:
SDD 要保证的是:整个系统,从意图到实现,一直是对齐的。
9.2 未来展望(2026-2030)
2026:智能体网格与互操作性规范
未来的软件将不再是由单一团队编写的巨石,而是由跨厂商的智能体相互协作构建。
关键技术:
- 基于 MCP 协议和 Arazzo 规范的"智能体网格"(Agentic Mesh)
- 自愈架构:系统自动检测不一致,并提议对规范和实现进行自动化对齐修复
- 自动合规审计:从抽样调查变为实时的、100% 覆盖的自动认证
更进一步:超级人工智能与递归自我优化
随着 ASI(超级人工智能)的临近,软件开发的周期将进一步缩减。
关键能力:
- 无代码重构:人类只需描述新业务目标,ASI 将依据 SDD 框架重新生成整个系统
- 环境模拟与合成数据:SDD 规范用于生成大规模合成测试数据和虚拟运行环境
- 软件在部署前就已在数百万个边缘场景中完成演练
9.3 终极形态:从“代码工匠”到“意图架构师”
规范驱动开发并非要取代程序员,而是要将其从繁琐的机械编码中解放出来,提升为系统的“意图架构师”。
在未来的自智软件工程中:
- 能够精准、清晰、严谨地传达系统意图的人,将成为最具价值的创造者
- 软件工程的中心正在不可逆转地从实现层上移到规范层
- 氛围或许能点燃创新的火花,唯有规范才能铸就支撑现代文明的数字基石。
9.4 哲学意涵:规范作为数字时代的“新拉丁文”
如果我们跳出工程视角,从更宏观的历史维度审视规范驱动开发,会发现一个深刻的隐喻:
规范,正在成为数字时代的“新拉丁文”。
在人类文明史上,拉丁文曾作为学术、法律、科学的通用语言,跨越地域和文化的边界,承载了数百年的知识传承。而当 AI 成为“主力工程师”后,规范(Specification)正扮演着类似的角色:
- 跨物种沟通:规范是人类与 AI 之间无歧义的“共识语言”。
- 知识载体:规范承载了系统设计决策、业务规则、质量要求等核心知识。
- 长期传承:规范版本化、可演化,确保系统意图在数十年间依然可被理解。
- 去中心化协作:基于规范的智能体网格,使跨组织、跨地域的协同开发成为可能。
规范驱动开发的三个哲学层次
- 工具层:规范是提高效率、降低错误的工程工具。
- 方法论层:规范是整合 TDD、BDD、DDD 的元方法论。
- 文明层:规范是数字文明得以规模化、可持续演进的基础设施。
当我们谈论“规范驱动开发”时,表面上在讨论一种工程方法,实际上是在回答一个更深层的问题:
在 AI 时代,人类如何将“意图”可靠地转化为“现实”?
规范驱动开发给出的答案是:通过结构化、可验证、可演化的规范,建立从意图到实现的确定性桥梁。
写给未来的软件工程师
如果你是一名即将进入或已经身处行业的软件工程师,请记住:
- 编码能力不会过时,但其价值重心正在转移:从“写出能跑的代码”转向“写出能准确表达意图的规范”。
- 沟通能力成为核心竞争力:与 AI 沟通、与跨领域专家沟通、与未来维护者沟通,都需要规范的媒介。
- 终身学习的内容正在变化:除了学习新框架、新语言,更要学习如何设计可验证的规范、如何构建规范驱动的工程体系。
最后一句
代码终将老去,规范永远年轻。
因为规范承载的,不是实现细节,而是系统之所以存在的本质意图。在技术浪潮的更迭中,唯有对本质的精准把握,才能让我们在数字文明的构建中,既不失创新的活力,也不失秩序的尊严。

浙公网安备 33010602011771号