V2EX 07月31日 15:19
[程序员] 我宣布, CC 目前最佳使用方式是 Spec+Agents+TDD
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文作者分享了在个人开发项目(mcp)中尝试各种开发方法的经验,最终发现结合 Spec 定义、TDD 流程以及 AI Agents(特别是上下文隔离的 Agents)能够显著提高开发效率和成功率。作者强调了 TDD 中的 Red-Green-Refactor 循环的重要性,并指出 AI Agents 在避免上下文压缩、隔离职责(QA 负责测试、Developer 负责编码)方面表现出色,尤其是在重构和优化阶段,能够帮助开发者保持代码的清晰和可维护性,尽管在 Prompt 补充上下文方面仍需持续优化。

💡 Spec 定义与 TDD 结合是高效开发的关键:作者通过实践发现,先明确需求 Spec,制定实现计划,再采用 TDD(测试驱动开发)是最高效且成功率最高的方式。这种方法有助于避免“炼丹式”开发,即为了通过测试而随意修改测试代码。

🤖 AI Agents 解决上下文压缩问题:作者指出,在使用 Claude Code 进行 Spec 开发时,大 Spec 容易触发上下文压缩,导致随机丢失上下文。而新发布的 Agents 通过上下文隔离,有效解决了这一痛点,使得 AI 在大型项目开发中更加可靠。

⚖️ 职责分明的 Agent 协作提升效率:文中提到将 QA Agent 专职于单元测试修改,Developer Agent 专职于代码编写并确保测试通过,这种职责分离的模式,配合 Red-Green-Refactor 的完整流程,极大地提升了开发效率和代码质量。

🔄 Red-Green-Refactor 流程的重要性:作者强调了 TDD 中最后一个阶段——重构(Refactor)的重要性。在实现复杂接口时,这个阶段能够帮助开发者清理冗余代码、拆解大函数、发现并实施重构机会,从而避免代码难以维护的问题。

🔧 上下文补充优化 Agent 表现:尽管 AI Agents 在 TDD 中表现出色,但作者也提到仍有优化的空间。例如,在 Prompt 中补充上下文信息,可以帮助 Agent 更聚焦于当前的修改范围,减少偏离,进一步提升其在复杂开发场景下的表现。

这一周都在自己的 mcp 上尝试各种开发方法。

最终结论是 Spec 先定义好需求,实现计划,然后进行 TDD 是最舒服,成功率最高的方式。

之前我实现了一个 gitlab 的 Spec 的 mcp ,但是还是不得劲,单元测试瞎写,纯炼丹。就是属于那种他过不去就自己改单元测试,或者单元测试写一大堆但是重复的不少。最主要的问题是上下文问题。claude code 在使用 Spec 的开发模式进行开发的时候非常容易触发压缩。尤其是对于大一点的 Spec 。压缩带来的问题更严重,随机的丢失上下文。这是一件非常麻烦的事。

这周发布的 agents ,让我眼前一亮,因为上下文隔离就可以很好的避免上下文污染。

我测试了 3 天,完全是可行的。QA 的 agents 只负责单元测试的修改。Developer 的 agents 只负责代码的编写保证单元测试通过。最后的重构和优化阶段非常重要,我调试了很多次才搞定。也就是形成 Red-Green-Refactor 的完整流程。一开始我没觉得最后的阶段有用,真的实现和跑了一些复杂接口实现的时候这玩意就有用了。不会一直拉屎拉到无法看懂。我要求他重构的时候把不用的清理掉,大函数拆解,发现重构机会。但当然还是有点问题,10 次里有 1 次没聚焦到这次的修改范围,目前把上下文在 prompt 里补充了好像还行。

prompt

