一只阿木木

程序员的"外脑"长这样——我用 claude-obsidian 管理我读过的每一行重要源码

程序员的"外脑"长这样

——我用 claude-obsidian 管理我读过的每一行重要源码

作者:一只阿木木 我相信:在 AI 时代,每个普通人都该拥有一个自动生长的知识系统。

一个我问过 100 个程序员的问题

"你读过 Redis 源码吗?"

回答大多是这样的:

"读过。上次……好像是两年前?具体的记不太清了。"

"读过,但是没记下来,现在完全忘了。"

"读了一半,后来项目来了就搁置了。"

我自己也是一样。工作五年,读过的重要源码少说也有十几个:Redis、React Fiber、Spring IOC、Netty 的 Pipeline……每一次读的时候都是真的看懂了,理解了,甚至激动地在草稿本上画了图。

然后呢?

然后就消失了。

下次遇到相关问题,还是得重新谷歌,重新翻文档,重新经历一遍"哦对,我之前看过这个!"的挫败感。

这个问题困扰我很久了——不是"读不懂源码",而是"读过的源码没有积累下来"。

直到我开始用 claude-obsidian 做源码知识库,这件事才有了根本性的改变。

源码阅读为什么特别难沉淀?

普通文章可以总结核心观点,扔进笔记软件了事。但源码不一样,它有三个特殊的属性:

属性 1:多层次 一个函数调用另一个函数,一个类依赖另一个类,调用链可以深达十几层。光理解一个函数不够,得理解整个调用关系网络。

属性 2:跨时间 你今天读 Dispatcher,明天读 Handler,下周读 Executor。三次阅读才能拼出一个完整的理解,但笔记是碎的。

属性 3:跨项目复用 React 的调和算法和 Vue 的 Diff 算法有深层相似性;Redis 的跳表和 LevelDB 的 skiplist 设计思路相互印证;Spring 的 IoC 容器和 Guice 的实现路线截然不同——这些跨项目的联系,是最有价值的洞察,也是最难用普通笔记捕捉的东西。

传统笔记工具的根本缺陷是:它存储信息,但不建立联系。

转折点:把源码阅读当作"来源"来 ingest

claude-obsidian 不是聊天界面,而是一个知识引擎——它创建、组织、维护并自主地演化你的笔记。

这个定义,对源码阅读场景来说意味着什么?

意味着你可以把源码阅读笔记当作一个"来源"扔进去,Claude 不会给你写一段总结就完事,而是会:

  • 把你提到的每一个类、函数、设计模式、架构概念提取成独立的实体页
  • 自动建立它们之间的 [[wikilinks]] 连接
  • 跨源码检测相似的设计思路并建立关联
  • 下次你阅读另一个项目的类似机制时,自动把新旧知识编织在一起

每个加入的来源都会被整合,你问的每个问题都从所有读过的内容里调取答案。知识像利息一样复利增长。

这句话,在源码阅读场景里,效果被放大了好几倍。

我的完整工作流:从源码到知识图谱

📂 第一步:建立"源码专用"的 vault 结构

虽然 claude-obsidian 的默认 vault 结构已经够用,但对于源码阅读场景,我做了一点定制。

你可以把任意 Claude Code 项目指向这个 vault,在项目的 CLAUDE.md 里添加:Wiki Knowledge Base Path: ~/path/to/vault,当需要上下文时自动调用。

我的源码专用 vault 结构是这样的:

text

sourcecode-vault/
├── .raw/
│   ├── redis/          # Redis 源码阅读笔记
│   ├── react/          # React 源码阅读笔记
│   ├── spring/         # Spring 源码阅读笔记
│   └── netty/          # Netty 源码阅读笔记
├── wiki/
│   ├── entities/       # 类、函数、模块页面(自动生成)
│   ├── concepts/       # 设计模式、架构思路(自动抽取)
│   ├── synthesis/      # 跨项目对比分析(最有价值)
│   ├── index.md        # 总目录
│   └── log.md          # 操作记录
└── CLAUDE.md

重点是 .raw/ 按项目分子文件夹——这样你在做 ingest 时可以按项目批量处理,生成的 wiki 页面也会自动带上来源标记。

📝 第二步:源码阅读笔记怎么写,才最适合 ingest?

这是最关键的一步,很多人在这里走弯路。

不要这样写(流水账,对 AI 抽取没帮助):

text

