Documentation Index
Fetch the complete documentation index at: https://adonis-til.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
很多人学开源项目的套路是这样的:git clone,然后让 AI 把整个仓库扫一遍,生成一份”架构文档 + 模块关系图 + 流程图”。产出确实漂亮——模块框清晰、箭头整齐、一眼看过去像什么都讲明白了。
但读完合上电脑,下一秒连入口文件在哪都说不上来。想改一行代码也不知道该从哪下手。很多人开始怀疑是自己思维方式有问题。
不是思维问题,是方法错了。AI 生成的架构文档不是辅助,是理解的替代品。这篇写一套能真正把代码装进脑子的 4 步法。
为什么 AI 文档让你读不懂代码流程
一份 AI 生成的架构文档和你真正需要的东西,中间有四层错位:
| AI 文档给你的 | 你真正需要的 |
|---|
| 静态结构(模块、调用关系) | 动态流程(运行时到底发生了什么) |
| 按概念组织(Auth / Data / UI) | 按问题组织(想做 X 该看哪个文件) |
| 作者视角的”应该怎么理解” | 读者视角的”我现在卡在哪一步” |
| 被动接收 | 主动构建 |
更本质的问题在于阅读姿势。读小说是线性的,一页翻过一页;读代码不是——代码需要反复跳转、交叉引用、回溯。调用栈深到第五层,你还得记住第一层的上下文。
AI 把这个立体的东西拍平成一份可以从上到下读一遍的文档,读的时候确实顺——但顺,就意味着你的大脑没有亲手建立索引。没有”这个函数在那个位置”的空间感,没有”上次追这条线卡在 A 函数”的肌肉记忆。合上文档一小时,结构图上的箭头就从记忆里溶解了。
这是 ChatGPT 时代一个普遍的陷阱:“生成感”让你误以为自己在学习。生成是输出,学习是内化,两件事。看着精美的图”哦,懂了”的那个瞬间,你获得的是理解的幻觉,不是理解本身。
4 步主动学习法
步骤 1 · 先当用户,再当程序员
跑起来 → 用 10 分钟 → 再读代码。
git clone <repo>
cd <repo>
# 读 README 的 Quick Start / Development 段
pnpm install # 或 npm / yarn / pip / cargo run
pnpm dev
打开浏览器,当一个真实用户用 10 分钟:登录一次、搜索一次、提交一次、切换一次设置。
所有后续阅读都需要”具体使用场景”做锚点。没跑过产品就开始读代码,就像没看过电影就读剧本——所有角色名都对不上脸,读到第三幕你还在翻前面查”这人是谁”。
跑不起来本身也是重要信号:真实项目的启动门槛 = 它复杂度的缩影。需要配几个环境变量、起几个服务、跑几个迁移脚本,这些摩擦本身就在告诉你项目的依赖结构。
步骤 2 · 从入口点追一条具体流程
不要从架构总览开始读。总览永远太抽象,没有钩子挂不住任何记忆。
先找真正的入口,常见候选:
| 项目类型 | 入口文件 |
|---|
| Vite / React SPA | src/main.tsx |
| Next.js | app/page.tsx 或 pages/_app.tsx |
| Node 服务端 | server.ts / src/index.ts |
| CLI 工具 | bin/cli.js 或 package.json 的 bin 字段 |
| Tauri 应用 | 前端 src/main.tsx + 后端 src-tauri/src/main.rs |
| 找不到 | 看 package.json 的 main / module / exports |
找到入口后,选一条你刚才用产品时做过的动作(登录、搜索、提交表单任选一个),从点击开始追整条链路:
UI 按钮 onClick
-> 前端处理函数(哪个文件?哪行?)
-> API 请求(fetch / axios / tRPC / GraphQL)
-> 后端路由(Express / Fastify / Axum)
-> 业务逻辑层
-> DB 查询
-> 返回路径一路反推回来
-> 前端状态更新 -> UI 变化
每一跳都打开文件亲眼看一次。看完一条完整链路,整个项目 70% 的基础结构就摸到了——一个真实的 feature 横切所有层,UI、路由、业务、数据、状态全被串起来。这是任何架构图替代不了的。
步骤 3 · 读测试,比读文档有效
找测试文件:
# 常见测试目录
find . -type d -name "__tests__" -not -path "*/node_modules/*"
find . -name "*.test.*" -not -path "*/node_modules/*" | head -20
find . -name "*.spec.*" -not -path "*/node_modules/*" | head -20
测试是项目里最精准的功能说明书,而且它是可执行的、带真实数据的:
describe / it 名称 = 这个功能在做什么,一句话说明
- 测试输入输出 = 真实数据长什么样(比类型声明直观 10 倍)
- mock 和 fixture = 这个模块依赖谁,铁证
- 修改一个测试的输入,重新跑 = 主动理解
文档会过期,注释会骗人,但测试不会——测试跑不过 CI 就红,它和代码的真实行为永远同步。
反模式预警:如果项目测试覆盖率很低,或者测试里满是 expect(true).toBe(true) 这种摆设,说明项目本身质量一般,深学的性价比低。换一个学。
步骤 4 · 用 debugger 看真实执行
这一步是最多人跳过、也最能拉开差距的一步。
VSCode / Cursor 打开项目
-> 在入口函数或追的那条链路上打断点
-> F5 启动 debug(Node / 浏览器 / Rust 都支持)
-> 在产品界面触发对应操作
-> F10 单步跳过、F11 步入
-> 盯着变量面板看值怎么变
跑一次 debug 的信息量约等于读 100 行代码。变量面板里的实际值、调用栈、闭包上下文,这些东西单看源码要脑补半天,断点一打全在眼前。
很多人(包括读到这里的一部分人)写了三五年前端,还在靠 console.log 调试——这是巨大的工具浪费。debugger 不只是调试工具,它是最好的代码阅读工具。
AI 的正确用法(对照表)
AI 不是不能用——是你要换个用法。
| 错误用法(把 AI 当教科书) | 正确用法(把 AI 当问答伙伴) |
|---|
| “帮我生成这个项目的架构文档" | "我在看 src/auth/session.ts,这段 try/catch 为什么要吞掉错误?" |
| "画一个数据流的流程图" | "我追到 handleLogin 这里了(贴代码),下一步应该看哪个文件?" |
| "总结这个项目用了哪些设计模式" | "这里用了 Observer 模式,比用 callback 的好处具体是什么?" |
| "讲讲这个项目是做什么的" | "useUser 这个 hook 被哪些组件调用?各自目的是什么?” |
原则一句话:带着具体代码 + 具体疑问去问 AI,不要对着空气侃。
空问题得到空答案。你问”这个项目怎么设计的”,AI 只能给你一份看起来很懂实际什么也没传递的综述。你问”这段代码第 47 行为什么用 useLayoutEffect 而不是 useEffect”,AI 会给你一个你可以验证、可以复用、可以记住的答案。
配合工具
两个值得常备的 MCP 工具:
- DeepWiki MCP:针对热门 repo 的社区级沉淀文档。和本地 AI 临时生成不是一回事——DeepWiki 的内容是多人校验过的,用
ask_question 或 read_wiki_contents 查,可靠性远高于”clone 下来现生成一份”
- Context7 MCP:库级真实文档,比读源码找 API 快,遇到不熟悉的库 API 直接查这里
两者定位都是查,不是替你读。查完还是要回到你自己追的那条流程上去。
画图纪律:一定要自己画
读完一条流程、追完一个模块后,关掉所有 AI,打开白板、纸、draw.io 或 Excalidraw,自己画。
画的过程有三个回合:
- 理解:我到底看懂了吗?
- 抽象:哪些是主干,哪些是细节?
- 表达:怎么让图对得上我脑子里的结构?
- 画得乱七八糟 = 还没真懂,回去继续追
- 画得出来 = 真懂了
AI 画的图你”看懂了”是幻觉,自己能画出来才是真懂。这个训练不能外包——外包了就等于用别人的肌肉记忆替代自己的,健身房请人代练不会长肌肉。
反常识总结
- 第一个动作是
pnpm dev,不是”帮我生成文档”
- 追一条具体流程,比读十份架构总览有用
- 测试文件的可信度 >
docs/ 目录 > 源码注释 > AI 生成的文档
- debugger 单步执行一次,顶
console.log 十次
- AI 是问答伙伴,不是教科书作者,更不是你
- 图要自己画,画得丑也自己画