Claude Code 实战技巧:从能跑到好用的 12 条工程化经验
Claude Code 装好之后,大多数人的用法停留在:在终端打开它,敲一段需求,看着它改完文件,关掉。一个月下来,体感和"AI 自动补全工具"差不多。
但 Claude Code 真正的能力曲线在后面:当你开始用 hooks 让它在每次保存前自动跑 lint、用 CLAUDE.md 让它记住你的工程约定、用 subagent 把任务拆成并行的小窗口、用自定义 slash command 把高频流程封装成一句指令——同样的模型,同样的 API 调用,产出效率会出现数量级的差异。
本文整理 12 条经过生产环境验证的实战技巧,每条都给出完整可复制的配置。文末附在国内稳定接入的方案(claudeapi.com)。
一、写一份真正有用的 CLAUDE.md
CLAUDE.md 不是 README。它是每次会话都会自动塞进上下文的高优先级指令。写得好能省下大量的"请按 X 风格写代码"重复提示;写得差就是在浪费 token。
好的 CLAUDE.md 写法:
# 项目约定
## 技术栈
- 后端:FastAPI 0.115,async-first
- ORM:SQLAlchemy 2.0(asyncio 风格)
- 测试:pytest + pytest-asyncio,不要用 unittest
## 代码风格
- 不写多行 docstring,每函数最多一行注释
- 错误处理:业务边界 raise 自定义 Exception;不要在 service 层 catch 后吞掉
- 不要新建文件,优先编辑现有文件
## 必须先看的文件
- `app/core/deps.py` — 所有依赖注入入口
- `app/models/base.py` — 所有 model 必须继承 BaseModel
## 禁止
- 任何 `print()` 调试语句
- `from x import *`
- 修改 `migrations/` 下已应用的迁移文件
# 项目约定
## 技术栈
- 后端:FastAPI 0.115,async-first
- ORM:SQLAlchemy 2.0(asyncio 风格)
- 测试:pytest + pytest-asyncio,不要用 unittest
## 代码风格
- 不写多行 docstring,每函数最多一行注释
- 错误处理:业务边界 raise 自定义 Exception;不要在 service 层 catch 后吞掉
- 不要新建文件,优先编辑现有文件
## 必须先看的文件
- `app/core/deps.py` — 所有依赖注入入口
- `app/models/base.py` — 所有 model 必须继承 BaseModel
## 禁止
- 任何 `print()` 调试语句
- `from x import *`
- 修改 `migrations/` 下已应用的迁移文件
坏的写法:项目背景介绍、团队规模、技术选型理由——这些是给人看的,给模型看就是噪声。
经验值:CLAUDE.md 控制在 200 行以内,超过部分用 @import 拆到子文件,按需引入。
二、用 hooks 把"每次都要提醒一遍"的事情自动化
hooks 是 Claude Code 的杀手锏,但绝大多数人没启用过。它能在工具调用前后插入 shell 脚本,把"每次让 Claude 跑测试"、“每次改完格式化”、"每次禁止改 prod 配置"这类规则从对话提示降级成强制硬约束。
~/.claude/settings.json:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "if [[ $CLAUDE_FILE_PATHS == *.py ]]; then ruff format $CLAUDE_FILE_PATHS && ruff check --fix $CLAUDE_FILE_PATHS; fi"
}
]
}
],
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "echo \"$CLAUDE_TOOL_INPUT\" | grep -qE 'rm -rf|git push --force|drop database' && exit 1 || exit 0"
}
]
}
]
}
}
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "if [[ $CLAUDE_FILE_PATHS == *.py ]]; then ruff format $CLAUDE_FILE_PATHS && ruff check --fix $CLAUDE_FILE_PATHS; fi"
}
]
}
],
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "echo \"$CLAUDE_TOOL_INPUT\" | grep -qE 'rm -rf|git push --force|drop database' && exit 1 || exit 0"
}
]
}
]
}
}
第一个 hook:每次 Edit/Write 完 Python 文件,自动跑 ruff 格式化和修复。
第二个 hook:拦截危险 bash 命令(rm -rf、git push --force、drop database),直接阻止执行。
hooks 的好处:你不需要在 prompt 里再说"记得跑 ruff",模型也无法"忘记"。
三、把高频流程封装成自定义 slash command
如果你每周要做 5 次相同的事(写 changelog、生成 API 文档、把 issue 转成 PR description),把它写成 slash command。
在 .claude/commands/changelog.md 写:
---
description: 根据最近的 git 提交生成 CHANGELOG 条目
---
读取从上一个 tag 到 HEAD 的所有 commit(用 `git log <last-tag>..HEAD --oneline`),
按 feat / fix / chore / docs 分类,
按照项目 CHANGELOG.md 的现有格式追加一节。
要求:
- 标题用今天日期 + 版本号(从 package.json 读)
- feat 类要写清"用户能做什么新事",不要堆 commit message
- breaking change 单独标 ⚠️
---
description: 根据最近的 git 提交生成 CHANGELOG 条目
---
读取从上一个 tag 到 HEAD 的所有 commit(用 `git log <last-tag>..HEAD --oneline`),
按 feat / fix / chore / docs 分类,
按照项目 CHANGELOG.md 的现有格式追加一节。
要求:
- 标题用今天日期 + 版本号(从 package.json 读)
- feat 类要写清"用户能做什么新事",不要堆 commit message
- breaking change 单独标 ⚠️
之后在 Claude Code 里输入 /changelog 就直接触发,省去每次手敲完整指令。
更进一步,slash command 支持参数:
---
description: 给指定 PR 写 review 评论
argument-hint: <pr-number>
---
用 `gh pr view $ARGUMENTS --json files,title,body` 获取 PR 内容,
按 review-checklist.md 里的项逐条 review,
找到问题用 `gh pr review $ARGUMENTS --comment -b "..."` 发表评论。
---
description: 给指定 PR 写 review 评论
argument-hint: <pr-number>
---
用 `gh pr view $ARGUMENTS --json files,title,body` 获取 PR 内容,
按 review-checklist.md 里的项逐条 review,
找到问题用 `gh pr review $ARGUMENTS --comment -b "..."` 发表评论。
调用:/review 1234。
四、并行 subagent:把 90 分钟的活压成 15 分钟
Claude Code 的 Agent 工具可以一次启动多个 subagent,每个开一个独立上下文窗口并行跑。适用场景:
- 在 5 个不同的模块里同时找一个 API 的所有调用点
- 给整个仓库的 10 个 service 类同时加上同一种 logging
- 同时跑代码 review、security 扫描、performance 检查三个独立分析
正确的触发方式是在一次回复里发出多个 Agent 工具调用,不要串行。Claude Code 在收到多个独立任务时自动并行,前提是你明确告诉它"并行执行":
请同时(并行)执行以下三件事:
1. 在 services/ 下找所有调用 `external_api.py` 的位置
2. 在 tests/ 下找所有 mock 了 external_api 的测试
3. 在 docs/ 下找所有提到 external_api 的文档
每件事用一个独立的 Agent 任务,三个并行启动。
请同时(并行)执行以下三件事:
1. 在 services/ 下找所有调用 `external_api.py` 的位置
2. 在 tests/ 下找所有 mock 了 external_api 的测试
3. 在 docs/ 下找所有提到 external_api 的文档
每件事用一个独立的 Agent 任务,三个并行启动。
实测对比:同样的"在大仓库里做三项独立调研",串行 90 秒,三个并行 30 秒。
五、用 plan mode 防止"边想边改"
复杂改动直接动手是 Claude Code 翻车的高发场景——改到一半发现思路不对,已经把 8 个文件搅得乱七八糟,回滚也尴尬。
解法:在重要任务前先进入 plan mode(Shift+Tab 切换,或直接说"先给我一份实施计划,不要动代码")。Claude 会探索代码、列出方案、给出步骤清单,等你确认后才开写。
特别值得 plan mode 的场景:
- 涉及 3 个以上文件的重构
- 引入新依赖或新架构模式
- 数据库 migration / API 版本变更
- 不熟悉的代码区域
六、上下文管理:长会话要主动压缩
Claude Code 的上下文窗口很大(Opus 4.7 支持 1M),但不等于无脑塞。会话超过几千轮后:
- 早期无关讨论会"污染"模型注意力
- 找最近的关键决策变慢
- token 计费持续累加
实战做法:
- 完成一个子任务后用
/clear:清空当前上下文,下一个任务从干净状态开始 - 超长会话用
/compact:让 Claude 把前面的会话压成一段摘要,保留关键决策但去掉冗余 - 跨会话的事项写进 CLAUDE.md:而不是依赖"上次会话我们决定了 X"
七、给模型读 issue / PR / log 的快捷方法
Claude Code 不止能改代码。当你的问题来自 GitHub issue、PR 评论或日志文件,让它直接读源头比你复制粘贴更准:
# 让 Claude 读 issue 全文
请用 `gh issue view 456 --comments` 看完这个 issue 和所有评论,
然后告诉我应该怎么修。
# 让 Claude 看 CI 失败原因
最近一次 push 的 CI 挂了,用 `gh run list -L 1` 找到 run ID,
然后用 `gh run view <id> --log-failed` 看失败日志,分析原因。
# 让 Claude 分析生产日志
读 `~/var/log/myapp/2026-05-27.log` 最后 500 行,
找出所有 ERROR 级别记录,按出现次数归类。
# 让 Claude 读 issue 全文
请用 `gh issue view 456 --comments` 看完这个 issue 和所有评论,
然后告诉我应该怎么修。
# 让 Claude 看 CI 失败原因
最近一次 push 的 CI 挂了,用 `gh run list -L 1` 找到 run ID,
然后用 `gh run view <id> --log-failed` 看失败日志,分析原因。
# 让 Claude 分析生产日志
读 `~/var/log/myapp/2026-05-27.log` 最后 500 行,
找出所有 ERROR 级别记录,按出现次数归类。
八、cost 命令:让账单可见
/cost 命令显示当前会话累计费用。养成习惯:
- 每个大任务开始前先
/cost,结束后再/cost,知道这个任务花了多少 - 上下文炸到几十万 token 时一眼能看到费用拐点
- 团队多人协作时,可以以会话费用为单位评估"这个功能开发用了多少 AI 成本"
配合上一节的 /clear,控制单会话成本上限。
九、用 Skills 沉淀团队最佳实践
Skills 是 Claude Code 的可复用能力包,比 slash command 更结构化——可以带说明文件、模板、辅助脚本。
例如团队约定的"创建新微服务"流程,可以做成一个 skill:
.claude/skills/new-microservice/
├── SKILL.md # 描述 + 触发条件
├── templates/
│ ├── pyproject.toml.tpl
│ ├── Dockerfile.tpl
│ └── main.py.tpl
└── scripts/
└── setup.sh
.claude/skills/new-microservice/
├── SKILL.md # 描述 + 触发条件
├── templates/
│ ├── pyproject.toml.tpl
│ ├── Dockerfile.tpl
│ └── main.py.tpl
└── scripts/
└── setup.sh
SKILL.md:
---
name: new-microservice
description: 在 services/ 下创建符合公司规范的新微服务骨架,包括 FastAPI 入口、Dockerfile、CI 模板。当用户说"新建一个 XX 服务"或"加一个微服务"时使用。
---
按以下步骤:
1. 询问服务名(kebab-case)
2. 复制 templates/ 下所有模板到 services/<服务名>/,替换占位符
3. 跑 scripts/setup.sh 初始化依赖
4. 在 .github/workflows/ 加上对应的 CI 文件
---
name: new-microservice
description: 在 services/ 下创建符合公司规范的新微服务骨架,包括 FastAPI 入口、Dockerfile、CI 模板。当用户说"新建一个 XX 服务"或"加一个微服务"时使用。
---
按以下步骤:
1. 询问服务名(kebab-case)
2. 复制 templates/ 下所有模板到 services/<服务名>/,替换占位符
3. 跑 scripts/setup.sh 初始化依赖
4. 在 .github/workflows/ 加上对应的 CI 文件
之后团队任何人在 Claude Code 里说"新建一个订单查询服务",模型会自动触发这个 skill,按统一规范生成,避免每个人手动捏一份。
十、模型分层:贵的留给硬骨头
不是所有任务都需要 Opus 4.7。Claude Code 支持手动切模型(/model):
| 任务类型 | 推荐模型 | 理由 |
|---|---|---|
| 复杂重构、架构设计、跨多文件的逻辑梳理 | claude-opus-4-7 |
最强推理能力 |
| 写新功能、改 bug、单文件级别的代码改动 | claude-sonnet-4-6 |
速度快 5 倍,质量足够 |
| 简单查找、文档撰写、commit message | claude-haiku-4-5-20251001 |
价格 1/20,秒回 |
在 settings.json 默认设 Sonnet 4.6,只在啃硬骨头时切到 Opus,月成本可以下降 60% 以上。
{
"env": {
"ANTHROPIC_MODEL": "claude-sonnet-4-6"
}
}
{
"env": {
"ANTHROPIC_MODEL": "claude-sonnet-4-6"
}
}
十一、permission 配置:减少弹窗、保留安全
Claude Code 默认对每个 Bash 命令、文件写入都会询问授权。频繁弹窗会打断节奏。
~/.claude/settings.json:
{
"permissions": {
"allow": [
"Bash(npm test)",
"Bash(npm run *)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(gh issue view *)",
"Bash(gh pr view *)",
"Bash(pytest *)",
"Read(**)",
"Edit(src/**)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(git push --force*)",
"Bash(curl * | sh)",
"Edit(.env*)",
"Edit(secrets/**)"
]
}
}
{
"permissions": {
"allow": [
"Bash(npm test)",
"Bash(npm run *)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(gh issue view *)",
"Bash(gh pr view *)",
"Bash(pytest *)",
"Read(**)",
"Edit(src/**)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(git push --force*)",
"Bash(curl * | sh)",
"Edit(.env*)",
"Edit(secrets/**)"
]
}
}
把高频安全操作(读、跑测试、看 git)默认放行,危险操作(rm -rf、强推、env 文件)默认拒绝。
十二、稳定接入:把"网络"这个变量排除
Claude Code 直连 Anthropic 官方 API 在国内网络环境下偶尔会出现请求中断、响应卡顿、跨地域延迟波动等问题,这些会直接导致"对话到一半失联"——而 Claude Code 是带状态的会话,中断后恢复成本不低。
可以把接入点改成 https://gw.claudeapi.com,接口与 Anthropic SDK 完全兼容,Claude Code 透明使用:
# macOS / Linux
export ANTHROPIC_AUTH_TOKEN="sk-你的ClaudeAPI密钥"
export ANTHROPIC_BASE_URL="https://gw.claudeapi.com"
# macOS / Linux
export ANTHROPIC_AUTH_TOKEN="sk-你的ClaudeAPI密钥"
export ANTHROPIC_BASE_URL="https://gw.claudeapi.com"
# Windows PowerShell(永久)
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_AUTH_TOKEN", "sk-你的Key", "User")
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_BASE_URL", "https://gw.claudeapi.com", "User")
# Windows PowerShell(永久)
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_AUTH_TOKEN", "sk-你的Key", "User")
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_BASE_URL", "https://gw.claudeapi.com", "User")
或写入 settings.json:
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "sk-你的ClaudeAPI密钥",
"ANTHROPIC_BASE_URL": "https://gw.claudeapi.com",
"ANTHROPIC_MODEL": "claude-sonnet-4-6"
}
}
{
"env": {
"ANTHROPIC_AUTH_TOKEN": "sk-你的ClaudeAPI密钥",
"ANTHROPIC_BASE_URL": "https://gw.claudeapi.com",
"ANTHROPIC_MODEL": "claude-sonnet-4-6"
}
}
之后 Claude Code 启动直接走稳定接入点,不必再为网络抖动调试 timeout 配置。控制台 console.claudeapi.com 提供按会话维度的用量明细,配合上面第八条 /cost 使用,可以清楚看到每个项目、每个开发者的 Claude Code 实际消耗。
小结
Claude Code 不是"装上就完事"的工具。投资半天时间把 CLAUDE.md、hooks、自定义 slash command、permissions 配置好,往后几个月的产出曲线会和"开箱即用"派完全分开。
12 条里最优先做的三件事:
- 写一份精简但具体的 CLAUDE.md(不要超 200 行)
- 把"自动格式化 + 危险命令拦截" hooks 启用
- 默认模型设为 Sonnet 4.6,只在硬骨头时切 Opus 4.7
如需在国内稳定使用 Claude Code,访问 claudeapi.com 获取接入点,配置只需替换两个环境变量,账单清晰、用量透明,企业结算支持。