今天看了 Redis 的 ae.c 文件,里面是事件循环的实现,
有个 aeEventLoop 结构体,里面有 events 数组……

应该这样写(结构化,实体清晰,关系明确):

Markdown

# Redis 事件循环机制 - ae.c

## 核心实体
- **aeEventLoop**:事件循环的核心结构体,持有所有注册的事件
- **aeFileEvent**:文件事件(I/O事件),绑定 fd 和回调函数
- **aeTimeEvent**:时间事件,用链表管理,id 单调递增
- **aeApiState**:底层多路复用的封装层(epoll/kqueue/select)

## 核心机制
- Redis 使用单线程事件循环,不依赖多线程并发
- 每次循环先处理时间事件,再处理文件事件
- 底层 IO 多路复用通过条件编译选择:Linux 用 epoll,macOS 用 kqueue

## 关键设计决策
- **为什么用链表存时间事件而不用堆?**
  Redis 的时间事件极少(主要是 serverCron),链表遍历开销可接受,
  避免了堆的实现复杂度

## 我的疑问
- aeProcessEvents 中 beforesleep 的调用时机?
- 文件事件和时间事件的优先级是怎么决定的?

这种写法的好处:Claude 在 ingest 时能精确识别出 aeEventLoop、aeFileEvent 等实体,把它们各自生成独立 wiki 页面,同时提取"单线程事件循环"、"IO 多路复用"等概念页。

⚡ 第三步:ingest——让 Claude 把笔记"编译"成 wiki

把写好的源码笔记存入 .raw/redis/ 后,在 Claude Code 里执行:

text

ingest redis/aeEventLoop-analysis.md

Claude 读取来源后会提取实体、事实、关系和日期,并按领域(技术、业务等)分类。

以我实际操作为例,ingest 一份 Redis 事件循环的分析笔记后,系统自动生成了:

页面类型
生成的页面
实体页aeEventLoop.md
、aeFileEvent.md、aeTimeEvent.md、aeApiState.md
概念页单线程事件循环.md
、IO多路复用.md、epoll.md、Reactor模式.md
来源页redis-ae分析.md
(带原始引用)

一次 ingest 通常会更新 5–15 个带交叉引用的 wiki 页面。

打开 Obsidian 的图谱视图,你会看到这些页面已经通过 [[wikilinks]] 相互连接。这不是你手动建的,是 Claude 自动建的。

🔗 第四步:跨项目的魔法——当你 ingest 第二个来源时

这是这个系统真正让我震惊的地方。

几周后,我阅读了 Netty 的 NioEventLoop,写了新的分析笔记,再次 ingest。

Claude 在处理 Netty 笔记时,发现 wiki 里已经有 单线程事件循环.md、IO多路复用.md、Reactor模式.md 这些页面——这些都是读 Redis 时生成的。于是它:

  1. 更新了 单线程事件循环.md,把 Netty 的实现案例加进去
  2. 更新了 Reactor模式.md,标注 Redis 和 Netty 在实现上的差异
  3. 新建了 NioEventLoop.md 实体页,并自动加上了 [[aeEventLoop]] 的 wikilink
  4. 在 synthesis/ 里新建了 Redis-vs-Netty 事件循环对比.md

我什么都没做。我只是说了一句 ingest。

这就是与 RAG 的关键区别:wiki 是持久化的产物,交叉引用已经在里面,矛盾已经被标记,合成内容已经反映了所有读过的资料。知识像利息一样复利增长。

🔍 第五步:查询——把"外脑"真正用起来

有了知识图谱,下一步是让它真正服务于你的工作。

场景 1:准备技术面试

text

what do you know about 事件循环

Claude 会扫描 index,深入 单线程事件循环.md、aeEventLoop.md、NioEventLoop.md,综合出一个涵盖 Redis 和 Netty 两个实现案例的回答。1它读取热缓存、扫描索引、深入相关页面并综合答案,引用的是具体的 wiki 页面,而不是训练数据。

场景 2:做技术调研

text

what do you know about 内存分配器

如果你之前 ingest 过 Redis 的 zmalloc 分析、jemalloc 的原理文章、Go 的 TCMalloc 笔记,Claude 会直接综合出一份跨项目的内存分配器对比。这份对比没有人替你写,是你自己读过的东西"自动"合成的。

场景 3:解决当前 bug

text

what do you know about epoll 边缘触发 vs 水平触发

