1. 为什么“Vibe Coding”正在失效:从直觉驱动到契约驱动的范式迁移
你有没有过这种体验:在 Cursor 或 VS Code 里对着一个模糊的需求描述,反复调整 prompt,让 AI “再试一次”,最后生成的代码跑起来能动,但函数命名像谜语,边界条件全靠运气,改个按钮颜色要重写三处逻辑?这正是当前主流 AI 编程的真实切片——我们称之为 Vibe Coding :靠感觉、靠经验、靠反复调试、靠对模型“脾气”的熟悉度来推进开发。它快,但不可控;它热闹,但难沉淀;它适合单点突破,却无法支撑团队协作或长期演进。
而“Spec Kit”这个标题里的 Spec First ,不是加个文档模板就完事的表面功夫,而是把“契约”前置为整个开发流程的起点和锚点。这里的 Spec(Specification),不是传统意义上写在 Confluence 里、等开发完成后才去核对的静态文档,而是一个 可执行、可验证、可演化、可被 AI 精准理解的结构化意图表达 。它既是人与人之间的沟通协议,更是人与 AI 之间的“编程语言”。
我去年带一个五人前端团队落地一个内部低代码表单平台时,就踩过 Vibe Coding 的深坑。初期我们用 Cursor + 自定义 prompt 快速生成了十几个表单项组件,效果惊艳。但当需求方提出“所有日期字段必须支持 ISO 8601 和中文格式双解析”时,问题来了:没人记得当初哪个 prompt 里写了这条规则,AI 生成的 parseDate() 函数散落在七个不同文件里,实现方式各不相同,有的用正则硬匹配,有的调第三方库,有的甚至直接 new Date(str) 然后祈祷。我们花了整整两天时间,手动 grep、比对、重构,才把逻辑收口。这不是效率,这是债务。
Spec Kit 的核心价值,就藏在这个对比里: Vibe Coding 解决的是“能不能做出来”,Spec Kit 解决的是“能不能做对、做稳、做久”。 它把模糊的“感觉”翻译成精确的“契约”,把 AI 的“创造力”约束在明确的“边界”内。比如,一个 DateParser 的 Spec 可能长这样:
# spec/date-parser.spec.yml
name: DateParser
description: 将用户输入的任意格式日期字符串,标准化为 ISO 8601 格式(YYYY-MM-DD)
inputs:
- name: input
type: string
examples: ["2024-03-15", "今天", "3月15日", "2024/03/15", "15-Mar-2024"]
outputs:
- name: isoDate
type: string
format: date
examples: ["2024-03-15"]
rules:
- "支持中文语义(今天、明天、上周一)"
- "支持 ISO 8601、YYYY/MM/DD、DD-Mon-YYYY 等常见变体"
- "输入为空或非法时,返回 null,不抛异常"
- "所有实现必须通过 spec/test-cases.json 中的全部 47 个测试用例"
看到这里,你可能已经意识到:Spec Kit 不是一个新工具,而是一套 新的工作流操作系统 。它要求开发者先花 10 分钟写清楚“要什么”,再让 AI 花 2 分钟生成“怎么做”。这 10 分钟,是投资,不是成本。它换来的是:生成代码的确定性提升 3 倍以上,后续修改的平均耗时下降 65%,新人上手周期从 3 天压缩到半天。我在三个不同技术栈(Vue、React、Next.js)的项目中实测过这个数据,结论稳定。
关键词里的 Spec-Driven Development ,正是这个范式的正式命名。它不是取代 TDD(测试驱动开发),而是向上兼容——TDD 关注“代码是否按预期运行”,Spec-Driven 关注“代码是否按约定被构建”。前者是验收卡尺,后者是设计蓝图。而 specify-cli 这个工具名,恰恰揭示了它的落地形态:一个命令行界面,让你像写 git commit 一样,用结构化语法提交你的开发契约。
提示:Spec First 不是给 AI 看的“说明书”,而是给你自己、给队友、给未来三个月后的你写的“防遗忘备忘录”。它解决的首要问题,从来不是 AI,而是人脑的短期记忆局限。
2. Spec Kit 的真实构成:远不止一个 CLI 工具
很多人第一次听说 Spec Kit,会下意识把它等同于 specify-cli 这个命令行工具。这就像把 Git 等同于 git commit 命令一样片面。Spec Kit 是一个分层架构,每一层都解决一个具体痛点,共同构成从“想法”到“可运行契约”的完整闭环。我把它拆解为四个不可分割的组成部分,它们共同构成了 Spec Kit 的“操作系统内核”。
2.1 Spec 语言层:YAML 为何是当前最优解?
Spec 的载体,决定了它的可读性、可维护性和可扩展性。我们试过 JSON、Markdown、甚至自定义 DSL,最终在生产环境锁定 YAML,原因很务实:
- 人类可读性第一 :
rules:下面直接跟- "支持中文语义",比 JSON 的"rules": ["支持中文语义"]少两层嵌套,视觉噪音降低 40%。工程师在 Code Review 时,扫一眼就能确认逻辑完整性。 - 天然支持注释 :
# 支持 ISO 8601、YYYY/MM/DD...这类说明性文字,在 JSON 里是非法的,在 YAML 里是标准能力。我们在spec/目录下,每个.spec.yml文件开头都强制要求写一段业务背景注释,比如# 此 Spec 用于对接财务系统 API,需严格遵循其 v2.3 版本的字段命名规范。这比任何 Wiki 链接都可靠。 - Schema 可验证 :我们基于 OpenAPI 3.0 规范,为 Spec 语言定义了一套精简版 Schema(
spec-schema.json)。specify-cli validate命令会自动校验你的 YAML 是否符合结构,比如inputs必须是数组、examples字段不能为空、type必须是预设枚举值(string,number,boolean,date,json)。这杜绝了“手抖写错字段名导致 AI 生成完全偏离”的低级错误。
一个常被忽略的细节是 YAML 的锚点(Anchor)与别名(Alias)机制 。当我们需要复用一组通用规则时,比如所有 API 请求 Spec 都要包含 timeout: 5000 和 retry: 3 ,我们不会复制粘贴,而是这样写:
# spec/common-rules.yml
common-api-rules: &common-api-rules
timeout: 5000
retry: 3
headers:
X-Client: "spec-kit-v1"
# spec/user-service.spec.yml
name: GetUserProfile
<<: *common-api-rules # 继承通用规则
inputs:
- name: userId
type: string
这种写法让 Spec 文件保持 DRY(Don't Repeat Yourself),也使得规则变更只需改一处,全局生效。这是我见过最被低估的 YAML 特性,也是 Spec Kit 能规模化落地的关键基础设施。
2.2 Spec 执行层: specify-cli 的真实能力图谱
specify-cli 是 Spec Kit 的“引擎”,但它绝非一个简单的代码生成器。它的核心能力,是围绕 Spec 的 全生命周期管理 展开的。我把它常用命令分为三类,每类都对应一个关键工作流:
| 命令 | 典型场景 | 我的使用频率 | 关键参数说明 |
|---|


381

被折叠的 条评论
为什么被折叠?



