用好 Claude Code 的那些门道
从第一次尝试让 AI 帮忙写代码到真正把它变成日常开发里顺手好用的伙伴中间往往隔着几条不成文的经验。这篇文章想把这些经验整理出来——不是教条而是一路上摸索出来的、确实管用的做法。Claude Code 本质上是一个“能动起来”的编程环境。它跟普通的聊天机器人不太一样后者是问一句答一句而 Claude Code 能自己去读文件、跑命令、改代码甚至一个人琢磨着把问题解决掉开发者可以在一旁看着、中途纠正或者干脆走开让它慢慢跑。这种工作方式确实不一样。以前是自己写代码然后让 AI 来审现在变成描述想要什么Claude 自己琢磨怎么实现。它会探索、会规划、会动手。当然这种自由度也意味着需要适应它的“脾气”。下面这些经验来自 Anthropic 内部团队以及在不同代码库、不同语言环境下使用 Claude Code 的工程师们。它们都围绕着一个核心约束展开Claude 的上下文窗口填满的速度比想象中快。上下文窗口那个需要时刻留心的资源每一次对话、每一个文件、每一条命令的输出都会被塞进 Claude 的上下文窗口里。这个窗口填满的速度相当快——一个调试会话或者代码库探索动辄消耗几万甚至几十万 token。这很重要因为大语言模型在上下文快满的时候表现会明显下降。它会“忘记”前面的指令或者犯更多低级错误。上下文窗口可以说是最需要管理的资源。那怎么知道窗口快满了呢可以定制状态栏实时查看用量也可以参考官方文档里关于减少 token 用量的策略。总之心里有这根弦后面很多做法就顺理成章了。给它一个自己检验自己的办法这是所有建议里最管用的一条让 Claude 自己能验证结果对不对。提供测试用例、截图、或者预期输出让 Claude 跑完自己检查。一个能自检的 Claude比不能自检的表现要好出一大截。如果没有明确的标准它可能产出看起来正确、实际上跑不通的东西。开发者就成了唯一的反馈回路每个错误都得亲自来修。看看几种常见场景的对比场景不太好的问法更好的问法写函数“实现一个验证邮箱地址的函数”“写一个 validateEmail 函数。示例测试用例userexample.com 应返回 trueinvalid 返回 falseuser.com 返回 false。实现后运行这些测试。”UI 改动“让仪表盘好看点”“[贴截图] 按这个设计实现。完成后截图对比列出差异并修正。”修构建错误“构建失败了”“构建失败错误是[贴错误]。修复并验证构建成功。解决根本原因不要只是把错误提示关掉。”UI 改动还可以用 Claude in Chrome 扩展来验证——它会在浏览器里打开新标签页测试 UI反复迭代直到代码正确。验证可以是测试套件、linter、或者检查输出的 Bash 命令。花时间把验证机制做扎实是回报率最高的投入。先探索再计划最后动手把研究和规划跟实际编码分开可以避免解决错误的问题。如果让 Claude 直接跳进代码它可能产出解决错误问题的代码。用“计划模式”可以把探索和执行分开。一个推荐的四步流程探索进入计划模式Claude 只读代码不做任何改动。claude (计划模式) 读一下 /src/auth搞明白我们怎么处理会话和登录的。 再看看环境变量里的 secrets 是怎么管理的。计划让 Claude 制定详细的实现计划。claude (计划模式) 我想加 Google OAuth。需要改哪些文件 会话流程是怎样的帮我制定一个计划。按CtrlG可以在编辑器里直接改计划。实现切回普通模式让 Claude 按计划写代码。claude (普通模式) 按你的计划实现 OAuth 流程给回调处理器写测试跑通测试套件并修复失败。提交让 Claude 提交代码、开 PR。claude (普通模式) 用描述性的消息提交然后开一个 PR计划模式很好用但也会增加一些开销。对于范围明确、改动很小的事情比如改个拼写、加条日志、重命名变量直接让 Claude 做就行。什么时候需要计划当不确定怎么做的时候、改动涉及多个文件的时候、或者对要改的代码不熟悉的时候。如果改动一句话就能说清楚那就不用计划了。在提示词里给出具体上下文指令越精确后面需要纠正的次数就越少。Claude 能猜到意图但它没法读心。具体到文件、提到约束、指出可以参考的例子这些细节都很重要。策略不太好的问法更好的问法明确范围“给 foo.py 加测试”“给 foo.py 写测试覆盖用户登出时的边界情况。不要用 mock。”指向来源“ExecutionFactory 的 API 怎么这么奇怪”“翻翻 ExecutionFactory 的 git 历史总结一下它的 API 是怎么变成现在这样的。”参考现有模式“加一个日历组件”“看看首页现有组件是怎么实现的HotDogWidget.php 是个好例子。按那个模式实现一个新的日历组件让用户能选月份、前后翻页选年份。纯手写除了代码库里已有的库不要用别的。”描述症状“修一下登录的 bug”“用户反馈会话超时后登录失败。检查 src/auth/ 里的认证流程特别是 token 刷新。先写一个会失败的测试复现问题再修复。”当然模糊的提示也不是没用。在探索阶段一句“这个文件有什么可以改进的”往往能挖出一些自己没想到的问题。用更丰富的方式给它信息用引用文件、直接粘贴图片、或者用管道传数据都可以让 Claude 拿到更丰富的信息。用引用文件不用描述代码在哪Claude 会在回答前读文件。直接粘贴图片截图拖进去或者复制粘贴都行。给文档链接贴上 API 文档或参考链接用/permissions把常用域名加白。管道传数据cat error.log | claude直接把文件内容送进去。让它自己去拿告诉 Claude 用 Bash 命令、MCP 工具、或者读文件来获取需要的上下文。把环境配好几个小配置能让 Claude Code 在所有会话里都更顺手。写一份好用的 CLAUDE.md运行/init可以根据当前项目结构生成一个初始的 CLAUDE.md 文件然后再慢慢打磨。CLAUDE.md 是 Claude 每次对话开始时都会读的一个特殊文件。里面可以放 Bash 命令、代码风格、工作流规则——这些是 Claude 光看代码猜不出来的信息。/init会分析代码库识别构建系统、测试框架、代码模式搭好一个基础框架。CLAUDE.md 没有固定格式但尽量简短、易读。举个例子# 代码风格 - 使用 ES 模块import/export不用 CommonJSrequire - 尽可能解构导入例如 import { foo } from bar # 工作流程 - 做完一系列代码改动后记得做类型检查 - 优先运行单个测试不要跑整个测试套件速度更快CLAUDE.md 每次会话都会加载所以只放那些普遍适用的东西。那些只在某些时候相关的领域知识或工作流可以考虑用技能skills代替——技能是按需加载的不会让每个对话都变得臃肿。保持简洁。每一条规则都可以问自己“如果去掉这条Claude 会犯错吗”如果不会就删掉。太长的 CLAUDE.md 反而会被 Claude 忽略。应该放的内容不应该放的内容Claude 猜不到的 Bash 命令Claude 读代码就能知道的东西跟默认习惯不同的代码风格标准语言惯例Claude 已经知道了测试指令和偏好的测试运行器详细的 API 文档放链接就好仓库规范分支命名、PR 约定频繁变化的信息项目特有的架构决策长篇大论的教程开发者环境里的特殊要求必需的 env var逐个文件的代码库描述常见的坑或非直观的行为不言自明的做法比如“写整洁代码”如果 Claude 明明有规则禁止却还老犯说明文件太长了规则被淹没了。如果 Claude 问的问题明明 CLAUDE.md 里有答案那可能是表述不够清楚。把 CLAUDE.md 当代码对待出问题了就审一遍定期修剪改了之后观察 Claude 的行为有没有变化。可以通过加强语气比如“重要”、“必须”来让 Claude 更遵守指令。把 CLAUDE.md 提交到 git让团队一起维护。这个文件会随着时间积累越来越有价值。CLAUDE.md 还可以用路径引入其他文件参见 README.md 了解项目概览package.json 了解可用的 npm 命令。 # 补充指令 - Git 工作流docs/git-instructions.md - 个人覆盖规则~/.claude/my-project-instructions.mdCLAUDE.md 可以放在几个不同位置主目录~/.claude/CLAUDE.md所有 Claude 会话通用项目根目录./CLAUDE.md提交到 git 跟团队共享父级目录对 monorepo 很友好根目录和子目录的 CLAUDE.md 都会被自动引入子目录当处理该目录下的文件时Claude 会按需读取配置权限用“自动模式”让一个分类器来处理审批或者用/permissions把特定命令加白名单再或者用沙箱做系统级隔离。这些都能减少打断同时保持可控。默认情况下Claude Code 对会改动系统的操作写文件、执行 Bash 命令、调用 MCP 工具等都会请求许可。安全但有点烦——到后来其实也不是真在审就是机械地点确认。有三种方法可以减少打断自动模式一个独立的分类器模型会审查命令只拦截看起来有风险的比如权限升级、未知基础设施、被恶意内容驱动的操作。适合当信任任务的大方向但不想每一步都点确认。权限白名单允许某些明确安全的工具比如npm run lint或git commit。沙箱启用系统级隔离限制文件系统和网络访问让 Claude 在明确边界内自由干活。用好命令行工具告诉 Claude Code 用gh、aws、gcloud、sentry-cli这些 CLI 工具跟外部服务打交道。CLI 工具是与外部服务交互最省上下文的方式。如果用 GitHub装一下ghCLI。Claude 知道怎么用它来建 issue、开 PR、读评论。没有gh的话Claude 也能调 GitHub API但没认证的话容易触发限流。Claude 学新 CLI 工具也挺快。可以试试这样的提示“用 ‘foo-cli-tool --help’ 学习 foo 工具然后用它解决 A、B、C。”连上 MCP 服务器运行claude mcp add可以接入 Notion、Figma、数据库这些外部工具。有了 MCP 服务器可以让 Claude 从 issue 追踪器实现功能、查数据库、分析监控数据、从 Figma 拿设计、自动化工作流等等。配置钩子hooks钩子能在 Claude 工作流程的特定节点自动运行脚本保证某个动作每次都发生没有例外。跟 CLAUDE.md 那种“建议性”的规则不同钩子是确定性的能保证动作一定执行。Claude 自己就能写钩子。试试这样的提示“写一个钩子每次文件编辑后运行 eslint。”或者“写一个钩子禁止对 migrations 目录的写入。”手动配置的话直接编辑.claude/settings.json运行/hooks可以浏览当前配置。创建技能skills在.claude/skills/目录下放SKILL.md文件给 Claude 提供领域知识和可复用的工作流。技能扩展了 Claude 的知识可以放项目、团队或特定领域的信息。Claude 会在相关时自动应用或者直接通过/技能名调用。创建一个技能在.claude/skills/下建一个目录里面放SKILL.md.claude/skills/api-conventions/SKILL.md--- name: api-conventions description: 我们服务的 REST API 设计规范 --- # API 规范 - URL 路径用 kebab-case - JSON 属性用 camelCase - 列表接口必须带分页 - API 版本放在 URL 路径里/v1/、/v2/技能也可以定义可直接调用的可重复工作流.claude/skills/fix-issue/SKILL.md--- name: fix-issue description: 修复一个 GitHub issue disable-model-invocation: true --- 分析和修复 GitHub issue$ARGUMENTS。 1. 用 gh issue view 获取 issue 详情 2. 理解问题描述 3. 搜索代码库找到相关文件 4. 实现修复 5. 写测试并运行验证 6. 确保代码通过 lint 和类型检查 7. 写描述性的提交消息 8. 推送并创建 PR运行/fix-issue 1234就能调用它。用disable-model-invocation: true来标识那些有副作用、需要手动触发的工作流。创建子代理在.claude/agents/下定义专门的助手让 Claude 可以把隔离的任务交给它们。子代理在自己的上下文里运行有自己的工具集。适合那些要读很多文件、或者需要专注某个领域、不想弄乱主会话的任务。.claude/agents/security-reviewer.md--- name: security-reviewer description: 审查代码的安全漏洞 tools: Read, Grep, Glob, Bash model: opus --- 你是资深安全工程师。审查代码时关注 - 注入漏洞SQL、XSS、命令注入 - 认证和授权缺陷 - 代码里的密钥或凭证 - 不安全的数数据处理 给出具体的行号和修复建议。然后就可以让 Claude 明确调用“用一个子代理来审查这段代码的安全问题。”安装插件运行/plugin浏览插件市场。插件把技能、钩子、子代理、MCP 服务器打包成一个可安装的单元。如果用带类型的语言装一个代码智能插件能让 Claude 获得精确的符号导航和自动错误检测。有效沟通的方式怎么跟 Claude Code 沟通对结果质量影响挺大。问代码相关的问题可以把 Claude 当成一个资深工程师来问问题。刚接触一个新代码库时可以用 Claude Code 来学习和探索日志是怎么工作的怎么新建一个 API 端点foo.rs 第 134 行的async move { ... }是干什么的CustomerOnboardingFlowImpl 处理了哪些边界情况为什么第 333 行调的是 foo() 而不是 bar()这样用 Claude 是一个很有效的上手方式能缩短上手时间减少对其他工程师的打扰。不需要什么特殊提示直接问就行。让 Claude 先采访你对于大一点的功能可以让 Claude 先采访你。从一个极简的提示开始让 Claude 用AskUserQuestion工具来采访我想做一个[简要描述]。用 AskUserQuestion 工具详细采访我。 问技术实现、UI/UX、边界情况、顾虑和取舍。别问显而易见的问题深挖那些我可能没考虑到的难点。 持续采访直到都覆盖了然后写一份完整的规格说明到 SPEC.md。规格写完后开一个新会话来执行它。新会话的上下文是干净的全部精力都在实现上手里还有一份写好的规格文档。会话管理对话是持久化的还可以撤销。善用这个特性及早纠偏发现 Claude 跑偏了尽早纠正。最好的结果往往来自紧密的反馈循环。虽然 Claude 偶尔第一次就完美解决但快速纠偏通常能更快得到更好的方案。Esc按一下就能让 Claude 停下手头的事上下文还在可以重定向。两次 Esc 或 /rewind打开回滚菜单可以恢复之前的对话和代码状态或者从选中的消息开始总结。“撤销那个”让 Claude 自己撤回改动。/clear在无关任务之间重置上下文。长会话里堆着不相关的上下文会拖累表现。如果同一个问题在同一个会话里纠正了两次还不对说明上下文里已经堆满了失败的方法。运行/clear用一个更精确的提示重新开始把刚才学到的东西融进去。一个新会话配上好提示往往比一个塞满了修正的长会话效果更好。主动管理上下文在无关任务之间运行/clear来重置上下文。Claude Code 会在接近上下文限制时自动压缩对话历史保留重要的代码和决策释放空间。长会话里上下文窗口很容易被无关对话、文件内容、命令输出填满。这会拖累表现甚至让 Claude 分心。任务之间用/clear完全重置上下文自动压缩触发时Claude 会总结最重要的信息代码模式、文件状态、关键决策想更精细控制用/compact 指令比如/compact 关注 API 改动只压缩部分对话可以用两次 Esc 或/rewind选一个消息检查点选择“从这里开始总结”。这会把该点之后的消息压缩保留之前的内容在 CLAUDE.md 里定制压缩行为比如“压缩时务必保留所有修改过的文件列表和测试命令”确保关键信息在总结后还在那些不需要留在上下文里的快速问题用/btw。答案会出现在一个可关闭的浮层里不会进入对话历史查个细节也不会撑大上下文用子代理做调研用“用子代理来调研 X”把调研工作委派出去。子代理在单独的上下文里探索主会话保持干净专心实现。既然上下文是核心资源子代理就是最有力的工具之一。当 Claude 研究代码库时它会读很多文件这些文件都消耗主会话的上下文。子代理在独立的上下文窗口里运行只汇报总结用子代理来调研一下我们的认证系统怎么处理 token 刷新以及有没有现成的 OAuth 工具可以复用。子代理探索代码库、读相关文件、回来汇报发现主会话一点没乱。Claude 实现完东西之后也可以用子代理来验证用一个子代理来审查这段代码看看有什么边界情况用检查点回滚Claude 的每一步操作都会创建一个检查点。可以恢复到任意之前的检查点可以只恢复对话、只恢复代码、或者两者都恢复。Claude 在改动前会自动创建检查点。按两下 Esc 或运行/rewind打开回滚菜单。可以选择只恢复对话、只恢复代码、两者都恢复或者从选中的消息开始总结。有了检查点就不用小心翼翼了。可以让 Claude 尝试风险高的操作不行就回滚换条路。检查点跨会话持久化关掉终端后面还能回滚。注意检查点只追踪 Claude 做的改动不是 git 的替代品。恢复会话运行claude --continue可以接着上次的对话--resume可以从最近的会话里选。Claude Code 会把对话存在本地。当一个任务跨多个会话时不用重复解释上下文claude --continue # 恢复最近的会话 claude --resume # 从最近的会话列表里选用/rename给会话起个名字比如“oauth-迁移”或“调试-内存泄漏”以后好找。把会话当分支用不同工作流可以有各自独立、持久的上下文。自动化与规模化当一个人用一个 Claude 用得顺手之后可以试试并行会话、非交互模式、以及扇出模式成倍放大产出。非交互模式在 CI、pre-commit 钩子或脚本里用claude -p 提示词。加--output-format stream-json可以拿到流式 JSON 输出。非交互模式是把 Claude 集成到 CI 流水线、pre-commit 钩子或任何自动化工作流的方式。输出格式支持程序化解析纯文本、JSON、流式 JSON。# 一次性查询claude-p这个项目是做什么的# 给脚本用的结构化输出claude-p列出所有 API 端点--output-format json# 实时处理的流式输出claude-p分析这个日志文件--output-format stream-json并行运行多个 Claude可以同时跑多个 Claude 会话加快开发、做隔离实验、或者启动复杂的工作流。主要有三种方式Claude Code 桌面应用可视化地管理多个本地会话每个会话有独立的工作树网页版 Claude Code在 Anthropic 的安全云基础设施上隔离的虚拟机里运行Agent 团队自动协调多个会话共享任务、消息有队长除了并行工作多会话还能支持一些注重质量的工作流。比如“写代码 / 审代码”模式会话 A写会话 B审给我们的 API 端点实现一个限流器审查src/middleware/rateLimiter.ts里的限流器实现找边界情况、竞态条件、以及与现有中间件模式的一致性这是审查反馈[会话 B 的输出]。解决这些问题。类似的模式也可以用在测试上让一个 Claude 写测试另一个 Claude 写代码让测试通过。跨文件扇出用循环遍历任务对每个调用claude -p。配合--allowedTools限制权限适合批量操作。对于大规模迁移或分析可以把工作分给多个并行的 Claude 调用生成任务列表让 Claude 列出所有需要迁移的文件比如列出 2000 个需要迁移的 Python 文件写脚本循环forfilein$(catfiles.txt);doclaude-p将$file从 React 迁移到 Vue。返回 OK 或 FAIL。\--allowedToolsEdit,Bash(git commit *)done先在几个文件上试再全量跑根据前两三个文件的情况调整提示词然后跑全量。--allowedTools限制了 Claude 能做什么在无人值守时很重要。也可以把 Claude 集成到现有数据处理流水线里claude-p提示词--output-format json|你的命令开发调试时用--verbose生产环境关掉。用自动模式自主运行想要不间断执行又要有后台安全检查可以用自动模式。一个分类器模型会在命令执行前审查拦截权限升级、未知基础设施、以及被恶意内容驱动的操作让日常任务自动跑不用点确认。claude --permission-mode auto -p 修复所有 lint 错误在用-p的非交互运行中如果分类器反复拦截操作自动模式会中止因为没有用户可回退。避坑指南下面这些是常见的问题早点识别能省不少时间。“厨房水槽”式会话从一个任务开始然后让 Claude 做点不相关的事再切回第一个任务。上下文里塞满了无关信息。解法不相关的任务之间用/clear。反复纠正Claude 做错了纠正还是错再纠正。上下文里堆满了失败的尝试。解法两次纠正之后还没好/clear重新开始写一个更精确的初始提示把刚才学到的东西放进去。CLAUDE.md 太臃肿文件太长Claude 会忽略一半因为重要规则被淹没了。解法狠心精简。如果 Claude 不用这条规则也能做对就删掉或者换成钩子。“先信后验”的缺口Claude 产出一个看起来合理的实现但不处理边界情况。解法永远提供验证手段测试、脚本、截图。没法验证的代码不要放过去。无限探索让 Claude “调研”某件事但不限定范围结果它读了上百个文件把上下文塞满了。解法给调研任务限定范围或者用子代理这样探索不会占主会话的上下文。培养直觉上面的这些做法不是铁律只是普适性好、值得参考的起点不一定在每个场景都最优。有时候就应该让上下文积累——因为正深陷在一个复杂问题里历史记录很有价值。有时候可以跳过计划让 Claude 自己摸索——因为任务本来就是探索性质的。有时候模糊的提示刚刚好——想看看 Claude 怎么理解问题不想过早约束它。留意什么做法管用。当 Claude 输出特别好的时候回头看看自己做了什么提示结构、提供的上下文、所处的模式。当 Claude 卡住的时候想想为什么上下文太乱提示太模糊任务太大一次做不完慢慢地会形成一种直觉这是任何指南都写不出来的。会知道什么时候要具体、什么时候要开放什么时候该计划、什么时候该探索什么时候该清空上下文、什么时候该让它留着。相关资源Claude Code 工作原理代理循环、工具、上下文管理扩展 Claude Code技能、钩子、MCP、子代理、插件常见工作流调试、测试、PR 等的分步指南CLAUDE.md存放项目规范和持久化上下文