来聊聊源码学习
现如今我们的开发工作并不会从零开始,往往会基于很多开源库,就前端而言,构建工具我们会使用 webpack,MVVM 框架我们会使用 Vue、React 或者 Angular,这些开源工具帮助我们大大提升了生产效率。
通常我们学习一个开源项目的步骤都是先去阅读它的官方文档,下载安装后运行它的一些 demo 实例,然后在工作中去应用和踩坑。当我们对一个开源项目熟练使用并掌握后,再想去深入了解它就需要去阅读它的源码了。
很多同学都尝试学习过源码,目前业内也会有各种开源库的源码解析文章,那么今天我们也来聊聊源码学习这个事儿。
为什么做为什么大家对源码解析这个事情乐此不彼呢,或者说我们为什么要去学习源码呢,通常有以下几个原因:
兴趣驱动
这样的同学往往是对技术非常热爱,对未知技术的探索有着非常大的兴趣,喜欢刨根问底。因此对于优秀的开源项目,他们都会非常愿意花时间去探究它的实现原理,并且一旦弄明白后会有非常大的成就感。
技术驱动
这样的同学往往是愿意通过更多的学习来提升自己的技术能力。造轮子的技术含量比使用轮子的技术含量高,那么研究轮子的实现原理,知道这个轮子是如何造出来的,也能在很大程度上提升自己的技术能力。而且一般研究的源码都是和工作相关,学习源码也可以很好辅助自己平时的工作开发。
坑驱动
这样的同学会在使用开源项目过程中踩到一些坑,并且查阅资料无果后决定来看一下源码的实现,去找一下问题的原因。但是坑驱动学习源码的方式比较被动,往往只能学习到源码的冰山一角,效果不如前 2 者。
面试驱动
这样的同学可能占比最高,因为如今很多面试官都喜欢问一些技术的实现原理,那么就会逼迫大家在面试前去学习平时工作中使用到技术栈的原理实现,但是这样的学习是最被动的,很多人可能选择去看一些源码解析的文章去死记硬背,而并没有真正掌握源码实现的精髓。
什么时候做学习源码固然是件好事,但是如果在了不恰当的时机去学习可能会适得其反。有一部分同学对一个开源项目甚至都没搞清楚是干什么的时候就开始去看源码了,如果是一些稍微复杂的开源项目,这样的效率非常低下的,很大概率是时间浪费了什么也没有学到。
那么什么时候我们该学习源码呢,我认为你至少已经对这个开源项目的使用已经很熟练了,并且对它的设计思想,用来解决什么问题等等都比较清楚的时候,为了进一步对它深入学习,就可以来看它的源码实现了。
怎么做那么如何去学习源码就非常重要了,诚然学习源码是一定会花时间的,好的学习方法会大大提升学习效率,事半功倍。其实社区也有人推荐了一些学习源码的方式,比如说从源码早期的 commit 开始看,仿造一个小型轮子等等。这里我结合自己看源码的经验总结了几个点。
全盘了解
首先你要对这个开源项目要有全盘的了解,知道它产生的背景,来解决什么样的问题。开始看源码前,先对它的源码目录结构、代码执行入口、构建打包方式、最终产出的文件等等有一个整体的了解。需要用一个全局的视野去审视源码,切忌漫无目的的看源码。
问题驱动
在全盘了解的基础上,就可以通过问题驱动去看源码了。以 Vue.js 为例,我们知道了它的核心思想是数据驱动 + 组件化,那么我们就可以问自己,Vue 模板的数据是如何渲染到 DOM 上的,数据更新后模板是如何重新渲染的,组件化是如何实现的,模板到 render 函数如何编译的等等。那么每一个问题都可以值得我们针对性地去学习源码。问题驱动的方式和坑驱动不同的地方在于这个学习过程是主动的,自驱的,学到的东西会更加系统和全面;而坑驱动往往都会满足于解决某个问题就停下了,学习会比较局限。