为何读优质开源项目?又该如何读一个陌生开源项目?

AI时代,高级程序员不再有门槛?

从2025年起,Agent for coding 发展的如火如荼,编程的门槛正以极大的速度降低,大众社媒上兜售 AI 编程课程的”名师“成为了这波浪潮的第一批受益者。AI 工具的方兴未艾也让大众开始唱衰开发工作,认为开发的所有门槛已经消失,初级程序员甚至非从未接触过编程的人也可以通过 AI 完成前 AI 时代一屋子高级程序员才能完成的项目——但事实果真如此吗?

如果各位身边有从未接触编程的朋友,不妨让ta和有一定编程项目经验的你在使用同个 Agent 的环境下共同去实现一个项目,他可以是一个电商网站的 MVP 或者个人站点的 Demo,我有信心你最终交付的成果会明显好于那个没有编程背景的朋友。

著名前端框架 HTMX 官方发布了一篇文章 《Yes,and...》,其中提到了在同样的 VibeCoding 中,高级程序员的产出会明显优于初级程序员,并将其归因于高级程序员在前AI时代已经接触过大量项目,了解一个好的项目结构是长什么样的、一套好的技术栈选型是怎么敲定的,这是他们相对于开发新手的优势。

但项目的见识差距并非不可逾越,优秀开源项目就是所有程序员天然的学习资料。


“AI时代,见识高于工时”:为什么需要?

