源码阅读

Source codes reading

Posted by Bryan on August 10, 2019

源码阅读

从开始正经写代码,就被各路前辈告知要经常阅读好项目的源码,提升代码能力。之前也一直有实践去阅读一些经典的源码,但是不得其法,啃得比较艰难,收获却比较有限。是阅读源码收益本身比较低吗?不应该吧,要不然也不会有那么多人推荐。想来想去,应该还是方法的问题。

随着经验的增长,也随着各种尝试,感觉开始找到一些的阅读好项目源码的感觉。在这边做个分享,也希望帮到阅读源码苦无收益的同学。

明确源码阅读目的

从之前阅读源码的经验来看,阅读源码应该是有明确的目的,从我角度来看,无非是以下两种目的:

  • 了解一个项目框架设计,完整流程。在实际出现问题时,可以深入源码解决。或者只是单纯希望了解项目作者的优秀设计;
  • 了解项目的精巧代码实现,或者学习项目作者的优秀编码风格;

在不同的目的下,阅读源码的习惯是完全不同的。如果是出于第一种目的,那么很多编码细节都是可以不用关心的,甚至命名习惯良好的项目中,不太需要深入去查看基础的方法实现,因为命名上已经反映了使用者需要关心的信息了。而处于第二种目的,则需要关心实现实现细节,需要详细阅读项目基础方法的实现。

从目前的我的实际情况来看,大部分情况下我都属于第一种情况。但是,即使是出于第二种情况,也应该先了解了完整的流程之后,再分块阅读实现细节。

阅读什么样的项目

选择什么样的项目是很重要的,从过去的经历来看,选择实际使用过,相对熟悉的项目是很有必要的。因为一个连使用经历都没有项目,直接从源码啃起,一方面很难阅读,另一方面也很难理解项目者的设计意图,就更谈不上领会其精妙之处了。

另一个需要注意的是项目规模,规模过大的项目阅读源码是比较困难的。梳理完整脉络都可能需要比较久,需要有打持久战的准备。一般情况下不推荐。

从我的实际情况来看,我可能会选择是目的明确,解决问题明确,规模中小,代码风格良好,相对的熟悉的项目阅源码。

阅读顺序

在源码的阅读中,我实际走了一些弯路,实践下来,我觉得比较有效的阅读顺序是这样的:

  1. 阅读官方文档,官方文档事实上是项目意图的表达,同时也会强调项目的优异特性。这些是我们阅读源码时需要重点关注的;
  2. 按照最基础的用法,跳转着将完整的流程走一遍,走的过程中,不要深入实现细节,尽量找到主线脉络;
  3. 根据找到主线脉络以及文档中的信息,将项目拆分为相对独立的功能模块,明确功能模块在项目中所起的作用;
  4. 分模块追踪功能模块的实现脉络,注意在追踪单个模块的流程时,如果调用了其他功能模块,不要深入研究其他功能模块的实现细节,大致从接口命名上了解其功能即可;
  5. 主要的功能模块了解清楚之后,大致的项目结构就了然于胸了。此时可以从官方强调的优异特性选择一些感兴趣的特性,了解项目中是如何实现的;
  6. 在前 5 步中,对于基础方法尽量避免纠缠实现细节。如果有兴趣,可以最后统一查看基础方法的实现细节;

总结

源码阅读是一个体力活,也是我们探究学习优秀程序员的一个很好的途径。但是一定要了解到,代码的价值是解决特定问题,也是个人思想的表达,因此了解代码后面的意图才是更重要的。至于代码本身,简单清晰的代码才是好代码,花里胡哨的代码就像一个喜欢在沟通时讲文言文的人,是主动制造沟通障碍的人。这样的代码,是完全不值得花大力气去阅读的。