Skip to content

编写优质规范

你很少会从空白页面开始编写规范。你只需用平实的语言描述变更,/opsx:propose 就会自动起草需求和场景,之后你再将其打磨完善。本文聚焦于最后一步——明确“优质规范”的标准,以及如何引导AI产出符合要求的草稿。本文是审查变更的配套文档:审查是找出草稿中的薄弱点,而编写则是明确一份扎实的规范应该具备哪些要素。

规范描述行为,而非代码

规范描述的是系统做什么,是任何人都可以核查的行为说明,而非系统的构建方式。规范由需求(行为声明)和场景(证明需求成立的具象示例)两部分组成。

markdown
### 需求:会话超时
系统 SHALL 在会话闲置30分钟后将其过期。

#### 场景:闲置超时
- GIVEN 一个已认证的会话
- WHEN 会话闲置30分钟无任何活动
- THEN 会话失效,用户必须重新认证

实现细节(比如队列、依赖库、表结构)请保留在 design.md 或代码中。当行为与实现被混入同一个需求时,该需求将不再可测试,且会在代码变更的瞬间就变得过时。

优质需求的构成

优质需求是对单一行为的声明,表述足够直白,你可以把它交给其他人直接进行测试。

  • 一条声明,一个 SHALL/MUST 如果一个需求包含三个“此外还有”的从句,那它实际上就是三个需求,需要拆分。

  • 可观测。 非代码相关人员也能判断该需求是否成立。“系统 SHALL 在上传文件超过10MB时显示错误横幅”是可观测的;“系统 SHALL 优雅处理大文件上传”则不是。

  • 合适的强度。 OpenSpec 使用RFC 2119定义的关键词,不同关键词的含义不同:

    关键词含义
    MUST / SHALL强制性要求,没有协商余地。
    SHOULD强烈建议,但在有合理理由的情况下可以例外。
    MAY真正可选。

    默认优先使用 MUST/SHALL。只有当你确实想表达“除非有充分理由否则必须遵守”时,才使用 SHOULD

需求的检验标准是:从未接触过代码的测试人员能否判断该需求是否通过? 如果答案是否定的,说明需求需要进一步打磨。

优质场景的构成

场景是需求发挥价值的地方。每个场景都是具体的 GIVEN / WHEN / THEN 结构,可以直接转化为自动化测试。

  • 覆盖对应需求。 只是用其他措辞复述需求的场景没有任何测试价值,需要将其设定为带有明确结果的具体情境。
  • 覆盖关键场景,而非仅覆盖正常流程。 合法的登录场景很容易编写,但空输入、过期令牌、重复点击、异常情况才是bug的藏身之处,也是场景价值最高的地方。
  • 在标题中明确场景名称。 “场景:拒绝过期令牌”能让审查者一眼看出覆盖的内容,而“场景:测试2”则做不到。

一个好习惯:在批准变更前,先问自己“如果哪个场景出问题我会最不满?” —— 并确保该场景已经被明确命名覆盖。

选择合适的变更类型

变更通过三种章节类型描述对规范的修改,选择正确的类型才能保证归档后的规范准确可信:

  • ## ADDED Requirements — 此前不存在、全新添加的行为。
  • ## MODIFIED Requirements — 已存在、正在变更的行为。需要包含完整的新版本内容;附上一句简短的变更说明能帮助审查者快速理解。
  • ## REMOVED Requirements — 即将移除的行为,需要说明移除原因。

归档时,ADDED 内容会被追加到主规范中,MODIFIED 会替换旧版本,REMOVED 则会被删除。如果把真实变更标记为 ADDED,最终会出现两条冲突的需求;如果把新行为描述为 MODIFIED,则没有可替换的旧内容。如有疑问,打开当前规范查看该需求是否已经存在即可。

控制变更规模

编写规范时最常犯的错误不是措辞糟糕的需求,而是一个变更试图涵盖三个变更的内容。优质变更只有一个核心意图,可以用一句话说清楚。 比如“添加深色模式切换开关”“对登录接口做速率限制”“将会话存储从Cookie迁移走”。如果描述变更时需要大量使用“此外还有”,这就是需要拆分的信号。

变更过大的迹象:

  • 提案的范围看起来像是一系列不相关的功能列表。
  • 审查这个变更需要整整一个下午,没人愿意做。
  • 两个人无法同时协作开发,会产生冲突。
  • 一半的任务可以独立交付。

更小的变更更容易审查,更容易在一次专注的开发会话中完成,也更容易在六个月后只剩归档内容时快速理解。你完全可以并行推进多个变更——详见编辑与迭代工作流

反过来也会出现过度设计的情况:修复一行拼写错误不需要写三条需求加一份设计文档。流程的复杂度要和变更的影响范围匹配。

如何引导AI产出优质草稿

由于 /opsx:propose 负责生成初稿,你得到的结果质量和你输入的内容质量直接相关。你不需要手动编写需求,只需要精准引导AI即可:

  • 明确意图和边界。 “添加深色模式切换开关,首次加载时跟随系统设置——不要修改现有的主题API。” 范围外的要求和范围内的要求同样重要。
  • 明确你关心的场景。 “确保覆盖手动选择过主题的用户的场景。” AI只会覆盖你指出的内容。
  • 然后编辑。 规范就是普通的Markdown格式,你可以收紧模糊的 SHALL 表述,删除没有测试价值的场景,补充它遗漏的用例——也可以直接要求AI修改:“超时需求的表述太模糊,把它明确为30分钟。”

起草、打磨、重复。经过几轮这样的操作,就能产出一份你信得过的规范,这就是整个流程的意义所在。

快速检查清单

  • [ ] 每个需求都是带有 SHALL/MUST 的可观测行为。
  • [ ] 需求中没有嵌入实现细节。
  • [ ] 每个需求至少有一个能真正覆盖它的场景。
  • [ ] 重要的边界和异常场景都有对应场景,而非仅覆盖正常流程。
  • [ ] 变更类型(ADDED/MODIFIED/REMOVED)相对于当前规范的使用是正确的。
  • [ ] 整个变更只有一个可以用一句话说清楚的核心意图。

下一步阅读