Anthropic:Claude Code 如何在大型代码库中工作

0 阅读10分钟

公司大型代码库里用 Claude Code,头几天顺手,跨服务一改就难受。下面是读 Anthropic 博客文章 How Claude Code works in large codebases 的收获。

cover.png


一、导航:不靠索引,靠「现查现用」

大代码库的第一个硬约束:没有任何窗口装得下整个仓库。Opus 即便开到 1M context,面对持续增长的 monorepo 加依赖树,依然只能看局部。

不少工具(如 Cursor、Copilot 的 semantic search)会先对代码建 embedding 索引,再按语义召回;大库里索引可能滞后,且「相似」不等于「就是那个符号」。

Claude Code 不走这条路,而是用 agentic search:在本机 ls、读文件、grep、沿引用现查,始终对着当前工作区。

agentic-vs-rag.png

Anthropic 把这套做法叫 agentic search,核心表述是:Claude Code 导航代码库的方式 「像软件工程师那样去」——遍历文件系统、读文件、用 grep 找需要的内容、沿引用跨文件追踪;在开发者本机运行,不需要构建、维护或上传 codebase 索引。

官方把两类路径的差异归纳如下:

RAG / 语义索引:典型失效场景

  • 索引跟不上提交:embedding pipeline can't keep up with active engineering teams(活跃团队持续提交时,索引难以同步)。
  • 查询读到的是「旧的内容」:开发者发起查询时,索引往往仍是 weeks, days, or even hours before 的代码库快照。
  • 召回内容已失真:例如两周前已重命名的函数、上个 sprint 已删除的模块仍被返回。
  • 过期无感知:上述过期信息被当作有效上下文喂给模型,with no indication that either is out of date

Agentic search:官方强调的规避点

  • 无中心化索引:不必构建、维护或上传 codebase index。
  • 始终对着 live codebaseEach developer's instance works from the live codebase——每次搜索都基于本机当前文件。
官方对比维度RAG / 语义索引Agentic search
索引需构建、维护,难跟上提交节奏无需 codebase index;对应当前工作区
召回风险过期函数/已删模块,且无过期提示现查现用,避免上述失效模式
前置条件索引建完才好用足够的 starting context(CLAUDE.md、子目录、LSP 等)
适用边界大库 + 模糊全局搜索易撞 context 上限有范围的探索与修改更稳

因此 context 爆掉时,官方提示先查的不是「模型够不够大」,而是 起点 context 与仓库可导航性——后文 harness 一节就是在回答这件事。


二、Harness:模型是烈马,harness 是马具

博客里有一句话:The harness matters as much as the model(harness 和模型一样重要)。

换个说法:模型是烈马——能力强、跑得快;harness马具(鞍、辔、缰)——决定这匹马在大库这条路上能不能被驾驭、往哪跑、会不会跑偏。

很多人评估 Claude Code 时只看 benchmark、模型版本、套餐档位;真正进生产后,马鞍辔头怎么配——记忆怎么注入、什么时候自动跑 lint、团队 SOP 怎么分发——往往比换一匹更烈的马更影响体感。

上一节讲的 starting context,落到工程里就是这套 harness:先得 CLAUDE.md 立住项目约定,再挂 Hooks 做确定性动作与自我修正,再用 Skills 按需加载专长,最后用 Plugins / MCP 把个人配置变成团队能力;LSP、Subagents 则补导航与拆任务。下图、下表按此列出各层职责。

extension-layer.png

组件加载方式该干什么常见误用
CLAUDE.md每次会话自动读项目约定、关键坑、目录指针把本该做成 skill 的长流程全塞进来
Hooks事件触发确定性检查、会话结束反思、动态加载上下文用 prompt 重复提醒「记得 format」
Skills任务相关时才加载专项 SOP(迁移、发布、安全审查)与 CLAUDE.md 职责混淆
Plugins安装后团队共享打包 skill + hook + MCP 配置好配置只留在高手本机
LSP配置后常驻按符号跳转、找引用以为装了插件就自动有语言服务
MCP配置后常驻接 Slack、工单、内网文档基础没搭好就先接一堆 server
Subagents调用时派生探索与编辑分窗,只回传摘要同一 session 里又读又改又大改

简言之,harness 不单是「把团队经验写成默认值」——官方把它定义为围在模型外的扩展生态:约定入口、确定性自动化、按需专长、工具链接入,以及大库里的符号导航与任务拆分;在生产里,这套外装对体感的影响,往往不亚于换模型。


三、让仓库「可被读懂」:三个反复出现的模式

博客里有一句定调的话:Claude 在处理大型代码库时的能力, 受限于它能否找到正确的上下文(背景信息)。——上下文给太多,每次会话都被噪声淹没;给太少,agentic search 只能盲搜。下面三类模式,就是在这两者之间找平衡。

three-patterns.png

模式一:让代码库可导航

Making the codebase navigable at scale:让大规模(或大型)代码库变得易于导航/查阅。

对应 harness 里的 CLAUDE.md、LSP、ignore,直接缓解「搜错地方、context 被无关输出冲垮」。

  • CLAUDE.md 瘦而分层

    根目录只放指针与致命坑,模块约定进子目录;其余写进根文件会变成噪声,挤掉真正有用的规则。

  • 在子目录启动

    cd services/payments && claude,不要总在 repo 根;向上走树仍会加载根级 CLAUDE.md,但默认视野落在当前服务。

  • 子目录写清测试 / lint

    改哪个服务就跑哪条命令,避免全仓 suite 把 context 冲垮;编译型 monorepo 依赖深时要按构建图单独定。

  • ignore + permissions.deny 进 git

    生成物、构建产物、第三方代码一律排除,全队同一套降噪。

  • 代码库地图

    目录名说不清故事时,根目录用 markdown 给每个顶层文件夹一句话;顶层上百个则分层,细节放进子目录 CLAUDE.md。

  • 上 LSP

    常见符号 grep 可能上千命中;LSP 在读文件前按符号过滤。C/C++ 等栈有客户先 org-wide 铺 LSP,再 rollout Claude Code。

