目录

序言

过去二十年,软件开发方法论层出不穷。从 Kent Beck 提出的 TDD,到 Dan North 推动的 BDD,再到 Eric Evans 构建的 DDD 体系,这些方法试图解决同一个问题:如何让软件开发从混乱走向可控。

它们分别从不同角度给出了答案。TDD试图用测试约束代码的正确性,BDD试图用行为统一业务与开发的理解,而DDD则进一步将焦点上移,试图让软件结构本身映射真实世界的业务领域。在没有AI的时代,这些方法已经构成了一套相对完整的软件工程实践体系。

但今天,事情开始发生变化。

随着以 Anthropic 的 Claude Code 等工具为代表的AI编程方式兴起,越来越多的开发者开始直接用自然语言驱动代码生成。我们不再总是从“写代码”开始,而是从“描述需求”开始。代码,正在逐渐从“生产目标”变成“中间产物”。

这带来了一个新的问题:当代码可以被生成,我们还需要过去这些方法论吗?如果需要,它们的位置又在哪里?

在这样的背景下,一个新的概念开始被频繁提起——SDD(Specification-Driven Development)。它试图进一步前进:不只是用测试或行为约束代码,而是让“规范”本身成为唯一的事实来源,让代码成为规范的投影。

问题也随之而来:SDD是对TDD、BDD、DDD的继承,还是对它们的替代?这些看似纷繁复杂的“DD”,究竟各自解决了什么问题,又处在软件工程的哪个层级?

这篇文章不会简单罗列概念,而是试图回答一个更本质的问题:

在AI已经可以参与甚至主导编码的今天,我们到底应该如何重新理解这些开发方法论?

第那些“DD”到底是什么?——从测试到规范的五种开发视角

如果你在过去几年里接触过软件工程方法论,很可能会被一堆缩写包围:TDD、BDD、ATDD、DDD,甚至最近开始出现的SDD。

它们看起来像一条演进路线,但实际情况并没有那么简单。这些“DD”并不是简单的替代关系,而是分别站在不同层级,试图解决软件开发中的不同问题。

要理解它们,最好的方式不是记定义,而是回答四个问题:它是谁提出的?解决什么问题?核心做法是什么?它的局限在哪里?

1. TDD:从“先写代码”到“先写测试”

TDD(Test-Driven Development,测试驱动开发)由 Kent Beck 在2000年前后系统化提出,是极限编程(XP)中的核心实践之一。

它要解决的问题非常直接:在传统开发模式中,测试往往是最后一步,经常被压缩甚至忽略,导致代码质量不可控。

TDD的做法简单而激进:先写测试,再写实现。开发流程通常被总结为三个步骤——红(测试失败)、绿(让测试通过)、重构(优化代码结构)。

换句话说,TDD强迫开发者在写代码之前先思考:这段代码应该“如何被验证”。

这种方式的好处是显而易见的:代码天然具备可测试性,回归风险降低,重构更加安全。但它也有局限——测试用例本质上是对“局部行为”的验证,很难保证整体业务逻辑的正确性。如果方向错了,测试写得再多也只是“高质量地做错事”。

2. BDD:把“测试”换成“行为”

在实践TDD的过程中,Dan North 发现一个有趣的问题:很多开发者和业务人员对“测试”这个词天然排斥,他们更关心的是“系统应该怎么工作”。

于是,BDD(Behavior-Driven Development,行为驱动开发)在2003年前后被提出。

BDD并没有否定TDD,而是换了一种表达方式。它强调用接近自然语言的形式描述系统行为,例如经典的:

Given(某个前提)
When(发生某个行为)
Then(得到某个结果)

这种描述方式有两个重要变化:第一,它让非技术人员也能理解;第二,它把关注点从“代码是否正确”转移到“系统行为是否符合预期”。

BDD的优势在于沟通,它在产品、测试和开发之间建立了一种共享语言。但在实际项目中,如果维护成本过高,这些行为描述文件也可能变成另一种“过时文档”。

3. ATDD:在写代码之前定义“完成标准”

ATDD(Acceptance Test-Driven Development,验收测试驱动开发)常常和BDD一起出现,但它关注的不是“怎么描述”,而是“什么时候算完成”。

它没有一个单一的提出者,而是在2000年代中期随着敏捷开发实践逐渐成熟。

ATDD的核心思想是:在开发开始之前,由产品经理、测试人员和开发人员共同定义“验收标准”(Acceptance Criteria)。这些标准通常会被转化为可执行的测试用例。

你可以把它理解为一种“对齐机制”——在写任何代码之前,团队已经对“什么是完成”达成一致。

相比TDD关注函数级别的正确性,ATDD关注的是系统级别的结果。它解决的是“做没做对”的问题,而不是“代码写得对不对”。

当然,它的挑战也很现实:需要跨角色协作,成本更高,一旦团队沟通机制不成熟,很容易流于形式。

4. DDD:当问题不再是代码,而是业务

如果说前面的几种方法还停留在“怎么写代码”或“怎么验证”,那么DDD(Domain-Driven Design,领域驱动设计)则直接跳到了更高一层。

DDD由 Eric Evans 在2003年提出,其核心观点是:软件的复杂性,往往来自业务本身,而不是技术实现。

它要解决的问题是:为什么系统越做越复杂,代码结构和业务逻辑越来越脱节?

DDD的答案是:让软件结构直接反映业务领域。为此,它引入了一整套概念,例如“通用语言”(Ubiquitous Language)、“限界上下文”(Bounded Context)、“实体”、“值对象”、“聚合”等。

这些概念的目标只有一个——让开发人员和业务人员说的是同一套语言,并且让代码结构与业务模型保持一致。

但DDD的难点也在这里:它不是一个可以“照着做”的流程,而是一种需要持续维护的建模能力。很多团队在建模阶段做得很好,但随着代码演进,很快就偏离了最初的领域模型。

5. SDD:当“规范”成为代码的上游

相比前面几种方法,SDD(Specification-Driven Development,规范驱动开发)并不是一个已经被严格定义的经典方法论,而是近年来,随着AI编程兴起逐渐被提出的一种新思路。

它关注的问题是:当代码可以被生成时,开发的核心还应该是代码吗?

SDD的核心观点是:规范(Specification)才是系统的唯一事实来源,代码只是规范在某种技术栈中的具体实现。在理想状态下,开发者不再直接修改代码,而是修改规范,然后由工具或AI生成对应实现。

这种思路在过去其实已经有雏形,例如API规范生成代码、基础设施即代码(IaC)等。但在AI时代,这种能力被极大放大——像 Claude Code 这样的工具,已经可以根据自然语言或结构化规范生成复杂逻辑。

SDD带来的变化是根本性的:代码不再是“源”,而是“结果”。

当然,它目前仍处于早期阶段,最大的问题在于:如何定义一套足够精确、可执行、可维护的规范。如果规范本身不严谨,那么生成的代码只会放大问题。

它们不是一条线,而是不同层级的答案

回过头来看,这些“DD”其实回答的是不同层面的问题:

TDD关注的是“代码是否正确”,BDD关注的是“行为是否符合预期”,ATDD关注的是“功能是否完成”,DDD关注的是“系统是否反映业务本质”,而SDD则试图回答“在AI时代,代码是否还是核心”。

它们并不是相互替代的关系,而更像是从不同高度,对软件开发复杂性的一次次回应。

从 “Vibe Coding” 到规范化——问题是怎么暴露出来的?

