1. 为什么选择SDD作为开发实践
第一次听说SDD(Specification-Driven Development)这个概念时,我正在为一个电商促销系统焦头烂额。需求文档改了7版,开发过程中还在不断调整业务规则,测试用例永远跟不上代码变更。直到团队引入SDD后,我才真正体会到什么叫做"用规范驱动开发"的爽快感。
SDD与传统的TDD(测试驱动开发)不同,它强调在编写任何代码之前,先通过机器可读的规范语言(如OpenAPI、AsyncAPI、JSON Schema等)明确定义系统的行为契约。这种开发模式特别适合现代分布式系统和微服务架构,在我们团队落地后,接口变更引发的线上事故直接归零。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SDD的核心工作流拆解
2.1 规范即单点真理(Single Source of Truth)
我们采用OpenAPI 3.0作为规范语言,在项目启动阶段就定义好所有API的:
- 端点路径和操作类型
- 请求/响应数据结构
- 错误码体系
- 安全认证方案
例如定义创建订单接口时,我们会先编写这样的规范:
yaml复制paths:
/orders:
post:
tags: [订单]
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/OrderCreateRequest'
responses:
'201':
description: 订单创建成功
content:
application/json:
schema:
$ref: '#/components/schemas/Order'
'400':
$ref: '#/components/responses/BadRequest'
这个规范文件会成为整个开发流程的基石,前后端、测试、文档都基于此展开工作。
2.2 开发阶段的"三明治"工作法
- 规范先行:业务分析师和架构师用Swagger Editor协作编写API规范
- Mock服务:通过prism等工具根据规范自动生成Mock服务器
- 并行开发:前端直接对接Mock,后端实现规范要求的行为
- 契约测试:使用Dredd等工具验证实现是否符合规范
我们在实践中发现,当规范足够完善时,前后端联调时间可以缩短80%以上。一个典型的指标是:原先需要2周的联调周期,采用SDD后平均只需2天。
3. 工具链的实战配置
3.1 规范校验与可视化
推荐使用以下工具组合:
- Swagger Editor:实时校验规范语法错误
- Stoplight Studio:可视化建模工具
- Speccy:规范文档质量检查(类似ESLint)
在package.json中添加的校验脚本示例:
json复制{
"scripts": {
"lint:spec": "speccy lint openapi.yaml --rules=default",
"serve:mock": "prism mock openapi.yaml",
"test:contract": "dredd openapi.yaml http://localhost:3000"
}
}
3.2 自动化文档发布
我们搭建的文档流水线包含:
- 规范变更触发GitHub Actions
- 自动生成Redocly静态文档
- 发布到内部文档中心
关键配置片段:
yaml复制# .github/workflows/docs.yml
steps:
- uses: Redocly/cli@v1.0.0
with:
command: build-docs openapi.yaml -o public/index.html
- uses: peaceiris/actions-gh-pages@v3
with:
publish_dir: ./public
4. 踩坑实录与效能提升
4.1 规范版本管理之痛
初期我们直接修改master分支的openapi.yaml,导致多次出现规范与实现不同步的问题。后来引入规范版本化方案:
- 每个迭代周期创建规范分支(如feat/checkout-v2)
- 通过$ref引用公共组件避免重复
- 合并时要求必须通过所有契约测试
4.2 性能规范的盲区
有一次上线后才发现某个批量查询接口没有定义分页参数,导致全表查询拖垮数据库。现在我们会强制要求:
- 列表接口必须包含limit/offset或page/size
- 响应中必须带分页元数据
- 在规范中明确标注性能预期(如<200ms)
4.3 规范与测试的黄金组合
我们发现最有效的实践是:
- 用规范生成测试用例骨架
- 补充业务逻辑测试
- 将测试用例作为规范示例(example)
例如在规范中定义:
yaml复制examples:
validOrder:
value:
items:
- productId: "123"
quantity: 2
couponCode: "SUMMER20"
然后测试代码可以直接引用这些示例数据,确保测试与规范始终保持一致。
5. 从SDD到Harness Engineering
随着实践深入,我们逐渐将SDD理念扩展到整个工程体系,形成所谓的"Harness Engineering":
- 基础设施即规范(Terraform模块化)
- 部署流程即规范(Argo Workflow模板)
- 监控指标即规范(Prometheus Recording Rules)
这种规范驱动的工程文化,让我们的发布频率从每月1次提升到每周3次,而线上故障率反而降低了60%。最让我意外的是,新成员 onboarding 时间从原来的2周缩短到3天——因为所有系统行为都明确定义在规范中,不再需要口口相传。
