第 4 章:核心功能

代码库全景扫描与模块关系分析

一、代码库全景扫描:Claude 如何快速建立项目地图

1.1 初始探索策略

当面对一个全新的代码库时,Claude Code 的核心优势在于其"代理式"(agentic)的工作方式——它不只是回答问题,而是主动规划步骤、执行命令、读取文件并自主探索。根据 Anthropic 官方最佳实践文档,最有效的代码库探索遵循"先探索、再计划、后编码"(Explore first, then plan, then code)的原则。

快速建立项目地图的提问示例:

"请分析这个项目的整体结构。我需要了解:
1. 项目使用的主要技术栈和框架
2. 目录结构的核心组织逻辑
3. 主要的入口文件和配置文件
4. 测试结构如何组织
不要修改任何文件,仅做分析。"

预期输出:

Claude 会遍历项目根目录,识别 package.jsonCargo.tomlpyproject.toml 等配置文件,分析 src/app/ 目录结构,并给出类似以下的结构化总结:

项目概览:
- 技术栈:Next.js 14 + TypeScript + Tailwind CSS + Prisma ORM
- 架构模式:分层架构(API Routes → Services → Repository → DB)
- 关键目录:
  - src/app/ — Next.js App Router 页面
  - src/lib/services/ — 业务逻辑层
  - src/lib/db/ — 数据访问层(Prisma)
  - src/components/ — React 组件
  - src/types/ — TypeScript 类型定义
- 入口文件:src/app/layout.tsx, src/app/page.tsx
- 测试:Vitest + React Testing Library,位于 __tests__/ 目录

1.2 使用 CLAUDE.md 构建知识基础

Claude Code 会在项目启动时自动读取 CLAUDE.md 文件,将其内容注入到每次对话的上下文中。这是建立项目地图的关键基础设施。官方文档建议,根目录的 CLAUDE.md 应充当"宪法"角色,定义技术栈、核心命令和不可妥协的标准。

根级 CLAUDE.md 示例:

# 项目规范

## 构建命令
- 生产构建:`pnpm build`
- 开发模式:`pnpm dev`

## 测试命令
- 单元测试:`pnpm test:unit <file>`
- E2E 测试:`pnpm test:e2e`

## 代码风格
- 仅使用函数组件
- 禁止使用默认导出(default exports)
- 样式使用 Tailwind CSS

## 架构
- Next.js monorepo
- 共享逻辑位于 `/packages/shared`

对于大型代码库,单一扁平的 README 会导致 token 浪费和上下文混淆。Think in Python 博客(技术博客,非 Python 编程书籍)提出的"渐进式披露"(Progressive Disclosure)原则建议采用三级层次结构:

层级文件位置目的内容密度
Tier 1: 项目根/CLAUDE.md全局上下文——技术栈、核心命令、代码规范高密度规则
Tier 2: 模块/领域/src/features/billing/CONTEXT.md战略上下文——业务逻辑、数据流、安全要求中等密度
Tier 3: 叶子/组件/src/components/DataGrid/NOTES.md战术上下文——坑点、技术债务、TODO低密度备注

上述文件名(CONTEXT.md、NOTES.md)为 Think in Python 博客的建议命名,非 Claude Code 官方强制要求。实际项目中可使用 CLAUDE.md 统一命名。

1.3 利用 Git 历史理解演进

代码库不仅是当前的快照,更是决策、权衡和修复的历史记录。Claude Code 可以通过 gitgh CLI 工具深入挖掘这段历史。

提问示例:

"查看 ExecutionFactory 的 git 历史,总结它的 API 是如何演进的。
特别关注:
1. 最初的 API 设计意图
2. 重大变更的 PR 编号和原因
3. 当前 API 中的技术债务"

二、模块关系分析:依赖图、调用链、数据流追踪

2.1 从 AST 到知识图谱的范式转变

传统的代码分析工具将代码库视为孤立文件的集合——逐文件解析为抽象语法树(AST),独立分析后结束。但真实的软件是一个相互关联的关系网络,依赖和调用链横跨多个文件、模块甚至语言。

