在当今数字化的时代,代码编写成为了许多人工作和学习中不可或缺的一部分。Claude Code 作为一款强大的命令行工具,为我们的编码工作带来了更多的便利和可能性。今天,就让我们一起来了解一下如何根据 Claude 的编码最佳实践,高效地使用 Claude 来编写代码。
一、自定义你的设置
Claude Code 是一个会自动将上下文信息拉入提示的代理式编码助手。虽然这个收集上下文的过程会消耗时间和令牌,但我们可以通过环境调整来优化它。
1. 创建 CLAUDE.md 文件
CLAUDE.md 是一个特殊的文件,Claude 在开始对话时会自动将其内容拉入上下文。因此,它是记录以下信息的理想场所:
- 常用的 bash 命令:比如
npm run build
用于构建项目,npm run typecheck
用于运行类型检查器。 - 核心文件和实用函数:让 Claude 了解项目中的关键文件和函数。
- 代码风格指南:例如使用 ES 模块(
import/export
)语法,而不是 CommonJS(require
)语法;尽可能解构导入(如import { foo } from 'bar'
)。 - 测试说明:告诉 Claude 如何进行测试。
- 仓库礼仪:包括分支命名规则、合并与变基的选择等。
- 开发者环境设置:比如使用
pyenv use
来指定 Python 环境,以及哪些编译器可用。 - 项目特定的意外行为或警告:提醒 Claude 注意项目中的特殊情况。
- 其他你希望 Claude 记住的信息
CLAUDE.md 文件没有固定的格式,建议保持简洁易读。你可以将其放在以下几个位置:
- 仓库根目录:这是最常见的用法,将文件命名为 CLAUDE.md 并提交到 git,这样可以在不同会话和团队成员之间共享;也可以命名为 CLAUDE.local.md 并将其添加到.gitignore 中。
- 运行 claude 的目录的父目录:对于单仓库项目很有用,Claude 会自动将这些目录下的 CLAUDE.md 文件拉入上下文。
- 运行 claude 的目录的子目录:当你处理子目录中的文件时,Claude 会按需拉入这些子目录下的 CLAUDE.md 文件。
- 你的主文件夹:即
~/.claude/CLAUDE.md
,这样该文件将适用于所有的 claude 会话。
当你运行/init
命令时,Claude 会自动为你生成一个 CLAUDE.md 文件。
2. 调整你的 CLAUDE.md 文件
CLAUDE.md 文件会成为 Claude 提示的一部分,因此需要像优化常用提示一样对其进行精炼。常见的错误是添加了大量内容却没有对其有效性进行迭代。你可以手动向 CLAUDE.md 文件中添加内容,也可以按下#
键,Claude 会自动将你给出的指令合并到相关的 CLAUDE.md 文件中。许多工程师在编码时经常使用#
来记录命令、文件和风格指南,然后将 CLAUDE.md 文件的更改包含在提交中,这样团队成员也能受益。
3. 管理 Claude 允许使用的工具列表
默认情况下,Claude Code 对于任何可能修改系统的操作(如文件写入、许多 bash 命令、MCP 工具等)都会请求权限。你可以自定义允许列表,以允许使用你认为安全的额外工具,或者允许使用那些容易撤销的潜在不安全工具(如文件编辑、git 提交)。管理允许工具的方法有以下四种:
- 在会话中提示时选择“始终允许”
- 使用
/allowed-tools
命令:在启动 Claude Code 后,使用该命令添加或删除允许列表中的工具。例如,添加Edit
以始终允许文件编辑,添加Bash(git commit:*)
以允许 git 提交,添加mcp__puppeteer__puppeteer_navigate
以允许使用 Puppeteer MCP 服务器进行导航。 - 手动编辑配置文件:编辑
.claude/settings.json
或~/.claude.json
(建议将前者提交到源代码控制中,以便与团队共享)。 - 使用
--allowedTools
CLI 标志:用于特定会话的权限设置。
4. 安装 gh CLI(如果使用 GitHub)
Claude 知道如何使用 gh CLI 与 GitHub 进行交互,例如创建问题、打开拉取请求、读取评论等。如果没有安装 gh,Claude 仍然可以使用 GitHub API 或 MCP 服务器(前提是你已经安装了这些)。
二、为 Claude 提供更多工具
Claude 可以访问你的 shell 环境,你可以为它构建一组便利脚本和函数,就像为自己构建一样。它还可以通过 MCP 和 REST API 利用更复杂的工具。
1. 结合 bash 工具使用 Claude
Claude Code 继承了你的 bash 环境,因此可以访问你所有的工具。但如果不给出指令,Claude 可能不知道你的自定义 bash 工具。你可以通过以下方式让 Claude 了解这些工具:
- 告知工具名称和使用示例
- 让 Claude 运行
--help
命令查看工具文档 - 在 CLAUDE.md 文件中记录常用工具
2. 结合 MCP 使用 Claude
Claude Code 既可以作为 MCP 服务器,也可以作为 MCP 客户端。作为客户端,它可以通过以下三种方式连接到任意数量的 MCP 服务器以访问其工具:
- 项目配置:在运行 Claude Code 的目录中可用。
- 全局配置:在所有项目中可用。
- 已提交的
.mcp.json
文件:在你的代码库中工作的任何人都可以使用。例如,你可以将 Puppeteer 和 Sentry 服务器添加到.mcp.json
文件中,这样每个在你的仓库中工作的工程师都可以直接使用这些工具。在使用 MCP 时,使用--mcp-debug
标志启动 Claude 可以帮助识别配置问题。
3. 使用自定义斜杠命令
对于重复的工作流程(如调试循环、日志分析等),可以将提示模板存储在.claude/commands
文件夹中的 Markdown 文件中。当你输入/
时,这些命令会在斜杠命令菜单中显示。你可以将这些命令提交到 git,以便团队其他成员也能使用。自定义斜杠命令可以包含特殊关键字$ARGUMENTS
,用于从命令调用中传递参数。
三、尝试常见的工作流程
Claude Code 不会强制规定特定的工作流程,这为我们提供了很大的灵活性。以下是一些在用户社区中出现的成功使用 Claude Code 的模式:
1. 探索、规划、编码、提交
这种通用的工作流程适用于许多问题:
- 探索阶段:让 Claude 读取相关的文件、图像或 URL,可以给出大致的提示(如“读取处理日志的文件”)或具体的文件名(如“读取 logging.py”),但明确告诉它暂时不要编写代码。在这个阶段,可以充分利用子代理,特别是对于复杂的问题。
- 规划阶段:让 Claude 制定解决特定问题的计划。建议使用“think”这个词来触发扩展思考模式,Claude 会有更多的计算时间来更全面地评估替代方案。
- 编码阶段:如果规划阶段的结果看起来合理,让 Claude 用代码实现解决方案,并要求它在实现过程中明确验证解决方案的合理性。
- 提交阶段:让 Claude 提交结果并创建拉取请求。如果有必要,让 Claude 更新 README 或变更日志,解释它所做的工作。
2. 编写测试、提交;编码、迭代、提交
这是一种受 Anthropic 青睐的工作流程,适用于可以通过单元测试、集成测试或端到端测试轻松验证的更改。测试驱动开发(TDD)在代理式编码中变得更加强大:
- 编写测试:让 Claude 根据预期的输入/输出对编写测试,并明确告知你正在进行测试驱动开发,避免 Claude 创建模拟实现。
- 运行测试:让 Claude 运行测试并确认测试失败,明确告诉它在这个阶段不要编写实现代码。
- 提交测试:当你对测试满意时,让 Claude 提交测试。
- 编写代码:让 Claude 编写通过测试的代码,指示它不要修改测试。Claude 通常需要多次迭代才能编写代码、运行测试、调整代码并再次运行测试,直到所有测试通过。
- 验证实现:在这个阶段,可以让 Claude 使用独立的子代理验证实现是否没有过度拟合测试。
- 提交代码:当你对更改满意时,让 Claude 提交代码。
3. 编写代码、截取结果截图、迭代
类似于测试工作流程,你可以为 Claude 提供视觉目标:
- 提供截图方式:给 Claude 一种截取浏览器截图的方法(如使用 Puppeteer MCP 服务器、iOS 模拟器 MCP 服务器,或手动复制/粘贴截图到 Claude)。
- 提供视觉模拟:通过复制/粘贴或拖放图像,或者给 Claude 图像文件路径,为它提供视觉模拟。
- 实现设计并迭代:让 Claude 用代码实现设计,截取结果的截图,并不断迭代,直到结果与模拟匹配。
- 提交:当你满意时,让 Claude 提交。
4. 安全 YOLO 模式
你可以使用claude --dangerously-skip-permissions
绕过所有权限检查,让 Claude 不间断地工作直到完成。这种模式适用于修复 lint 错误或生成样板代码等工作流程。但需要注意的是,让 Claude 运行任意命令是有风险的,可能会导致数据丢失、系统损坏甚至数据泄露。为了降低这些风险,建议在没有互联网访问的容器中使用--dangerously-skip-permissions
。
5. 代码库问答
当你开始使用一个新的代码库时,可以使用 Claude Code 进行学习和探索。你可以像在结对编程时向项目中的其他工程师提问一样向 Claude 提问,Claude 可以自动搜索代码库来回答一般性问题,如:
- 日志是如何工作的?
- 如何创建一个新的 API 端点?
foo.rs
文件第 134 行的async move { ... }
是什么意思?CustomerOnboardingFlowImpl
处理哪些边缘情况?- 为什么在第 333 行调用
foo()
而不是bar()
? baz.py
文件第 334 行在 Java 中的等效代码是什么?
6. 使用 Claude 与 git 交互
Claude 可以有效地处理许多 git 操作。许多 Anthropic 工程师在 90%以上的 git 交互中使用 Claude:
- 搜索 git 历史:让 Claude 搜索 git 历史以回答问题,如“哪些更改被包含在 v1.2.3 版本中?”“谁负责这个特定的功能?”“为什么这个 API 是这样设计的?”在提示 Claude 时,明确要求它查看 git 历史。
- 编写提交消息:Claude 会自动查看你的更改和最近的历史记录,综合考虑所有相关上下文来撰写提交消息。
- 处理复杂的 git 操作:如还原文件、解决变基冲突、比较和嫁接补丁等。
7. 使用 Claude 与 GitHub 交互
Claude Code 可以管理许多 GitHub 交互:
- 创建拉取请求:Claude 理解“pr”的简写,并会根据差异和周围的上下文生成适当的提交消息。
- 解决代码审查评论:告诉 Claude 修复你的 PR 上的评论(可选地,给它更具体的指示),完成后将更改推回到 PR 分支。
- 修复失败的构建或 linter 警告
- 对开放问题进行分类和分类:让 Claude 遍历开放的 GitHub 问题,对其进行分类和分类。
8. 使用 Claude 处理 Jupyter 笔记本
Anthropic 的研究人员和数据科学家使用 Claude Code 读取和写入 Jupyter 笔记本。Claude 可以解释输出,包括图像,提供了一种快速探索和与数据交互的方式。没有特定的提示或工作流程要求,但建议在 VS Code 中并排打开 Claude Code 和.ipynb
文件。你还可以在向同事展示 Jupyter 笔记本之前,让 Claude 清理或进行美学改进。明确告诉它使笔记本或其数据可视化“美观”,有助于提醒它优化人类观看体验。
四、优化你的工作流程
以下建议适用于所有工作流程:
1. 明确你的指令
Claude Code 在更具体的指令下成功率会显著提高,尤其是在首次尝试时。提前给出清晰的方向可以减少后续的纠正需求。例如: | 较差的指令 | 较好的指令 | | — | — | | 为 foo.py 添加测试 | 为 foo.py 编写一个新的测试用例,覆盖用户注销的边缘情况,避免使用模拟 | | 为什么 ExecutionFactory 的 API 如此奇怪? | 查看 ExecutionFactory 的 git 历史记录,总结其 API 是如何形成的 | | 添加一个日历小部件 | 查看主页上现有小部件的实现方式,了解模式,特别是代码和接口是如何分离的。以 HotDogWidget.php 为例,然后按照该模式实现一个新的日历小部件,让用户可以选择月份并前后翻页选择年份。不使用除代码库中已使用的库之外的其他库从头开始构建 |
Claude 可以推断意图,但不能读心。明确性有助于更好地符合预期。
2. 给 Claude 提供图像
Claude 在处理图像和图表方面表现出色,你可以通过以下几种方式提供图像:
- 粘贴截图:在 macOS 中,按下
cmd + ctrl + shift + 4
截图到剪贴板,然后使用ctrl + v
粘贴。 - 直接拖放图像:将图像直接拖放到提示输入框中。
- 提供文件路径:给 Claude 提供图像的文件路径。
这在 UI 开发中使用设计模拟作为参考点,以及在分析和调试中使用可视化图表时特别有用。即使不将视觉元素添加到上下文中,向 Claude 明确结果的视觉吸引力的重要性也是有帮助的。
3. 提及你希望 Claude 查看或处理的文件
使用制表符补全功能可以快速引用仓库中任何位置的文件或文件夹,帮助 Claude 找到或更新正确的资源。
4. 给 Claude 提供 URL
在提示中粘贴特定的 URL,让 Claude 获取并读取这些 URL 的内容。为了避免对同一域名(如 docs.foo.com)的权限提示,可以使用/allowed-tools
将域名添加到允许列表中。
5. 尽早并经常进行纠正
虽然自动接受模式(shift + tab
切换)允许 Claude 自主工作,但作为积极的协作者并指导 Claude 的方法通常会获得更好的结果。你可以在开始时向 Claude 详细解释任务,也可以在任何时候对 Claude 进行纠正。以下四个工具可以帮助你进行纠正:
- 让 Claude 在编码前制定计划:明确告诉它在你确认计划看起来不错之前不要编码。
- 按下 Escape 键:在任何阶段(思考、工具调用、文件编辑)中断 Claude,保留上下文,以便你可以重定向或扩展指令。
- 双击 Escape 键:跳回到历史记录,编辑之前的提示,并探索不同的方向。你可以编辑提示并重复操作,直到得到你想要的结果。
- 让 Claude 撤销更改:通常与上述第二个选项结合使用,以采取不同的方法。
虽然 Claude Code 偶尔会在首次尝试时完美解决问题,但使用这些纠正工具通常可以更快地产生更好的解决方案。
6. 使用/clear
保持上下文聚焦
在长时间的会话中,Claude 的上下文窗口可能会被无关的对话、文件内容和命令填满,这会降低性能并有时分散 Claude 的注意力。在任务之间频繁使用/clear
命令重置上下文窗口。
7. 使用清单和便笺本处理复杂工作流程
对于具有多个步骤或需要详尽解决方案的大型任务(如代码迁移、修复大量 lint 错误、运行复杂的构建脚本),让 Claude 使用 Markdown 文件(甚至是 GitHub 问题)作为清单和工作便笺本可以提高性能。例如,要修复大量 lint 问题,你可以:
- 让 Claude 运行 lint 命令,并将所有结果错误(包括文件名和行号)写入 Markdown 清单。
- 指示 Claude 逐个处理每个问题,在修复并验证后将其标记为已完成,然后再处理下一个问题。
8. 向 Claude 传递数据
有几种方法可以向 Claude 提供数据:
- 直接复制粘贴:将数据直接复制粘贴到提示中,这是最常见的方法。
- 管道输入:使用管道将数据输入 Claude Code(如
cat foo.txt | claude
),这对于日志、CSV 文件和大数据特别有用。 - 让 Claude 通过 bash 命令、MCP 工具或自定义斜杠命令拉取数据
- 让 Claude 读取文件或获取 URL:这也适用于图像。
大多数会话会结合使用这些方法。例如,你可以通过管道输入一个日志文件,然后让 Claude 使用一个工具拉取额外的上下文来调试日志。
五、使用无头模式自动化你的基础设施
Claude Code 包含无头模式,适用于非交互式上下文,如 CI、预提交钩子、构建脚本和自动化。使用-p
标志和提示启用无头模式,并使用--output-format stream-json
获取流式 JSON 输出。需要注意的是,无头模式不会在会话之间持久化,你需要在每个会话中触发它。
1. 使用 Claude 进行问题分类
无头模式可以驱动由 GitHub 事件触发的自动化,例如当你的仓库中创建了一个新问题时。例如,公共 Claude Code 仓库使用 Claude 检查新问题并分配适当的标签。
2. 使用 Claude 作为代码审查工具
Claude Code 可以提供超越传统 linting 工具检测范围的主观代码审查,识别诸如拼写错误、过时的注释、误导性的函数或变量名等问题。
六、使用多 Claude 工作流程提升效率
除了单独使用 Claude,一些最强大的应用涉及并行运行多个 Claude 实例:
1. 让一个 Claude 编写代码,另一个 Claude 进行验证
一种简单而有效的方法是让一个 Claude 编写代码,另一个 Claude 进行审查或测试。类似于与多个工程师合作,有时拥有单独的上下文是有益的:
- 让 Claude 编写代码
- 运行
/clear
或在另一个终端启动第二个 Claude - 让第二个 Claude 审查第一个 Claude 的工作
- 启动另一个 Claude(或再次运行
/clear
)来读取代码和审查反馈 - 让这个 Claude 根据反馈编辑代码
你也可以对测试进行类似的操作:让一个 Claude 编写测试,然后让另一个 Claude 编写代码使测试通过。你甚至可以让 Claude 实例通过给它们单独的工作便笺本并告诉它们读写的位置来相互通信。这种分离通常比让单个 Claude 处理所有事情产生更好的结果。
2. 创建多个仓库检出
许多 Anthropic 的工程师不会等待 Claude 完成每个步骤,而是采取以下做法:
- 在单独的文件夹中创建 3 - 4 个 git 检出
- 在单独的终端标签中打开每个文件夹
- 在每个文件夹中启动 Claude 并分配不同的任务
- 循环检查进度并批准/拒绝权限请求
3. 使用 git 工作树
这种方法适用于多个独立任务,提供了一种比多个检出更轻量级的替代方案。Git 工作树允许你将同一仓库的多个分支检出到不同的目录中。每个工作树都有自己的工作目录,文件是隔离的,同时共享相同的 Git 历史记录和引用日志。使用 git 工作树可以让你在项目的不同部分同时运行多个 Claude 会话,每个会话专注于自己的独立任务。例如,你可以让一个 Claude 重构你的身份验证系统,而另一个 Claude 构建一个完全不相关的数据可视化组件。由于任务不重叠,每个 Claude 可以全速工作,而无需等待其他 Claude 的更改或处理合并冲突。
4. 使用自定义框架的无头模式
claude -p
(无头模式)将 Claude Code 以编程方式集成到更大的工作流程中,同时利用其内置工具和系统提示。使用无头模式有两种主要模式:
- 扇出模式:处理大型迁移或分析(如分析数百个日志中的情感或分析数千个 CSV 文件)。让 Claude 编写一个脚本来生成任务列表,然后循环遍历任务,为每个任务以编程方式调用 Claude,并为它提供一个任务和一组它可以使用的工具。多次运行脚本并优化你的提示以获得期望的结果。
- 管道模式:将 Claude 集成到现有的数据/处理管道中。调用
claude -p “<你的提示>” --json | 你的命令
,其中你的命令
是处理管道的下一步。JSON 输出(可选)可以帮助提供结构,便于自动化处理。
在使用这两种用例时,使用--verbose
标志进行 Claude 调用的调试可能会有帮助。一般建议在生产环境中关闭详细模式,以获得更简洁的输出。
总之,Claude Code 为我们的编码工作提供了丰富的功能和灵活的使用方式。通过遵循这些最佳实践,你可以更好地利用 Claude 的优势,提高编码效率和质量。希望这些指南能帮助你在编码的道路上更加顺畅!