在AI编程工具(如Cursor、Copilot)爆发的今天,我们似乎进入了一个“代码无限生成”的乌托邦。许多开发者沉迷于Vibe Coding(氛围编程)——跟着感觉走,用自然语言描述需求,让AI瞬间生成代码。

在短平快的原型开发中,这种模式效率惊人。但当我们将视角拉长到企业级应用或长期维护的项目时,Vibe Coding的副作用开始显现:代码方向漂移、上下文断裂、生成的代码“能跑但不可维护”。

为了解决这个问题,规范驱动开发(Spec-Driven Development, SDD)应运而生。它不是要扼杀AI的创造力,而是给AI套上“缰绳”,让软件工程从“手工作坊”进化为“精密制造”。

什么是SDD?从“Vibe”到“Spec”的进化

SDD的核心思想非常朴素:用形式化、可执行的规范作为事实来源,引导AI生成一致、可维护的代码。

如果说Vibe Coding是“先做再想”,那么SDD就是“先想清楚,再做”。

在传统开发中,代码是事实来源,文档往往滞后;而在SDD中,规范是主要构件,代码只是规范在特定语言下的表达。这种范式的转变,让人的职责从“写代码”升级为“设计+验证”,而AI则专注于“实现+建议”。

为什么企业必须建立SDD体系?

很多团队不敢全面转向大模型编程,核心顾虑是:代码质量怎么保证?SDD通过机制解决了这个问题:

  • 降低理解误差:将隐含的假设显性化在规范里,避免AI“猜谜”。
  • 知识资产沉淀:即使人员流动,核心逻辑依然保存在Spec中,新人读Spec 20分钟即可上手,而不是花2天翻代码。
  • 质量可追溯:每次修改都有决策留痕,Bug率反而比纯人工开发更低(数据显示可降低18%-37%)。
实战篇:如何从零搭建SDD工作流?

建立SDD体系并非一蹴而就,我们可以参考GitHub Spec Kit等工具倡导的标准四阶段工作流,将其内化为团队的工程纪律。

Step 1:制定“宪法”

在项目启动之初,不要急着写代码,先建立项目的“宪法”。这通常是一个名为constitution.md的文件,它定义了项目的全局约束。

宪法内容应包含:

  • 技术栈锁定:例如 TypeScript 5.0+, Next.js 14, PostgreSQL。
  • 架构原则:例如“组件化设计,UI与逻辑分离”,“禁止直接操作DOM”。
  • 质量红线:例如“所有API必须遵循RESTful”,“单元测试覆盖率必须>80%”。

有了宪法,AI在后续生成的每一行代码都会自动对齐这些标准,避免“幻觉”和风格不统一。

Step 2:编写高质量规范

这是SDD最核心的环节。一份能直接交付AI执行的规范,必须包含以下要素:

  • 目标与价值:明确解决什么业务问题。
  • 上下文与约束:依赖服务、性能要求、安全规范。
  • 功能需求:核心业务流程、字段规则、异常分支处理。
  • 非功能需求:响应时间、并发能力。
  • 测试标准:明确上线验收规则。

技巧:如果你面对复杂需求不知如何下笔,可以尝试“动词拆解法”——在需求文档中找出“校验、计算、保存、通知”等动词,每个动词背后通常对应一个可拆分的子功能点。

Step 3:任务拆解与计划

规范定稿后,不要直接让AI生成所有代码。利用SDD工作流中的“计划”阶段,将规范拆解为具体的任务清单:

  • Plan:设计技术方案,明确接口定义、数据结构。
  • Tasks:生成可执行的任务清单(如:1. 修改数据库Schema;2. 编写用户服务层;3. 编写API接口)。

Step 4:AI实现与验证闭环

最后,AI依据任务清单进行代码生成。但SDD强调,生成不是结束,验证才是关键。

  • 自动化测试:让AI同时生成测试用例,并运行测试。
  • 静态合规扫描:检查代码是否符合“宪法”中的红线。
  • 反馈闭环:如果测试失败或发现Bug,不要直接修补代码,而是回头修改规范,然后重新生成。确保规范与代码永远同步。
实施路线图:从试点到全员

SDD的落地需要循序渐进,建议分为三个阶段:

  1. 试点期:选择1-2个非关键的新特性,由“种子选手”尝试使用SDD流程,跑通“规范-生成-验证”闭环。
  2. 扩展期:建立团队通用的规范模板,将SDD推广到全团队的新功能开发中。
  3. 成熟期:将SDD融入CI/CD流程,对存量项目进行逐步迁移和重构。
结语

SDD不仅是一套技术流程,更是一次思维范式的跃迁。它要求我们从“代码搬运工”转型为“规范架构师”。

在AI时代,说清楚“要什么”,比“怎么做”更重要。通过建立SDD工程体系,我们不仅能驾驭AI的生产力,更能确保产出的软件系统像精密仪器一样可靠、可控。