在真正进入 BDD 和 SDD 之前,我们需要先面对一个现实:很多人已经在用 AI 写代码了,但方式其实还停留在一个非常原始的阶段。(包括我自己

一个很形象的说法叫做:Vibe Coding。

如果直译,它通常会被翻成“凭感觉开发”,但这个翻译多少有点误导。更准确的理解应该是:

用直觉驱动开发,而不是用代码驱动开发。

在这种模式下,开发者不再从“写代码”开始,而是从“描述需求”开始。你只需要用自然语言告诉 AI 你想做什么,剩下的事情交给它完成。

从体验上来说,这种方式非常有吸引力,甚至可以说是很多人第一次真正“掌控开发”的时刻。

它之所以流行,是因为它确实解决了一些长期存在的问题:

首先,自然语言成为了主要接口。你不再需要关心语法、框架或者具体实现细节,甚至不需要知道是用 Python 还是 JavaScript。

其次,注意力被彻底转移到了“业务逻辑”上。你思考的是“我要解决什么问题”,而不是“这段代码怎么写”。

再者,反馈周期极短。功能不对?直接改描述,让 AI 重来一版,而不是自己一点点调试。

最重要的是,它几乎消除了开发门槛。很多原本不会写代码的人,也可以通过描述需求来构建应用。

听起来很美好,对吧?

但问题很快就出现了。

当项目变大之后,Vibe Coding 开始失效

在简单场景下,Vibe Coding 的确高效。但一旦项目复杂度上来,一些结构性问题就会暴露出来。

最典型的,是不精确性

自然语言本身就是模糊的。例如一句“帮我写一个计算两个数字相加的程序”,对人来说似乎很清楚,但对 AI 来说却存在歧义:是整数?浮点数?是否需要处理异常?有没有边界限制?

这种模糊在小工具中问题不大,但在复杂系统中会不断放大。

第二个问题是不一致性

在传统开发中,团队通常会维护一套统一的代码风格和设计约束。但在 Vibe Coding 模式下,每一次生成的代码都可能风格不同。一旦你开始手动修补这些差异,就已经在偏离“完全依赖 AI”的初衷。

第三个问题是隐性错误(Bugs)

AI 生成的代码往往“看起来是对的”,但在边界条件(例如极端输入、异常流程)下可能出现问题。而对于非技术人员来说,这类问题很难被系统性发现。

最后,也是最容易被忽略的一点,是安全性问题

例如 SQL 注入、XSS 等经典漏洞,在 AI 生成代码中并不罕见。而这些问题往往不会在“功能正常”的情况下暴露出来。

换句话说:

Vibe Coding 很擅长“快速做出一个能跑的东西”,但不擅长“保证这个东西长期可用”。

BDD 与 SDD:让 AI 不再“自由发挥”

当你把这些问题放在一起看,会发现它们其实指向同一个根因:

缺少一套结构化的约束来约定“系统应该是什么样”。

Vibe Coding 本质上是“自由输入 → 自由输出”,它没有强制你把需求描述清楚,也没有机制保证结果的一致性。

而这,正是 BDD 和 SDD 要解决的问题。

BDD(Behavior-Driven Development,行为驱动开发)和 SDD(Specification-Driven Development,规范驱动开发)可以看作是对 Vibe Coding 的一次“收敛”。

它们的共同点在于:不再允许你随意描述需求,而是要求你用结构化的方式表达。

但两者的侧重点不同。

BDD关注的是“行为”,它试图回答:系统在某种情境下应该如何反应。

而SDD关注的是“规范”,它试图回答:系统整体应该满足哪些约束、规则和结构。

BDD:把“随便说”变成“讲清楚”

BDD 的核心形式是一个非常简单的结构:

  • Given(前提)
  • When(行为)
  • Then(结果)

例如,一个购物车功能可以这样描述:

Given 用户进入商品页面
When 用户点击「加入购物车」
Then 系统显示「商品已加入购物车」

相比“帮我写一个购物车功能”,这种描述方式明显更加清晰。

更重要的是,它在无形中做了一件事:强迫你把隐含的前提说出来

在 AI 开发场景中,我们可以进一步简化流程:

  • 你只负责写行为描述
  • 测试由 AI 生成
  • 代码也由 AI 生成

于是,开发的核心从“写代码”变成了“描述行为”。

仅仅有行为,有时候还不够。

AI 很依赖上下文,如果缺少背景信息,它仍然可能“理解跑偏”。这时候,引入 User Story 会非常有效。

一个典型的 User Story 结构是:

我是 <某种用户>,我想要 <某个功能>,以便于 <某个目的>

例如:

我是一个在线购物用户,我想要将商品加入购物车,
以便于我可以在结账时一次购买多个商品。

当你把 User Story 和 BDD 结合起来,效果会明显提升。

例如:

# Requirements

## Requirement 1

User Story:
我是一个在线购物用户,我想要将商品加入购物车,
以便于我可以在结账时一次购买多个商品。

1. Given 用户进入商品页面 When 用户点击「加入购物车」 Then 系统显示成功提示
2. Given 用户已加入商品 When 用户查看购物车 Then 系统显示购物车内容
3. Given 用户在购物车页面 When 用户点击结账 Then 系统跳转到结账页

你会发现,这已经不再是“随便说说”,而是一份结构清晰的需求说明。

对于 AI 来说,这种输入远比自然语言段落更容易理解,也更容易生成稳定的结果。

一个过渡问题:那 SDD 呢?

如果说 BDD 解决的是“行为描述不清晰”,那么接下来要面对的问题是:

当系统变得复杂,仅靠行为描述是否足够?

答案通常是否定的。

因为行为描述解决的是“点”的问题,而不是“整体结构”的问题。

这也是 SDD 要解决的核心。

从“讲故事”到“画蓝图”——SDD 是怎么补上最后一块拼图的?

在上一节我们提到,BDD 本质上是在做一件事:把需求讲清楚

但当系统继续变复杂时,一个新的问题会浮现出来:

光讲清楚“发生什么”,还不够。

因为你会开始遇到这些情况:

  • 行为是清楚的,但数据结构不统一
  • 场景是对的,但实现方式五花八门
  • AI 理解了“要做什么”,但还是在“怎么做”上自由发挥

这时候,你会发现:我们缺的不是行为,而是“约束行为的结构”

这就是 SDD 要补的那一块。

如果说 BDD 是在讲故事,那么 SDD 更像是在画蓝图。

它关注的不是:

用户会做什么

而是:

系统应该长什么样

在 SDD 中,你不再只是描述行为,而是开始定义:

  • 系统用什么技术
  • 数据长什么结构
  • API 怎么设计
  • 哪些能做,哪些不能做
  • 边界在哪里

换句话说:

BDD 解决的是“说清楚”,SDD 解决的是“说完整”。

来看一个很现实的例子。

当你用 Vibe Coding 时,你可能会这样跟 AI 说:

帮我实现一个用户注册功能

听起来没问题,但 AI 很可能会给你一整套“工业级方案”:

  • 邮箱验证
  • 密码强度校验
  • 手机验证码
  • OAuth 登录
  • 激活流程

它不是错,它只是不知道你的边界在哪

问题的本质不是 AI 太“蠢”,而是你给的信息太“模糊”。

现在换一种方式,用 Spec 来描述:

## 用户注册功能规格

### 功能范围
- 实现基础账号密码注册

### 规则(仅限以下)
1. 密码长度 ≥ 8
2. 必须包含大写字母
3. 必须包含数字

### API
- register(email: string, password: string)

### 不在范围
- 邮箱验证
- 手机验证码
- OAuth 登录

这时候会发生一个非常明显的变化:

👉 AI 不再“发挥”,而是“执行”。

很多人第一次接触 SDD,会以为它只是“写更详细的文档”。

但它真正的价值在于:

不仅定义“要什么”,还定义“不要什么”

这一点极其关键。

因为 AI 有一个很典型的行为模式:

做多不做少

如果你不给边界,它一定会补全;
如果你不给限制,它一定会扩展。

而 SDD,本质上就是在做一件事:

把“猜”变成“约束”

而在实际项目中,SDD 通常不会是一段 Prompt,而是一组结构化文件。

例如,你可能会有两类核心文件:

1️⃣ 设计文件(Design / Architecture)

定义系统的“骨架”:

## Technology Stack
- TypeScript
- Nuxt 3
- Firebase

## Data Structures

interface Product {
  id: string
  name: string
  price: number
  stock: number
}

你会发现这些细节相较于 BDD 来说,更加技术性,对于非技术人员来讲其实满不友善的,但对于 AI 跟开发者来讲,这些细节却是非常重要的,也相对容易理解。

2️⃣ 规格文件(Specifications)

定义具体功能“怎么实现”:

### Function: addToCart

Pre-conditions:
- quantity > 0
- stock >= quantity

Logic:
- 已存在 → 数量 +1
- 不存在 → 新增

Side Effects:
- 更新 cart state

你会发现一件很有意思的事:

👉 这些内容其实已经非常接近代码了

但它比代码更高一层,因为它是:

可以被 AI 理解的“意图表达”

如果你用 SDD 写到这么细的话,AI 要发生幻觉的机会基本上是很低的,因为它不需要去猜「库存不足要干嘛?」,也不用猜「重复加入是要新增一笔还是数量 +1?」,因为你都透过规格文件告诉它了。

BDD + SDD 之后,还缺什么?

到目前为止,我们已经解决了两个关键问题:

  • BDD:让需求“说得清楚”
  • SDD:让实现“有边界、有约束”

从输入角度来看,这已经非常完整了。

但这里有一个容易被忽略的问题:

当 AI 按照你的描述实现之后,你怎么确定它真的“做对了”?

这是一个本质问题。

因为无论你的描述写得多好,AI 的实现依然存在几个不确定性:

  • 是否遗漏了某些边界条件?
  • 是否在某些场景下逻辑错误?
  • 是否“看起来对”,但其实在特殊情况下会出 bug?

换句话说:

BDD 和 SDD 解决的是“输入问题”,但还没有解决“验证问题”。

而这正是 TDD 的位置。

TDD(测试驱动开发)在这里的角色,不再是传统意义上的“先写测试再写代码”,而是:

为 AI 生成的代码提供一套可执行的验证标准

在 AI Coding 场景中,一个更现实的流程是:

需求 → BDD(行为描述) → SDD(规范约束)
      → 生成测试(AI 或人) → AI 实现 → 跑测试验证

也就是说:

  • BDD:定义“要做什么”
  • SDD:定义“怎么做 & 不要做什么”
  • TDD:定义“什么叫做做对了”

当三者结合时,你可以这样理解:

BDD(行为:What)
↓
SDD(规范:How + Constraint)
↓
TDD(验证:Correctness)
↓
AI Implementation

这其实对应了三个完全不同的问题:

层级 解决问题
BDD 需求是否表达清楚
SDD 实现是否受控
TDD 结果是否正确

我们把前面的购物车例子补完整:

## Requirement: Add to Cart

### 1. Behavior(BDD)
Given 用户进入商品页
When 点击加入购物车
Then 显示“加入成功”

### 2. Specification(SDD)
- CartItem: { productId, quantity }
- quantity ≤ stock
- 必须通过 store action 修改 state

### 3. Test(TDD)
- 加入新商品 → cart 数量 +1
- 重复加入 → 数量递增,不新增条目
- 库存不足 → 抛出错误或限制数量

这个时候,你会发现一个本质变化:

👉 AI 不再只是“生成代码”,而是在满足一组明确约束 + 通过验证标准

在传统开发中:

  • 测试是“保障代码质量”的工具

但在 AI Coding 中:

测试是“约束 AI 行为”的工具

它的作用已经从“质量控制”变成了“执行约束”。

所以再回到最初那个问题:

我到底该用 BDD 还是 SDD?

更准确的答案应该是:

BDD + SDD + TDD 是一整套体系,而不是三选一

它们分别解决:

  • BDD:防止你“说错需求”
  • SDD:防止 AI“乱实现”
  • TDD:防止 AI“实现错”

如果要用一句话总结这一整套组合:

Vibe Coding 让你“快速做出来”,
BDD 让你“说清楚”,
SDD 让你“约束住”,
TDD 让你“验证对”。

而这四者叠加之后,软件开发的重心也发生了变化:

从“写代码”,变成“定义 + 约束 + 验证系统”。

进阶:工具化的 Spec

手写 Markdown Spec,其实已经足够你完成大多数项目。

但当项目开始变大,你很快会遇到几个很现实的问题:

  • Spec 越写越多,开始散落在各个文件里
  • 每次修改需求,不知道哪些 Spec 需要一起改
  • AI 的上下文不稳定,经常“忘了之前说过什么”
  • 同一个功能,不同人写出来的 Spec 风格完全不一致

这时候问题就不再是“会不会写 Spec”,而是:

你有没有能力“管理 Spec”。

手写 Spec,本质上还是一种“文档行为”。

但当你开始频繁做这些事情:

  • 为一个功能持续迭代 Spec
  • 让 AI 多轮根据 Spec 实作
  • 用测试验证 Spec
  • 在多个 feature 之间复用或对齐规则

Spec 就不再只是文档,而变成了:

开发流程的一部分。

一旦进入这个阶段,你会自然想要三样东西:

  • 结构统一(不要每个人写一套风格)
  • 流程可控(知道现在做到哪一步)
  • 变更可追踪(这个功能改了什么、为什么改)

而这,正是“工具化 Spec”要解决的问题。

工具在做什么?

很多人第一次接触这类工具,会以为它们是在“帮你写 Spec”。

其实不是。

它们真正做的事情只有三件:

1)把 Spec 结构标准化