如果你某次源码阅读中记录过这个知识点,它就能精确找到,并给出你自己当时的理解(带来源引用),不是泛泛的教科书答案。

🔧 第六步:定期 lint——保持知识图谱健康

lint 会扫描每个 wiki 页面,检查孤儿页(无传入链接)、过时内容(超过 90 天未更新但仍标注高置信度)、缺少必需属性、断开的引用,以及不应该出现在 git 追踪文件中的凭证。

对于源码知识库,lint 的另一个作用是帮你发现认知盲区:

text

lint the wiki

它会告诉你哪些实体页是"孤儿"——被其他页面引用,但自身内容几乎空白。这些孤儿页就是你"知道这个词,但没有真正理解过"的东西。把它们当作下一阶段源码阅读的选题,是最精准的学习路径规划。

实战案例:用这套工作流读懂 React Fiber

让我用一个完整的真实案例,展示"从阅读到知识图谱"的全过程。

背景

React Fiber 的源码以难读著称。核心难点不是某一个函数,而是三棵树(current、workInProgress、finishedWork)之间的状态转换关系。这种关系用普通笔记根本存不下来。

第一周:建立实体层

我分四次读完了 Fiber 的核心模块,每次写分析笔记后 ingest:

text

ingest react/fiber-architecture.md
ingest react/reconciler-deep-dive.md
ingest react/scheduler-analysis.md
ingest react/hooks-implementation.md

四次 ingest 之后,wiki 里自动生成了:

  • 实体页(52 个):FiberNode.md、FiberRoot.md、Scheduler.md、WorkLoop.md、useEffect.md、useState.md 等
  • 概念页(18 个):双缓冲树.md、优先级调度.md、时间切片.md、副作用链.md 等
  • 来源页(4 个):每次 ingest 的原始分析

第二周:发现跨项目联系

我之前 ingest 过操作系统调度算法的笔记(读 Linux 源码时写的)。

第二周做 lint 时,Claude 自动提示:优先级调度.md 页面现在有来自 React Scheduler 和 Linux CFS 两个来源,两者的优先级衰减机制有相似之处——建议生成 synthesis/调度算法对比.md。

我点头同意,输入 yes,它就生成了这个对比页。

这个洞察如果靠我自己,不知道要多久才能想到。

第三周:知识图谱成型

text

what do you know about React Fiber 的工作流程

Claude 的回答引用了 WorkLoop.md、双缓冲树.md、Scheduler.md、优先级调度.md 四个页面,综合出了一个完整的、带图谱节点引用的回答。我直接把这份回答复制出来,稍作润色,变成了一篇技术博客的草稿。

从阅读到博客草稿,中间没有"整理笔记"这个环节。

颜色编码:Obsidian 里的视觉层

系统内置三个 CSS snippets,在文件浏览器里对 wiki/ 下的文件夹按类型颜色编码:蓝色代表 concepts,绿色代表 sources,紫色代表 entities。

打开图谱视图时,你会看到:

  • 紫色节点:具体的实体(类名、函数名、工具名)
  • 蓝色节点:抽象的概念(设计模式、算法思想)
  • 绿色节点:来源文档(你读过的每一次分析记录)

紫色节点之间的连线越密,代表你对这个技术领域的理解越深——它们之间的联系已经被明确记录下来了。

这是你的"认知地图",一眼就能看出哪里厚、哪里薄。

Web Clipper:把 GitHub 上的分析直接喂进来

除了自己写的分析笔记,项目还建议安装 Obsidian Web Clipper 浏览器扩展,它能把网页文章转成 Markdown 并一键发送到 .raw/ 文件夹,支持 Chrome、Firefox 和 Safari。

对程序员来说,这意味着:

  • 在 GitHub 上看到别人写的源码分析文章 → 一键 Clip 到 .raw/ → ingest
  • 掘金、InfoQ 上的源码解析文章 → 一键 Clip → ingest
  • 官方文档里关于内部实现的说明 → 一键 Clip → ingest

你不再需要"先收藏、打算之后看、然后永远不看"。内容进入 .raw/ 的那一刻,它就开始为你的知识图谱贡献价值。

高级用法:把 wiki 接入你的编码工作流

这是我目前觉得最有潜力的用法,也是最接近"真正的程序员外脑"的形态。

把任意 Claude Code 项目指向这个 vault。在该项目的 CLAUDE.md 里添加:Wiki Knowledge Base Path: ~/path/to/vault,当需要上下文不在当前项目中时自动调取。

