ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SDD规范驱动开发:用可执行剧本驯服AI编程

SDD规范驱动开发:用可执行剧本驯服AI编程 1. “Vibe Coding”不是玄学是失控前的预警信号最近两周我连续帮三个团队做AI编程落地咨询其中两个项目在第三天就卡死——不是模型不响应不是API调不通而是开发组长盯着满屏自动生成的代码突然说“这玩意儿……好像在自己编故事。”这话听着荒诞但背后是真实发生的系统性脱轨需求没变PRD还在飞书文档里躺着可AI生成的模块已经悄悄把“用户登录”改成了“OAuth2.0JWTRedis Token黑名单设备指纹绑定”而原始需求只写了“手机号验证码登录”。更离谱的是另一个团队让AI基于“做一个内部报销审批流程”生成代码结果产出里硬塞进了RabbitMQ消息重试、Saga分布式事务补偿、以及一套完整的审计日志链路追踪——需求文档里连“审批通过后发邮件”都没提。这就是“Vibe Coding”正在发生的真相它根本不是什么新潮编程范式而是缺乏约束的AI生成行为在工程现场的具象化崩塌。所谓“vibe”本质是开发者用模糊提示词比如“写个好用的API”“做个酷炫的前端”触发AI自由发挥再靠人工肉眼筛出可用片段的临时工作流。它和“剧本”之间不是风格差异而是有无工程底线的分水岭。你可能听过“SDDSpec-Driven Development”这个词——它不是新概念而是把“先写清楚要做什么”这件事从口头约定升级为可执行、可验证、可追溯的工程契约。当热词榜单里“vibe coding 技巧”和“sdd六步实践指南”并列出现时恰恰说明行业已集体意识到靠感觉喂AI迟早被AI反向驯化。我见过最典型的翻车案例是一个电商促销活动页开发。团队用“vibe coding”方式让AI生成首页Banner轮播组件提示词是“用React写个现代感强的轮播图”。AI交出的代码里不仅实现了自动播放、手势滑动、渐变过渡还顺手加了WebGL粒子特效和Lottie动画加载状态——而产品需求文档里明确写着“适配iOS 14首屏加载时间1.2秒禁用任何第三方动画库”。最终这个“现代感强”的轮播图导致页面白屏3秒上线当天被紧急回滚。提示所有标榜“零配置”“直觉式交互”的AI编程工具其底层逻辑都默认你已具备完整上下文。但现实是90%的日常开发场景里上下文恰恰是碎片化的、未结构化的、甚至相互矛盾的。AI不会主动追问“你指的‘快’是渲染帧率还是网络请求耗时”它只会按概率分布选一个最“合理”的答案——而这个答案在工程语境下往往就是最危险的答案。所以“必须先写剧本”不是给AI加枷锁而是给开发者抢回控制权。这个“剧本”不是Word里一页纸的需求描述而是能被机器解析、被团队对齐、被测试覆盖的最小可行契约。它解决的从来不是“AI会不会写代码”而是“我们敢不敢让AI写的代码直接进生产环境”。2. 剧本不是文档是可执行的工程契约很多人一听到“写剧本”第一反应是打开Word新建文档敲下“需求背景……”“功能描述……”。这恰恰是翻车的起点——因为这种文档对AI毫无意义。AI无法理解“用户体验流畅”这种主观描述也无法将“支持高并发”翻译成具体的QPS阈值或缓存策略。真正的“剧本”必须满足三个硬性条件可解析、可验证、可追溯。它不是给人看的是给AI、测试框架、CI/CD流水线共同消费的中间语言。我给客户落地SDD时强制推行的“剧本”模板只有三部分且全部用Markdown语法结构化2.1 接口契约用OpenAPI 3.0定义而非自然语言描述错误示范“用户登录接口返回token和用户信息”。正确写法paths: /api/v1/auth/login: post: summary: 用户手机号验证码登录 requestBody: required: true content: application/json: schema: type: object properties: phone: type: string pattern: ^1[3-9]\\d{9}$ code: type: string minLength: 6 maxLength: 6 responses: 200: description: 登录成功 content: application/json: schema: type: object properties: token: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... user_id: type: integer example: 12345 expires_in: type: integer example: 3600 400: description: 验证码错误或手机号格式不正确为什么必须用OpenAPI因为AI工具如GitHub Copilot Enterprise、Tabnine Enterprise能直接解析YAML中的pattern正则、example示例、type类型约束并据此生成带输入校验、类型断言、错误码映射的代码。而“返回token”这种描述AI大概率会生成一个裸字符串返回后续调试时才发现前端拿不到user_id字段。2.2 行为契约用Gherkin语法描述业务规则而非功能列表错误示范“订单支付成功后库存扣减发送短信通知”。正确写法Feature: 订单支付完成后的库存与通知处理 Scenario: 支付成功且库存充足 Given 库存服务中商品ID1001的剩余库存为50 When 用户支付订单IDORD-2024-001成功 Then 库存服务应扣减商品ID1001的库存1件 And 短信服务应发送内容为您的订单已支付成功的短信至138****1234 And 订单状态应更新为paid Scenario: 支付成功但库存不足 Given 库存服务中商品ID1001的剩余库存为0 When 用户支付订单IDORD-2024-002成功 Then 库存服务不应扣减任何库存 And 短信服务不应发送任何短信 And 订单状态应更新为payment_failed And 系统应记录错误日志库存不足订单IDORD-2024-002Gherkin的Given-When-Then结构强制把模糊的“支付后处理”拆解成可穷举的状态转移。AI生成代码时会严格遵循Then后的断言自动生成库存扣减的原子操作、短信发送的幂等校验、失败路径的日志埋点。更重要的是这套契约可直接导入Cucumber或Playwright变成自动化测试用例——AI写的代码必须通过这些用例才能合入主干。2.3 约束契约用JSON Schema定义非功能性要求而非口号式声明错误示范“系统要高性能”“代码要可维护”。正确写法{ performance: { api_latency_p95: 200ms, db_query_time_p95: 50ms, cache_hit_rate: 95% }, security: { password_hash_algorithm: bcrypt, jwt_expiration_seconds: 3600, cors_allowed_origins: [https://app.example.com] }, observability: { required_metrics: [http_request_duration_seconds, db_query_count], log_level: INFO, trace_sampling_rate: 0.1 } }这些约束会直接注入AI的System Prompt。例如当AI生成数据库查询代码时看到db_query_time_p95:50ms就会主动避免N1查询优先选择JOIN或预加载看到cache_hit_rate:95%会在关键查询前插入Redis缓存层并生成缓存失效逻辑。没有这个契约AI默认按“功能正确性”优先性能、安全、可观测性全靠开发者后期补救——而这正是vibe coding最常翻车的雷区。注意这三个契约模块必须放在同一个Git仓库的/spec目录下且版本号与代码分支严格对齐。我见过太多团队把“剧本”存在Confluence里结果AI读取的是半年前的旧版OpenAPI生成的DTO字段名和后端实际返回完全不一致。契约的生命力只存在于代码仓库的提交历史中。3. 从“喂提示词”到“喂剧本”AI编程工作流重构实录把“写剧本”当成额外负担是vibe coding思维残留的典型症状。实际上SDD不是增加步骤而是把原本分散在会议、IM聊天、口头确认里的隐性共识显性化为可复用的机器指令。我带的一个金融风控团队重构AI编程工作流后单个需求平均交付时间从5.2天缩短到3.1天——关键不在AI写得更快而在返工率从37%降到4%。以下是他们落地的四步实操链路每一步都对应一个具体工具链和避坑点。3.1 需求到剧本用VS Code插件实时生成结构化契约传统流程产品经理写PRD → 开发看PRD → 自行脑补技术细节 → 写代码 → 联调发现理解偏差。SDD流程产品经理在飞书文档中标注需求关键词 → 开发用VS Code插件SpecFlow Assistant一键提取 → 自动生成OpenAPI草案/Gherkin场景/约束JSON。这个插件的核心能力是把自然语言需求自动映射到结构化字段。例如PRD中写“用户首次登录需强制修改初始密码”插件会识别出POST /api/v1/auth/first-login接口路径password_change_required: true响应字段Scenario: First login triggers password change flowGherkin场景security.password_must_contain_uppercase: true约束实测心得插件对“必须”“禁止”“不超过”等强约束词识别率高达92%但对“建议”“尽量”“优化体验”等弱约束词会跳过。这是故意设计——SDD只处理可验证的契约模糊地带必须拉会确认不能交给AI猜。3.2 剧本到代码Copilot Enterprise的Prompt Engineering实战很多团队以为接入Copilot就等于SDD结果发现AI依然乱写。问题出在Prompt设计上。我们给Copilot配置的System Prompt长这样You are a senior backend engineer at a fintech company. Your task is to generate production-ready code based ONLY on the provided spec files in /spec directory. Rules: 1. NEVER invent new endpoints, fields, or business rules not defined in OpenAPI.yaml 2. ALWAYS implement Gherkin scenarios as unit tests using Jest, with exact Given/When/Then assertions 3. For performance constraints: use Redis cache for all GET /api/v1/* endpoints, add Cacheable annotation 4. For security constraints: hash passwords with bcrypt before saving, validate JWT signature with HS256 5. If spec is ambiguous (e.g., missing error code for 404), ask for clarification — DO NOT guess关键点在于把约束转化为AI可执行的指令而非道德呼吁。“不要乱写”是无效指令“必须用Cacheable注解”才是有效指令。我们做过对比测试同样需求用通用Copilot生成代码平均需要人工修改17处才能过CI用定制Prompt生成85%的代码一次通过单元测试剩余15%主要是边界case遗漏修改集中在3处以内。3.3 代码到验证CI流水线自动校验契约符合度剧本的价值只有在代码提交时被强制校验才真正落地。我们在GitLab CI中配置了三道卡点OpenAPI校验swagger-cli validate ./spec/openapi.yaml确保YAML语法正确且无未定义引用契约覆盖率扫描用自研脚本spec-coverage分析代码报告“Gherkin场景中定义的5个Then断言当前代码仅实现3个”约束合规检查grep -r bcrypt src/ | wc -l确认密码哈希存在grep -r Cacheable src/ | wc -l确认缓存注解存在。最狠的一招是任何未通过校验的MR自动拒绝合并。曾有个开发者想绕过约束手动删掉Cacheable注解结果CI直接报错“Constraint violation: performance.cache_hit_rate requires Cacheable on all GET endpoints”。他不得不回去补上——这比开会批评十次都管用。3.4 剧本到演进用Git Blame追踪契约变更影响当需求变更时“剧本”不是被覆盖而是被版本化。例如某次迭代要求“短信通知增加渠道优先级”我们不是改旧Gherkin文件而是新建/spec/v2.1/payment-notification.feature新增ScenarioScenario: SMS notification with channel priority Given SMS channel priority is set to high When payment succeeds Then SMS should be sent within 100ms在CI中加入跨版本比对diff -u /spec/v2.0/*.feature /spec/v2.1/*.feature | grep Then自动生成变更影响报告——本次更新涉及3个接口的响应时间约束调整需同步修改缓存策略。这种机制让每个代码变更都能回溯到具体的契约条款。某次线上故障运维查到是/api/v1/order/status接口超时我们直接git blame spec/openapi.yaml定位到两周前某次“提升查询性能”的契约变更发现误将cache_ttl从300秒改成30秒导致缓存击穿——问题5分钟内定位10分钟修复。4. Vibe Coding的残余价值如何把它驯化成SDD的加速器否定vibe coding不等于否定它的全部价值。就像手工焊接不会因自动焊机出现而消失vibe coding在特定场景下仍是高效工具——关键在于划定它的合法边界并用剧本为它筑起护栏。我在三个真实场景中把vibe coding从“主力引擎”降级为“特种兵”效果远超预期。4.1 场景一探索性原型开发——用vibe coding快速验证技术可行性某次要做“实时交易风控决策引擎”不确定Flink CEP和Kafka Streams哪个更适合低延迟场景。传统方案是写详细技术方案再评审耗时一周。我们改用vibe coding提示词“用Flink CEP写一个demo监听Kafka topic trades当同一用户1秒内成交金额10万时触发alert输出到topic alerts”AI 3分钟生成完整Flink Job代码包含Kafka Source/Sink、CEP Pattern、Alert实体类我们直接运行测出P95延迟为87ms满足要求这里vibe coding的价值是用最小成本验证技术假设。但注意这个demo代码绝不进生产它只用于生成最终的SDD剧本——我们将验证结果写入/spec/v2.2/risk-engine.feature“Flink CEP实现CEP Pattern匹配P95延迟100ms”后续所有生产代码必须严格遵循此契约。4.2 场景二重复性样板代码生成——用vibe coding消灭机械劳动微服务项目中每个新服务都要写Controller/Service/Repository三层还要配Swagger、健康检查、Metrics暴露。这些代码高度模式化但手写极其枯燥。我们的做法是先用SDD定义样板契约/spec/template/microservice.yaml明确要求controller: swagger_tags: [user-service] health_check_endpoint: /actuator/health metrics: prometheus_exporter: true custom_metrics: [request_count, error_rate]再用vibe coding提示词“根据microservice.yaml契约生成Spring Boot 3.x的User Service样板代码包含Controller/Service/Repository用Lombok用JPA”AI生成代码后CI自动校验grep Tag src/main/java/.../controller/UserController.java确认Swagger标签存在curl http://localhost:8080/actuator/health确认健康检查端点可用此时vibe coding成了“契约驱动的代码生成器”它不再决定业务逻辑只负责把已知契约翻译成标准代码结构。我们统计过样板代码生成时间从2小时/服务降到8分钟/服务且零错误。4.3 场景三技术债清理——用vibe coding辅助重构而非替代重构一个遗留系统有200个SQL拼接的DAO方法急需迁移到MyBatis。全手动重写不现实。我们的方案是先用SDD定义迁移契约/spec/v3.0/mybatis-migration.md规定所有DAO方法必须使用Select/Update注解禁止XML文件SQL中禁止字符串拼接参数必须用#{}每个方法必须有对应单元测试覆盖空结果集、单条记录、多条记录三种场景再用vibe coding处理单个方法提示词“将以下JDBC DAO方法迁移到MyBatis遵守上述契约public List findUsersByStatus(String status) { ... }”AI生成MyBatis代码后人工只做两件事检查SQL是否真的用了#{status}运行单元测试是否通过结果200个DAO方法3天内完成迁移测试通过率100%。vibe coding在这里的角色是把开发者从体力劳动中解放出来专注在契约校验和测试验证上——这才是人该干的活。经验总结vibe coding的黄金法则是“永远让AI在契约划定的格子里画画而不是让它自己画格子”。一旦发现AI开始解释需求、补充功能、优化体验立刻打断——这不是AI聪明是它在越界。真正的生产力来自人类定义边界的能力而非AI突破边界的勇气。5. 团队协作中的剧本落地从对抗到共生的组织转型技术方案再完美如果团队不买账终究是空中楼阁。我们帮某中型SaaS公司落地SDD时最大的阻力不是技术而是工程师的文化抵触“写剧本那不是产品经理的事吗”“每次改需求都要改三份文件太慢了”——这些声音背后是根深蒂固的“编码即创造”认知。破局的关键不是说服而是用数据重构工作价值认知。5.1 用“返工成本可视化”打破认知盲区我们做了个简单实验随机抽取上周10个MR统计每项的“返工时间”。结果触目惊心MR编号功能描述返工原因返工耗时小时MR-101用户注册邮箱验证前端传参字段名与后端API定义不一致4.5MR-102订单导出Excel未按PRD要求包含“创建时间”列且日期格式错误2.0MR-103支付回调处理未处理重复回调导致订单重复扣款18.0MR-104商品搜索排序默认排序规则与产品文档冲突未提供排序参数3.5MR-105短信模板管理未按安全规范对模板内容做XSS过滤6.0总返工时间34小时。而写剧本的平均耗时是每个MR 1.2小时。这意味着团队每周浪费近1天在本可避免的返工上。我把这张表贴在茶水间配上一行字“你写的每一行代码都在为别人的返工买单。”——第二天就有工程师主动来问剧本模板怎么用。5.2 设计“剧本贡献度”指标重塑绩效评价技术团队最反感形式主义所以SDD的考核必须和真金白银挂钩。我们和HR一起设计了新指标契约完备率MR中引用的OpenAPI/Gherkin/JSON Schema文件是否100%覆盖需求点由CI自动计算契约变更追溯率MR描述中是否包含Fixes #SPEC-2024-001这类关联IDGit自动提取AI生成代码采纳率CI报告中AI生成代码的单元测试通过率95%为A级最妙的是第三项当AI生成的代码一次通过测试开发者获得双倍积分若需人工修改积分按修改行数扣减。这倒逼开发者认真写剧本——因为剧本越精准AI产出越可靠自己的绩效越高。三个月后团队AI代码采纳率从32%升至89%而人均MR数量反而增加17%。5.3 建立“剧本守护者”角色让SDD成为团队肌肉记忆SDD不能只靠流程驱动必须有人持续守护契约质量。我们没设专职岗位而是采用“轮值制”每周由一名资深工程师担任“剧本守护者”职责包括审核所有新提交的剧本文件确保语法正确、约束可验证、场景无遗漏主持每日15分钟“契约站会”每人用1句话说明今天写的代码对应哪个剧本条款例“我写的OrderService.cancel()对应/spec/v2.1/order-cancellation.feature第3个Scenario”维护《常见契约陷阱手册》记录典型错误如“用‘可能’描述业务规则导致AI忽略该路径”“未定义错误码导致AI默认返回500”这个角色不增加工作量却让SDD从制度变成习惯。有位刚入职的应届生分享“第一天写代码导师没让我看代码规范而是让我先读/spec目录下的README。他说读懂剧本比读懂代码重要十倍。”最后分享个真实细节该公司CTO在季度OKR汇报中把“SDD落地”列为最高优先级目标但KPI不是“剧本覆盖率”而是“因契约缺失导致的线上事故数”。上季度这个数字是0——而去年同期是3起。当技术决策的成败直接映射到业务损失时所谓的“文化阻力”自然烟消云散。
返回列表