不再是随意的 Markdown,而是明确拆分为:

  • proposal(为什么做)
  • spec(要做什么)
  • design(怎么做)
  • tasks(怎么拆)

这样 AI 在不同阶段拿到的是“刚好需要的信息”,而不是一整坨上下文。

2)把开发流程显式化

从原本的:

想需求 → 写点文档 → 直接让 AI 写代码

变成:

定义需求 → 写 Spec → 拆任务 → 实作 → 验证 → 归档

你不再依赖“记忆”来控制流程,而是用工具把流程固定下来。

3)让 AI 有“稳定上下文”

这是很多人低估的一点。

AI 最大的问题不是不聪明,而是:

它没有长期记忆。

当你的 Spec 被结构化、文件化之后:

  • AI 可以随时读取当前 feature 的完整上下文
  • 不需要依赖聊天历史
  • 不会因为“上下文漂移”而越写越偏

换句话说:

Spec 成了 AI 的“外部记忆”。

一个典型的工具化流程

当 Spec 被工具接管之后,一个功能的生命周期通常会变成这样:

探索需求
→ 定义变更(change)
→ 生成 Spec / Design / Tasks
→ AI 实作
→ 测试验证
→ 归档

你会发现,这其实就是你前面看到的:

BDD + SDD + TDD 的工程化版本