please think hard about, 请读取 issues $ARGUMENTS 的详情,你会得到一个任务树;你不得实现任何业务,应该调度角色来完成## 名词理解**业务实现计划**指定的 $ARGUMENTS 是业务实现计划的 issue ID ,包含了业务实现的详细步骤和文件修改计划。**单元测试计划**查看 `$ARGUMENTS` 的详情,你会得到一个任务树,link 中的 labels 含有`type::Testing`的 issue 是单元测试计划的 issue ID ,包含了单元测试的详细步骤和文件修改计划。**使用子任务尽可能的并行的分析和拆解 TDD 循环列表**子任务中 link 的 label 为`type::TDD-interface`的 issue 是以接口为单位的 TDD 工作大纲。读取 tdd-interface 的子任务的 label 为`type::TDD`的 issue 是 TDD 工作流中的具体的 TDD 循环任务请创建和使用子代理来并行的调查 TDD 循环的列表。子任务中 link 的 label 为`type::TDD-interface`的 issue 是以接口为单位的 TDD 工作大纲,TDD 工作大纲的子任务的 label 为`type::TDD`,并且状态为 open 的 issue 是 TDD 工作流中的具体的 TDD 循环任务。  - 每开始一个 TDD 循环,必须先设置 tdd 循环任务状态为`inprogress`,使用`gitlab-issues-workflow-status(issue_id="", status="inprogress")`。  - 每完成一个 TDD 循环的步骤,必须设置 tdd 循环任务中的 AC 对应步骤为 checked 。    - 完成 RED 阶段,设置 TDD 循环任务中的 AC 的 RED 步骤为 checked    - 完成 GREEN 阶段,设置 TDD 循环任务中的 AC 的 GREEN 步骤为 checked    - 完成 REFACTOR 阶段,设置 TDD 循环任务中的 AC 的 REFACTOR 步骤为 checked  - 每完成一个 TDD 循环,必须检查 tdd 循环任务的 AC 是否完全满足,使用`gitlab-issues-workflow-status(issue_id="", status="done")`将任务状态改为`done`。  - 分析和检查 AC 的步骤一步完成了哪一步没完成。对 TDD 循环列表创建 todowriter 列表,每一项就是 TDD 的一个循环,tdd 循环来源于子任务的调查结果。### TDD 工作流的阶段**角色定义**:**QA**: `tdd-qa-partner`子代理角色负责实现单元测试,只允许实现测试代码,不允许修改业务代码。**Developer**: `tdd-code-implementer`子代理角色角色负责实现业务代码,只允许实现业务代码,不允许修改测试代码。### TDD 循环**Workflow Guidance**:- **第一**让`tdd-code-implementer`基于设计文档的接口定义,实现最小的接口或者 struct 定义,要确保 make test 是能通过的。- tdd 以接口为单位进行迭代开发,每个接口都经过严格的测试驱动开发( TDD )流程,确保每个接口都经过 Red-Green-Refactor 的完整流程。- 要告知角色,只做一个阶段的事,不允许做任何其他阶段的工作。- 避免一次性创建所有接口,专注于一个功能一个功能地 TDD 循环,确保每个功能都经过测试和验证。  - 严格检查每个 Phase 的 TDD 循环的 Red ,Green 和 Refactor 阶段是否都做了。不能跳过任何阶段。  - 不是 QA 和 Developer 的任何独立完成的任务,是描述的 Phase 的 TDD 循环。  - 确保都做过步骤 Red→Green→Refactor  - QA 和 Developer 角色需要紧密协作,交替按照 TDD 循环进行红绿优化循环。  - 每个循环步骤都务必聚焦于设计需求和测试需求所涉及的文件和代码,**不得擅自修改和优化其他的代码文件**  - QA 和 Developer 都不是一次性完成他们的工作,而是一个接口一个接口的去进行实现和测试。  - 每次 QA 和 Developer 开始的时候,你**必须把设计文档和测试文档的 issues id 以及 TDD 循环迭代給到子代理角色**,并让子代理角色先自己去分析和理解上下文。- 在一个循环完整结束后,在需求设计的 issues 上使用`gitlab-workitem-create-note(issue_id="", description="TDD 循环完成,进入下一个循环")` 添加进度笔记,记录当前循环的完成情况。- QA 和 Developer 除了在 TDD 循环中使用绝对不会自行去实现实现计划的接口和单元测试任务。#### Phase 0: Ready for TDD,1. 只定义即将测试的一个方法(如 AddLabel )2. 创建必要的数据结构#### Phase 1: **TDD 循环**每次 QA 和 Developer 开始的时候,你**必须把设计文档、测试文档和 TDD 循环迭代的 issuesID 給到子代理角色**,并让子代理角色先自己去分析和理解上下文。1. Red: QA(`tdd-qa-partner`) 为接口编写失败测试2. Green: Developer(`tdd-code-implementer`) 实现最小代码让测试通过3. Refactor: QA(`tdd-qa-partner`)和 Developer(`tdd-code-implementer`),都需要检查(codereview)和优化(refactor)在这个循环中自己修改过的代码,重构不需要考虑向下兼容,务必一次性改成最正确的实现,为了避免代码修改冲突,交替进行重构和协调。不能并行执行#### Phase 2: 逐步扩展1. 添加下一个方法到接口2. 重复 TDD 循环 #### **phase 分解的例子**分解的任务必须严格按照 TDD 循环的步骤进行,确保每个方法都经过 Red-Green-Refactor 的完整流程。

⏺ Update Todos☒ Phase 0: Ready for TDD - 创建最小接口定义,确保 make test 通过
☒ TDD 循环 1: ContentBlockHelper.GetAcceptanceCriteria() - Red→Green→Refactor☒ TDD 循环 2: ContentBlockHelper.SetAcceptanceCriteria() - Red→Green→Refactor☐ TDD 循环 3: ContentBlockHelper.GetImplementationPlan() - Red→Green→Refactor☐ TDD 循环 4: ContentBlockHelper.SetImplementationPlan() - Red→Green→Refactor☐ TDD 循环 5: IssuesManager.SetAcceptanceCriteria()编排逻辑 - Red→Green→Refactor☐ TDD 循环 6: IssuesManager.AddLabel()去重逻辑 - Red→Green→Refactor

##### TDD 工作流的重构阶段QA 负责:- 重构测试代码(提取测试辅助函数、优化测试数据设置)- 确保测试仍然验证正确的业务逻辑- 检查测试覆盖率是否受影响- 验证重构后测试仍然能发现潜在 bug- 发现的改进机会都必须在重构阶段处理,不得延后到下一个 TDD 循环Developer 负责:- 重构实现代码(提取小函数、优化算法、改善命名)- 确保代码结构更清晰- 优化性能(在不改变行为的前提下)- 处理代码重复和设计改进- 发现的改进机会都必须在重构阶段处理,不得延后到下一个 TDD 循环共同协作:- 讨论接口设计是否需要调整- 确保测试和实现的重构方向一致- 运行完整测试套件验证重构成功- 代码审查确保质量实际操作流程:重构阶段开始:├─ QA:重构测试代码,保持测试意图不变├─ Developer:重构实现代码,保持行为不变├─ 协作:运行测试确保全部通过├─ 协作:代码审查和讨论└─ 提交重构后的代码,进入下一个 TDD 循环

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

TDD AI Agents 开发流程 代码质量 上下文隔离
相关文章