> For the complete documentation index, see [llms.txt](https://code-visualization.shawnxie.top/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://code-visualization.shawnxie.top/di-si-pian-san-ge-he-xin-gong-cheng-chang-jing/codebase-understanding.md).

# 代码库理解与上下文构建

代码库理解是最核心的工程场景之一。无论是新人加入团队、开发者接手陌生模块，还是 AI Agent 准备修改代码，都需要先回答同一个问题：这个系统的关键上下文是什么？

前几篇讲了源码结构化、静态分析、动态分析、变更分析和代码图谱。本章开始进入工程场景。代码库理解不是为了把整个仓库一次性解释清楚，而是为了围绕一个任务快速建立足够准确的上下文。

## 代码库理解的目标

理解一个代码库不是背下所有文件，而是建立几个关键地图：

* 入口地图：系统从哪里被触发。
* 模块地图：代码如何组织，边界在哪里。
* 调用地图：一个业务动作经过哪些路径。
* 数据地图：代码读写哪些数据和资源。
* 测试地图：哪些测试能验证关键路径。
* 历史地图：哪些文件和模块经常变化。

这些地图并不一定都是图形界面，也可以是列表、路径、报告或查询结果。关键是它们能帮助开发者和 Agent 更快回答“我该从哪里开始看”。

## 入口识别

理解代码库首先要找入口。入口是外部世界进入系统的地方。

常见入口包括：

* HTTP 路由和 Controller。
* RPC 或 GraphQL 接口。
* 消息消费者。
* 定时任务。
* 命令行命令。
* 批处理任务。
* 测试用例。
* 框架启动类。

入口识别可以从注解、路由配置、框架约定、启动脚本和测试代码中提取。例如 Java/Spring 项目里，`@RestController`、`@RequestMapping`、`@Scheduled`、消息监听注解都可能表示入口。

入口识别的价值在于让阅读从业务动作开始，而不是从目录结构开始。一个开发任务通常会描述“修改下单逻辑”“调整权限判断”“修复回调重复处理”，入口地图可以把这些业务动作连接到代码路径。

## 模块地图

模块地图回答系统如何拆分。它可以来自目录、包名、构建配置、服务目录、业务域、部署单元和团队 owner。

一个常见误区是把目录结构等同于模块边界。真实系统里，目录结构可能已经过时，公共工具包可能承载了业务逻辑，多个业务域可能共享同一个数据访问层。模块地图需要结合多种信号：

* 包和目录命名。
* 构建模块。
* 依赖关系。
* 业务入口。
* 数据库表和资源访问。
* 变更历史。
* 团队 owner。

模块地图不要求一开始就完美。它的作用是给读者一个足够稳定的起点：哪些代码属于同一功能域，哪些依赖是正常的，哪些跨界调用需要警惕。

## 调用路径

调用路径把入口和核心逻辑连接起来。它能回答：

* 一个请求进入系统后经过哪些方法。
* 某个核心方法由哪些入口触发。
* 业务逻辑在哪里真正发生。
* 哪些公共方法处于多条路径交汇处。

调用路径通常来自静态调用图，也可以用运行时 Trace 校准。静态路径适合全量探索，运行时路径适合确认真实执行。

在大型系统中，调用路径需要裁剪。直接展开所有下游调用会让读者迷失。更实用的方式是沿业务层级展示：入口、应用服务、领域服务、数据访问、外部资源。必要时再下钻到具体方法。

## 数据和资源上下文

很多代码理解问题不只在方法调用里，还在数据和资源依赖里。一个功能可能涉及数据库表、缓存 key、消息 topic、外部 API、配置开关和权限策略。

因此，代码库理解应该尽量识别：

* 代码读写哪些表和字段。
* 使用哪些缓存和队列。
* 调用哪些外部服务。
* 依赖哪些配置项。
* 哪些资源属于核心路径。

这些关系对变更风险非常重要。修改一个看似局部的方法，如果它写入核心表或发出关键消息，影响面就不能只按代码调用关系判断。

## 相关文件定位

真实开发任务通常只需要阅读仓库的一小部分。上下文构建的关键是找出相关文件，而不是把整个仓库交给开发者或 AI。

相关性可以来自多个维度：

* 任务关键词命中的文件。
* 同一入口路径上的文件。
* 调用方和被调用方。
* 同一模块或业务域。
* 覆盖目标代码的测试。
* 历史上经常一起变更的文件。
* 相关 PR 或缺陷记录提到的文件。

这些维度可以组合成一个上下文包。例如一次“修改订单取消逻辑”的任务，上下文包可能包含订单 Controller、订单服务、状态机、库存回滚逻辑、消息发送逻辑、相关测试和历史缺陷。

## 面向人的上下文表达

给人看的上下文应该支持逐步探索：

1. 先看到任务相关入口和模块。
2. 再看到关键调用路径。
3. 再看到相关文件、测试和资源。
4. 最后能跳回源码、PR、Trace 和测试报告。

这类表达可以是模块图、调用路径图、影响面列表、测试推荐或 Markdown 报告。不要强迫所有信息进入一张图。对人来说，清晰的路径和可跳转证据通常比复杂网络图更有价值。

## 面向 AI Agent 的上下文包

AI Agent 更需要结构化上下文，而不是可视化界面。一个适合 Agent 的上下文包可以包含：

* 任务摘要。
* 相关文件列表。
* 关键符号和定义位置。
* 调用方和被调用方。
* 相关测试。
* 相关历史 PR 或变更。
* 架构约束。
* 明确禁止修改的范围。

上下文包还应该区分“必须阅读”和“可选参考”。如果把所有可能相关文件都放进去，Agent 会被噪声干扰；如果只给一个文件，它又可能遗漏系统约束。

## 上下文构建的误区

常见误区包括：

* 只依赖全文搜索，忽略符号和调用关系。
* 只看静态调用图，忽略运行时路径。
* 只看当前代码，忽略历史 PR 和测试失败。
* 把目录结构当成真实业务边界。
* 给 AI 太多文件，导致上下文稀释。
* 给 AI 太少文件，导致局部修改破坏系统行为。

上下文构建的目标不是“尽可能多”，而是“足够相关、可验证、有边界”。

## 小结

代码库理解与上下文构建是所有后续场景的入口。它把源码结构、调用关系、资源依赖、测试覆盖和历史变更组织成任务相关上下文。

对人来说，它降低进入陌生系统的成本；对 AI Agent 来说，它决定修改代码前是否真正理解系统边界。下一章会在这个基础上讨论变更影响分析：当上下文建立之后，如何判断一次修改会影响谁，以及如何验证。