只不过:

  • BDD → 体现在场景(Given-When-Then)
  • SDD → 体现在 Spec / Design
  • TDD → 体现在验证和测试

工具只是把这些东西串起来,并且“强制你走一遍”。

当你真正用上这些工具之后,会有一个很明显的感受:

你花时间最多的地方,不再是写代码。

而是:

  • 定义 Spec
  • 拆分任务
  • Review AI 的实现
  • 修正 Spec 或测试

代码本身,反而变成“执行结果”。

这也是为什么很多人会产生错觉:

“有了 AI + SDD,开发是不是更轻松了?”

现实往往是:

  • 以前你只需要维护代码
  • 现在你要维护:Spec + 测试 + 代码

短期来看,成本是上升的。

但换来的东西是:

可控性 + 一致性 + 可持续演进

这里需要再强调一遍(也是最容易被误解的一点):

工具解决的是“表达问题”,不是“思考问题”。

它可以帮你:

  • 规范格式
  • 约束流程
  • 减少 AI 偏离

但它解决不了:

  • 需求拆解
  • 架构设计
  • 边界判断
  • 代码质量

这些东西,依然完全取决于你。

一个例子:OpenSpec 的工作方式

OpenSpec 是一个典型的 SDD 工具。

它做的事情,本质上和手写 Markdown 是一样的:

用结构化的 Spec,引导 AI 实现。

但它额外做了两件事:

  • 格式标准化
  • 流程命令化

也就是说,你不再只是“写”,而是通过命令驱动整个开发流程。

它对应到 SDD,大致是这样一条链路:

探索需求     建立 change    产生规则文件         实现        验证        归档
  │              │              │               │          │          │
  ▼              ▼              ▼               ▼          ▼          ▼
/opsx:explore → /opsx:new → /opsx:ff      → /opsx:apply → /opsx:verify → /opsx:archive
                            /opsx:continue

每一步其实都非常清晰:

  • /opsx:explore
    当需求还不明确时,先进入探索模式,补齐上下文和边界

  • /opsx:new
    创建一个 change,对应一次功能变更

  • /opsx:ff / /opsx:continue
    生成完整规划文件(proposal / specs / design / tasks),或者分阶段生成方便审查

  • /opsx:apply
    根据 tasks 开始实现

  • /opsx:verify
    检查实现是否符合 spec

  • /opsx:archive
    将本次变更归档,并合并回主 specs

比如你要做一个“深色模式”功能:

你:/opsx:propose add-dark-mode

AI:
✓ proposal.md — 为什么要做
✓ specs/      — 行为与场景
✓ design.md   — 技术方案
✓ tasks.md    — 实现步骤

这一步,其实就已经把一件事拆清楚了:

  • 为什么做(Why)
  • 做什么(What)
  • 怎么做(How - design)
  • 怎么落地(Tasks)

接着进入实现:

你:/opsx:apply

AI:
✓ 1.1 添加 theme provider
✓ 1.2 创建切换组件
✓ 2.1 添加 CSS 变量
✓ 2.2 接入 localStorage

这里的关键在于:

AI 是在“执行 Spec”,而不是“根据 prompt 发挥”。

最后是归档:

你:/opsx:archive

AI:
✓ 归档 change
✓ 更新主 specs

这一步解决的是一个很关键的问题:

AI 没有长期记忆,但 Spec 可以成为“外部记忆”。

Spec 可以有很多写法,但在 AI 时代,有一种格式特别有效:

Given-When-Then

它本来是为了让“人”沟通需求(Dan North),但现在反而变成了:

最适合 AI 理解的结构

原因很简单:

  • 结构化:固定三段(Given / When / Then)
  • 具体:用实例表达,而不是抽象描述
  • 可验证:Then 本身就是断言

举个对比:

普通 prompt:

帮我实现一个网球计分系统,要能够追踪两个玩家的分数,
用 love、fifteen、thirty、forty 来表示,
还要处理 deuce 和 advantage 的情况。

Given-When-Then:

Feature: 网球计分系统
  跟踪两位球员的分数,并使用标准网球术语返回比分

  Scenario: 比赛开始时
    Given 一场新的比赛
    When 查询当前比分
    Then 比分应该是 "love all"

  Scenario: 一方得分
    Given 一场新的比赛
    When player1 得 1 分
    Then 比分应该是 "fifteen love"

  Scenario: 双方各得一分
    Given 一场新的比赛
    When player1 得 1 分
    And player2 得 1 分
    Then 比分应该是 "fifteen all"

  Scenario: 平分 (Deuce)
    Given 一场新的比赛
    When player1 得 3 分
    And player2 得 3 分
    Then 比分应该是 "deuce"

  Scenario: 优势 (Advantage)
    Given 双方比分为 deuce
    When player1 得 1 分
    Then 比分应该是 "advantage player1"

  Scenario: 从优势回到 Deuce
    Given player1 处于 advantage
    When player2 得 1 分
    Then 比分应该是 "deuce"

  Scenario: 赢得比赛
    Given player1 处于 advantage
    When player1 得 1 分
    Then player1 赢得比赛

区别在于:

前者是“描述”,后者是“定义行为 + 验证标准”

差异很明显。 每个场景都把前置条件、动作、预期结果写清楚了,AI可以精确地知道每个情境下系统应该怎么表现。 不会多做,也不会少做

SDD 不是银弹

这里必须泼一盆冷水。

SDD 能解决的是:

  • 输入不清晰
  • AI 乱发挥
  • 结果不一致

但它解决不了:

  • 需求拆解(你要懂业务)
  • 架构设计(AI 不负责长期演进)
  • 代码质量(能跑 ≠ 好代码)
  • 边界发现(依赖经验)

换句话说:

SDD 降低的是“表达成本”,不是“思考成本”。

Spec 写多少才够?

一个常见的问题是:Spec 要写到多细?

答案取决于你对 AI 的信任度和功能的复杂度。

简单功能(工具函数、格式转换等):Spec 可以很简短,几行就够。AI 在这类任务上的表现通常很好,不需要过度约束。

中等功能(业务逻辑、API endpoint 等):需要明确的范围、API 设计、关键的 Given-When-Then 场景。特别是不在范围的部分要写清楚。

复杂功能(跨模块交互、状态管理等):除了 Spec 之外,可能还需要拆分成多个小 Spec,每个小 Spec 对应一个 TDD 循环。

一个衡量标准是:如果你把 Spec 给另一个人类开发者,他能不能理解你要做什么、做到什么程度?如果可以,那这份 Spec 给 AI 也够用了。如果连人都看不懂,AI 更不可能猜对。

工具在变,速度在变,但本质没有变:

  • 理解需求
  • 做出设计
  • 保证质量

AI 是加速器,但:

方向是 Spec 给的,正确性是测试给的,最终质量是人把关的。

OpenSpec vs Spec Kit:两种“工具化 Spec”的路线

当 Spec 开始从“写文档”走向“驱动开发流程”,工具就自然分化成了两条路线。

目前比较典型的两种实现就是:

  • OpenSpec(偏轻量、流程驱动)
  • Spec Kit(偏规范、体系化、工程治理)