刚才提到的那篇 htmx 作者 Carson Gross 的文章《Yes, and…》,其中主要提到了三个观点:

  • “提示词的高级语言之于编程语言,不等于编译器之于汇编”。 很多人打过一个比方:既然没人手写汇编了,以后也没人手写代码,prompt 就是新的高级语言。但这个类比有个漏洞——编译器是确定性的,同样的输入永远产出同样的输出,所以我们可以放心忘掉汇编;而 LLM 不是,它产出的代码需要你逐行验收,质量还常常往”偶然的复杂度“方向滑。你不能信任一个你读不懂其产物的工具。
  • 学徒陷阱(The Sorcerer's Apprentice Trap)。 新手如果跳过亲手写代码的阶段,直接靠AI生成,就永远学不会读代码;而读不懂代码,就没法判断 AI 产出的好坏——恶性循环。
  • 资深工程师的优势不是写得快,而是"知道好的长什么样"。 这句话几乎就是本文的题眼。

类比成学写作:没人是靠背词典学会写作的,都是先读大量好文章,读得多了,落笔自然有分寸。写代码一模一样。读优质开源项目,就是程序员版的”读经典“——而且是性价比最高的那种:免费的、无门槛的、第一手的。

而且不同于写作,AI 时代的编程对具体的编码通常降低,所以了解架构相对于了解代码更加重要,这也就是所谓的”见识高于工时“。这也就决定了我们在阅读项目要求实际会比前AI时代位于一个更高的抽象层级:从原来了解一个功能具体实现,到现在倾向于了解一个项目的整体架构;这样的转变减小了我们了解项目时的阅读量、抬高了阅读优秀项目的边界收益,让丰富的项目见识更加有价值。


“选择高半个身位的项目”:读什么?

挑项目有几个朴素的标准:还在世界范围内大规模使用的或者活跃维护的(代码风格不过时或者已经成熟)、有真实的用户压力(设计是被需求打磨过的,不是玩具)、规模合适。最好的阅读材料是比你当前水平高半个身位的项目——全懂的项目学习了没有收获,全不懂的则只有挫败。

下面是几个优秀开源项目的样例清单,每个附一句"读它什么"和一个可以带着进去的切入问题。带着问题读,比漫无目的地翻高效十倍:

项目 规模 读它什么 切入问题
Flask 千行级 一个 Web 框架的最小骨架,装饰器与请求上下文 浏览器发一个 GET,到 return "hello" 之间发生了什么?
SQLite 十万行级 极致的测试文化与可靠性工程 它凭什么敢说自己被部署在几十亿台设备上?
Redis 十万行级 C 语言的克制之美,数据结构选型 为什么字符串不直接用 C 的 char*,要自己搞 SDS?
LevelDB 两万行级 LSM-tree 的最小完整实现 为什么写入很快、范围查询也不慢?
ripgrep 十万行级 性能工程的教科书 凭什么比 grep 快一个数量级?
curl 大型 三十年不塌房的兼容纪律 一个活过互联网大半历史的项目如何管理复杂度?
llama.cpp 大型 推理性能与内存布局 大模型为什么能在一台笔记本上跑起来?
VS Code 超大型 大型 TypeScript 工程的分层 上百万行代码怎么组织才不互相打架?
DeepSeek Harness(也就是我们上一篇博客的主题) 大型 Agent 运行时的生产级架构 一条用户消息发出去,到拿到交付物,中间经过了几层?

最后一个是我自己的例子,上一篇文章就从结构和层次的设计上解读了 DeepSeekHarness 这个优质的开源 Agent 项目——可以把它当作本文方法论的一次完整实战。

另外还有一类特殊的”项目“值得单独提:配套成书的代码。比如《Crafting Interpreters》带你手写两个解释器,《Redis 设计与实现》把 Redis 的内部结构掰开揉碎。书负责讲清"为什么",源码负责展示"具体怎么落地",两者一起读,理解是双层的。


“自顶向下,模拟真实工况”:怎么读?

了解一个项目,可以先从项目的文件结构开始。即使是陌生的框架,根据目录的名称以及整个项目的 README 也可以对项目有个最初步的了解。

但是要了解项目的内部细节,我个人并不很推荐从入口函数开始线性通读,而是可以模拟一个正式工况,比如一个真实的网络请求或者一个用户输入开始,跟着这个请求去走完全程。

整体可分为三步:

  • 第一步,建立全局地图。 这就是我们最开始做的。读 README、架构文档、目录结构,知道项目大概分几层、每层管什么。这一步不求甚解,只求迷路的时候能查地图。比如读 DSH 之前,我先翻完了仓库的 docs/architecture.zh.md,知道了“一切皆插件、日志即真相”这两条总纲,后面读任何一块源码都能对号入座。
  • 第二步,追一条主线。 类似上面给出的项目表格那样,挑一个端到端的“切入问题”,从入口开始往下跟,每经过一层记一笔:这一层输入了什么、输出了什么、交给了谁。例如读 Flask 时,去追踪一个 GET 请求的完整生命周期,读完之后,对“请求上下文”这个词的自然会有更深、更底层的理解;读 DSH 时跟的是一条用户消息从浏览器到模型再回来的全程,跟完这条线,五层架构基本就自动浮现出来了。在这一步中,不需要注意源码的细节,以数据在接口端的传输、通信为主;大型项目单个接口的实现往往十分复杂,所以我们将具体的源码留到单独部分细究,这一步中只去感受项目的架构。
  • 第三步,源码对应。 读的过程中你一定会形成各种“我猜它是这么实现的“,或者看着这个接口,我会怎么去实现他——把这些猜测记下来,回源码里逐个验证;这是你与资深开源开发者的一次编码逻辑探讨:认知偏差被纠正的那一下,你的感想和印象将十分深刻。由于我参与了 DSH 插件 dsh-knowledge仓库的维护,对插件间的依赖并不清楚但是有些先入为主的想象,我学习 DSH 的分层结构时一直以为插件间是直接互相调用的,跟到源码才发现全部走事件系统,三种模式各司其职——这也是上篇文章中通信机制那一节的主线。

“最低成本的交互式学习”:AI 带读项目

AI工具是最低成本、也是用起来最得心应手的私教;让AI带着你去学习一个开源项目,效率是极高的。AI圈著名研究者、OpenAI 联合创始人 Andrej Karpathy最近在 X 上发了一条AI带领学习的方法论层级,他认为随着 LLM 自主完成越来越多底层工作,人类的工作会上移到“监督与理解”,所以我们将花大量时间去理解模型的输出;于是,如何让理解更高效,就成了关键问题。

所以他给出了一个“理解介质”的阶梯,每一级比上一级信息传达效果更好、更易消化:

  • 第一层:受控文字(遵守 ASD-STE100 规范)。 让 LLM 用 ASD-STE100 来解释东西。ASD-STE100 原本是航空航天维修文档的受控语言规范,对用词和句式有严格约束,产出的文字异常干净易读。LLM 对这套规范很熟。如果你认为严格遵照规范表述,语言过于凝练硬核,也可以向AI提出“使用 80%的 ASD-STE100 进行解释”。这是最快的方式,但是也由于任务深度不高,AI可能会出现幻觉而一本正经的概述出错。
  • 第二层:图(Diagrams / images)。 与其要文字,不如直接让 LLM 画图——图比文字更容易解析和理解。有些架构关系靠文字是讲不清的,可以直接让 AI 用 matplotlib、graphviz 这类工具把模块依赖、调用流程画出来,程序性的绘图也摆脱了对模型原生生图能力的要求,成本和效率都不错。
  • 第三层:网页(Web pages)。 要求AI去完成一个漂亮的、可交互的网页。LLM 的前端能力已经很强,能做动画和完整的交互体验。交互体验的信息传达能力高于此前静态的图文内容。
  • 第四层:讲解视频(Explainer videos)。 将任意你想学习的内容要求AI生成 3Blue1Brown 风格的讲解视频,配音可以用 ElevenLabs API(或让 LLM 自己找本地免费的替代方案)。

Karpathy 的观点是让AI去完成知识理解过程中,下层的、细节的内容,然后以更高层次的抽象向人类解释,发挥人的监督与理解作用;去让AI完成你一次性的、可随时抛弃的定制软件,比如讲解网页、解说视频等,让AI时代廉价的代码给你提供更优质高效的定制内容。


“从学习者到客户端”:输出倒逼输入

由于 Karpathy 的推文是广泛用于所有知识领域的,对于 CS/AI 领域,我个人还想补充一个更加有实践属性的方法——去搭建一个可以承载多种服务框架、可以承接多个项目功能的平台,用来作为你所了解过的项目的客户端。

这个平台可以是你的个人站点、个人博客、线上工具箱、家庭服务器等等,只要他是一个围绕真实需求、向你或者其他人提供服务的平台,都是优质的实践平台。比如你去构建你的个人博客:博客的评论系统接 giscus,网站统计挂 Umami,图床用 immich,密码库自托管 Vaultwarden……每一个都是活的开源项目。装的时候读文档,配的时候翻配置项,出问题的时候去 issue 区搜——这个过程里你的身份就从一个学习者成为了开源仓库的下游用户,成为了开源生态的一部分;自然而然地,你对项目的理解会愈发加深。

这种做法还有个附带好处:自托管服务是接触"生产级配置"最便宜的途径。学校里、教程里的项目永远跑在 localhost 上,而一个挂在你自己域名下、每天被你真实使用的服务,会逼着你理解反向代理、HTTPS、数据备份这些课本外的知识。这些东西,恰恰是优质开源项目里写得最认真的部分。

“Make Open Source Great Again”:从社区中体验

读和用之上,还有最后一级台阶:参与。它按难度自然分层,可以从任何一级开始:

  1. 提一个高质量的 issue。 别小看这一步。学会写"最小复现步骤"本身就是工程能力——你得把问题从自己的环境里剥离出来,精确描述触发条件。maintainer 对着清晰的复现回一句"confirmed",那种正反馈很上头。
  2. 改文档、做翻译。 门槛最低,但会让你以"作者视角"重读项目——文档哪里含糊,往往就是设计哪里微妙。
  3. 认领 good first issue。 很多项目会刻意留一些适合新人的小任务,这是社区递给新人的梯子。
  4. 提小功能的 PR。

为什么值得做?因为 maintainer 的逐行 review,是免费的资深工程师一对一辅导。你写的每一行都会被人用“这个项目十年历史沉淀下来的标准”来检验——这种反馈,是你难以从其他途径获得的。前面说见识来自读好代码,而参与开源是让见识升级成“手感”与个人经验的极佳捷径。

当你真正参与社区,开源社区会因为你的贡献变得更加活跃、更加完善,而你对“什么是好项目”的理解也会逐渐形成一套你的“开发观”。


AI 时代,读项目这件事过时了吗?

回到开头提到的那些观点,看了 HTMX 这样传统的技术团队以及 Andrej Karpathy 等AI时代的权威先进开发者,不难意识到,至少直到眼前,开阔的项目见识、深刻的项目理解、优质的项目经历仍是这个时代 CS/AI 从业者的技术门槛与核心竞争力。开发者的见识与经验是验收 AI 产出的底气,是做技术选型时的直觉,也是从一个“会用工具的人”变成“工程师”的一道分水岭。

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论