首页 > 代码库 > 源码阅读的方法

源码阅读的方法

    小弟我入行不久,实打实的菜鸟,最近由于个人兴趣和工作需要,读了一些源码,感觉还不错,谨以此文做个小小的总结以达到抛砖引玉之效,如有错误和不足的地方希望各位补充。
    感谢开源,让我这种并没有受过系统的软件开发训练的工程师也能学习到业界一流的代码,并通过源代码和一些顶尖的程序员零距离的对话。源码对于我这种经验算不上丰富的小白来说是恐怖的,但真正开始的时候却也是魅力无限的,当全身心地沉浸在代码中时,专注和兴奋度远大于听一次讲座或者看一本书,但如果方法不对则很有可能刚刚形成的勇气和兴趣会被无情地摧毁。
    我稍微总结了几点阅读开源项目源码的方法。
    1.先要有理论基础。我曾经满腔热血下定决心准备阅读某开源项目的源码,却在只知其作用的情况下就盲目地开始阅读,往往看了一两个钟头却不知所云,就像看文言文似的:字都认识,串起来就不知道在说什么了。而在分析Spark源码时并没有着急忙慌地开始,而是先仔细地把那篇讲RDD的论文看了几遍,然后再看源码。此时已经明白spark的设计思路,各个scheduler的作用和地位等等概念,看源码时只是将这些概念细化下去,思路非常清晰。
    2.了解架构。先从项目的官网或者wiki上了解一下项目的架构是十分有必要的,可以给自己一个全局的认识,至少能对代码结构一目了然,对于源码项目下的一大堆文件夹也不用两眼一摸黑。此外,对于源码包里项目的依赖库浏览一下也很有帮助。举个例子,比如JStorm源码包里lib目录下,像zookeeper、disrupter、netty等几个包总归能让你猜出点什么了。
    3.善用工具。也许真正的大神即使用个记事本就能把源码看得飞起,但对于我这种小白来说工具就是一大助力了。比如看spark源码时的IDEA,比如看Linux内核时的SourceInsight等等。里面的一些依赖分析、搜索、联想、跳转等功能对于看源码简直是神器,所以选择一款适合这个项目源码阅读的工具,并花点时间熟悉一下快捷键,浏览一下支持的功能,绝对包赚不赔。此外一些外部辅助工具也十分好用,比如Linux下的grep,对于那种不提供全项目搜索关键字的IDE来说是一大补充。
    4.不畏惧语言差异。语言差异有两点,一种是自然语言上的不通,像我这样英语差的看到全英文的论文、文档、注释总归多多少少有点惧怕感,但不得不说这些东西是捷径,是作者和专家总结的精华。另外一种是编程语言上的差异,不知到别人怎么样,初次看到storm的源码(用clojure写的,一种lisp在jvm上的方言)时,简直眼前一黑一口老血喷在屏幕上,但其实只要鼓起勇气坚持看下去,结合网上的资料手册,其实也能看得懂,毕竟只是看看而已。老生长谈的一句话就是:编程语言只是表达工具,编程思路总归都是通的。
    5.从main开始。不是所有编程语言组成的程序入口都是main,这里只是举个例子。如果目标开源系统是一个可运行的程序而不是一个库,那么找到它的启动入口作为代码跟踪的源头是很有效果的,因为这样分析源码的思路是最贴合思维模式的。无论什么程序,总归是从一个起点开始运行,从源头开始一点一点跟,耐心点,绝对翻不出五指山。
    6.从使用开始。还有一种方式不仅适用于可运行的系统,对于一些库的源码分析也很有帮助。对,没有错,直接先用起来,跑跑demo,写写example,看看报错....然后会明白一些api的作用,会找到一些关键的角色,这都是一些可以考虑的起点。
    7.以流程为线索。源码是茫茫多的,一股脑冲进去会被它各种各样的信息和作者不同的编程习惯冲跨,并且通常情况下一些代码是被复用的,很多流程是交织在一起的。此时我们紧跟自己感兴趣的流程作为一切的线索,比如看spark的时候可以先看一个application是怎么被提交的,一个任务是怎么被执行的,数据是怎么被持久化的....由简到难一切都会很清楚。
    8.善用错误栈。有时候在使用时故意搞点错误出来围观一下打印输出也是很有帮助的,这些错误中包含的错误信息,“一不小心”就把流程中一层一层的调用关系都给透露出来了。
    9.尝试修改运行。给代码打个桩做个测试是在工作中经常用到的方法,同样的手段在阅读源码时也能用,随心所欲地加点打印啦,改改功能块啦,都能帮助自己更深入地理解整个系统。
    10.勤做笔记。这点是最近感触比较深的,自从我开始刷blog记录一些源码阅读过程中的思考后,发现思路越来越清晰了,而且也越来越关注一些细节。一边写感想和笔记实际上是在做总结,如果理解的不到位就很难自圆其说,不仅是一个记录更像是一种检验。如果能与此同时给其他人一些帮助,那就更加圆满啦。
    11.找茬。我觉得抱着找茬的心态去看源码或者一些文档是很有帮助的(不是我对作者有意见或者狂妄哈)。我一直认为如果哪天有能力对一款框架或者著作提出有理有据(不是胡搅蛮缠)的意见或建议,并且能被大多数人所接受,那么就意味着自己是真正看懂了,而且绝对不是人云亦云,水平不说超过作者,也起码在一个水平线上了。而且抱着找茬的心态去看会更加专注仔细。怎么说呢,我尊敬前辈但更尊敬真理~


    好啦,差不多就这样,胡言乱语了一通,大家见笑了。

源码阅读的方法