它们都属于 Spec-Driven Development(SDD)工具化实践,但设计哲学差异非常明显。

在这里插入图片描述

在这里插入图片描述

先用一句话把差异说清楚:

  • OpenSpec:更像“开发流程脚手架 + 命令驱动 AI 执行”
  • Spec Kit:更像“完整的软件工程治理体系 + SDD 操作系统”

OpenSpec 的核心目标很直接:

让 AI coding 过程“可控 + 可重复 + 可追踪”,但不要太重。

它做的事情可以拆成三层:

① 把 Spec 标准化

原本你手写 Markdown:

  • proposal
  • spec
  • design
  • tasks

OpenSpec 直接帮你变成固定结构。

② 把开发过程命令化

核心就是这一套 OPSX 流程:

/opsx:explore   → 理解需求
/opsx:new       → 创建变更
/opsx:ff        → 生成完整规划
/opsx:apply     → AI 实现
/opsx:verify    → 验证结果
/opsx:archive   → 归档沉淀

它本质是在做一件事:

把“写 prompt + 管理上下文”变成“操作流程”。

③ 强调“轻”

OpenSpec 的设计哲学很明确:

  • 不强制复杂工程结构
  • 不绑定特定 IDE
  • 不引入重型流程治理
  • 允许逐步 review(/continue)

它更像:

AI 编程的“流程增强插件”

而不是一个完整体系。

OpenSpec 的特点总结

可以归纳为四点:

  • 流程轻
  • 上手快
  • 约束适中
  • 更偏“单项目开发体验优化”

适合:

  • 个人项目
  • 小团队
  • 快速 AI coding workflow
  • 实验型开发

Spec Kit 走的是完全不同的路线。

它不是在优化“怎么写 prompt”,而是在做:

软件工程流程本身的结构化重建。

① Spec 不只是文件,而是“生命周期对象”

Spec Kit 不是简单生成:

  • spec.md
  • tasks.md

它定义的是一整套生命周期:

specify → plan → tasks → implement → verify → iterate → archive

每一步都有明确职责边界。

② 强调“工程治理能力”

Spec Kit 引入了大量工程级能力,比如:

  • spec drift 检测(规范和实现是否偏离)
  • 质量 gate(进入 implement 前必须满足条件)
  • 任务追踪(spec → task → issue)
  • review flow(多阶段验证)
  • extension system(扩展整个 SDD 生命周期)

甚至包括:

  • CI/CD 集成
  • Jira / GitHub issues 同步
  • 多 agent 协作
  • security / QA / architecture review

③ 它更像“AI 时代的软件工程框架”

Spec Kit 的定位已经不是工具,而是:

Spec-driven Software Engineering System

它试图解决的问题是:

  • 大型项目如何用 AI 管理复杂性
  • 多人协作如何保持 spec 一致性
  • AI 参与开发时如何防止“结构漂移”
  • 如何把 spec 变成长期可演进资产

Spec Kit 的特点总结:

可以归纳为:

  • 强流程约束
  • 强工程治理
  • 强扩展能力
  • 面向复杂项目 / 企业级场景

适合:

  • 中大型项目
  • 长生命周期系统
  • 多团队协作
  • AI + 工程体系融合场景

可以用一张结构化对比来看:

维度 OpenSpec Spec Kit
设计目标 简化 AI 开发流程 构建完整 SDD 工程体系
复杂度
学习成本 中高
流程约束 弱到中
工程治理 基础 完整体系
扩展能力 有限 很强(extension/preset)
适用场景 个人/小团队 中大型/企业级
核心思想 “让 AI 好用” “让 AI 可控地参与工程”

如果从更底层看,它们的差异不是“功能多少”,而是哲学不同:

OpenSpec 的假设

AI 已经足够强了,我们要做的是让它“更容易被用”。

重点是:

  • 提升效率
  • 降低输入成本
  • 减少 prompt 混乱

Spec Kit 的假设

AI 不可控是常态,我们要做的是“工程化约束它”。

重点是:

  • 控制复杂性
  • 管理长期演进
  • 约束 AI 行为边界
  • 保证系统一致性

回到 SDD 的本质其实两者都在做同一件事:

把“自然语言 prompt 驱动开发”升级为“结构化规格驱动开发”。

区别只是:

  • OpenSpec:偏“开发体验优化”
  • Spec Kit:偏“工程体系重构”

OpenSpec笔记

OpenSpec 是一个面向 AI 辅助开发的结构化工作流工具。它通过一组统一的斜杠命令(如 /opsx:)来组织开发流程,引导开发者与 AI 在同一套规范下协作,从需求探索、方案规划、任务拆解,到代码实现、结果验证与最终归档,每个阶段都有明确的输入与输出。

它的核心思想可以概括为一句话:

先约定,再编码。

在真正编写代码之前,开发者会先与 AI 一起明确需求边界、设计实现方案,并将其拆解为可执行的任务清单;在实现过程中,AI 按照这些约定进行编码;实现完成后,再通过验证步骤检查是否符合最初的规格;最后将本次变更归档,形成可追溯、可回顾的开发历史。

通过这种方式,OpenSpec 将原本分散在“对话式 prompt”中的开发过程,结构化为一条清晰、可控且可复用的工作流,从而减少沟通偏差,提高 AI 辅助开发的稳定性与工程质量。

在这里插入图片描述

安装 OpenSpec CLI

npm install -g @fission-ai/openspec@latest

进入你的项目根目录,执行:

openspec init

该命令会创建基础目录结构,例如:

  • openspec/
  • changes/
  • 配置文件等

在这里插入图片描述

在这里插入图片描述

这段输出本质上是在说:OpenSpec 已经帮你把“AI 编程工作流插件”装进了 Claude Code,并完成初始化配置

🧩 1. “✔ Select tools to set up (28 available) Claude Code”

意思是:

OpenSpec 支持 28 种 AI 工具 / 集成环境,你当前选择的是 Claude Code

也就是说它不是只能用在一个工具里,而是“多代理适配器”,这里选的是 Claude Code 这一套。

🏗️ 2. “▌ OpenSpec structure created”

意思是:

项目目录结构已经生成好了

通常会创建类似这些东西:

  • .claude/(AI 命令和 skills)
  • openspec/(配置与规范)
  • changes/(变更目录)

✔ 3. “Setup complete for Claude Code”

意思是:

OpenSpec 已经成功集成到 Claude Code 里了

换句话说:

👉 现在 Claude Code 已经“懂 OpenSpec 的工作流命令”了

🧠 4. “4 skills and 4 commands in .claude/”

这个很关键:

意思是:

OpenSpec 给 Claude Code 注入了:

  • 4 个 skills(能力模块)
  • 4 个 commands(/opsx: 之类的命令)

也就是说:

👉 /opsx:propose/opsx:apply 这些不是魔法,是“被写进 AI 工具里的规则脚本”

⚙️ 5. “Config: openspec/config.yaml (schema: spec-driven)”

意思是:

当前项目启用了一个配置文件,模式是 spec-driven(规格驱动开发)

这个配置控制:

  • 用不用完整 SDD 流程
  • 启用哪些 opsx 命令
  • 工作流是轻量还是严格

🚀 6. “Start your first change: /opsx:propose “your idea””

意思是:

现在可以开始你的第一个需求变更了

比如:

/opsx:propose "add dark mode"

它会帮你:

👉 创建 proposal + specs + design + tasks