具体操作:

Markdown

# 在你当前工作项目的 CLAUDE.md 末尾添加:

## Wiki Knowledge Base
Path: ~/sourcecode-vault

When you need context about:
- Event loop implementation → check wiki/concepts/单线程事件循环.md
- Memory allocation → check wiki/concepts/内存分配器.md  
- Reactor pattern → check wiki/concepts/Reactor模式.md

这样,当你在这个项目里让 Claude Code 帮你写代码时,它会自动从你的源码知识库里取用相关知识——而不是从它的通用训练数据里回答。

用你读过的源码,回答你现在遇到的问题。这才是"外脑"该有的样子。

和其他工具的对比:为什么普通笔记做不到这件事

工具
能做什么
做不到什么
Notion / 语雀
结构化记录、团队协作
自动建立跨笔记连接、矛盾检测
Obsidian(手动)
双链笔记、图谱视图
你得自己建所有连接,成本极高
RAG 方案
语义搜索、问答
没有持久化的结构,每次临时检索
claude-obsidian
自动抽实体、建连接、跨项目综合
需要你写好结构化的阅读笔记

最后这一点很重要:claude-obsidian 不能替代你认真读源码。你的阅读笔记质量决定了 wiki 的质量。它是一个放大器,不是替代品。

三个月后,我的源码知识图谱变成了什么样

截至写这篇文章,我的源码知识库里有:

  • 已 ingest 的源码分析:23 份(覆盖 Redis、React、Spring、Netty、Kafka、Go Runtime 6 个项目)
  • 自动生成的 wiki 页面:487 个
  • 实体页:312 个(类、函数、模块、工具)
  • 概念页:118 个(设计模式、算法思想、架构理念)
  • 跨项目 synthesis 页:57 个(这些是最有价值的)
  • 被自动检测出的跨项目矛盾/差异:19 处

最重要的是最后这个数字——19 处跨项目差异。这些是不同开源项目在处理同一问题时选择了不同路线的地方。每一处都是一个值得深入思考的设计问题,每一处都是面试时能聊得让面试官刮目相看的话题。

这 19 处,如果靠我自己,不知道需要多少年才能发现。

整个系统的核心价值是:你的 wiki 应该随着你在不同代码库中工作而持续更新。你不需要每次都回到某个固定的工具。 它就跟在你身边,随时准备接收新的理解,随时准备帮你调取旧的知识。

给想开始的程序员:最小可行起点

如果你现在手头有一份最近在读的源码,按这个顺序开始:

text

Day 1:
① 把你手头最近一份源码分析笔记(不管写得多粗糙)
   按我上面的格式稍微改一下,存入 .raw/
② ingest 它
③ 在 Obsidian 图谱视图里看看自动生成了什么

Day 3:
④ 阅读另一个模块,写分析,再 ingest
⑤ 观察:有没有新页面自动和第一次 ingest 的页面建立了连接?

Day 7:
⑥ 输入:what do you know about [你最近研究的核心概念]
⑦ 感受一下:它引用的是你自己读过的分析,不是通用答案

做完这七步,你会明白我在说什么。

最后

有一句话,我觉得说出了源码阅读这件事的本质困境:

我们读源码不是为了背代码,而是为了积累对"事物运作方式"的深层理解。

这种理解需要时间积累,需要跨项目印证,需要反复回溯。

但大多数程序员的现实是:读过就忘,忘了再读,一直在原地循环。

claude-obsidian 做的事情很简单:它帮你把每一次阅读的收获留下来,并且连接起来。

你不再是一个人孤独地读源码。你有一个外脑,它记住了你读过的每一行重要的代码,随时准备帮你调用。

这才是程序员在 AI 时代该有的工作方式。

👇 如果你想继续跟着做:

关注「一只阿木木」,我们在 AI 时代一起构建自己的知识系统。

本文基于 claude-obsidian 项目(GitHub: AgriciDaniel/claude-obsidian,MIT 协议开源)实测撰写。所有数据均来自作者真实使用记录。

我是【一只阿木木】,AI 知识系统架构师,坐标杭州。

扫码加入行动营👇获取更多Obsidian + AI数字大脑实践

Image

关注【一只阿木木】。

我相信:在 AI 时代,每个普通人都该拥有一个自动生长的知识系统

去做,才是真的学。🌊