官方也提到了:数十万文件夹、非 Git 等极端场景,分层 CLAUDE.md 也会失效,系列后续文章会单独讲。

模式二:把配置当活文件维护

Actively maintaining CLAUDE.md as models evolve:随着模型的不断演进,积极维护 CLAUDE.md 文件。

对应 harness 里的 Hooks、Skills

官方指出的问题:随着模型能力演进,为当前这一代写的指令,换到下一代后可能起反作用——曾经帮 Claude 度过难点的 CLAUDE.md,在新模型上线后可能不再必要,甚至主动限制它

怎么治——下面三条是同一套动作的不同环节,不是并列的三种可选方案:

  • 定期审查何时查

    每 3–6 个月做一次完整审查;或 major 模型发布后体感 plateau 时,先审 CLAUDE.md 与 skill,再考虑换模型。

  • 狠删文档查完怎么改

    Ruthlessly edit your CLAUDE.md,对每一行问「删掉后 Claude 还会不会做对」——会,就删。

  • 让 harness 自更新怎么持续

    用 stop hook 在会话结束时反思并提议更新 CLAUDE.md,减少只靠人工堆规则。

模式三:组织层有人对 harness 负责

Assigning ownership for Claude Code management and adoption:明确 Claude Code 的管理与落地(采用)的责任人。

对应 harness 里的 Plugins、MCP、marketplace 与治理

官方指出的问题单靠技术配置推不动推广——模式一、二在个人仓库里能见效,但若没有人把 harness 汇编、分发、保鲜,好配置会停在高手本机,新人仍是「阉割版」体验。自下而上容易碎片化(人人各写一套 skill),知识停在部落里,推广会触顶;若开发者第一次用起来就挫败,后面很难翻盘。大企业还要尽早面对治理:谁控制哪些 skill/plugin 可上架、如何避免千人重复造轮子、AI 生成代码是否走同样 code review。

怎么治——下面三条同样是同一套推广链的不同环节:

  • 先铺基建再放量铺开前

    大面积开放前,用小团队把 plugin、MCP、目录约定接好,保证新人第一次就顺

  • 指定责任人日常谁维护

    DRI(或 Agent Manager),对配置、marketplace、CLAUDE.md 规范有拍板权并负责保鲜。

  • 收拢实践与治理怎么扩、怎么管

    汇编推广共用 skill/plugin;大企业尽早跨职能定治理,先批准清单 + code review + 小范围试点,再放大。

因此,三个模式是一条链:仓库可读配置随模型更新组织有人维护并分发——缺任何一环,前两节配好的 agentic search 与 harness 都难在全公司站稳。


四、经常容易犯的错误

「换 Opus 就能扛住大库」

窗口变大,只延缓「全库塞不下」;导航与 harness 没跟上,照样在错误文件里烧 token。

「CLAUDE.md 写得越全越好」

它每次会话都加载,过长会变成对所有任务的噪声;专项流程应下沉到 skill,用渐进式披露按需加载。

「MCP 接得越多越好」

MCP 在栈里偏后;前面 CLAUDE.md、hook、skill、plugin 没稳,接进来的内网数据只会加重混乱。官方对 retail 客户的例子是:先有一个连内部分析平台的 skill,验证价值后再 plugin 全公司分发——顺序是 skill → plugin → 规模化,不是反过来。

「大改动靠一个超长 prompt 一次做完」

跨几十个文件的迁移/重构,更可靠的是 plan 与实现分会话、探索用 subagent 只回传 findings、批量同质改动用 /batch 并行 worktree。本质是把「读库」和「改库」从同一个 context 里拆开,跟人查资料、写代码分两阶段一样。

「Claude Code 万能」

它默认的世界观是:Git、工程师为主贡献者、常规目录结构。游戏引擎海量二进制资产、非常规 VCS、非工程师主导改库,需要额外定制;不是不能做,但别指望开箱即用同一套 harness。


五、若你负责在团队落地,会怎么排优先级

  1. 子目录工作 + 根 CLAUDE.md 瘦身(<200 行量级)+ 子目录 CLAUDE.md —— 成本低,立刻改善「搜错地方」和「规则淹没」。
  2. 语言栈对应的 LSP plugin + language server —— 多语言/符号重的库 ROI 最高。
  3. ignore / deny 规则进仓库 —— 全团队统一降噪。
  4. 高频流程做成 skill,再 plugin 进 marketplace —— 把个人本机配置变成组织资产。
  5. hook 做确定性门禁 + stop hook 反哺 CLAUDE.md —— 减少「靠模型记得跑 lint」。
  6. MCP 接内网系统 —— 在前五步稳了之后,接 Slack/Jira/内网 wiki 等。
  7. 指定 harness DRI + 季度审查节奏 —— 防止配置随模型进化腐烂。

模型选型当然要做,但在这套顺序里,它更像换马;前面几步是在配马具


六、收尾

大库里用 Claude Code,关键从来不是「读完整个 repo」——谁也读不完。有用的是:每次对着你本机那份代码现查,再靠 CLAUDE.md、LSP、skill 这些把入口和边界说清楚。

体验变差,常见原因也不是模型突然不行,而是规则写太长、总在根目录开、测试命令跑全仓、好配置只留在某个人电脑上。换 Opus、开 Max,解决不了这些。

别一上来全公司推广,也别在根目录堆一千行 CLAUDE.md 当万能药。


参考