🔁 7. “Restart your IDE for slash commands to take effect”

意思是:

你需要重启编辑器(Cursor / VS Code / Claude Code)

因为:

👉 slash commands 是“插件注入的能力”,要重载才生效

OpenSpec 默认只启用核心命令(如 explore、apply、archive 等 4 个)。

如果你希望使用完整工作流(包括 new、continue、ff、verify、sync 等扩展命令),需要切换配置。

步骤 1:切换 Profile

openspec config profile

选择:

👉 Expanded Profile(完整工作流)

步骤 2:选择 Workflows(可选)

如果只想启用部分功能,可以选择:

👉 Workflows only

然后用空格键勾选需要的命令。

步骤 3:刷新配置

openspec update

步骤 4:重启编辑器

重启 Cursor / VS Code / Copilot,使 /opsx: 命令生效。

核心概念

变更(Change)

一次独立的开发任务,对应一个功能点。

存放路径:

changes/<change-name>/

制品(Artifact)

在一次变更过程中生成的所有产物,例如:

  • proposal(提案)
  • specs(规范)
  • design(设计)
  • tasks(任务清单)
  • 代码实现
  • 验证报告

规范(Specs)

全局或模块级设计约定,存放在:

openspec/specs/

可以在多个变更中复用。

快进(Fast-forward)

一次性生成规划阶段全部内容(proposal + specs + design + tasks)。

OpenSpec 工作流

一个完整的 OpenSpec 工作流分为:

探索 → 规划 → 执行 → 验证 → 同步 → 归档 六个阶段。

🔍 1. 探索阶段:/opsx:explore

在动手写代码前,与 AI 进行纯粹的讨论,分析需求、调研技术方案、梳理潜在风险。

/opsx:explore

适用场景:

  • 需求模糊
  • 技术选型不确定
  • 需要头脑风暴

行为说明:

  • AI 进入“只读模式”
  • 不创建任何文件
  • 只输出讨论性分析

输出:
通常是一段对话记录,可手动保存到项目文档中作为参考。

🧱 2. 规划阶段:从想法到任务清单

规划阶段的目标是产出清晰的:

📌 提案(proposal) + 规范(specs) + 设计(design) + 任务清单(tasks)

作为后续编码依据。

🚀 2.1 启动新变更:/opsx:new
/opsx:new

行为:

  • changes/ 下创建以时间戳命名的新目录

  • 生成基础文件框架,例如:

    • proposal.md
    • tasks.md

提示:
需要你描述本次变更目标(一句话或一段话)。

🔄 2.2 逐步完善:/opsx:continue
/opsx:continue

作用:
按顺序逐步生成每个工件。

行为逻辑:

  • 如果已有 proposal.md → 生成 specs/
  • 再执行 → 生成 design.md
  • 再执行 → 生成 tasks.md

优点:
✔ 每一步可审查
✔ 可修改方向
✔ 降低 AI 偏差

⚡ 2.3 快速完成规划:/opsx:ff
/opsx:ff

行为:
一次性生成全部规划产物:

  • proposal.md
  • specs/
  • design.md
  • tasks.md

适用场景:

  • 需求明确
  • 变更较小
  • 有经验的开发者
📦 规划阶段产出物
  • proposal.md → 背景 / 目标 / 验收标准
  • specs/ → 详细规范(接口 / 数据结构 / UI 等)
  • design.md → 技术设计(模块 / 算法 / 依赖)
  • tasks.md → 可执行任务清单(供 apply 使用)

⚙️ 3. 执行阶段:/opsx:apply

/opsx:apply

作用:
根据任务清单执行代码生成。

行为:

  • 读取 tasks.md
  • 按任务逐个生成代码
  • 写入项目对应位置

交互方式:

  • 每个任务完成后可能请求确认
  • 可中途暂停 / 修改 tasks / 继续执行

🧪 4. 验证阶段:/opsx:verify

/opsx:verify

作用:
检查代码是否符合规范与设计。

行为:

  • 对照 specs/ + design.md
  • 输出验证报告

📄 通常生成:

verify-report.md

报告内容:

  • ✔ 符合项
  • ❌ 不符合项
  • ⚠ 潜在问题
  • 🛠 修复建议

循环机制:
修复 → 再 verify → 直到通过

🔁 5. 同步规范:/opsx:sync

/opsx:sync

作用:
把本次变更中的“可复用规范”沉淀到全局。

行为:

  • changes/<change>/specs/
  • 合并到:
openspec/specs/

注意:

  • ❗不会归档变更
  • ❗变更仍处于开发状态

📦 6. 归档阶段

🗂 6.1 单个归档:/opsx:archive
/opsx:archive

行为:

  • 移动变更:
changes/active/ → changes/archived/
  • 自动 sync(确保规范已合并)
  • 更新 CHANGELOG.md
  • 标记完成状态
📚 6.2 批量归档:/opsx:bulk-archive
/opsx:bulk-archive

行为:

  • 列出所有可归档变更
  • 支持多选
  • 逐个归档
  • 自动检测规范冲突
  • 更新变更日志

📋 命令速查表

命令 阶段 功能
/opsx:explore 探索 只读模式讨论需求,不生成文件
/opsx:new 规划 创建新变更目录及基础文件
/opsx:continue 规划 按进度生成下一个工件
/opsx:ff 规划 快进:一次性生成所有规划工件
/opsx:apply 执行 根据任务清单编写代码
/opsx:verify 验证 检查代码是否符合规范,生成报告
/opsx:sync 同步 将变更中的规范合并到主规范库
/opsx:archive 归档 归档单个已完成变更
/opsx:bulk-archive 归档 批量归档多个变更
/opsx:onboard 学习 交互式教程(约15分钟)

💡 最佳实践与典型场景

🧩 场景一:复杂功能开发(逐步推进)

/opsx:explore   – 与 AI 讨论需求、技术选型
/opsx:new       – 创建变更
/opsx:continue  – 生成 proposal,审阅后继续
/opsx:continue  – 生成 specs,审阅后继续
/opsx:continue  – 生成 design,审阅后继续
/opsx:continue  – 生成 tasks,审阅后定稿
/opsx:apply     – 执行任务清单,生成代码
/opsx:verify    – 验证代码一致性,修复问题
/opsx:sync      – 将新增规范合并到主库
/opsx:archive   – 归档变更

⚡ 场景二:小型快速迭代

/opsx:ff        – 快进生成所有规划工件(需需求明确)
/opsx:apply     – 编码
/opsx:verify    – 验证
/opsx:archive   – 归档

🏗 场景三:规范先行,团队协作

在项目启动阶段,可以先通过:

/opsx:explore
/opsx:new

建立全局规范(例如代码风格、API 设计原则),并存放在:

openspec/specs/

之后所有功能变更都从主规范派生,并在开发完成后执行:

/opsx:sync

用于将新规范回写到主规范库,保持团队一致性。

🚀 下一步该做什么(标准流程起点)

当你已经做完 初始化(openspec init) 这一步了,接下来本质上就进入 OpenSpec 的“第一段工作流”:先把第一个 change 跑起来,而不是直接写代码。

① 先启动你的第一个需求(推荐)

直接进入:

/opsx:explore "你要做的功能"

比如:

/opsx:explore "做一个本地待办事项系统"

👉 这一步的意义

  • 不写代码
  • 不建结构
  • 只和 AI 对齐需求
  • 把“要做什么”先说清楚

