跳转至

规格先行

先固定问题,再讨论实现。

规格先行(Spec First)是 Vibe Coding 最重要的习惯。在让 AI 写任何代码之前,先用自然语言把问题边界写清楚。这一步通常只需要 5 分钟,却能避免 80% 的跑偏和返工。

为什么需要规格

AI 模型非常擅长"完成任务",但它不知道你真正想要什么——除非你告诉它。

没有规格时,AI 会做出合理但错误的假设:

  • 你说"加个搜索功能",它可能实现了全文搜索,但你只需要按名称过滤
  • 你说"优化这个函数",它可能重写了整个模块,但你只想改一个算法
  • 你说"修复这个 Bug",它可能改了症状,但没有修复根因

规格的作用是提前约束改动边界,让 AI 的"合理假设"和你的预期对齐。

一个可执行规格应包含

字段 说明 示例
目标行为 完成后系统应该做什么 用户点击"用 GitHub 登录"后跳转到 OAuth 授权页
不做什么 明确排除的内容 不新增后端接口,不修改现有用户表结构
输入和输出 数据流的起点和终点 输入:GitHub OAuth token;输出:session cookie
影响范围 可以修改哪些文件 只改 src/auth/ 和登录页组件
验证方式 怎么确认完成了 运行 pnpm test auth 和手动走一遍登录流程
已知风险 可能出问题的地方 GitHub OAuth 回调 URL 需要在开发环境配置

不是每个规格都需要填满所有字段。简单任务可以只写前三项;复杂任务或安全敏感改动需要全部填写。

示例对比

模糊请求(容易跑偏):

帮我加个 GitHub 登录

可执行规格(边界清晰):

目标:为登录页增加 GitHub 登录按钮,点击后走 OAuth 流程,成功后写入 session。
范围:只改 src/auth/providers.ts 和 src/pages/login.tsx,不新增后端接口。
约束:沿用现有按钮样式(Button 组件)和 loading 状态逻辑。
验证:运行类型检查和登录页组件测试,手动验证 OAuth 回调正常。
风险:本地开发需要在 .env.local 配置 GITHUB_CLIENT_ID。

第二个版本让 AI 知道:改哪里、不改哪里、用什么风格、怎么验证。

规格的粒度

规格不需要写成需求文档。一段话就够,关键是覆盖边界。

  • 太粗:没有约束,AI 自由发挥
  • 刚好:覆盖目标、范围、验证,AI 有足够信息做决策
  • 太细:变成伪代码,失去 AI 的价值

判断标准:读完规格后,你能预测 AI 会改哪些文件吗?如果能,规格就够了。

规格先行的时机

不是所有任务都需要完整规格。以下情况必须先写规格:

  • 改动涉及多个文件或模块
  • 任务有明确的"不做什么"
  • 安全、权限、数据库相关改动
  • 团队协作时需要对齐理解

以下情况可以简化:

  • 单文件的小改动(修个拼写、调个样式)
  • 探索性的原型(先跑起来再说)