How Claude Code works in large codebases: Best practices and where to start¶
Ch09.013 How Claude Code works in large codebases: Best practices and where to start¶
📊 Level ⭐⭐ | 20.9KB |
entities/how_claude_code_works_in_large_codebases.md
核心要点¶
- Claude Code 采用主动搜索(agentic search)而非 RAG,在本地运行,直接读取实时代码库,无集中式索引延迟
- Extension layer 是关键:CLAUDE.md → Hooks → Skills → Plugins → MCP Servers → LSP/Subagents,五层叠加决定实际表现
- 大型代码库配置三模式:代码库可导航化、CLAUDE.md 持续维护、设置所有权 DRI
- 组织层面:需要 agent manager 或 DRI 集中管理配置,防止知识部落化
Claude Code 如何导航大型代码库¶
Claude Code 导航代码库的方式与软件工程师相同:遍历文件系统、读取文件、使用 grep 精确查找、跟踪跨代码库的引用。它在开发者本地运行,不需要构建、维护或上传代码库索引到服务器。
Agentic Search vs RAG¶
RAG 驱动的 AI 编程工具通过嵌入整个代码库并在查询时检索相关片段来工作。在大规模场景下,这些系统可能失效——因为嵌入 pipeline 无法跟上活跃工程团队的代码提交速度。当开发者查询索引时,它反映的是代码库在数天、数周甚至数小时前的状态,检索返回的是团队两周前重命名的函数或上一个 sprint 删除的模块,且没有任何过期提示。 Agentic search 避免了这些失败模式。没有嵌入 pipeline 或集中式索引需要维护,数千名工程师提交新代码也不会影响系统。每个开发者的实例都基于实时代码库工作。
局限性¶
但这种方法有权衡:当 Claude 有足够的起始上下文来知道从哪里查找时,效果最佳。如果要求它在数十亿行代码库中查找模糊模式,在工作开始前就会遇到 context-window 限制。投资于代码库设置的团队能看到更好的结果。
Harness 与模型同等重要¶
对 Claude Code 最常见的误解之一是其能力完全由使用的模型决定。团队关注模型的基准测试分数和在测试任务上的表现。实际上,围绕模型构建的生态系统——harness——比单独的模型更能决定 Claude Code 的表现。 Harness 由五个扩展点构建:CLAUDE.md 文件、hooks、skills、plugins 和 MCP servers,每个都有不同功能。团队构建它们的顺序很重要,因为每一层都建立在前一层的基础上。另外两个能力——LSP 集成和 subagents——完善了整个设置。
扩展点层次¶
| 组件 | 是什么 | 何时加载 | 最适合 | 常见困惑 |
|---|---|---|---|---|
| CLAUDE.md | Claude 自动读取的上下文文件 | 每个 session | 项目特定约定、代码库知识 | 用它来存放属于 skill 的可重用专业知识 |
| Hooks | 在关键时刻运行的脚本 | 由事件触发 | 自动化一致行为、捕获 session 学习 | 用 prompt 处理应该自动运行的事情 |
| Skills | 特定任务类型的打包指令 | 按需加载 | 跨 session 和项目的可重用专业知识 | 把所有东西都放进 CLAUDE.md |
| Plugins | 打包的 skills、hooks、MCP 配置 | 配置后始终可用 | 在组织内分发工作设置 | 让好的设置保持部落化 |
| LSP | 通过语言服务器获取实时代码智能 | 配置后始终可用 | 符号级导航和类型语言的自动错误检测 | 假设它是自动的 |
| MCP servers | 连接外部工具和数据 | 配置后始终可用 | 赋予 Claude 访问内部工具的能力 | 在基础工作之前构建 MCP 连接 |
| Subagents | 用于特定任务的独立 Claude 实例 | 调用时 | 分离探索和编辑、并行工作 | 在同一 session 中运行探索和编辑 |
CLAUDE.md 文件¶
第一个扩展点。这些是 Claude 在每个 session 开始时自动读取的上下文文件:根文件提供全局视图,子目录文件提供本地约定。它们赋予 Claude 所需的代码库知识。由于无论任务如何,每个 session 都会加载它们,将内容集中在广泛适用的内容上可以防止它们成为性能拖累。
Hooks¶
让设置自我改进。大多数团队认为 hooks 是防止 Claude 做错事的脚本,但它们更有价值的用途是持续改进。stop hook 可以在 context 新鲜时反思 session 中发生的事情并提议更新 CLAUDE.md。start hook 可以动态加载特定于团队的上下文,使每个开发者无需手动配置就能获得正确的模块设置。对于 lint 和 formatting 等自动检查,hooks 以确定性方式执行规则,比依赖 Claude 记住指令产生更一致的结果。
Skills¶
在需要时提供正确的专业知识,而不会膨胀每个 session。在拥有数十种任务类型的大型代码库中,并非所有专业知识都需要在每个 session 中存在。Skills 通过渐进式披露(progressive disclosure)解决这一问题,将专业工作流和领域知识卸载到 context 空间,否则这些会与 session 争抢资源,仅在任务需要时才加载。例如,安全审查 skill 在 Claude 评估代码漏洞时加载,而文档处理 skill 在代码变更需要更新文档时加载。 Skills 还可以限定到特定路径,这样它们只会在代码库的相关部分激活。拥有支付服务的团队可以将他们的部署 skill 绑定到该目录,这样当有人在 monorepo 的其他地方工作时它永远不会自动加载。
Plugins¶
分发有效的设置。大型代码库的一个挑战是好的设置可能保持部落化。Plugin 将 skills、hooks 和 MCP 配置打包成单一可安装包,因此新工程师在第一天安装该 plugin 时,就能立即获得与已经使用它的用户相同的上下文和能力。Plugin 更新可以通过托管市场在组织内分发。
LSP 集成¶
赋予 Claude 与开发者相同的 IDE 导航能力。大多数大型代码库 IDE 已经运行着 LSP,为"转到定义"和"查找所有引用"提供支持。向 Claude 公开这个能力给它符号级精度:它可以跟踪函数调用到其定义,跨文件追踪引用,区分不同语言中同名的函数。没有它,Claude 会进行文本模式匹配,可能定位到错误的符号。一家企业在 Claude Code 推广前 org 范围内部署了 LSP 集成,专门为了在 C 和 C++ 的大规模导航中保证可靠性。对于多语言代码库,这是最高价值的投资之一。
MCP Servers¶
扩展一切。MCP servers 是 Claude 连接内部工具、数据源和 API 的方式,这些是它无法通过其他方式访问的。最复杂的团队构建 MCP servers 向 Claude 暴露结构化搜索作为可以直接调用的工具。其他人则连接 Claude 到内部文档、工单系统或分析平台。
Subagents¶
分离探索和编辑。Subagent 是一个孤立的 Claude 实例,有自己的 context window,执行任务,完成工作后只向父级返回最终结果。一旦 harness 就位,一些团队启动只读 subagent 来映射子系统并将发现写入文件,然后让主 agent 在完整图景下进行编辑。
成功部署的三个配置模式¶
如何为大型代码库配置 Claude Code 很大程度上取决于代码库的结构。但我们在观察到的部署中出现了三个一致的模式。
1. 使代码库在大规模下可导航¶
Claude 在大型代码库中提供帮助的能力受限于其找到正确上下文的能力。每个 session 加载太多上下文会降低性能,而太少的上下文会让 Claude 盲目导航。最有效的部署在使代码库对 Claude 可读性方面进行前期投资。几个模式一致出现:
- 保持 CLAUDE.md 文件精简和分层。Claude 在代码库中移动时将它们相加加载:根文件提供全局视图,子目录文件提供本地约定。根文件应该只是指针和关键陷阱;其他一切都会漂移到噪音中
- 在子目录中初始化,而不是在 repo 根目录。Claude 在实际与任务相关的代码库部分作用域时效果最佳。在 monorepos 中,这可能感觉违反直觉,因为工具通常假设根访问,但 Claude 自动向上遍历目录树并加载沿途发现的每个 CLAUDE.md 文件,因此根级上下文永远不会丢失
- 按子目录限定测试和 lint 命令。当 Claude 只更改一项服务时运行完整套件会导致超时并浪费在无关输出上的 context。子目录级别的 CLAUDE.md 文件应指定适用于该部分代码库的命令。这对于每个目录都有自己测试和构建命令的服务导向代码库效果很好。在具有深层跨目录依赖的编译语言 monorepos 中,按子目录限定更难实现,可能需要特定于项目的构建配置
- 使用
.claudeignore文件排除生成的文件、构建产物和第三方代码。在.claude/settings.json中提交permissions.deny规则意味着排除项受版本控制,团队中的每个开发者都无需自己配置就能获得相同的噪音减少。在某些代码库中,生成的文件本身就是开发工作的主题。从事代码生成器工作的开发者可以在本地设置中覆盖项目级排除,而不会影响团队其他成员 - 当目录结构不能胜任时构建代码库地图。对于代码不在常规目录结构中整合的组织,在 repo 根目录的轻量级 markdown 文件列出每个顶级文件夹及其内容的单行描述,给 Claude 一个它可以在打开文件前扫描的目录表。对于有数百个顶级文件夹的代码库,这最好作为分层方法:根文件只描述最高级结构,子目录 CLAUDE.md 文件提供下一级细节,在 Claude 在树中移动时按需加载。对于更简单的情况,@-mention 特定文件或目录可以让 Claude 引用做同样的工作
- 运行 LSP 服务器让 Claude 按符号搜索而不是按字符串搜索。在大型代码库中 grep 一个常见函数名会返回数千个匹配,Claude 会消耗 context 打开文件来确定哪个重要。LSP 只返回指向同一符号的引用,因此过滤在 Claude 读取任何内容之前进行。设置这个需要为您的语言安装代码智能 plugin 和相应的语言服务器二进制文件
2. 随着模型智能发展主动维护 CLAUDE.md 文件¶
随着模型发展,为当前模型编写的指令可能会与未来模型产生反效果。指导 Claude 度过以前挣扎模式的 CLAUDE.md 文件可能在下一代模型发布时变得不必要或积极限制。例如,告诉 Claude 将每个重构分解为单文件变更的 CLAUDE.md 规则可能帮助过早期模型保持正轨,但会阻止更新模型执行它处理得很好的协调跨文件编辑。 构建来补偿特定模型限制的 skills 和 hooks——无论是在模型的推理中还是在 Claude Code 自己的工具中——一旦这些限制不再存在就成了开销。例如,在 Perforce 代码库中拦截文件写入以强制 p4 edit 的 hook 在 Claude Code 添加原生 Perforce 模式后变得冗余。 团队应该每三到六个月进行一次有意义的配置审查,但在重大模型发布后性能感觉停滞时也值得进行一次。
3. 为 Claude Code 管理和 adoption 分配所有权¶
仅靠技术配置本身并不能推动 adoption。做得对的组织也在组织层面进行了投资。 推广最快的方式是在广泛访问之前进行专门的基础设施投资。一个小团队,有时甚至只有一个人,在开发者第一次接触时就将工具连接到开发者工作流程。在一家公司,几名工程师构建了一套 plugin 和 MCP,在第一天就可用。在另一家,一整个专注于管理 AI 编程工具的团队在推广开始前就建立了基础设施。在这两种情况下,开发者第一次体验是高效的而不是沮丧的,adoption 从此传播。 今天做这项工作的团队往往位于开发者体验或开发者生产力之下,这通常是负责新工程师入职和构建开发者工具的职能。在几个组织中,一个新兴角色是 agent manager:专门负责管理 Claude Code 生态系统的混合 PM/工程师职能。对于没有专门团队的組織,最小可行版本是 DRI:一个对 Claude Code 配置、设置权限政策、plugin 市场和 CLAUDE.md 约定拥有所有权和决策权的人,并负责保持它们最新。 自下而上的 adoption 产生热情但没有集中化就会碎片化。您需要一个人或一个团队来汇编和推广正确的 Claude Code 约定(如标准化的 CLAUDE.md 层次结构或精选的 skills 和 plugins 集)。没有这项工作,知识将保持部落化,adoption 将停滞。 在大型组织中,尤其是在受监管行业,治理问题很早就出现,例如:谁控制哪些 skills 和 plugins 可用,如何防止数千名工程师独立重建相同的东西,如何确保 AI 生成的代码经过与人类生成的代码相同的审查流程?为了尽早解决这些问题,我们建议从一组定义的批准 skills、所需的代码审查流程和有限的初始访问开始,随着信心建立而扩展。
深度分析¶
Agentic Search 的本质优势与结构性代价¶
Claude Code 采用的 agentic search 路径,本质上是将代码库导航问题转化为了一个本地化的上下文填充问题。这与 RAG 范式有根本区别:RAG 在索引侧投入大量计算构建"知识图谱",在查询侧依赖检索质量;而 agentic search 放弃索引构建的初始投入,选择在每次会话时实时遍历。两种路径的选择实际上反映了不同的工程哲学——RAG 赌的是"索引投资能换来一致的检索质量",agentic search 赌的是"本地计算足够便宜且代码库结构足够可导航"。 但这个选择的结构性代价是:上下文窗口成为硬性瓶颈。当代码库规模超过一定阈值(文中暗示是"数十亿行"级别),单次搜索的上下文消耗会超过可用窗口。在超大规模代码库中,这不是配置能解决的问题,而是架构层面的约束。文中提到的 edge case——"数十万文件夹和数百万文件"——正是这个代价的体现。这暗示 Claude Code 的设计边界可能比官方宣传的更早到来。
扩展点层次的依赖顺序不是技术约束而是认知约束¶
文中强调"构建顺序很重要,因为每一层建立在前一层的基础上"。但这个"顺序"是否真的是技术依赖?仔细看各层的功能:CLAUDE.md 提供初始上下文,hooks 在关键节点触发自动化,skills 按需加载专业知识,plugins 分发打包配置,MCP 连接外部工具,LSP 提供符号级导航。严格来说,skills 可以不依赖 hooks,MCP 可以独立于 plugins 运行。这个顺序更像是认知上的层次——从"每个会话都需要的基础上下文"到"偶尔需要的专门能力"。 这提示了一个设计问题:如果各层之间没有真正的技术依赖,那么团队可能会过度设计这个层次,将本可简化的配置复杂化。实际部署中,许多小型团队可能只需要 CLAUDE.md + LSP 就足够了,skills 和 plugins 是可选的进阶配置。
三模式配置的隐含假设¶
三个配置模式——代码库可导航化、CLAUDE.md 维护、设置所有权分配——隐含了一个前提:Claude Code 在大型代码库中的表现,90% 取决于配置,10% 取决于模型。但这个比例在不同场景下可能反转。在模型能力快速提升的周期中,为当前模型深度优化的配置可能是下一版本的负担。文中提及的"每三到六个月进行配置审查"实际上是一个保守估计——如果模型迭代加快,这个频率可能需要更高。 组织层面的 DRI 或 agent manager 角色是一种预防知识部落化的技术,但它本身也是一种部落化——DRI 个人的判断和偏好会渗透进全局配置,影响数千名工程师的工作体验。这个角色的存在暗示大型组织可能需要重新定义"工具管理"的职能边界。
实践启示¶
- 不要在配置军备竞赛中过度投资:五层扩展点是为极端复杂场景设计的。大多数中型代码库(<100 万行)只需要 CLAUDE.md + LSP 就足够运行良好。plugins 和 MCP 是可选的进阶配置,不是必需品。
- 代码库可导航性的投入优先于模型选择:在代码库结构混乱、CLAUDE.md 缺失、LSP 未配置的情况下,换用更强大的模型几乎不会带来明显改善。可导航性是底层的,不能被模型能力弥补。
- CLAUDE.md 审查应该与模型版本发布同步:每当有重大模型发布时,应该有一轮专门的配置审查,检查原有的模型特定优化是否从"必要"变成了"阻碍"。这个节奏可能需要从"每季度"加速到"每重大模型发布后"。
- Subagent 模式是探索与编辑解耦的正确方向,但有 context 泄漏风险:当子 agent 返回结果时,它的完整推理链不会保留在父级 context 中。这意味着同一子任务可能被重复探索。解决方案是让 subagent 在返回前将关键发现写入文件,让父 agent 读取文件而不是依赖记忆。
- 在受监管行业中,adoption 初期的治理设计比技术配置更重要:定义批准 skills 列表和代码审查流程的决策,应该在任何人开始使用之前完成。一旦工程师形成了工作方式,改变它会比一开始就设计好治理框架更困难。
- DRI/agent manager 的核心职责是"反部落化"而非"集中控制":这个角色的价值在于确保有效的配置能传播,而不是审批所有人可以做什么。过度管控会扼杀 bottom-up 的创新,这同样危险。
适用场景与局限性¶
Claude Code 围绕传统软件工程环境设计:工程师是主要的代码库贡献者,repo 使用 Git,代码遵循标准目录结构。大多数大型代码库符合这个模式,但游戏引擎与大型二进制资产、版本控制非常规的环境或非工程师贡献代码库等非传统设置需要额外的配置工作。 边缘情况:即使分层 CLAUDE.md 方法在某些情况下也会失效,例如拥有数十万文件夹和数百万文件的代码库,或使用非 git 版本控制的遗留系统。该系列的后续文章将解决这些挑战。
相关概念¶
相关实体¶
- How Claude Code Works In Large Codebases Best Practices And Where To Start
- Claude Code Large Codebase Harness Configuration
- Claude Code Best Practices
- Claude Code Large Codebase Enterprise Deployment
- Oneusefulthing Claude Code What Comes Next
→ 原文存档