如果你已经很确定要做什么(更快路径)

可以跳过 explore,直接开始:

② 创建第一个变更

/opsx:new

然后描述你的需求,例如:

我要做一个用户登录系统,支持邮箱登录 + JWT

③ 选择规划方式(关键分叉点)

🟡 方式 A:逐步规划(推荐)

/opsx:continue

你会依次得到:

  • proposal.md
  • specs/
  • design.md
  • tasks.md

👉 每一步都可以检查、修改

🔵 方式 B:一次生成(快)

/opsx:ff

👉 AI 一次性帮你把规划全部写完

当你有了 tasks.md 之后,才开始:

/opsx:apply

👉 AI 才会真正开始写代码

如果你是第一次用 OpenSpec,我建议你按这个走:

1. /opsx:explore   (先对齐需求)
2. /opsx:new       (创建 change)
3. /opsx:continue  (逐步生成 spec)
4. /opsx:apply     (开始写代码)
5. /opsx:verify    (检查)
6. /opsx:archive   (完成归档)

❗ OpenSpec init 只是“装工具”,
真正开始开发,是从 /opsx:explore/opsx:new 开始的。

Spec Kit(Speckit)笔记

Spec Kit 是 GitHub 官方开源的规范驱动开发(Spec-Driven Development, SDD)工具包。它通过"规范→计划→任务→实现"的结构化流程,将 AI 从"代码生成工具"转变为"产品开发伙伴"。

你可以选择不同的安装方式:

⚠️ 重要说明

Spec Kit 唯一官方维护的包来自 GitHub 仓库。

在 PyPI 上任何同名包 都不是官方项目的一部分,也不受维护

👉 请务必像下面这样从 GitHub 安装。

📦 方式一:持久安装(推荐)

一次安装,全局可用。建议锁定版本号(更稳定):

注意:下面的 uv 需要 Python 包管理工具 uv
如果提示 command not found: uv,请先安装 uv
或使用 pipx 替代(不依赖 uv)

🔧 安装指定版本(推荐)

uv tool install specify-cli --from git+https://github.com/github/spec-kit.git@vX.Y.Z

在这里插入图片描述

👉 将 vX.Y.Z 替换为最新 release 版本

🔧 安装最新 main(可能包含未发布内容)

uv tool install specify-cli --from git+https://github.com/github/spec-kit.git

🔧 pipx 替代方案

pipx install git+https://github.com/github/spec-kit.git@vX.Y.Z
pipx install git+https://github.com/github/spec-kit.git

✅ 验证是否安装成功

specify version

如果你的环境无法访问 PyPI 或 GitHub:

👉 请参考企业/离线安装指南

核心思路是:

  • 在可联网机器下载 wheel 包
  • 再转移到离线环境安装

⬆️ 升级方式

uv tool install specify-cli --force --from git+https://github.com/github/spec-kit.git@vX.Y.Z

pipx 用户:

pipx install --force git+https://github.com/github/spec-kit.git@vX.Y.Z

🚀 使用方式

创建新项目

specify init <PROJECT_NAME>

在这里插入图片描述

在这里插入图片描述

在现有项目初始化

specify init . --integration copilot

或:

specify init --here --integration copilot

检查工具状态

specify check

建立项目原则

在项目目录中启动你的 AI 编程代理。

大多数工具会提供类似 /speckit.* 的命令;

Codex CLI 在 skills 模式下则使用 $speckit-*

使用:

/speckit.constitution

用来创建项目的开发原则与规范,包括:

  • 代码质量标准
  • 测试规范
  • 用户体验一致性
  • 性能要求

创建 spec(需求规格)

使用:

/speckit.specify

描述你要做什么(What & Why),不要写技术栈。

示例:

构建一个应用,用来整理照片到不同相册。
相册按日期分组,可以在主页拖拽重新排序。
相册不能嵌套。
每个相册内用网格方式展示照片预览。

创建技术方案

使用:

/speckit.plan

定义技术栈与架构:

示例:

  • 使用 Vite
  • 尽量少依赖第三方库
  • 使用原生 HTML / CSS / JS
  • 图片不上传服务器
  • metadata 存储在本地 SQLite

拆解任务

使用:

/speckit.tasks

将方案拆解为可执行任务列表。

执行实现

使用:

/speckit.implement

AI 会按照任务列表:

  • 自动实现代码
  • 完成整个功能开发流程

Spec Kit 的核心流程就是:

constitution → specify → plan → tasks → implement

❓ FAQ(常见问题)

Q1:OpenSpec 和普通“AI 写代码”有什么区别?

OpenSpec 不是“帮你写代码的工具”,而是一个结构化开发流程框架

普通 AI coding:

你说一句需求 → AI 直接写代码

OpenSpec:

需求 → 结构化拆解(spec / design / tasks)→ 再编码 → 再验证 → 再归档

核心区别是:

AI 不再“自由发挥”,而是“按约定执行”。

Q2:OpenSpec的这些 /opsx: 命令是在终端运行的吗?

不是。

/opsx:*AI 对话指令,不是 shell 命令

你应该在支持 OpenSpec 的 AI 工具中输入,例如:

  • Claude Code
  • Cursor
  • Copilot Chat(部分支持)

例如:

/opsx:explore 做一个待办事项系统

在这里插入图片描述

Q3:OpenSpec必须按完整流程走吗?

不必须。

OpenSpec 是可裁剪流程

  • 小需求 → /opsx:ff 一步到位
  • 中等需求 → /opsx:new + /opsx:apply
  • 复杂需求 → 完整 flow(explore → archive)

它的设计理念是:

流程是建议,不是强制。

命令 行为 适用场景
/opsx:continue 一步一步生成 spec → design → tasks 需要审查、复杂项目
/opsx:ff 一次性生成全部规划产物 简单需求 / 快速开发

一句话:

continue = 可控推进
ff = 一步到位

Q4:OpenSpec 会不会自动帮我写完整项目?

不会。

OpenSpec 的定位不是:

❌ 自动写完项目的 AI

而是:

✅ 让 AI 按工程规范参与开发的系统

它不会替你:

  • 拆需求
  • 做架构决策
  • 判断设计质量

它只会:

  • 把你的思考结构化
  • 帮你执行
  • 帮你验证一致性

Q5:OpenSpec中sync 和 archive 有什么区别?

这是很多人容易混淆的点。

  • /opsx:sync
    👉 只做“规范沉淀”,不结束任务

  • /opsx:archive
    👉 结束整个变更生命周期

简单理解:

sync = 更新知识库
archive = 关闭项目

Q6:OpenSpec 是不是必须配 AI 才能用?

严格来说:

  • OpenSpec 本身是流程工具
  • AI 是执行载体

所以:

OpenSpec ≠ AI
OpenSpec + AI = 工作流系统

没有 AI,它只是 Markdown 结构 + 目录规范。

Q7:Claude Code 登录失败怎么办?

在这里插入图片描述

Claude Code 会在用户主目录下生成一个本地状态文件 .config.json,其中包含一个关键字 段 hasCompletedOnboarding,用于标记用户是否已经完成了初次引导流程。

  • hasCompletedOnboarding: true:表示引导已完成,程序启动后直接进入工作模式。

  • hasCompletedOnboarding: false:表示引导未完成,程序会在每次启动时尝试引导用户。

我们新建一个.config.json文件写入:

{
  "hasCompletedOnboarding": true,
  ...
}

