Claude Code 最佳实践 12 招:从 Vibe Coding 到工程化
- 1. 从 Vibe Coding 到 Agentic Engineering
- 2. CLAUDE.md 60 行最优,200 行是上限
- 3. 不要再把 Claude Code 当聊天框用
- 4. Context 是资源,用完要释放
- 5. Hook:夹在 Agent 动作之间的隐形助手
- 6. /sandbox:减少 84% 的权限弹窗
- 7. “任何时候都有几十个 Claude 在跑”
- 8. ultrathink 不是噱头
- 9. /loop:CI 做不到的本地自动化
- 10. /btw:不中断任务提问
- 11. 技能中最有价值的部分:Gotchas
- 12. 让”完成”真的完成
- 13. –bare:SDK 调用快 10 倍
- 14. 这些模式的共同逻辑
- 思考
- 总结
1. 从 Vibe Coding 到 Agentic Engineering
第三次看到 Claude 删错分支的时候,作者不再怪模型了。真正的问题是他使用 Claude 的方式——每次会话都从零开始,没有结构、没有约束、没有可复用的配置。
这个转折的引子是 shanraisshan/claude-code-best-practice 仓库——2026 年 3 月登上 GitHub 热榜第一的项目,副标题是 “from vibe coding to agentic engineering”。该仓库汇总了 69 条实用技巧,涵盖 11 个类别,还得到了 Claude Code 的开发者 Boris Cherny 的审阅。
本文提炼出 12 个最核心的模式。
2. CLAUDE.md 60 行最优,200 行是上限
大多数人把 CLAUDE.md 当配置文件写,觉得越长越详细越好。500 行的 CLAUDE.md 里,后半部分规则会被 Claude 静默忽略——不是偶尔,而是「足够让你无法依赖它的频率」。
令人惊讶的发现是:60 行最优,200 行是天花板。超过之后,后面的规则会被 quietly deprioritized。Claude 的注意力不是无限的。
解法不是删规则,而是让规则只在相关时才出现。<important if="language=go"> 语法能做到这一点——规则包裹在标签内,只在 Claude 处理 Go 文件时可见,写 Python 时整块内容相当于不存在。
对于分层结构的项目,文件组织如下:
my-service/
├── CLAUDE.md # 根目录:通用规则 ~30行
├── api/
│ └── CLAUDE.md # REST 约定、错误码
├── internal/
│ └── CLAUDE.md # 包命名、接口模式
└── cmd/
└── CLAUDE.md # 参数解析、日志初始化
internal/CLAUDE.md 使用条件规则:
<important if="language=go">
- 不要裸起 goroutine。使用 errgroup 或 WaitGroup 管理生命周期。
- Channel 容量 > 0 需要内联注释说明原因。
- context 必须是第一个参数,命名为 ctx。
</important>
总行数保持可控,每条规则只在实际相关时才触发。
3. 不要再把 Claude Code 当聊天框用
一个常见习惯:每次请求都重新写一遍规则。「帮我审查这个 PR。只读文件,不要修改。关注 internal/ 包。使用项目的错误处理约定。」——每次都这样。
替代方案是把 Claude Code 当作编排系统而非聊天界面。.claude/ 目录支持三类配置:
- commands/:可复用的工作流快捷方式,存储为斜杠命令
- agents/:专用的子 Agent,带有明确的权限限制
- skills/:跨项目可移植的知识模块
代码审查的例子最直观:在 .claude/agents/ 下创建一个 reviewer.md,只赋予 Read 权限——没有写工具、没有 Shell 执行、没有网络访问。这个 Agent 物理上不能修改文件,不管你在对话里怎么要求它。那句「只读不改」已经永远从你的 prompt 中消失了。
4. Context 是资源,用完要释放
默认情况下,技能的上下文与主 Agent 共享。这带来的问题比你想象的要大:一个代码质量分析技能读了 40 个文件生成报告后,后续的每个任务都会变重——Claude 携带着所有的文件内容,即使回答完全不相关的问题。
在技能的 frontmatter 加一行就解决:
context: fork
技能在隔离的子 Agent 中运行,完成后上下文立即丢弃。主 Agent 只看到输出——一个干净的摘要、一列发现。
不需要手动 /compact,不需要开新会话清空上下文。
5. Hook:夹在 Agent 动作之间的隐形助手
PreToolUse、PostToolUse、Stop——三个钩子点,大多数 Claude Code 用户从未配置过。
它们的有趣之处在于:运行在 Claude 主要推理循环外部。不消耗 Token、不中断任务。它们是附着在 Claude 动作上的旁路自动化。
几个实际用例:
- 自动格式化:PostToolUse 钩子在每次写 Go 文件后自动触发 gofmt——格式化从来不需要你要求 Claude,它自动发生。
- 保护性操作拦截:
/careful模式激活 PreToolUse 钩子,拦截所有不可逆操作——文件删除、覆盖、分支强推——在执行前要求明确确认。在重构前激活它,任务完成后自动停用。 - 完成验证:下文第 11 条详述。
6. /sandbox:减少 84% 的权限弹窗
Claude Code 默认对每个 Shell 命令都弹窗确认。对于安全性这是正确的默认,对于效率提升则是错误的默认。
/sandbox 在隔离环境中运行 Shell 命令。每个命令的破坏范围被约束,审批阈值大幅降低。实测:减少 84% 的权限弹窗。
权衡是存在的——沙箱中的命令系统访问有限。但对于大多数编码任务,沙箱边界从未被触及,而中断消失了。
7. “任何时候都有几十个 Claude 在跑”
这是 Boris Cherny 对自己工作流的描述,不是夸张。
claude -w 在 git worktree 中启动 Claude——一个隔离的工作目录,在独立的分支上。配合 tmux 分屏,你可以跑多个独立的 Claude 实例,每个有自己的上下文、自己的分支、自己的任务。
Agent A 重构认证模块,Agent B 修数据库层,Agent C 为两者写测试。它们不共享上下文,不冲突,变更在独立分支上直到准备合并。
从「一次等一个 Claude 回复」到「同时跑十几个」——这个转变是 vibe coding 和 agentic engineering 之间最可见的区别。
8. ultrathink 不是噱头
在任务描述的任意位置输入 ultrathink,Claude 进入更高强度的推理模式。不需要配置变更、不需要切换模型——只是一个词。
不是每个任务都需要它。作者用在服务拆分设计上:普通模式给了三个不错的方案;开启 ultrathink 后,Claude 揭示了他没有考虑到的两个约束——跨服务事务边界和现有监控系统的接入成本。最终的选型完全不同。
9. /loop:CI 做不到的本地自动化
/loop 30m /code-review
每 30 分钟运行一次代码审查。不需要人盯着。间隔最长 1 小时,持续最多 3 天。
CI/CD 自动化的是代码合入之后的事情。/loop 自动化的是开发过程中发生的事情——它能做 CI 根本做不到的事,因为它能访问你当前的工作状态。
CI 看到的是 diff。基于 loop 的审查知道你这周在做什么、之前遇到了什么困难、建立了什么约束。作者周五下班前启动了一个 loop,让它周末跑着,周一回来发现已经标记好了问题并草拟了 PR 摘要。
大多数开发者不知道 Claude Code 原生就有这个能力。
10. /btw:不中断任务提问
你正在跑一个 90 分钟的重构,突然想问一个无关的问题——不同的文件,不同的关注点。中断意味着丢失上下文,但问题需要答案。
/btw 把问题排入队列。Claude 继续当前任务,记下你的问题,在自然停顿点时回答,然后无缝接回去。
用过一次之后,把整个任务停下来问一个旁路问题,感觉就像浪费。
11. 技能中最有价值的部分:Gotchas
如果你在为团队构建技能,核心贡献者 Thariq 有一条特别的建议:
「技能中信号密度最高的内容,是 Gotchas 章节。」
不是概述,不是使用示例。是 Gotchas。
Gotchas 章节记录的是 Claude 在实际使用中真实遇到的失败模式。不是你预测的边缘情况——是真实的失败,随着时间积累,在发生时记录下来的。它们的信噪比远超说明性文字,因为它们具体、已验证、会叠加。你记录的每个失败都变成未来的预防。
先构建 Gotchas 章节。每次 Claude 失败时更新它。让它成为技能文档的主要产出物。
12. 让”完成”真的完成
Claude 会告诉你任务完成了。这不等于真是这样。
作者让 Claude 写一组 API handler。Claude 说写好了。作者看了代码——三个 handler 中两个有空的错误处理:err != nil 后面什么都没有。如果当时有一个 Stop 钩子接到测试覆盖率检查,就会立即捕获这个问题,让 Claude 回去修复。
Stop 钩子在 Claude 表示任务完成时触发。把它接到验证脚本上——跑测试套件、检查预期文件是否存在、调用 API 端点并验证响应。如果验证失败,任务状态回退,Claude 继续工作直到通过。
在跨夜运行或多会话的自动化工作流中,这是可信输出和仍需人工检查的输出之间的分界线。
13. –bare:SDK 调用快 10 倍
通过 Agent SDK 编程调用 Claude 时(非交互式 CLI),加 --bare 参数。
上下文发现是 Claude 的启动例程——定位 CLAUDE.md 文件、加载配置、检查环境。交互式会话中,这只发生一次。批量自动化中,每次调用都会触发。
--bare 跳过它。启动时间最多快 10 倍。
单次调用几乎无感。但作者有一个每日代码分析流水线——约 300 个文件,每个文件一个 Agent 并行跑。加 --bare 之前:约 40 分钟。之后:18 分钟。同样的基础设施、同样的工作负载。
14. 这些模式的共同逻辑
看完 69 条技巧后,vibe coding 和 agentic engineering 之间的真正差距不是工具不同,而是同样的工具使用方式不同。
Vibe coding 是反应式的:你描述你想要什么,Claude 尝试,你纠正,重复。输出质量几乎完全取决于你今天 prompt 写得多认真。
Agentic engineering 把工作转移到了配置中。约束住在文件里,不在 prompt 里。工作流按计划运行。Agent 有硬性的权限限制,不管你在对话中怎么要求它们。上下文自动清理。整个系统的一致性是 prompt 技巧永远无法达到的。
实现这些的工具——agents、skills、hooks、worktrees、loops——都随 Claude Code 一起发布。它们不是高级功能。大多数人从来没找到它们。
该仓库是 shanraisshan/claude-code-best-practice,仍在活跃更新,值得从头到尾读一遍。
思考
这 12 条模式最打动我的不是技术深度,而是它们背后的工程哲学转变。
Claude Code 发布后,大多数人的使用方式还停留在「加强版聊天」的阶段——更长的 prompt、更详细的指令、更多的约束条件。但这套最佳实践揭示了一个完全不同的使用模式:把你的开发习惯系统化为配置文件,而不是每次对话都重新描述一遍。
最直接可用的三条是第 1 条(CLAUDE.md 60 行)、第 3 条(context: fork)和第 5 条(/sandbox 省 84% 弹窗)。它们不需要理解任何架构概念,改一行配置就能立刻感受到差异。
第 7 条「几十个 Claude 同时跑」和第 9 条「/loop 离线审查」则展示了更激进的可能性——当你把 Agent 从对话窗口解放出来,它就变成了一个可以并行调度、离线工作的虚拟团队。这种模式在传统的 IDE 插件思维里是不存在的。
需要注意的是,这些实践对个人开发者和团队有不同的适用性。个人开发者可能最受益于 CLAUDE.md 优化和子 Agent 权限隔离;团队则应该关注 skills 共享和 Stop Hook 验证标准化。
总结
从 vibe coding 到 agentic engineering 的跨越,不依赖更强的模型或更贵的 API,而是同一套工具使用方式的系统性升级:约束写进文件而不是塞进 prompt,Agent 跑在限定权限下而不是靠口头约束,验证挂在钩子里而不是靠人工复查,任务定时执行而不是等人发号施令。这些都是 Claude Code 原生支持、但大多数用户从未打开过的功能。





