Claude Code 是 Anthropic 推出的命令行编程代理,它直接在终端里通过自然语言帮开发者读代码、改代码、运行命令、执行测试。很多开发者第一次打开它时,只会把它当成一个“高级补全工具”:让它改一个文件没问题,让它实现一个完整功能,就需要反复纠正上下文,甚至越修越乱。为什么同一个模型,在有的人手里可以连续完成复杂任务,在另一些人手里只能处理小片段?差距通常不在模型能力,而在使用方法。这篇文章把一套被实践验证过的工作流拆开讲:项目记忆固化、任务拆解、上下文预算控制、验证闭环四条主线,配合模板和排查清单,目标是让 Claude Code 从“偶尔能用的助手”变成稳定的工程生产力。
1. 为什么默认用法会把 Claude Code 用成“慢速编辑器”
1.1 先从三个低效场景看起
第一种低效场景是“盲目探索”。开发者让 Claude Code 新增一个接口,它没有先确认项目结构,而是用搜索工具把整个仓库翻了一遍,最后在错误的位置创建文件。浪费了交互时间,还干扰了后续修改。
第二种低效场景是“不知道命令”。开发者让 Claude Code 重构一个函数,它改完了代码,但没有运行测试,因为对话里从没告诉它测试命令是什么。结果代码不能编译,却一直停留在“写代码”阶段,不做验证。
第三种低效场景是“上下文漂移”。多轮对话之后,Agent 把最初的约定忘掉了。前几轮还在遵守某个命名规范,后面突然提出完全相反的方案。开发者往往要花大量精力纠正它,这种返工比手动改代码更耗时。
这三种现象的共同点不是模型笨,而是使用者把 Claude Code 当成了一个没有项目背景的新人开发者,并且没有建立验证机制。
1.2 低效的根因是上下文失控
Claude Code 在每次请求中都要依赖当前会话上下文来理解任务。上下文是有限的,它的质量还会随长度下降。一个大型项目的全部代码、构建脚本、历史约定不可能完整装进窗口里,即使能装进去,也会挤占模型用于推理和生成代码的空间。
普通的文本编辑器不需要理解项目,它只是打开文件等你修改。Claude Code 不同,它需要“理解”才能修改。它靠什么理解?主要是三条路径:项目根目录的规则文件、你当前对话里的描述、它自己通过工具读取到的文件内容。默认用法下,这三条路径都没有被认真治理,于是它只能靠猜。
高效用法的本质,是把“让模型自己猜”变成“让项目自己说明”,把“一次做很多事”变成“一次做一件可验收的事”。
1.3 10x 工作流的三个支柱
把 Claude Code 用出数量级差异,通常不是某一个提示词技巧,而是三者配合:项目语境外置化、任务原子化、验证闭环。
| 维度 | 默认用法 | 工作流用法 |
|---|---|---|
| 项目背景 | 在每次对话里口头描述,经常遗漏 | 写入 CLAUDE.md,每次会话自动带入 |
| 任务粒度 | 一个 prompt 塞多个需求 | 一次请求只完成一个原子任务 |
| 验收标准 | “你看看对不对” | “执行 build 和测试,所有用例通过” |
| 探索文件 | 让 Agent 全项目搜索 | 用 read 精确指定相关文件 |
| 上下文控制 | 一路对话到上下文耗尽 | 定期压缩、总结、断点续传 |
| 失败处理 | 重新描述任务 | 把报错信息和日志直接交给 Agent |
这套组合在重复性工程任务里效果最明显,比如接口开发、bug 修复、重构、单元测试补充。它能减少大量“生成代码但不符合预期”的返工,这也是“10x 方法”这个词的来源。它不是让模型变强,而是让每一次交互都更接近正确结果。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 第一支柱:把项目语境固化到 CLAUDE.md 与 .claude 目录
2.1 为什么 CLAUDE.md 能减少大量解释成本
Claude Code 会把项目根目录的 CLAUDE.md 当作项目级记忆来读取。把项目背景写进去之后,后续会话不需要再花多轮对话解释“技术栈是什么”“测试命令是哪个”“代码风格是什么”,模型在第一次请求时就能拿到这些背景。
这看起来只是一个文件,实际改变的是交互链路的起点。默认情况下,一个没有项目背景的 Agent 接到“给购物车模块加一个优惠券逻辑”的任务,可能先猜目录结构、猜路由前缀、猜测试框架。有了 CLAUDE.md,它至少在框架层面不会跑偏。
注意:CLAUDE.md 的加载行为在不同版本之间可能有细节差异。落地前先在项目里建一个最小文件,然后启动会话,观察 Agent 是否会在回答中引用其中的规则,再逐步扩充内容。
CLAUDE.md 的作用不是给模型“背诵文档”,而是减少它每次重新探索、重新猜测的成本。它保存的是项目里稳定不变的部分,例如目录约定、命令、验收方式和禁止事项。
2.2 CLAUDE.md 应该写哪些内容
一个有用的 CLAUDE.md 至少包含四部分:技术栈与结构、命令、约定、验收标准。
markdown复制# 项目记忆
## 技术栈
- 后端:Java 17 + Spring Boot 3 + Maven
- 前端:Vue 3 + TypeScript + Vite
- 数据库:PostgreSQL 15
## 目录结构
- backend/src/main/java/com/demo:Java 源码根目录
- backend/src/test/java/com/demo:Java 测试目录
- frontend/src:前端入口
- docs:设计文档
## 常用命令
- 构建:cd backend && mvn clean package
- 测试:cd backend && mvn test
- 前端安装:cd frontend && pnpm install
- 前端构建:cd frontend && pnpm build
- Lint:cd frontend && pnpm lint
## 代码约定
- Controller 层不写业务逻辑,只做参数校验和结果透传
- Service 层方法名必须表达业务动作,例如 cancelOrder、submitReview
- 所有新增接口必须补充 controller 测试
- 日志使用 SLF4J,禁止 System.out.println
## 验收标准
- 提交代码前必须通过 mvn test 和 pnpm lint
- 接口变更需要更新 docs/api.md
- 数据库变更需要提供 migration 脚本
写 CLAUDE.md 时要克制。不要堆砌设计文档,不要写“请遵守规范”这种空话。它应该只承载 Agent 每次决策时都需要的稳定信息,条目数量控制在 20 到 40 行为宜。内容过多会占用上下文,反而影响长任务表现。
2.3 .claude/commands 与 settings 示例
除了 CLAUDE.md,还可以在 .claude/ 目录里放置自定义命令。自定义命令的作用是封装高频工作流,让开发者用一条命令触发完整的约定行为。
yaml复制# .claude/commands/test.yaml
description: 运行后端测试并输出失败摘要
argument-hint: [optional] 测试类名
agent: true
prompt: |
运行命令 cd backend && mvn test。
如果测试失败,提取第一个失败用例的完整堆栈,并输出失败原因。
不要修改代码,只输出测试结果摘要。
yaml复制# .claude/commands/plan.yaml
description: 先输出变更方案,等待确认后再实现
agent: false
prompt: |
阅读项目结构和相关代码,输出一个简短变更方案。
方案必须包含:涉及文件、改动点、影响范围、验证方式、风险。
不要写代码,等用户确认后再继续。
自定义命令的价值是让高频操作变成固定流程。你不必每次手写一长串要求,只需要调用 my-agent test 或 my-agent plan。生产环境中可以把命令定义得和团队代码评审清单一致,降低个人使用习惯造成的差异。
2.4 学习环境与生产环境的差异
学习环境可以先放一个最简 CLAUDE.md,只写技术栈和构建命令,跑通最小案例后再补充约定。生产环境则建议把 CLAUDE.md 纳入代码评审流程,更新依赖、调整目录结构、新增命令时同步修改。
另外,CLAUDE.md 不是唯一规则来源。如果团队有统一接口规范、日志规范、数据库规范,应该在 CLAUDE.md 里只写摘要,再在需要时用 read 读取详细规则文档。这样既让 Agent 有足够方向,又避免上下文被大段文档填满。
3. 第二支柱:用任务拆解和验收标准驱动每次请求
3.1 为什么一次请求只做一件事
让 Claude Code 一次完成“新增用户模块、修改订单状态、优化查询性能”三个任务,结果往往三个任务都做不好。原因是任务目标越宽,Agent 需要探索和判断的路径就越长,中间任何一个假设错误都会导致整体方案偏移。
一次请求只做一件事,不是限制能力,而是提高确定性。一个原子任务必须满足两个条件:结果可以被验证,失败原因可以被定位。例如,“为订单模块新增取消接口”是一个原子任务;“优化订单模块”不是,因为你无法定义优化完成的标准。
3.2 让 Claude 先输出执行计划,再写代码
在实现复杂改动前,先让 Agent 输出计划,相当于在动手前进行一次低成本方案对齐。这会多花一点时间,却可以避免大量返工。
推荐在任务描述后追加这样的要求:
text复制先不要写代码。先阅读相关文件,输出一个执行计划,格式如下:
1. 涉及文件
2. 每个文件的改动点
3. 验证方式
4. 可能影响的范围
如果计划里有不确定的假设,列出问题等待我确认。
当 Agent 开始写代码时,它往往已经对方向做过确认,后续修改就集中在实现细节。这个习惯对代码库庞大的项目尤其重要,因为方向错误造成的成本远高于多一轮计划。
3.3 写出可验证的验收标准
验收标准是任务描述里最容易被忽略、却最能改变结果的部分。空泛的“实现一个登录功能”会让 Agent 自定义一切;明确的验收标准则会约束它的实现范围。
一段完整的任务描述可以这样写:
text复制任务:为后端新增接口 POST /api/orders/{orderId}/cancel。
验收标准:
1. 参数校验:orderId 必须是正整数,非法参数返回 400
2. 业务规则:已支付订单可以取消,已完成订单返回 409
3. 响应结构:返回 { code: 0, message: "ok" }
4. 数据状态:取消成功后 order_status 变为 CANCELLED
5. 测试:补充 controller 测试,mvn test 全部通过
验收标准要写可观察、可判定的内容。状态码、返回值、数据库状态变化、测试命令是否通过,这些才是判断“完成”的依据。主观标准只有“逻辑正确”“代码清晰”时,结果往往不可控。
3.4 用 todo 管理长任务
一个较大功能拆成多个原子任务后,建议使用结构化待办清单,而不是一次性把所有要求塞进 prompt。Claude Code 可以在执行过程中维护 todo,也能在有状态变更时核对进度。
text复制使用下面的 todo 作为任务进度:
[x] 1. 阅读 controller 层现有接口
[ ] 2. 新增 CancelOrderRequest DTO
[ ] 3. 修改 OrderService 增加 cancelOrder 方法
[ ] 4. 新增 Controller 层接口
[ ] 5. 补充测试并运行 mvn test
[ ] 6. 更新 docs/api.md
每次合理完成后,更新 todo 状态并输出当前进度。
长任务需要阶段性确认。不要让 Agent 闷头执行完整 todo 后一次性返回结果,而是在关键节点停下来展示 diff 和验证输出。这样即使某一步假设错误,也能及时止损。
4. 第三支柱:控制上下文预算,避免输出和记忆失焦
4.1 上下文膨胀如何影响质量?
Claude Code 的多轮对话会把历史内容全部计入下一次请求的上下文。会话越长,可用空间越少,模型需要从越来越长的历史里提取信息,同时生成高质量代码的难度也在上升。常见现象是:对话早期明确说过的规范,到对话后期被遗忘;或者 Agent 开始输出与需求无关的冗余信息。
上下文失控通常来自两个来源。第一是项目探索过度,Agent 反复 read 大文件、反复用 grep 搜索无关代码。第二是对话轮次过多,每次失败后的修正信息叠加在一起,形成噪音。控制上下文预算是所有工作流里最容易被忽视的一环。
4.2 精确 read 文件,而不是让它全局搜索
默认情况下,Agent 遇到不确定问题会自己搜索。搜索能解决“不知道文件在哪”的问题,但会消耗大量上下文,而且可能搜到无关文件。高效做法是在任务描述里直接给出关键路径。
命令示例:
bash复制读取以下文件后开始修改:
- backend/src/main/java/com/demo/service/OrderService.java
- backend/src/main/java/com/demo/controller/OrderController.java
- backend/src/test/java/com/demo/controller/OrderControllerTest.java
不要全局搜索,先基于这些文件判断实现方式。
在工程实践中,一个经验法则是:你希望 Agent 重点修改的文件应该在 prompt 中显式列出。它不需要从头重构项目,它需要精准地改动有限文件,再通过测试验证。显式列文件还会降低幻觉概率,因为 Agent 不需要猜测类名和路径。
4.3 定期压缩、总结、断点续传
当会话已经很长,或者 Agent 开始重复问已经回答过的问题,应该主动开启一轮总结,然后重新开始会话。
可以在当前会话里要求它:
text复制输出当前任务状态摘要:已完成内容、未完成内容、关键文件路径、剩余风险。
摘要不超过 20 行。之后我会基于摘要开启新会话继续任务。
常见 CLI 场景支持保存会话或恢复历史会话。进入新会话后,把上一轮摘要和剩余 todo 粘贴进去,继续推进。这让每一轮会话都保持轻量上下文,避免历史垃圾堆积。
4.4 让 Agent 精简输出,直击 diff 和测试结果
Agent 默认输出的解释性文字可能很长,这些文字同样占用上下文。可以把通信规范写进任务描述,要求它减少复盘,直接给结果。例如:
text复制后续回答要求:
- 修改代码时使用 diff 片段展示关键改动,不粘贴完整文件
- 不输出与任务无关的背景说明
- 每次执行命令后只输出结论和错误信息
- 需要读者决策时,按优先级列出选项
这样做不是为了“省 token”,而是为了让下一次请求的上下文里只保留真正的决策信息。描述越短,模型越不容易被自己的冗长输出带偏。
5. 验证闭环:从“它写完了”到“它兑现了”
5.1 让 Claude Code 自己执行测试、lint、build
很多失败发生在代码写完但没验证的环节。默认用法下,Agent 只是生成代码,开发者手动跑构建和测试,然后再把错误反馈给 Agent。这种循环每多一轮,都会增加上下文消耗和时间成本。
更好的做法是把验证命令直接写进任务描述:
text复制完成修改后,执行以下验证:
1. cd backend && mvn test
2. cd frontend && pnpm lint
3. 如果测试失败,读取失败日志并修复,直到全部通过
4. 输出最终测试结果
让 Agent 自己执行验证,本质上是在人机交互中增加一个最小持续集成环节。这不一定能保证所有逻辑都正确,但能保证构建、测试、静态检查这些自动化的部分不会被跳过。
5.2 分阶段验证:先编译,再逻辑,最后边界
验证不应该只在最后做一次。改动大或者涉及多个文件时,分阶段验证能更快定位问题。推荐顺序是:先验证编译和类型,再验证核心逻辑,最后验证边界条件。
- 编译阶段:让 Agent 运行
mvn compile或vnpm build,确认代码没有语法和类型问题。 - 逻辑阶段:运行新增测试和回归测试,确认主要业务路径符合预期。
- 边界阶段:补充参数异常、空值、超限、重复请求等边角场景,确认失败行为可预期。
实际操作中可以给 Agent 这样一个指令:
text复制先执行编译,通过后再补充单元测试,最后检查下面这些边界:
- orderId 为负数时是否返回 400
- 订单状态为 COMPLETED 时是否返回 409
- 重复取消时是否幂等
补充边界测试后运行 mvn test。
分阶段验证的另一个好处是,当测试失败时,你可以更精确地判断是 Agent 对业务理解错误,还是测试用例本身不合理,而不是在最终全量测试里大海捞针。
5.3 失败时如何提供反馈
验证失败时,不要只发一句“测试没过”。要把最有用的信息交给 Agent,减少它重复猜测的次数。
text复制测试失败。失败信息如下:
- 失败用例:CancelOrderTest#shouldReturn400WhenOrderIdInvalid
- 断言:assertEquals(400, result.getCode()) expected: 400 but was: 500
- 日志:见 /tmp/test-output.log
请先解释失败原因,再给出修复方案,然后重新运行 mvn test 确认。
有效的反馈包含三部分:失败现象、可检索的关键信息、期望行为。这和在人工协作中给有效 bug 报告是一样的,信息越具体,修复越快。
5.4 常见验证失败的排查路径
| 失败现象 | 可能原因 | 检查方式 | 处理建议 |
|---|---|---|---|
No such file 或命令找不到 |
工作目录错误,或 Agent 在错误层级执行命令 | 让 Agent 输入 pwd,确认项目根目录 |
在任务描述里直接写 cd backend && 前缀 |
| 编译错误集中在新增文件 | Agent 误用不存在的类或依赖 | 查看错误里缺失的类名 | 让 Agent 先 read 相关依赖的 import 位置 |
| 测试失败但逻辑代码无报错 | 断言与需求不一致,或边界未处理 | 对比失败用例名称和断言值 | 把详细错误日志交给 Agent,同时复核验收标准 |
| 测试全过但功能不符合预期 | 验收标准不完整 | 检查任务描述是否有状态变更、幂等等要求 | 补齐验收标准后重新让 Agent 执行 |
| Agent 反复修改同一文件 | 上下文丢失,未读取最新文件 | 检查对话是否过长 | 开启新会话并携带任务摘要 |
6. 常见坑与排查清单
6.1 三个高频坑,以及怎么避开
第一,任务范围过大。错误表现是让 Agent “重构整个模块”或“把这些优化都做掉”,结果改动几十个文件,测试大面积失败。这不是 Agent 能力问题,而是任务没有被拆解。处理方式是把它拆成若干原子任务,每个任务都对应清晰的验收标准和测试。
第二,过多依赖对话记忆。错误表现是上一轮让 Agent 记住了某种命名风格,这一轮换了一个新会话又忘了。CLAUDE.md 存在的意义正是承接这部分稳定信息,不要用多轮对话去重复校准。
第三,验证不闭环。错误表现是 Agent 改完了代码,但没有运行测试,开发者手动跑起来才发现问题。处理方式是把验证命令写进每个任务,同时要求 Agent 在结束前输出测试结果。
注意:不要以为 Agent 每次都能主动验证。它只会执行你让它执行的验证,或者它认为必要的验证。两者之间经常存在差异。
6.2 一份可直接套用的检查清单
| 检查项 | 是否完成 |
|---|---|
| CLAUDE.md 是否有技术栈、目录、命令、验收标准四类信息 | |
| 当前任务是否拆到原子粒度 | |
| prompt 里是否列出需要 read 的关键文件路径 | |
| 是否包含明确验收标准,而不只是“实现功能” | |
| 是否正确给出验证命令 | |
| 是否提示 Agent 在写代码前先输出计划 | |
| 测试失败时是否提供了错误信息和期望结果 | |
| 会话是否过长,是否需要压缩或开新会话 | |
| 最终输出的 diff 是否经过人工复核 | |
| 生产环境是否把 CLAUDE.md 变更纳入评审 |
这套清单可以直接贴在项目里的 .claude/commands/check.yaml 中,每次启动大任务前调用一次,让 Agent 按项自检。
7. 生产环境使用注意与扩展方向
7.1 权限、代码质量门禁和 CI 配合
生产环境使用 Claude Code 时,不能只靠会话里的自我验证。需要把安全边界放在工程体系里,而不是依赖 Agent 自觉。
建议至少做到三点:Agent 只能修改白名单目录;CLAUDE.md 和 prompts 进入版本管理;所有 Agent 产出必须经过统一 CI 门禁,包括构建、测试、lint 和必要的安全扫描。Agent 生成的代码仍然需要人工 review,特别是涉及权限、支付、数据删除、外部接口调用的场景。
权限方面,如果 Agent 被提示可以自由执行 bash 命令,它有可能修改到预期之外的文件。生产项目中建议使用最小权限账号或沙箱环境,并限制它对敏感目录的写权限。
7.2 扩展方向:从单任务到多任务流水线
掌握基础工作流之后,可以尝试把多个原子任务串成流水线。例如,在一个会话里先规划,再实现,再测试,最后生成变更文档。这种流水线能否成功,取决于前面每一步是否都满足验收条件。如果失败,及时回到上一步,而不是继续往前赶。
另一个扩展方向是把 CLAUDE.md 组织成团队级和项目级两层。团队级存放语言、框架、规范,项目级存放具体业务约定。这样在多个项目之间复用团队规则,而不需要拷贝大量重复内容。
7.3 落地建议:新手从最小闭环开始
如果之前没有系统用过 Claude Code,不建议一次性把所有原则全部铺开。最稳妥的落地顺序是:
第一步,先写一个简版 CLAUDE.md,包含构建命令和测试命令。第二步,选一个小修复任务,严格按“计划、实现、验证、报告”四步走。第三步,把失败案例记录下来,回填到 CLAUDE.md 的验收标准和禁忌部分。第四步,再把任务拆解和上下文压缩纳入日常。
Claude Code 的真正价值不在于把提示词写得花哨,而在于你能不能用工程手段管理它的工作过程。项目记忆越清晰、任务粒度越小、验证越自动,它的输出就越稳定。当它连续完成一系列可以被测试证明的任务时,10x 就不再是夸张的标题,而是可复现的工程结果。