工作目录在 Windows 上一般是:

C:\Users\<你的用户名>\.claude\

在 macOS / Linux 上是:

~/.claude/

在这里插入图片描述

settings.json 是什么?

这个就是 Claude Code 的用户级配置文件

类似于:

  • VSCode 的 settings.json
  • Git 的 .gitconfig

典型结构(示例):

{
  "env": {
    // 🔌 Claude API 的基础地址
    // 这里指向本地服务(例如 Ollama),而不是 Anthropic 官方 API
    "ANTHROPIC_BASE_URL": "http://localhost:11434",

    // 🔑 认证 token
    // 在本地模型(如 Ollama)中通常是随便填或固定值(如 "ollama")
    // 在官方 Claude API 中这里会是真实的 API Key
    "ANTHROPIC_AUTH_TOKEN": "ollama",

    // 🤖 使用的模型名称
    // 这里是本地模型 gemma4:e4b(具体取决于你 Ollama pull 的模型)
    "ANTHROPIC_MODEL": "gemma4:e4b",

    // 🚫 是否关闭非必要网络流量
    // 1 = 开启(更隐私,只做必要请求)
    // 0 = 关闭(允许更多遥测/非核心请求)
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
  }
}

Q8:Spec Kit 和 OpenSpec 有什么区别?

一句话版本:

Spec Kit = 重型规范驱动框架
OpenSpec = 轻量 AI 工作流工具

更具体一点:

  • Spec Kit:结构完整、流程严格(constitution → spec → plan → tasks → implement)
  • OpenSpec:更灵活,用 /opsx: 控制 AI 流程
  • Spec Kit 更偏“工程规范体系”
  • OpenSpec 更偏“AI 协作工作流”

👉 一个偏“方法论框架”,一个偏“工具化执行”。

Q9:Spec Kit 和 TDD 有什么关系?

Spec Kit 本质上是:

Spec-First + TDD 思想的工程化版本

区别:

  • TDD:从测试驱动代码
  • Spec Kit:从“规格驱动 → 再到任务 → 再到实现”

两者结合:

Spec 定义行为,Test 保证正确性,AI 负责实现

Q10:specify-cli 安装失败怎么办?

最常见原因是:

  • GitHub 连接失败(443 超时)
  • 网络被限制
  • Git 未配置代理

解决方向:

  • 配置 Git proxy
  • 使用 VPN
  • 或改用 SSH clone

有些地方你可能浏览器可以访问,但git没走魔法,检查:

git config --global --get http.proxy

设置

git config --global http.proxy http://127.0.0.1:xxx
git config --global https.proxy http://127.0.0.1:xxx

Q11:Spec Kit 适合什么项目?

适合:

  • 中大型项目
  • 有明确业务逻辑的系统
  • 需要多人协作的工程
  • 希望 AI 辅助开发但不失控的场景

不太适合:

  • 小脚本
  • 临时工具
  • 快速 demo(overkill)

Q12:Spec Kit 会不会限制开发自由度?

会,但这是设计目的。

它的思路是:

用结构换可控性,用流程换一致性

所以你会感觉:

  • 少了“随便写代码”的自由
  • 多了“按流程走”的约束

但换来的是:

AI 不容易乱写 + 项目更可维护

Q13:Spec Kit 和 OpenSpec 可以一起用吗?

理论上可以,但:

  • Spec Kit:强流程 + 强结构
  • OpenSpec:轻流程 + 灵活命令

👉 一起用会出现:

  • 流程重复
  • 抽象层冲突
  • AI 指令混乱

建议:

二选一作为主框架

Q14:SDD(Spec-Driven Development)和各大厂商的 Plan 模式有什么区别?

很多 AI 编程工具(比如 Cursor、Claude Code、GitHub Copilot Agent 等)都有所谓的 Plan / Planning 模式,看起来和 SDD 很像,但本质上不是一回事。

🧠 1. 核心目标不同

SDD(Spec-Driven Development)

👉 目标是“让规格成为开发的第一等公民”

强调的是:

  • 先定义“系统应该是什么样”(Spec)
  • 再拆解为任务(Tasks)
  • 最后由 AI 执行实现

它是一个开发方法论 / 工程范式

Plan 模式(厂商功能)

👉 目标是“让 AI 在写代码前先想一想”

强调的是:

  • 生成一个临时的执行计划
  • 用来指导当前对话中的代码生成
  • 通常不会长期保存

它是一个交互增强功能

🔧 2. 生命周期不同

对比项 SDD Plan 模式
是否持久化 ✔ 是(spec / tasks 会保存) ❌ 否(通常是临时上下文)
是否可复用 ✔ 可以跨会话/团队复用 ❌ 仅当前对话
是否工程化 ✔ 是完整流程体系 ❌ 只是步骤优化
是否影响项目结构 ✔ 会生成 spec / task / design ❌ 不改变项目结构

🏗️ 3. 抽象层级不同

可以这样理解:

🟦 Plan 模式(低层)

“先帮我想一下怎么写这段代码”

属于:

  • 单任务优化
  • prompt-level planning
  • 临时思考过程

🟩 SDD(高层)

“先定义系统应该是什么,再逐步实现”

属于:

  • 系统设计方法
  • 长期规范
  • AI 可执行的结构化开发流程

⚙️ 4. 是否“可执行规格”

这是最关键差异:

Plan 模式:

  • ❌ 输出的是“建议”
  • ❌ 不具备结构约束
  • ❌ 不保证一致性

SDD:

  • ✔ 输出的是“结构化规格”
  • ✔ 可拆解为 tasks
  • ✔ 可验证(verify)
  • ✔ 可迭代演进

🧠 5. 一句话总结

Plan 模式是“让 AI 想清楚这一轮怎么做”
SDD 是“让整个项目从一开始就结构化地被定义”

你可以这样类比:

  • Plan 模式 = 导航系统临时规划路线
  • SDD = 城市规划 + 建筑图纸 + 施工流程

🧩 结尾

vibe coding 的确很爽,尤其是在结合 plan 模式之后,很多小功能可以很快跑起来,甚至能做到“想到就写、写了就能用”的流畅体验。

但如果从更长周期的软件工程来看,问题也很明显:一旦项目变大、协作变多、迭代变频繁,代码风格、结构设计、边界处理很容易开始“各写各的”。一开始看起来是自由发挥,后面往往就变成维护灾难。

对于初学者来说,学习 SDD 确实是有成本的,就像小孩子学写字一样。你可以直接拿笔写,也能写出字,但如果没有字帖、没有楷书练习、没有基本结构训练,写出来的东西大概率就是“能看懂,但不统一”。甚至每个人都有自己的一套“自创草书”——包括我以前写的代码也是这样(笑)。

但问题在于:

写得出来 ≠ 写得可维护

SDD 的意义不在于限制创造力,而在于提供一个“统一的骨架”:

  • 让 AI 不至于自由发挥过度
  • 让项目结构保持一致
  • 让需求、设计、实现之间有清晰的映射关系
  • 让后期维护不会变成“读心游戏”

所以 SDD 的价值会在中大型项目中逐渐体现出来。

你依然可以 vibe coding,也可以用 plan 模式快速推进开发——这些都没问题。但当系统开始变复杂的时候,你会慢慢意识到:

真正难的不是“写出代码”,而是“让代码长期保持可理解”。

而 SDD 做的,就是把这个问题前置解决掉。

Logo

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

更多推荐