CodePrism 等新兴工具正在探索"通用 AST(跨语言的统一抽象语法树表示)+ 图分析"方法。CodePrism 是一个小众开源项目(rustic-ai/codeprism),使用 Rust 编写,旨在将代码结构转换为语言无关的图表示。虽然概念有趣,但尚未成为业界主流方案。其核心思想如下:

// 通用 AST 节点类型示例
pub enum UniversalNode {
    Module { name: String, path: PathBuf, exports: Vec<String> },
    Class { name: String, methods: Vec<String>, fields: Vec<String> },
    Function { name: String, parameters: Vec<String>, return_type: Option<String> },
    Import { source: String, symbols: Vec<String> },
    Call { target: NodeId, arguments: Vec<NodeId> },
    DataFlow { from: NodeId, to: NodeId, flow_type: FlowType },
}

这种图表示支持跨语言分析,能够回答传统工具无法处理的问题:

  • "找出所有直接或间接调用 authenticate 的函数"
  • "追踪用户输入到数据库查询的数据流"
  • "展示所有继承自 BaseModel 的类(跨所有语言)"

2.2 Claude Code 中的依赖分析实践

在 Claude Code 中,可以通过系统化的提问来获取模块关系洞察。

依赖图分析提问示例:

"分析 src/features/auth/ 模块的依赖关系:
1. 它直接依赖哪些其他模块?
2. 哪些模块依赖于它?
3. 是否存在循环依赖?
4. 画出模块间的依赖方向图"

调用链追踪提问示例:

"追踪一个用户登录请求的完整调用链:
从 API 路由入口开始,经过中间件、控制器、服务层、数据访问层,直到数据库查询。
列出每个环节的函数名和文件路径。"

数据流追踪提问示例:

"分析用户注册流程中的数据流:
1. 请求数据从哪个接口进入系统?
2. 数据经过哪些验证/转换步骤?
3. 最终存储到哪些数据表?
4. 是否有敏感数据(密码等)的加密处理?在哪里进行?"

2.3 使用子代理进行并行调查

上下文窗口是 Claude Code 中最宝贵的资源。当需要深入调查代码库时,子代理(subagents)可以在独立的上下文中运行,避免污染主对话。

并行调查示例:

"使用子代理并行调查以下内容:
1. 认证系统如何处理 token 刷新
2. 项目中是否有现有的 OAuth 工具可以复用
3. 用户权限系统的实现方式
每个子代理独立探索后,汇总发现。"

ProofSource.ai 的作者报告,在其个人项目中并行子代理可将代码库审计时间从 8 分钟缩短至 2 分钟(4 倍加速),Bug 调查从 5 分钟缩短至 1.5 分钟(3.3 倍加速)。此为轶事数据,非严谨基准测试,实际加速比取决于项目类型、任务复杂度和子代理数量。

三、技术栈自动识别

3.1 基于文件指纹的检测

Claude Code 的 /init 命令会自动分析代码库,检测构建系统、测试框架和代码模式。其检测逻辑基于以下文件指纹:

技术类型检测文件/模式示例
语言文件扩展名、shebang.ts → TypeScript, .rs → Rust
包管理器锁文件、清单文件package-lock.json → npm, pnpm-lock.yaml → pnpm
框架配置文件、目录结构next.config.js + app/ → Next.js
构建工具配置文件vite.config.ts → Vite, webpack.config.js → Webpack
测试框架依赖声明、测试文件vitest in package.json + *.test.ts → Vitest
ORM配置文件、schema 文件prisma/schema.prisma → Prisma
数据库迁移文件、连接配置migrations/ + docker-compose.yml with postgres → PostgreSQL

3.2 提问获取技术栈全景

"请识别这个项目的完整技术栈,包括:
1. 主要编程语言及版本
2. 前端/后端框架
3. 数据库和 ORM
4. 测试框架和工具
5. 构建和部署工具
6. 代码质量工具(lint、format 等)
7. 第三方服务集成(如果有的话)"