附录:SDD核心文档模板示例

为了让你能直接落地使用,这里提供两份核心文档的实战模板。你可以直接把这些内容复制到你的项目中,作为SDD体系的起点。

示例一:项目宪法

文件路径建议.specify/memory/constitution.md
适用场景:项目初始化阶段,由架构师或Tech Lead制定,AI在生成任何代码前必须读取此文件。

# 项目宪法

> **核心原则**:本文件定义了项目的不可变约束。AI在生成代码时,必须严格遵守以下原则。如有冲突,以本文件为准。

## 1. 技术栈标准
- **后端框架**: Python 3.10+ (FastAPI)
- **数据库**: PostgreSQL 15+ (使用 SQLAlchemy ORM)
- **前端框架**: React 18+ (TypeScript, Next.js 14 App Router)
- **状态管理**: Zustand (禁止使用 Redux,除非有极其特殊的理由)

## 2. 架构原则
- **模块化设计**: 严格遵循“领域驱动设计”思想,按业务领域划分模块。
- **API 规范**: 所有接口必须遵循 RESTful 风格,返回格式统一为 `{ code: number, data: any, message: string }`。
- **数据验证**: 所有用户输入必须使用 Pydantic (后端) 或 Zod (前端) 进行严格校验,禁止裸字典传递。
- **无状态服务**: 后端服务必须是无状态的,Session 信息必须存储在 Redis 中。

## 3. 代码质量红线
- **类型安全**: 
    - 后端:所有函数参数和返回值必须有类型提示。
    - 前端:TypeScript 必须开启 `strict` 模式,禁止使用 `any`。
- **测试覆盖**: 核心业务逻辑必须包含单元测试,覆盖率不低于 80%。
- **命名规范**: 
    - 变量/函数:`snake_case` (Python) / `camelCase` (TS)
    - 类名:`PascalCase`
    - 常量:`UPPER_SNAKE_CASE`

## 4. 安全与隐私
- **敏感数据**: 所有个人身份信息必须在日志中脱敏(如 `138****1234`)。
- **权限控制**: 所有 API 接口默认需要鉴权,公开接口需显式标注 `@public`。

## 5. 目录结构约束
```text
src/
├── api/            # 接口定义
├── core/           # 核心配置与工具
├── models/         # 数据模型
├── services/       # 业务逻辑层
├── utils/          # 通用工具
└── main.py         # 入口文件

**示例二:功能规范**

**文件路径建议**:`specs/001-user-authentication/spec.md`
**适用场景**:开发具体功能(如“用户登录”)前,由产品经理或开发者编写,作为AI生成的唯一依据。

```markdown
# 功能规范:用户登录与身份验证

**规格 ID**: FR-001
**状态**: 待开发
**优先级**: P0

## 1. 业务目标
实现用户通过用户名和密码进行安全登录,并获取访问系统所需的 JWT 令牌。

## 2. 功能需求
### F1. 登录请求处理
- **输入**: 用户名、密码。
- **处理**: 
    1. 校验用户名和密码格式。
    2. 查询数据库验证用户是否存在。
    3. 比对密码哈希值。
- **输出**: 成功则返回 JWT 令牌,失败则返回对应错误信息。

### F2. 密码安全
- **存储**: 密码必须使用 `bcrypt` 算法进行哈希存储,禁止明文存储。
- **比对**: 登录时使用 `bcrypt.checkpw` 进行安全比对。

## 3. 数据模型
**User (用户表)**
- `id`: UUID
- `username`: String (唯一)
- `password_hash`: String
- `created_at`: DateTime

## 4. 接口定义
### POST /api/v1/auth/login
**请求体**:
```json
{
  "username": "string",
  "password": "string"
}

成功响应 (200):

{
  "code": 200,
  "data": {
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "token_type": "bearer"
  }
}

失败响应 (401):

{
  "code": 401,
  "message": "用户名或密码错误"
}

5. 验收标准

  • AC1: 输入不存在的用户名,应返回 401 错误。
  • AC2: 输入错误的密码,应返回 401 错误。
  • AC3: 登录成功后,返回的 JWT 令牌有效期应为 24 小时。
  • AC4: 密码在传输和存储过程中均不可明文可见。

**编写小贴士**

1. **宪法要“硬”**:宪法里不要写具体的业务逻辑,只写技术选型和代码风格。它是给AI戴上的“紧箍咒”,防止它乱用库或写出风格迥异的代码。
2. **规范要“细”**:规范里要写清楚输入是什么、输出是什么、异常怎么处理。AI最怕模糊的指令(比如“做一个好看的界面”),但如果你说“用 TailwindCSS 实现一个居中的蓝色按钮”,它就能做得很好。
3. **先写规范,再写代码**:强迫自己(或团队)在写代码前,先花10分钟把`spec.md`写出来。你会发现,写完规范后,让AI生成代码的过程会顺畅得多,返工率也会大幅降低。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