如何阅读知名三方库的源码

请允许我先说结论:没啥特殊必要,就别专门读源码了,提升技术的方法千万种,别吊死在一棵树上

为什么我不推荐迷信源码

不知道从什么时候开始,圈子里面流传着一种比较诡异的论调:“想要成为高手,必须通读各方源码”、“读完几十个库的源码,你就是下一个 xxx 专家”。先别激动,冷静下来想一想,源码里面有什么呢?

就以 iOS 开发者都听过的 AFNetworking 这个网络库为例吧, 它算是一个小型的工具了(小型的意思是指,和 vue,TypeScript,TensorFlow 这种项目无法相提并论)。小型,意味着复杂度和难度相当有限,基本上就是各种独立功能的堆砌和组合。当然,也只有小型项目,才有可能花费一段时间读完。假设一个读者,用两周的时间读完了这个库,他的收获大概率是这样的:

  1. 大概 10% - 20% 的内容是真的精华,设计得很不错,值得学习
  2. 大概 60% - 70% 的内容都是普通的业务实现,这里面很多东西肯定是没用过,而且以后也不见得有机会用的。因为没有用过,所以无法体会
  3. 大概 20% 左右是历史遗留的包袱,给阅读理解增加了负担

这是事后看来,比较清楚的分类,但在阅读过程中,大部分人的感受是这样的:“额,这一段看不懂,是因为真的设计得好,还是因为我没有背景知识,难以产生共鸣,又或者只是这里有一个偶现的小坑,不得不蛋疼的适配一下呢?”,根据上面的分类,你看不懂,然后强行看懂以后还有收获的概率,是非常低的。

由此看来,对于绝大多数人来说,强行逼着自己人云亦云,随大流去看网红库的源码,似乎并不是一件效率多么高的事。那什么情况下值得看源码呢,我就总结了两点:

  1. 在某个库的使用过程中踩了坑。有些库,像 AFNetworking,封装得比较自然,不太容易出问题,我觉得就不需要专门看。有些库,像 YYCache,设计上比较诡异,容易踩坑,那么就要求:能做到对自己严格一些,遇到问题不要总想着绕过去,要解决问题本身
  2. 有些库是纯业务无关的,比如 libextobjc,我之前就专门读过一些,写了两篇总结:libextobjc 拾遗之 onExit 的实现libextobjc 拾遗之再谈 weakify。其它像 RAC 这种库,如果感兴趣也可以学习下

我读过的源码不太多,也就十个上下吧,都是部分阅读,没有完整读过。有时间和毅力方面的欠缺,更多的原因还是像上面说的,很多时候我只在遇到问题的时候,才从源码中吸取灵感。当然,这样一定会错过很多优秀的设计,我的 Leader 也和我说过:“多读一些源码,对你的代码风格和设计有帮助”,我从来不否认这一点,学习必然带来收获,但我坚持认为:“如果我能用相同的时间,学到更多东西,为什么要选择效率更低的那种方式呢?”比如同样是学习架构和设计,我肯定更优先考虑学习设计模式,只有当我遇到类似的架构或者技术瓶颈的时候,才会考虑看看别人是怎么做的。

如何读源码

top Created with Sketch.