四、架构模式识别

4.1 常见架构模式的代码特征

通过分析目录结构和导入关系,可以识别出代码库采用的架构模式:

MVC(Model-View-Controller):

特征目录:controllers/, models/, views/
导入方向:controllers → models, controllers → views
典型框架:Ruby on Rails, Django, Laravel, ASP.NET MVC

分层架构(Layered Architecture):

特征目录:api/routes/, services/, repositories/, models/
导入方向:routes → services → repositories → models(单向)
典型框架:Express.js, Spring Boot, NestJS

六边形/整洁架构(Hexagonal/Clean Architecture):

特征目录:domain/, application/, infrastructure/, adapters/
导入方向:infrastructure → application → domain(向内依赖)
核心特征:领域逻辑完全独立于框架和数据库

微服务架构:

特征目录:services/{user-service,order-service,payment-service}/
通信方式:HTTP API、消息队列、事件总线
配置文件:docker-compose.yml, k8s manifests

Monorepo + 模块:

特征目录:packages/{web,mobile,shared-ui,utils}/
工具链:Turborepo, Nx, pnpm workspaces
根配置:turbo.json, pnpm-workspace.yaml

4.2 Claude 架构识别提问

"分析这个代码库的架构模式:
1. 它最符合哪种架构模式?(MVC、分层、微服务、DDD 等)
2. 目录结构反映了什么设计意图?
3. 依赖关系是否符合该架构模式的预期方向?
4. 是否存在架构漂移(architecture drift)的迹象?
5. 如果我要添加一个新功能,应该放在哪个层级/模块?"

五、代码质量初步评估

5.1 核心质量指标

指标定义健康阈值工具
圈复杂度(Cyclomatic Complexity)代码中独立路径的数量函数 < 10SonarQube, ESLint
认知复杂度(Cognitive Complexity)理解代码所需的认知负荷函数 < 15SonarQube
代码覆盖率(Code Coverage)被测试覆盖的代码比例> 80%(新代码)SonarQube Quality Gate 对新增代码的要求
技术债务比率(TDR)(修复工时 / 开发成本) × 100< 5%(新代码)SonarQube 对新增代码的要求
可维护性指数(MI)综合复杂度、体积的评分> 65Visual Studio(专有指标;SonarQube 使用 A-E 评级)
重复代码率重复代码占总代码比例< 3%(新代码)SonarQube 对新增代码的要求

Johal AI Hub 报道称,某单一案例(QuantumLeap AI)在集成 SonarQube 和 CodeClimate 后技术债务降低高达 68%。但此为上限值,非平均效果,且缺乏同行评审研究支持。Johal AI Hub 还声称可维护性指数低于 40 的系统 Bug 率高出 3 倍,但未提供原始研究引用。

5.2 使用 Claude 进行质量评估

"对 src/services/ 目录下的代码进行质量评估:
1. 找出圈复杂度最高的 5 个函数
2. 识别重复代码或近似的逻辑
3. 检查错误处理是否完善
4. 评估类型安全性(TypeScript 项目)
5. 指出潜在的技术债务区域
请给出具体的文件名、行号和改进建议。"

六、大型代码库的分层理解策略

6.1 洋葱式理解模型

面对大型代码库,应采用由内而外的分层理解策略:

第一层:骨架层(5 分钟)

  • 查看顶层目录结构
  • 识别入口文件(main.tsindex.tsapp.ts
  • 阅读 README.mdCLAUDE.md
  • 查看关键配置文件

以上为中小型 Web 项目的参考时间。对于大型复杂系统(如分布式微服务、底层基础设施),各层所需时间可能显著增加。

第二层:脉络层(30 分钟)

  • 追踪一个完整请求的数据流
  • 识别核心模块及其边界
  • 理解依赖注入/服务定位模式
  • 查看数据库 schema 或 API 定义

以上为中小型 Web 项目的参考时间。对于大型复杂系统(如分布式微服务、底层基础设施),各层所需时间可能显著增加。

第三层:血肉层(数小时)

  • 深入关键业务模块的实现
  • 理解状态管理和数据流
  • 阅读测试用例以理解预期行为
  • 查看错误处理和边界情况

第四层:细节层(按需)

  • 特定功能的实现细节
  • 性能优化点
  • 安全相关的代码路径
  • 第三方集成的实现

6.2 使用 Plan Mode 进行安全探索

Claude Code 的 Plan Mode(计划模式)限制工具使用为只读操作(Read、Grep、Glob),阻止写操作(Edit、Write)和危险 Bash 命令(rm、curl 等)。read-only Bash 命令(ls、cat、grep 等)仍可执行。这是探索大型代码库的安全方式。

启动 Plan Mode:

claude --permission-mode plan

Plan Mode 中的探索流程:

用户:"我需要理解支付模块的架构。先不要修改任何代码。"

Claude(Plan Mode):
1. 搜索 payment 相关文件
2. 读取核心服务文件
3. 分析数据流和依赖关系
4. 提出澄清问题(AskUserQuestion)
5. 生成结构化分析报告

用户:"基于以上分析,请制定一个添加退款功能的实施计划。"

Claude:生成详细的步骤计划,待用户批准后执行。

七、与 Claude 对话的最佳实践

7.1 提问的黄金法则

具体优于模糊:

模糊提问具体提问
"给 foo.py 添加测试""为 foo.py 编写测试,覆盖用户未登录的边界情况,避免使用 mock"
"让仪表盘更好看""粘贴截图 实现这个设计。完成后截图对比差异并修复"
"修复登录 bug""用户反馈会话超时后登录失败。检查 src/auth/ 中的 token 刷新逻辑,先写复现测试再修复"

提供验证标准:

"实现一个验证邮箱地址的函数。验证标准:
- user@example.com → true
- invalid → false
- user@.com → false
实现后运行测试验证。"

引用现有模式:

"查看首页上现有组件的实现方式以理解模式。
HotDogWidget.php 是个好例子。
按照这个模式实现一个新的日历组件,
让用户可以选择月份并前后翻页选择年份。
仅使用代码库中已有的库。"

7.2 上下文管理策略

上下文窗口是 Claude Code 的核心约束。针对代码库扫描场景,以下策略特别有效:

使用 /compact 保留扫描结果:

/compact 保留项目架构分析、依赖关系图和关键文件列表

使用子代理隔离大工作量:

"使用子代理调查认证系统如何处理 token 刷新,
以及是否有现有的 OAuth 工具可以复用。"

更多通用上下文管理策略(/clear/btw 等)参见 3.2 节。

7.3 避免常见失败模式

失败模式症状修复方案
厨房水槽会话在一个会话中处理多个无关任务/clear 分隔任务
反复纠正同一问题纠正两次以上仍未解决/clear 后用更精确的 prompt 重新开始
过度指定的 CLAUDE.md文件太长,Claude 忽略一半规则无情删减,只保留 Claude 无法从代码推断的内容
信任-验证缺口Claude 产出了看起来对但边缘情况未处理的代码始终提供验证方式(测试、脚本、截图)
无限探索要求"调查"某事但不限定范围限定调查范围或使用子代理

八、参考来源

  1. Anthropic 官方文档
  2. 代码库导航与架构分析
  3. 依赖图与知识图谱
  4. 并行子代理
  5. 代码质量评估
  6. 架构模式

核心要点回顾:

  1. 上下文是最宝贵的资源 — 通过 CLAUDE.md 分层管理、子代理隔离、频繁 /clear 来最大化利用。
  2. 先探索、再计划、后编码 — Plan Mode 是安全探索大型代码库的最佳工具。
  3. 并行化加速理解 — 子代理可将多维度调查时间从分钟级压缩到秒级。
  4. 验证驱动开发 — 始终给 Claude 提供验证标准(测试、截图、脚本),避免"看起来对但实际错"。
  5. 架构可视化是长期投资 — 依赖图、调用链、数据流追踪是理解系统的关键,值得投入工具建设。