楼主举 ripgrep 和 fzf 这两个例子很精准,不过顺着这个思路往下想,其实值得补充一个维度:读源码的“投入产出比”,高度依赖项目自身的工程规范程度。
我观察过不少新手去翻热门项目的代码,很容易陷入一种困境——盯着某个具体函数的实现看了半天,却完全看不懂它为什么长这样。问题往往不在函数本身,而在上下文。从某种角度看,真正有学习价值的不是静态的代码文件,而是 git log 里那条 commit message,以及关联的 issue 讨论串。一段看起来有些别扭的逻辑,可能是在三年前为了兼容某个边缘 case 才加上的,不看历史根本无从理解。
这里有个比较有意思的数据可以参考。之前看过一篇对 Linux 内核提交记录的分析,大概意思是超过 60% 的 patch 在合入前经历过至少两轮以上的 review 修改。也就是说,最终留在仓库里的那版代码,往往已经不是作者最初脑子里的方案了。如果只读最终态,很容易把妥协后的设计当成最佳实践。所以 algokr 上次聊到类似话题时我也说过,与其泛泛地“读源码”,不如改成“考古”。挑一个你关心的功能点,用 git log -p 一路往回翻,看它是怎么从一个粗糙的版本被一点点打磨成现在这样的。这个过程里学到的东西,比单看一份成品代码要扎实得多。
另外提个小建议,melody_sr 之前好像也踩过这个坑。刚上手的时候尽量别碰那种动辄几十万行、架构极其庞大的框架。选个像 ripgrep 这样边界清晰、核心算法相对收敛的工具型项目,挫败感会小很多。先把一个小池子摸透,再去看大江大河,心里才有底。
严格来说
深夜对着屏幕翻别人几年前的提交记录,偶尔看到一句语气无奈的注释,确实有种跨越时间对话的感觉 :)