越短越好,200 行是上限
直觉告诉你信息越多 Claude 越懂你。实际相反:信息越多,Claude 越容易忽略真正重要的那部分。
claude-code-best-practice 的作者 Boris Cherny 给过一个明确的数字——CLAUDE.md 不要超过 200 行。这不是拍脑袋的建议。Claude Code 每次会话都会加载整个 CLAUDE.md,它直接吃掉你的上下文窗口。你多写的每一行废话,都在挤占 Claude 理解你真实代码的空间。
一个可操作的验证标准:找一个完全没看过你项目的人,让他读完 CLAUDE.md,看能不能在 30 秒内回答三个问题——这是什么产品?技术栈是什么?新代码放哪里?答得上来,合格;答不上来,说明你写偏了。
「不要引入什么」和「要引入什么」同等重要
你列出了技术栈,以为 Claude 就不会乱来。但别忘了 Claude 的知识截止在训练日,它不知道你的项目背着哪些历史包袱。
一份没有「禁止清单」的 CLAUDE.md 是危险的。Claude 会出于善意,引入它「知道」的那个最优方案——而这个方案很可能和你的项目彻底冲突。所以专门写一个 Do NOT introduce 区块,把禁用的库、禁用的模式列清楚。
这条规则值千金。它省下的不是一次纠正,而是防止 Claude 在你没注意时悄悄引入一个不兼容的依赖,然后接下来 10 次会话你都在修兼容性问题。
规则必须可操作,不是可感受
「写干净的代码」听起来像条好规则,但对 AI 来说约等于什么都没说。
Claude 不懂「干净」。它懂的是「用 named export 而不是 default export」「单个组件不超过 200 行」「用 async/await 不用 then 链」。前者是感受,后者是指令——只有指令能被执行。
判断方法很简单:读完一条规则后,你能不能在 5 秒内判断一段代码符不符合它?能,规则合格;不能,重写。
CLAUDE.md 是指针,不是图书馆
你想把所有架构文档都塞进 CLAUDE.md,但 CLAUDE.md 的职责从来不是存储信息,而是告诉 Claude 去哪找信息。
这是顶级用户和普通用户的分水岭。普通用户的 CLAUDE.md 是一份知识梳理,顶级用户的 CLAUDE.md 是一个 router。Claude 不需要在 CLAUDE.md 里读完整套架构文档,它只需要知道一件事:「需要架构信息时,去打开 docs/architecture.md。」
更进阶的玩法是渐进式上下文(Progressive Disclosure)——在 CLAUDE.md 里只留指向各类文档的指针,按需加载。这样 Claude 在处理无关请求时不会浪费上下文去读历史文档,但真正需要时,它知道该去哪找。
给敏感模块开「本地 CLAUDE.md」
默认认知里 CLAUDE.md 只有一个,放在根目录。但现实是某些模块的风险比其他模块高 10 倍。
在 src/auth/、src/payments/、infra/ 这些目录下各放一个本地 CLAUDE.md,Claude 在操作对应目录时会自动加载。这相当于给危险区域单独装上护栏——通用规则管不到的细节,在这里逐条约束清楚。
让 CLAUDE.md 驱动 Hook,而不是靠记忆
你写了测试规则,但 Claude 写完代码从来不跑测试——因为它忘了。
Claude 的记忆不可靠,Hook 可靠。正确的做法是把 CLAUDE.md 里的规则变成 Hook 的触发条件,让规则在工具层被强制执行。
这里的区别很本质:写在 CLAUDE.md 里的规则是「请记住」,配了 Hook 的规则是「你必须」。Hook 是 CLAUDE.md 规则的强制执行层,凡是「漏一次就出事」的规则,都应该往 Hook 上沉。
用 CLAUDE.md 建立长期记忆回路
每开一个新会话,Claude 都像失忆一样重新认识你的项目。但解决这个问题,你不需要一个复杂的向量数据库。
在 CLAUDE.md 里加一条指令,让 Claude 自己维护一个 MEMORY.md——把跨会话中最有价值的那部分上下文,主动记录进去。这比任何标榜「AI 长期记忆」的 MCP 都更简单、更可控,而且天然可以用 Git 追踪。
成本是一个文件,收益是 Claude 在跨会话时保留下了上下文里最值钱的那 5%。性价比的判断很清楚:这条赛道上那些重型记忆方案,目前还没看到相对一个纯文本文件的真正壁垒。
用 CLAUDE.md 代替每次会话的「开场白」
你不该每次都问 Claude「你能帮我做 X 吗」,而该让 CLAUDE.md 直接承载你的工作风格,让它从第一句话就知道你讨厌什么。
来自 Claude Code Cowork 的实战总结——一份优秀的 CLAUDE.md 里应该有两样东西:「你是谁」和「你讨厌什么」。短短几行,就能省掉你每次新会话开头的前 5 条消息。Claude 从第一句就知道你在乎什么、讨厌什么、期望怎样的交互节奏。
现在就可以动手的四件事
- 打开你的 CLAUDE.md,删到 200 行以内——删不掉的,本来就不值得留
- 加一个
Do NOT introduce区块,至少列出 3 个禁用的库 - 把每一条模糊规则改写成具体、可验证的指令
- 给最敏感的模块(auth / billing / infra)各加一个本地 CLAUDE.md
CLAUDE.md 不是写一次就扔那儿的文件,它是活的。每发现一个 Claude 反复踩的坑、每总结出一条有效规则,都该更新进去。一个月后回头看,你会发现它已经把 Claude 从一个莽撞的实习生,调教成了真正懂你项目的高级工程师。