DataCamp: Claude Code Best Practices
- 分组:四、社区教程与实践文章
- 原始链接:https://www.datacamp.com/tutorial/claude-code-best-practices
- 抓取来源:http://www.datacamp.com/tutorial/claude-code-best-practices
- 原始文件:/Users/yuanruiqin/Desktop/知识库/ClaudeCode-系统化知识库/04-社区教程与实践/32-datacamp-claude-code-best-practices.md
- 精读版生成时间:2026-04-05 13:50:44
中文精读版(去噪)
Claude Code 奖励了一种大多数开发工具不要求的纪律。如果您已经使用它一段时间了,您会注意到有些会话会产生您想要的结果,而另一些会话则消耗掉代币而无处可去。 Anthropic 自己的团队发现无指导的尝试成功率约为 33%,而该工具的创建者放弃了 10-20% 的会话。
差异取决于您在工具周围放置的模式,而不是您输入的提示。
本文介绍了这些模式在实践中的样子,这些模式取自 Abnormal AI、incident.io 和 Trail of Bits 等公司的生产工作流程。
如果您需要复习设置和核心功能,我们的 Claude Code 2.1 指南可以满足您的需求。这里的所有内容都假设您已经了解基础知识并且希望从该工具中获得更多信息。
为了更广泛地了解代理如何推理以及本教程的模式适合的位置,我强烈建议注册我们的AI代理基础知识轨道,其中涵盖了所有基本原则。
为什么规划纪律会改变一切
克劳德在没有指导的情况下做出的每一个决定都可能具有很高的准确性,这对于单一选择来说听起来不错,但当在具有许多决策点的功能中进行复合时,一切正确的机会就会减少。如果假设 20 个决策的准确度为 80%,则得到 0.8^20,因此实现完全正确实现的功能的机会大约只有 1%。
规划将这 20 个模棱两可的决策压缩为经过审查的规范,其中每个决策都接近 100%,因为您已经做出了决定。
使用注释周期工作流程进行规划
正如 Boris Tane 建议的那样,最适合规模化的规划工作流程是注释周期。你让 Claude 起草一个 plan.md,在编辑器中打开它,并在 Claude 做出错误调用或留下一些不明确的地方添加内联注释:“使用 drizzle:generate,而不是原始 SQL”或“这应该是 PATCH,而不是 PUT。”
然后,您将带注释的计划发回,并附上保护短语“解决所有注释,暂不实施”。这个保护短语很重要,因为如果没有它,克劳德就会跳过计划并立即开始编码。这个循环不断重复,直到计划不再有任何含糊之处,此时克劳德实施的错误次数要少得多,因为每个决定都已经做出了。
plan.md — 注释周期
第三步:数据库迁移
为用户表创建新的迁移。
注意:使用 drizzle:generate,而不是原始 SQL 注意:添加带有默认 NOW() 的created_at
步骤 4:API 端点
添加 PUT /users/:id 端点。
注意:这应该是 PATCH,而不是 PUT。仅部分更新。
注释后,发回:
#“解决所有注释,尚未实施”
使用 Claude Code 计划模式
如果注释周期感觉很重,Claude Code 的内置计划模式 是一个更轻的选择:
- 按 Shift+Tab 两次。
- 在谈话中重申计划。
- 使用 Shift+Tab 一次切换到自动接受。
计划会持久保存到“~/.claude/plans/”,因此它们可以在压缩和会话重新启动后继续存在,从而使内置计划模式成为大多数任务的可靠默认设置。对于非常大的功能,预先编写完整的规范也很有效:一名开发人员花了 2 个小时编写 12 个步骤的规范,并节省了估计 6-10 小时的实施时间。
进一步规划
无论采用哪种方法,将良好的开源代码与计划请求一起粘贴都会显着提高输出,因为克劳德使用工作参考比使用抽象描述效果更好。
规划还可以通过 git worktre es 水平扩展。 event.io 的工程师在不同的分支上运行 4-5 个并行的 Claude 会话,每个分支都按照自己的计划进行工作。一位工程师花费了 8 美元的 Claude 信用,开发了一个实现,将 API 生成时间缩短了 18%,整个团队日常使用的工具节省了 30 秒。
一些开发人员更进一步,运行相互竞争的工作树,对同一问题实施不同的方法并比较结果。
CLAUDE.md 架构最佳实践
您的“CLAUDE.md”文件有一个您可能不知道的预算。 HumanLayer 对 Claude Code 内部结构的分析 发现系统在您的指令上方注入了一条提醒:“此上下文可能与您的任务相关,也可能不相关。”
理解Claude Code的分层教学系统
克劳德主动过滤它所遵循的内容,而不是将所有内容视为持久命令。最重要的是,前沿思维模型在合规性下降之前遵循大约 150-200 条指令,而 Claude Code 自己的系统提示占据了其中的大约 50 条。这为您的规则留下了大约 100-150 个位置。 HumanLayer 将自己的文件控制在 60 行以下。
您可以观看此预算的实际效果。在您的“CLAUDE.md”中添加一行内容“始终称呼我为 Tinkleberry 先生”,然后看看 Claude 停止使用它的速度有多快,通常在几千个令牌之内。当名称消失时,注意机制会降低您的指令的优先级,并且“CLAUDE.md”中的其他所有内容都会随之失去影响。
使用渐进式披露进行指令参考
在该预算范围内开展工作的方法是逐步披露。您的根“CLAUDE.md”保持简短并专注于适用于所有地方的规则。对于任何特定于域的内容,请引用单独的文件而不内联它:“使用支付系统时,首先阅读‘docs/ payment-architecture.md’。”
仅当引用的文件进入代码库的该部分时,Claude 才会读取该文件,从而为高优先级规则保留指令预算。一家公司每月消耗数十亿代币,以这种方式构建他们的单一存储库“CLAUDE.md”,每个团队为其部分分配代币预算:
Monorepo CLAUDE.md — 渐进式披露
##Python 始终使用函数签名的类型提示 测试使用: pytest -x --tb=short
<内部 CLI 工具>
<使用示例> 在处理之前始终验证输入 永远不要使用原始 SQL,更喜欢 ORM 对于<复杂用法>或<错误>请参阅path/to/_docs.md
子目录“CLAUDE.md”文件进一步扩展了这一点。将包含数据库特定指令的 CLAUDE.md 放入 src/persistence/ 中,将另一个包含端点约定的放入 src/api/ 中。
Claude 自动将“CLAUDE.md”文件从工作目录向上加载到项目根目录,因此子目录文件仅在 Claude 在该区域工作时激活。这使您的根文件保持通用,同时为 Claude 提供准确的有针对性的指导。
一个常见的错误是:不要将“@”文件归档到“CLAUDE.md”中。这会在每次运行时嵌入整个文件,在对话开始之前就消耗掉你的指令预算。
Claude 代码中的上下文管理
Claude Code 为您提供了 200K 上下文标记,但可用窗口比看起来要小。
在您输入任何内容之前,一个新的 monorepo 会话会燃烧大约 20K 代币 加载系统提示、工具定义和“CLAUDE.md”。每个 MCP 服务器 都会添加永久消耗上下文的工具架构,因此在开始挤出实际工作之前,实际限制约为 5-8 个服务器。
更糟糕的是早期质量开始下降。多个从业者独立地确定了相同的阈值:不要让上下文超过容量的 60%。
Claude 的输出在窗口的 20-40% 处开始降级,远远早于任何限制生效,因为随着上下文的填充,注意力机制给予早期指令的权重较小。
自动压缩的触发率约为 83.5%,而且是有损的:一名开发人员损失了 3 个小时的重构工作,因为它在会话中删除了所有有关迁移决策的知识,只保留了大约 20-30% 的细节。
使用文档和清除模式
最好的防御是文档和清除模式。当上下文变得繁重时:
-
将当前计划和进度转储到 markdown 文件
-
运行
/clear重置会话 -
让 Claude 重新开始阅读该文件
这样,您将获得一个完整的 200K 窗口,其中仅包含您选择保留的内容,这优于“/compact”,因为您可以准确控制保留的内容。
自定义的“/catchup”命令使转换更加平滑:清除后,它会读取当前 git 分支中所有已更改的文件,因此 Claude 可以从您上次停下的地方继续,而无需旧的对话历史记录。
/clear 之后重建上下文。读取所有修改过的文件 当前分支与主分支相比。对于每个文件,了解 所做的改变。然后总结到目前为止已实施的内容 还剩下什么工作。
更改了该分支上的文件: $ git diff --仅名称主要
这个人工智能助手有帮助吗?
使用自定义 Claude 代码技能传输上下文
我使用 /transfer-context 技能 进一步推进这一点。当会话开始降级时,该命令会转储一个结构化的移交文件,其中包含已完成的工作、未决决策、要避免的陷阱以及相关文件路径。下一个会话将读取该文件,并从上一个会话结束的地方继续,只包含重要的信息,并且对话不会变得臃肿。
保存上下文的其他最佳实践
您还可以通过延迟加载工具来主动保存上下文。一个项目通过使用“UserPromptSubmit”挂钩仅在用户提示触发相关关键字时注入技能定义,而不是在启动时预加载所有内容,每个会话恢复了约 15,000 个令牌。
所有这一切背后最简单的规则是:每个对话一个任务。重新开始需要 20K 代币,这与污染会话造成的质量损失相比根本不算什么。
Claude 代码挂钩作为确定性护栏
即使结构良好的“CLAUDE.md”也只有大约 70% 的时间得到关注。对于编码风格偏好来说,这很好。对于“不要推送到主”或“不要删除生产数据”之类的安全规则,事实并非如此。 Hooks 通过在 Claude 工作流程中的特定点运行 shell 脚本,将差距缩小到 100%。
有两种类型值得了解。 Block-at-Submit 挂钩作为“PreToolUse”事件运行并冷停止操作:退出代码 2 阻止该操作并迫使 Claude 尝试其他操作。提示钩子提供非阻塞反馈,例如在每次编辑后运行 linter 并反馈输出,而不会中断 Claude 的流程。
最彻底的公共钩子配置执行以下操作:
B