干应用开发这些年,我自己沉淀了一套 BMAD 方法,一路迭代到 v6,正好赶上 AI 编程助手的成熟期。以前我一直把 Copilot 当“自动补全器”用,它给我建议代码片段,我来改,用完就关,感觉就是个高级插件。后来我发现,如果方法论和工具之间的关系只是“你补一句、我抄一段”,那效率提升非常有限。真正能拉开差距的,是把方法论本身嵌进 AI 的上下文里,让 Copilot 在需求建模、任务拆解、代码实现、测试验证这些环节都参与进来,而不是只在编辑器里等光标。
这篇文章不是工具功能介绍,也不是方法论的基础科普,而是我实际跑了三个迭代之后总结的一套配合打法。适合正在做应用开发、希望让 AI 编程助手不再是“边缘插件”、而变成团队里一个靠谱协作者的人。如果你已经有 Copilot 类工具,但对它的使用还停留在补全函数、写单测这种零散操作,那这篇内容应该能给你不少可以直接抄作业的模板。
1. BMAD 方法 v6 的核心逻辑与协同切入点
BMAD 是我自己整理的一套以业务模块化为核心的应用开发方法,全称是 Business Modular Agile Development,直译过来就是“业务模块化敏捷开发”。v6 不是简单加了个版本号,而是针对人机协作场景重做了一次底层假设。在 v5 及更早版本里,我的流程是需求文档、架构设计、编码、测试、上线的线性推进,人脑负责所有上下文,AI 只是编码阶段的辅助工具。但 v6 的出发点变成了:如果 AI 要在整个研发链路里发挥作用,那上下文就不能只存在人脑子里,必须显式化、结构化、可被工具读取。
1.1 从版本迭代看 BMAD v6 的关键变化
v6 重点引入了三个概念:上下文契约、能力单元、验证证据链。
上下文契约是指每个开发任务在启动前,需求方、开发方、测试方(包括 AI 协作者)必须共享一份对业务目标、约束条件、验收标准的明确描述。这份描述不是传统意义上几十页的 PRD,而是精简到一页以内的卡片式文档,可以放到项目仓库的固定目录里。
能力单元则是比“功能模块”更小、更内聚的拆分单位。传统模块可能是一个订单服务、一个支付网关,但能力单元更接近“可独立演进、可独立验证的一组行为”。比如“订单状态流转”是一个能力单元,“订单批量导出”是另一个能力单元,它们可以有共同的底层数据模型,但各自拥有独立的验收测试。
验证证据链是 v6 对交付质量的约束,意思是每个能力单元在交付时必须附上一串可回溯的证据,包括需求卡片、任务拆解记录、核心代码实现、测试用例、运行结果截图或日志。以前我会觉得这是额外负担,但和 AI 协作之后,我发现证据链反而是最容易被 AI 高效产出的部分,它基于仓库上下文就能生成大部分草稿。
这三个新概念凑在一起,产生了一个关键效果:流程中的每一步都在产生“可被 AI 读取的文本”。需求卡片是文本,任务拆解是结构化列表,验收标准是 Gherkin 风格的行为描述,连代码提交信息都可以要求包含 AI 参与标记。这些文本越规范,AI 编程助手能给出的响应质量就越高。
1.2 为什么一定要和 AI 编程助手绑定
如果只是想把开发流程做得更规范,用传统文档加项目管理软件也够,没必要非绑一个 AI 工具。但 v6 的“上下文契约”和“验证证据链”有一个天然矛盾:它们需要被大量撰写和持续更新,而开发者恰恰最讨厌写文档。
Copilot 这类 AI 编程助手解决的就是这个矛盾。它读取上下文之后,可以帮你把需求卡片转成初步实现,把能力单元描述转成测试用例骨架,把验收标准转成可执行的测试步骤。换句话说,它不只是写代码,它能把 BMAD v6 流程里那些繁琐但确定性高的“中间产物”自动化掉。
我和团队磨合下来的实际感受是:没有 AI 之前,BMAD v6 的规则越多,执行阻力越大;有 AI 且明确了协同方式之后,规则越多,反而越省力,因为每一条规则都可以被 AI 消化、执行、校验。方法论不再是靠人自觉去遵守,而是变成了 AI 协作的一部分。
1.3 协同的三个层面
我把 BMAD v6 和 Copilot 的协同拆成三个层面:需求建模、任务执行、验证反馈。
需求建模层面,AI 负责把自然语言需求改写成结构化卡片,并主动指出需求里的歧义点。这就像产品经理旁边坐了一个记忆力极好、从不嫌烦的评审,会在你描述完一个功能后追问“如果用户没登录怎么办”“如果导出文件超过一万行怎么办”。
任务执行层面,AI 不只是按命令生成代码,而是基于能力单元定义,先给出实现方案,再生成代码。它会告诉你“这个任务单元我建议拆成三个文件,职责分别是……”而不是直接甩一段看不出上下文的大函数。
验证反馈层面,AI 会生成测试用例、运行建议、边界条件清单,甚至分析测试失败日志并给出修复方向。整个过程相当于把“写代码—跑测试—查问题—再修改”的循环缩到尽可能短。
这三个层面不是孤立的,它们对应 BMAD v6 流程的三个核心活动。只要协同方式沿着这三个层面推进,工具和方法就不会变成两张皮。
2. 搭建 BMAD 与 Copilot 协同工作流
有了理论层面的共识,下一步就是把它们落到实际项目里。下面我以一个具体的应用开发项目为例,逐步说明我们从初始化仓库到完成第一个能力单元的全过程。这个项目我们内部叫“某跨平台数据管理系统”,就是一个典型的业务应用,包含登录、权限、数据导入导出、报表展示这些常见模块。为了描述方便,我用最典型的订单导出功能来展示协同过程。
2.1 初始化项目上下文目录
BMAD v6 要求每个仓库里有一个固定的上下文目录,我们约定放.context/bmad/下。第一次和 Copilot 协作前,我会先手工搭好这个目录,不需要太复杂,结构大致这样:
.context/ └── bmad/ ├── 00_project_overview.md ├── 01_coding_standards.md ├── 02_requirement_cards/ │ ├── REQ-001_order_export.md │ └── REQ-002_user_avatar_upload.md ├── 03_task_breakdowns/ │ ├── TASK-1001_order_export_data_source.md │ ├── TASK-1002_order_export_file_generation.md │ └── TASK-1003_order_export_notification.md ├── 04_acceptance_criteria/ │ └── AC-001_order_export.feature └── 05_prompt_templates/ └── code_generation.md00_project_overview.md是整个项目的简介,包含技术栈、模块划分、部署方式。01_coding_standards.md是团队编码规范,包括命名风格、错误处理方式、禁止事项。这两份文件是 Copilot 回答所有问题的基础背景。
02_requirement_cards/放需求卡片,每张卡片要覆盖业务目标、用户场景、约束条件、验收标准。我给模板做了精简,避免像传统需求文档那样写一堆废话。以订单导出为例,需求卡片长这样:
# REQ-001 订单批量导出 ## 业务目标 运营人员需要按日期范围、订单状态导出订单明细,用于月度财务对账。 ## 用户场景 运营人员进入订单列表页,点击“导出”,选择时间范围和状态,系统生成 CSV 文件并提供下载链接。 ## 约束条件 - 单次导出最大允许 10 万条记录 - 导出过程不能阻塞订单列表查询 - CSV 文件需包含指定表头,金额保留两位小数 ## 验收标准 - 导出任务创建后 30 秒内生成文件 - 文件内容与数据库查询结果一致 - 超过 10 万条时提示用户缩小范围写完之后,我通常会让 Copilot 先读一遍这张卡片,然后问它:“这个需求卡片里有没有隐含的技术风险或缺失的信息?”它一般会指出并发导出任务、文件生命周期、权限校验范围这类容易遗漏的点。这比直接写代码要值钱得多。
2.2 用 AI 进行任务拆解
需求卡片就绪后,按照 BMAD v6 的规则,要把需求拆成多个能力单元,并进一步拆成任务单元。任务单元的标准有三个:一个小时内可完成、产出可通过自动化测试验证、不依赖人脑中的隐式上下文。
以前手工拆解一张需求卡片要花不少时间,现在我会把需求卡片内容贴给 Copilot,让它先产出一版拆解建议。我给它的提示模板如下:
请根据需求卡片 REQ-001 进行任务拆解。要求如下: 1. 每个任务单元必须能在 1 小时内完成; 2. 每个任务单元必须有明确的产出物; 3. 每个任务单元必须有对应的验证方式; 4. 任务单元之间尽量解耦,避免前一个任务不完成,后一个任务完全无法启动。 请按照表格输出:任务编号、任务名称、产出物、验证方式、依赖任务。以订单导出为例,Copilot 给出的拆解结果经过我人工调整后如下:
| 任务编号 | 任务名称 | 产出物 | 验证方式 | 依赖任务 |
|---|---|---|---|---|
| TASK-1001 | 导出条件参数对象与校验 | 参数类与校验逻辑 | 单元测试覆盖边界值 | 无 |
| TASK-1002 | 订单数据源查询与分页游标 | 数据查询服务 | 集成测试验证游标正确 | TASK-1001 |
| TASK-1003 | CSV 文件生成器 | 文件生成服务 | 使用样本数据生成文件并比对 | TASK-1002 |
| TASK-1004 | 异步任务队列接入 | 任务处理器 | 模拟队列消息,验证处理状态 | TASK-1003 |
| TASK-1005 | 下载接口与权限控制 | 控制器与权限校验 | 接口测试验证未授权用户被拒绝 | TASK-1004 |
这份拆解里,我人工介入最多的是“验证方式”这一列。AI 倾向于把验证写成“单元测试通过”,但 BMAD v6 要求验证方式必须对应到具体业务行为。所以我会把 TASK-1002 的验证方式改成“使用包含 99999 条记录的订单表测试游标翻页,确保只加载当前批次”,而不是笼统的“测试通过”。
拆解完成之后,每个任务单元的产出物描述、技术要点、验收标准会合并成一个任务定义文件,放入03_task_breakdowns/目录。后续从 TASK-1001 开始执行,每个任务单元的执行都按照下面这个循环来。
2.3 开发循环:人定义意图,AI 生产初稿
任务单元一旦确定,开发阶段的人机分工就非常清晰。以 TASK-1003“CSV 文件生成器”为例,我先在代码编辑器中打开任务定义文件,然后让 Copilot 开始实现。我的提示词大概是这样:
我正在执行任务 TASK-1003:CSV 文件生成器。 请先阅读 .context/bmad/03_task_breakdowns/TASK-1003_order_export_file_generation.md。 实现语言使用 Java,框架使用 Spring Boot。 要求:生成 CSV 时使用 UTF-8 编码,避免中文乱码;字段中包含逗号和换行时需要使用双引号转义;金额字段输出为两位小数。 请输出: 1. 文件路径建议 2. 核心类设计 3. 关键方法代码 4. 需要特别测试的边界情况这里有一半内容是我提前写死的,比如编码要求、转义规则、金额格式。为什么要在提示词里写这些?因为 BMAD v6 的上下文契约要求“承载业务规则的上下文必须显式化”,如果我不说,AI 很可能生成一个最简单的 CSV writer,把字符串直接拼上去,后面测试阶段就会发现中文乱码、字段被逗号切割这类问题,返工成本反而更高。
Copilot 通常会照着一个类设计生成代码,比如OrderCsvFileGenerator,里面有writeHeader、writeRow、escapeField这些方法。我必须提示它处理null值、处理 BOM 头,这些都是实际项目中容易踩的坑。拿到初稿后,我不会直接接受,而是先做一轮人工审查,看它是否满足任务定义文件里的验证方式,然后让它生成对应的单元测试。
我要求所有 AI 生成的测试必须包含“边界情况表”注释,例如空列表、一行数据、字段含逗号、字段含换行、金额为 null、最大长度字段。Copilot 往往会生成一个@ParameterizedTest,把这些情况一个一个覆盖到。这个过程实际上就是 BMAD 的“验证证据链”落地:每个测试用例都在为验收标准提供证据。
开发循环结束后,提交信息也会带上 AI 参与标记。我们的提交规范是:
feat: 实现订单导出 CSV 文件生成器 (TASK-1003) - 实现文件生成核心逻辑 - 补充边界测试用例 - 基于 Copilot 生成初稿,人工审查后修改字段转义部分这个标记不是形式主义。后续排查问题时,看到某段代码是 AI 初稿加人工微调,就知道很可能存在隐藏风险区域,需要重点 review。如果整段代码是人工手写的,再配合测试证据,信任度会高很多。
3. 协同过程中的核心细节与避坑经验
用 BMAD v6 和 Copilot 协作一段时间后,我发现真正决定成败的往往不是方法论本身,而是一些非常细节的操作习惯。这些细节在官方文档里看不到,只有实际跑过才能体会到。下面把最有价值的几条经验整理出来。
3.1 提示词模板要长期积累,而不是每次临时发挥
我见过不少团队让开发者各写各的提示词,同样的任务,A 写的提示词只有一句话,B 写的提示词带上了项目背景和技术约束,两个人得到的结果质量完全不一样。在 BMAD v6 里,提示词本身就是一种上下文契约,必须要标准化。
我们的做法是把经常用的提示词沉淀到.context/bmad/05_prompt_templates/目录,每个人都可以引用。目前团队里最常用的四类模板是:需求卡片改写、任务拆解、代码生成、测试生成。每类模板不是固定死的,而是随着项目推进持续演进。
以代码生成模板为例,最早我们只写了“请实现 XX 功能”,后来发现经常漏掉异常处理,于是加了一句“所有可能失败的 IO 操作必须显式处理并记录日志”,再后来又发现 AI 喜欢把日志字符串拼成一大段,又加了“日志信息中必须包含任务单元编号,便于追溯”。这些补丁式的演进,本质上就是在不断细化上下文契约。
我的建议是,不要追求一次性写出完美提示词,而是先建立模板,再用“这次生成结果里哪里不满足预期”来反推模板的修改方向。坚持两三个迭代,模板会比绝大多数网上分享的通用模板都好用,因为它包含了你项目里特有的业务规则和团队风格。
3.2 处理 AI 幻觉的关键:让它先给依据再给结论
Copilot 生成代码时偶尔会“一本正经地胡说八道”,比如引用一个不存在的库方法,假想一个并不存在的配置项,或者凭经验把相似项目的实现方式套进当前项目。这本质上是模型根据概率推断的结果,而不是严格基于仓库上下文推演的结果。BMAD v6 应对这种问题的方法是强制要求 AI 在给出结论时同时提供依据。
举例说明。我曾经让 Copilot 处理一个权限注解,它直接生成了一段基于旧版框架的代码,编译时才发现类名根本不对。后来我在提示词里加了一条规则:“涉及框架 API、依赖注入、配置项时,必须先确认我的项目实际引入的版本,再给出具体写法。如果不确定,请明确说明不确定的地方,不要推测。”这条规则立竿见影。
另外一个技巧是让 Copilot 在代码注释里标注“这里基于项目里的 XX 类,原因是……”当它开始写理由时,反而容易暴露自己的猜测,我可以及时纠正。这个过程很像我带新人的时候,让对方先说思路,不要一上来就写代码。AI 生成速度快,但如果方向错了,速度只会放大错误。
3.3 测试生成的“输入空间”策略
BMAD v6 的验证证据链要求测试不是随便跑通就行,而是要覆盖有效输入空间和无效输入空间。Copilot 自动生成的测试往往偏向正常路径,因为训练数据里的示例大多都是理想情况。它很少主动测一个参数字符串超过数据库字段长度,也不会测试文件系统权限不足时是否有友好报错。
为了引导它生成更有价值的测试,我会在提示词里直接给出“输入空间清单”。清单包括四类:正常最小输入、正常最大输入、边界值、非法值。例如 CSV 生成器,我要求测试覆盖以下情况:
- 空列表
- 只有表头没有数据
- 一条完整数据
- 10 万条数据的性能冒烟
- 字段包含逗号、双引号、换行
- 金额为负数、零、两位小数以上
- 某个必要字段为 null
- 文件名包含特殊字符
我把这份清单固化成模板,每次让 Copilot 写测试时直接引用。它生成完测试代码后,我会再人工检查一遍:是否所有输入空间都有@Test或@ParameterizedTest对应。这个过程不复杂,但能显著提升测试对业务缺陷的捕捉能力。
3.4 数据构造也要纳入上下文管理
在应用开发里,测试数据往往是最容易被忽略的“隐性上下文”。Copilot 生成单元测试时,通常会顺手写几个魔法数字,比如order.setAmount(100.0),但没人知道这个 100 是什么意思,是恰好等于阈值,还是随便写的。BMAD v6 要求测试数据必须可解释,每个关键数据都要能在测试注释里找到业务含义。
我会让 Copilot 在生成测试数据时优先使用工厂方法,例如createOrder(OrderStatus status, BigDecimal amount, LocalDateTime createTime),而不是直接 new 对象后手动 set。工厂方法名可以表达数据背后的业务场景,比如createOverdueOrder()、createZeroAmountOrder()。这样测试的可读性大幅提升,后续需求变更时,我们也能快速定位哪些测试数据需要跟着调整。
另外一个相关经验是,随机数据生成要慎用。Copilot 可能会建议用 Java Faker 那类工具生成随机字符串做测试,这听起来很酷,但在业务应用开发中,随机数据往往会让断言失去意义。我倾向于在单元测试里用固定构造数据,在集成测试里用少量真实脱敏数据,只有在性能测试里才使用大规模随机数据。
3.5 代码审查要建立“AI 信任分级”
设计一个信任分级:完全信任、部分信任、需要重写。对于通用工具类、DTO、枚举转换、样板 CRUD,AI 生成的代码通常可以直接使用;对于业务状态流转、金额计算、权限校验、外部接口调用,即使 AI 生成逻辑正确,也需要团队里熟悉业务的人走一遍完整评审;如果 AI 生成的代码涉及事务边界、分布式锁、数据一致性,我基本不会直接采纳,而是把它当成“第一版草稿”,拿它来对照需求,重新写关键部分。
分级的依据不是看代码写得好不好,而是看代码出错后的影响范围。影响范围越小,越可以放权给 AI;影响范围越大,越要人工兜底。把这条原则写进团队的编码规范之后,整个团队的协作心里就有底了。
4. 常见问题与排查技巧实录
把三个迭代里遇到的高频问题集中列一下,附带排查思路和解决方式。这些问题有工具层面的,也有方法落地层面的,但最终都反映在“AI 产出和我们预期不一致”这一个现象上。
4.1 高频问题速查表
| 问题现象 | 根因分析 | 解决方式 |
|---|---|---|
| Copilot 生成的代码风格和项目现有代码不一致 | 上下文里缺少编码规范说明,AI 只能按默认风格输出 | 在.context/bmad/中加入编码规范文件、.editorconfig示例说明,并让 AI 在每次生成前阅读 |
| 生成的测试全是正常路径,边界情况缺失 | 没有给出输入空间清单 | 使用 BMAD 测试生成模板,显式列出正常、边界、非法三类输入 |
| AI 引用了项目中不存在的依赖方法 | 提示词没有要求基于现有依赖回答,AI 依赖训练知识推测 | 增加“先确认依赖版本再给答案,不确定请明说”的约束 |
| 同一个功能的代码,每次生成结果差异很大 | 提示词信息不足,AI 的自由度太高 | 把任务定义文件读入上下文,并把算法选择、命名偏好等决策提前说明 |
| AI 上下文窗口不够,忽略早期文档 | 项目上下文文件太多太长 | 拆成小而独立的文件,按任务单元只加载相关文件,必要时手动打开关键卡片 |
| 团队多人维护提示词,内容漂移 | 缺少共享模板库和变更记录 | 建立统一的提示词模板目录,模板变更走 MR 评审,保留提交历史 |
排查这些问题时,不要一上来就怪 AI 不好用。大多数情况都是上下文没给够,或者给的上下文和当前任务不对齐。先检查一下当前编辑器打开的标签页里,是否包含任务定义文件和需求卡片。如果这两个文件都不在上下文里,生成结果跑偏是必然的。
4.2 团队落地时的 BMAD 契约文档
BMAD v6 和 AI 编程助手协同,最大的挑战其实不是技术,而是团队是否愿意把“上下文契约”当成一件事情来做。开发者天然不喜欢写文档,如果每天都要维护需求卡片,很快就会有人糊弄。我的应对方法是把文档维护任务也分一部分给 AI 来做,将需求变更记录通过对话让 Copilot 整理成卡片,再人工确认。
我们还会在每个迭代结束后做一次“契约审计”。把当前迭代新增、变更的需求卡片、任务定义、验收标准全部过一遍,检查是否有上下文遗漏。这里会有一个很有意思的现象:Copilot 往往比人更早发现文档和代码不一致的地方。因为开发过程中,代码可能是 AI 生成的,文档也是 AI 辅助生成的,只要初始上下文保持一致,两边不会差太多。反而如果代码是人手写、文档是后来补的,差异会一目了然。这种发现能力,恰好是我们推行验证证据链最需要的。
4.3 后续自动化扩展方向
目前的协同模式已经跑顺了,但还有几个方向可以继续扩展。第一个是任务拆解的自动化校验,把 BMAD v6 的“一个小时内完成、有产出物、有验证方式”这三条规则写成一个脚本,每次生成任务拆解后自动检查格式和完整性。Copilot 生成拆解结果后,脚本跑一遍就能发现缺少验证方式的任务,提醒开发者补充。
第二个方向是验收标准到测试用例的自动绑定。我们已经在.feature文件里用行为描述写验收标准,下一步计划让 AI 在实现功能前先根据验收标准生成测试步骤,再进入开发。这样测试不再是开发之后补的,而是和需求同步产出,能更早暴露理解偏差。
第三个方向是在 CI 流水线里增加 AI 代码评审报告。每次提交后,自动让 AI 基于 BMAD 的任务编号和验收标准,对变更代码做一次快速审查,输出潜在风险点。这个流程可以作为人类代码评审之前的第一道过滤,目前我们已经开始在一些高风险模块上试用。
对我来说,这套 BMAD v6 和 AI 编程助手的协同方式,最大的收获不是“写代码变快”这种直观感受,而是让开发过程变得更可控。以前一个功能做完了,问它到底满足哪些验收标准,可能得翻半天代码和文档才能捋清楚。现在每一步都有上下文契约,有验证证据链,有 AI 配合检查,哪怕中途换人接手,也不会出现“只有写代码的人知道是怎么回事”的尴尬局面。
最后再分享一个小技巧:如果你刚开始尝试这种协同,不要一上来就把所有项目都套上 BMAD,也不要一下子让 AI 参与所有环节。先挑一个业务边界清晰的模块,把需求卡片、任务拆解、代码生成、测试生成这四个环节里,任意一个环节用上文中的模板跑通,感受一下上下文显式化带来的差别。跑通一个环节之后,再逐步扩大。我自己也是从小模块开始,磕磕碰碰了两个迭代才形成稳定的工作流。方法这东西,关键是长期坚持优化,而不是一次性做到完美。