1. 项目概述:从“感觉”到“规格”的研发范式跃迁
最近和几个技术VP、架构师朋友聊天,大家不约而同地提到了一个词:Vibe Coding。这个词直译过来是“氛围编码”或“感觉编码”,它精准地描述了过去几年里,很多团队在引入AI辅助编程工具(比如GitHub Copilot、Cursor、通义灵码等)后,开发流程发生的一种微妙变化。简单说,就是开发者不再完全依赖自己从零开始、严格遵循设计文档来写代码,而是更多地通过与AI的“对话”和“感觉”来驱动开发。你给AI一个模糊的指令,比如“帮我写一个用户登录的API”,AI就能生成一大段看起来能工作的代码。这种模式极大地提升了初期探索和原型构建的速度,让人感觉“氛围对了,代码就来了”。
然而,当我们将这种模式推向企业级、多人协作、长期维护的严肃研发场景时,问题开始集中爆发。生成的代码风格不一、边界条件缺失、安全漏洞潜伏、与现有架构格格不入……我们陷入了“快速生成,缓慢调试;短期爽快,长期还债”的怪圈。这促使我们思考:AI时代,企业研发的下一站是什么?我的答案是:Spec Coding,即“规格驱动编码”。这不是要抛弃AI,而是要为AI的创造力套上“缰绳”,用精确、可执行、可验证的“规格”(Specification)作为唯一的真相来源,驱动从需求到代码再到部署的完整闭环。今天,我就结合我们团队近一年的实战经验,拆解这套从Vibe Coding到Spec Coding的转型工程,分享一套可落地、可复用的企业级AI-SDD(AI-Specification Driven Development)实战框架。
2. 核心理念解析:为什么Spec Coding是企业研发的必然选择
2.1 Vibe Coding的“阿喀琉斯之踵”
Vibe Coding的核心问题在于其不确定性和不可控性。它的工作流通常是:开发者(或产品经理)有一个想法 -> 用自然语言描述给AI -> AI生成代码 -> 人工审查和修改。这个链条存在几个致命弱点:
- 自然语言的歧义性:“一个高性能的缓存服务”和“一个用户友好的登录界面”都是极其模糊的指令。AI基于其训练数据“猜”出来的实现,可能与你的业务上下文、技术栈约束、性能指标相去甚远。
- 缺乏可验证的中间产物:传统的瀑布模型或敏捷开发中,我们有需求文档、设计文档、API文档等作为不同角色间沟通和验证的基准。Vibe Coding跳过了这些,直接产出代码,导致“需求-实现”之间出现巨大的理解鸿沟,测试和验收缺乏依据。
- 知识无法沉淀和复用:每一次AI生成都是“一次性”的。即使这次生成了不错的代码,其中的设计决策、业务逻辑封装也无法系统地沉淀为团队资产。下次类似需求,又得重新“感觉”一遍。
- 协作与一致性灾难:在多人团队中,每个开发者都有自己的“Vibe”(感觉),与AI交互的提示词(Prompt)也千差万别。这必然导致代码库变成风格迥异、质量参差的“缝合怪”,大幅提升维护成本和系统风险。
2.2 Spec Coding的定义与核心价值
Spec Coding,即规格驱动编码,其核心思想是:将“规格”提升为研发流程中的一等公民。这里的“规格”是一个广义概念,它可以是:
- 机器可读的API定义:如OpenAPI Specification (Swagger)、gRPC Proto文件。
- 行为描述文件:如Cucumber的Gherkin语法(Given-When-Then)。
- 架构即代码:如使用HCL(Terraform)、Pulumi或AWS CDK定义的基础设施。
- 测试用例即规格:如JUnit/TestNG的测试方法,或更高级的基于属性的测试(PBT)规范。
- 领域特定语言:为特定业务领域设计的DSL,能精确描述业务规则。
Spec Coding的流程变为:定义精确规格 -> AI(或工具)根据规格生成/验证代码 -> 人工聚焦于规格设计和关键逻辑审查。
它的核心价值在于:
- 确定性:规格是唯一信源,消除了自然语言的歧义。
- 可自动化:机器可读的规格可以直接驱动代码生成、测试用例生成、文档生成、甚至部署流水线。
- 可协作:产品、开发、测试、运维基于同一份规格进行沟通,对齐认知。
- 可演进:规格本身作为资产被版本化管理,变更规格即驱动整个系统的变更,实现可控演进。
2.3 AI在Spec Coding中的新角色:从“创作者”到“执行者与协作者”
在Vibe Coding中,AI是模糊需求的“解读者”和代码的“创作者”,地位主动但不可控。在Spec Coding中,AI的角色发生了根本转变:
- 规格的辅助编写与校验者:AI可以帮助你根据自然语言需求,起草出结构良好的OpenAPI文档或测试用例,并检查规格的完整性和一致性。
- 基于规格的代码生成器:给定一份完整的API Spec,AI可以精准地生成符合团队规范、包含错误处理、日志、监控埋点的脚手架代码,一致性极高。
- 规格与代码的同步检查者:AI可以持续扫描代码库,检查实现是否偏离了已定义的规格,并提示差异。
- 测试数据的生成者:根据API Spec中的Schema,AI可以生成边界值、异常值等高质量的测试数据。
这个转变,正是AI-SDD(AI-规格驱动开发)的精髓:人类负责定义“做什么”(What)和“为什么”(Why),AI负责高效、准确地实现“怎么做”(How),并确保“做的”与“定义的”一致。
3. 企业级AI-SDD实战工程框架
理论说再多不如实战。下面我以构建一个“用户服务”模块为例,拆解我们团队落地的AI-SDD四层框架。
3.1 第一层:规格定义与治理
这是所有工作的基石。我们要求所有新建模块或重大迭代,必须先有规格,后有代码。
核心实践:OpenAPI First + 架构契约我们选择OpenAPI 3.0作为API规格的标准语言。不是因为它完美,而是因为它生态最成熟、工具链最全。操作流程如下:
- 协作编写Spec:产品经理、后端、前端、测试同学在设计阶段,共同在一个Git仓库的
specs/目录下,编写或迭代user-service.openapi.yaml。我们使用Swagger Editor或Stoplight进行可视化协作,避免直接手写YAML的低效。 - 嵌入架构与业务约束:在OpenAPI中,我们不仅定义路径、参数、响应,还通过
x-*扩展字段或规范的description,嵌入架构决策。paths: /users/{id}: get: summary: 获取用户详情 x-audience: internal # 扩展字段:标识该API为内部使用 x-cache-ttl: 60 # 扩展字段:缓存策略,60秒 security: - BearerAuth: [] parameters: - name: id in: path required: true schema: type: string format: uuid description: 用户UUID,必须符合RFC4122标准 responses: '200': description: 成功 content: application/json: schema: $ref: '#/components/schemas/UserDetail' '404': description: 用户不存在 content: application/json: schema: $ref: '#/components/schemas/Error' - 规格评审与版本化:Spec文件通过Pull Request提交,经历严格的代码评审。合并后,其版本通过Git Tag管理,并与服务版本关联。
实操心得:在Spec中强制要求对每个字段添加
description和example。这看似繁琐,但极大提升了AI生成代码和测试数据的质量,也是最好的活文档。
3.2 第二层:AI辅助的代码生成与脚手架
有了精确的Spec,AI生成代码就从“开盲盒”变成了“按图施工”。
工具链集成: 我们基于开源工具openapi-generator构建了内部模板,并与AI深度集成。
- 基础脚手架生成:执行命令
openapi-generator generate -i specs/user-service.openapi.yaml -g spring -o generated-code/,一键生成符合公司内部规范的Spring Boot控制器、模型类、接口等。 - AI增强生成:生成的脚手架代码是“骨架”。我们会将骨架代码连同Spec中相关的
description、业务规则注释,一起提交给配置了上下文的企业版Copilot或通义灵码,给出如下指令:“请基于以上OpenAPI规格和生成的Spring Boot控制器骨架,完成
UserController中getUserById方法的业务逻辑实现。需注意:1. 调用UserService的findById方法。2. 参数id需验证是否为有效UUID。3. 用户不存在时,抛出自定义异常UserNotFoundException。4. 按公司规范添加日志(使用SLF4J,INFO级别)。5. 方法需包含Javadoc注释。”
AI此时是在一个高度受限、上下文清晰的范围内工作,生成的代码质量、一致性和安全性远超Vibe模式下的自由发挥。
目录结构规范:
user-service/ ├── specs/ # 规格定义层 │ └── user-service.openapi.yaml ├── generated-code/ # 生成的脚手架(不直接修改) ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/example/user/ │ │ │ ├── api/ # 生成的API接口(可被继承) │ │ │ ├── controller/ # 手写的控制器(继承或使用生成的接口) │ │ │ ├── service/ │ │ │ └── repository/ │ │ └── resources/ │ └── test/ │ └── java/ └── pom.xml3.3 第三层:基于规格的自动化验证与测试
这是确保“代码符合规格”的关键防线,实现了测试的左移。
- 契约测试:使用Pact或Spring Cloud Contract。在服务提供方(User Service),根据OpenAPI Spec自动生成契约测试用例,验证自身实现是否符合契约。这些契约文件(如Pact的JSON文件)发布到Broker。服务消费方(Order Service)在集成测试中,从Broker获取契约并模拟提供方进行验证。AI在这里的作用是:根据Spec和生成的代码,自动补充边界情况、异常流的契约测试场景。
- API测试自动化:使用Postman或Schemathesis。将
user-service.openapi.yaml直接导入Postman,生成完整的请求集合。利用Schemathesis进行基于属性的测试,自动生成大量随机但符合Schema的请求,对API进行模糊测试,寻找边界缺陷。AI可以优化测试数据生成策略,使其更贴近真实业务场景。 - 集成测试生成:使用像Evidently这样的工具,AI可以读取OpenAPI Spec和代码,自动编写集成测试的骨架,开发者只需填充少量的Mock逻辑。
一个典型的CI/CD流水线集成点:
# .gitlab-ci.yml 或 Jenkinsfile 片段 stages: - spec-validate - generate - test - build spec-validate: stage: spec-validate script: - swagger-cli validate specs/*.openapi.yaml # 验证Spec语法 - spectral lint specs/*.openapi.yaml --ruleset .spectral.yaml # 自定义规则校验 generate-code: stage: generate script: - openapi-generator generate ... # 生成代码 artifacts: paths: - generated-code/ unit-test: stage: test script: - mvn test # 运行单元测试(包含AI辅助生成的测试) contract-test: stage: test script: - mvn pact:verify # 运行契约测试 api-fuzz-test: stage: test script: - schemathesis run --checks all specs/user-service.openapi.yaml --base-url http://localhost:80803.4 第四层:规格的持续演进与知识沉淀
规格不是一成不变的。业务在变,规格也要变。AI-SDD要求变更必须以规格变更为起点。
- 变更流程:任何API变更,必须先修改
specs/*.openapi.yaml,并通过PR评审。CI流水线会自动检测Spec变更,并:- 生成变更差异报告。
- 如果变更破坏兼容性(如删除字段、修改必填),流水线会失败并给出警告,要求明确版本升级策略(如Major Version bump)。
- 自动通知所有依赖该Spec的消费方团队。
- 知识图谱构建:我们将所有服务的OpenAPI Spec导入内部的开发者门户(基于Backstage或类似工具)。AI对所有这些Spec进行分析,自动构建服务间的调用关系图谱、数据模型图谱。新同学 onboarding 时,可以直接提问:“订单创建时,会调用哪些服务的什么API?参数是什么?” AI基于知识图谱给出精准回答。
- 架构治理与度量:基于全量的规格库,我们可以进行架构度量。例如,AI可以分析出:
- 是否存在循环依赖?
- 哪些API响应时间可能成为瓶颈?(通过分析Schema复杂度和关联关系)
- 整个系统的领域模型定义是否一致?(比如“用户状态”这个字段,在不同服务里枚举值是否统一?)
4. 落地挑战与实战避坑指南
从Vibe Coding切换到Spec Coding是一场研发文化的变革,我们踩过不少坑。
4.1 挑战一:思维转变与技能提升
最大的阻力来自人。习惯了“快糙猛”的开发者会觉得写Spec是负担,产品经理可能不习惯用结构化的方式描述需求。
应对策略:
- 自上而下推动:需要技术负责人坚定支持,将“Spec First”作为研发红线。
- 提供高效工具:提供Swagger UI、Stoplight等可视化编辑工具,降低编写门槛。编写Spec的体验应该优于直接写代码注释。
- 展示即时收益:组织内部Workshop,演示如何从一份Spec,在5分钟内生成可运行的服务骨架、API文档、客户端SDK和测试用例。用事实说服团队。
- 培训与赋能:开展OpenAPI规范、契约测试等专项培训,并设立内部专家角色提供支持。
4.2 挑战二:Spec的维护成本与“僵尸Spec”
Spec一旦过时,比没有Spec更可怕,因为它传递错误信息。
应对策略:
- 流水线卡点:在CI中集成
openapi-diff等工具,确保实现代码的变更如果涉及API,必须同步更新Spec文件,否则构建失败。 - 契约测试作为守护神:契约测试能有效发现实现与Spec的偏差,确保Spec的活性。
- 将Spec作为唯一信源:所有文档、客户端SDK都从Spec自动生成,杜绝多头维护。当大家发现修改Spec是更新文档最快捷的方式时,积极性就高了。
4.3 挑战三:工具链的整合与选型
开源工具很多,但如何串联成一个流畅的流水线需要投入。
我们的选型参考:
- Spec编写与协作:Stoplight Studio(商业版体验好)或Swagger Editor(开源)。
- 代码生成:OpenAPI Generator(模板灵活,社区活跃)为主,辅以AI编码助手进行细节填充。
- 契约测试:Pact(多语言支持好,生态成熟)或Spring Cloud Contract(Spring生态原生)。
- API测试:Schemathesis(基于属性的模糊测试) +Postman(集合运行与监控)。
- 文档与门户:Swagger UI/Redoc(嵌入项目) +Backstage(公司级门户)。
避坑指南:不要追求大而全的一次性整合。建议采用“爬-走-跑”策略:先在一个试点项目强制推行OpenAPI First和基础代码生成,跑通流程;再引入契约测试解决协作问题;最后构建知识门户和治理度量。每一步都让团队看到切实收益。
4.4 挑战四:对现有存量系统的改造
对于庞大的遗留系统,从头编写Spec工程量巨大。
渐进式改造策略:
- 逆向生成:使用
swagger-core等注解库,或像springdoc-openapi这样的工具,从现有代码中逆向生成初始的OpenAPI Spec。这虽然可能不完美,但提供了一个起点。 - 新需求驱动:规定所有新增或重大修改的API必须符合Spec First流程。存量API在下次被修改时,必须补全Spec。
- 接口隔离:通过API网关,将规范的“新API”和杂乱的“老API”在路由层面进行一定隔离,逐步迁移。
5. 效果度量与未来展望
推行AI-SDD大半年后,我们通过几个关键指标看到了积极变化:
| 指标 | Vibe Coding时期 | Spec Coding时期 | 说明 |
|---|---|---|---|
| API设计缺陷泄漏到测试阶段的比例 | ~35% | <10% | 在Spec评审阶段就发现了大量歧义和设计问题 |
| 跨团队接口联调平均耗时 | 3-5人日 | 0.5-1人日 | 契约测试和清晰的Spec减少了大量沟通和调试成本 |
| 客户端SDK更新及时性 | 滞后,常不同步 | 随服务发布自动同步 | 从Spec自动生成各语言SDK,并发布到包仓库 |
| 后端代码重复率 | 较高 | 显著降低 | 统一的Spec和生成模板促进了模型和逻辑复用 |
| 新成员上手第一个任务耗时 | 1-2周 | 2-3天 | 清晰的规格和知识门户大幅降低了理解成本 |
未来,我们认为Spec Coding会进一步与AI深度融合,走向“意图即规格”。也许不久的将来,产品经理用自然语言描述的需求,能被AI实时转化为结构化的、可执行的规格草案,开发者与AI在规格层面进行交互和确认,然后由AI生成近乎最终版本的、高质量的代码。研发的焦点将彻底从“如何实现”转移到“定义什么”和“为何这样定义”上。
这条路并不轻松,它要求团队具备更强的抽象能力、设计能力和协作规范。但它的回报是巨大的:一个更可控、更高效、质量更可预测的研发体系。从Vibe Coding到Spec Coding,是从“手工作坊”到“精密工程”的必然升级。如果你也在思考如何让AI在企业研发中发挥最大价值,不妨从尝试“Spec First”开始,先为AI的创造力画好跑道。