源码阅读的方法

小弟我入行不久,实打实的菜鸟,最近由于个人兴趣和工作需要,读了一些源码,感觉还不错,谨以此文做个小小的总结以达到抛砖引玉之效,如有错误和不足的地方希望各位补充。

感谢开源,让我这种并没有受过系统的软件开发训练的工程师也能学习到业界一流的代码,并通过源代码和一些顶尖的程序员零距离的对话。源码对于我这种经验算不上丰富的小白来说是恐怖的,但真正开始的时候却也是魅力无限的,当全身心地沉浸在代码中时,专注和兴奋度远大于听一次讲座或者看一本书,但如果方法不对则很有可能刚刚形成的勇气和兴趣会被无情地摧毁。

我稍微总结了几点阅读开源项目源码的方法。

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.找茬。我觉得抱着找茬的心态去看源码或者一些文档是很有帮助的(不是我对作者有意见或者狂妄哈)。我一直认为如果哪天有能力对一款框架或者著作提出有理有据(不是胡搅蛮缠)的意见或建议,并且能被大多数人所接受,那么就意味着自己是真正看懂了,而且绝对不是人云亦云,水平不说超过作者,也起码在一个水平线上了。而且抱着找茬的心态去看会更加专注仔细。怎么说呢,我尊敬前辈但更尊敬真理~

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

时间: 2024-08-29 01:22:26

源码阅读的方法的相关文章

spark.mllib源码阅读-分类算法4-DecisionTree

本篇博文主要围绕Spark上的决策树来讲解,我将分为2部分来阐述这一块的知识.第一部分会介绍一些决策树的基本概念.Spark下决策树的表示与存储.结点分类信息的存储.结点的特征选择与分类:第二部分通过一个Spark自带的示例来看看Spark的决策树的训练算法.另外,将本篇与上一篇博文"spark.mllib源码阅读bagging方法"的bagging子样本集抽样方法结合,也就理解了Spark下的决策森林树的实现过程. 第一部分: 决策树模型 分类决策树模型是一种描述对实例进行分类的树形

源码阅读系列:源码阅读方法

一.前提条件 1.纯熟扎实的语言基础 ??如果你学java,却对反射.泛型.注解一直半解,还是不要去读什么框架了,回去把java基础打扎实反而对你自身更有益. 2.UML能力 ??在软件工程中,UML在软件的不同生命周期阶段扮演着非常重要的角色,没有好的UML水平,面对大型的项目源码会束手无策. 3.对业务的理解 ??如果你要阅读的项目业务性比较强,事先对业务有一定的了解是必须的. 4.设计模式.重构的掌握 ??编程语言什么的没什么好说.着重提一个:设计模式由于Android源代码用到各种各样的

【转】Java开源项目源码阅读方法及二次开发方法

一直以来,都想要阅读某些Java开源项目的源代码,甚至想要修改某些代码,实现对开源项目进行二次开发的目的.但总是不知从何入手,直接将开源项目的源代码导入Eclipse,总是会报很多错误,而无法编译.可以直接通过Eclipse打开开源项目的源代码,至少能够达到可视化源码阅读.源码导航的目的,还是能在一定程度上解决源码阅读不爽的问题,因为直接打开并没有改变源文件项目的目录结果,对于修改过后的代码,可以通过命令行找到源文件项目目录,并使用mvn或者ant对项目进行编译,再查看修改后的项目是否正确. 由

ubuntu下linux内核源码阅读工具和调试方法总结

http://blog.chinaunix.net/uid-20940095-id-66148.html 一 linux内核源码阅读工具 windows下当然首选source insight, 但是linux下就没有source insight这么优秀的工具了,但是也有不少的替代品,但觉绝对部分人会选择vim+ctags+cscope的组合,还有部分人或选择wine中的source insight或选择navigatror,当然对于代码阅读来说vim+ctags+cscope的组合还是比较好的一

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划

body, td { font-family: tahoma; font-size: 10pt; } 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划 SQL编译解析三部曲分为:构建语法树,生成逻辑计划,指定物理执行计划.第一步骤,在我的上一篇博客淘宝数据库OceanBase SQL编译器部分 源码阅读--解析SQL语法树里做了介绍,这篇博客主要研究第二步,生成逻辑计划. 一. 什么是逻辑计划?我们已经知道,语法树就是一个树状的结构组织,每个节点代表一种类型的语法含义.如

JDK部分源码阅读与理解

本文为博主原创,允许转载,但请声明原文地址:http://www.coselding.cn/article/2016/05/31/JDK部分源码阅读与理解/ 不喜欢重复造轮子,不喜欢贴各种东西.JDK代码什么的,让整篇文章很乱...JDK源码谁都有,没什么好贴的...如果你没看过JDK源码,建议打开Eclipse边看源码边看这篇文章,看过的可以把这篇文章当成是知识点备忘录... JDK容器类中有大量的空指针.数组越界.状态异常等异常处理,这些不是重点,我们关注的应该是它的一些底层的具体实现,这篇

如何阅读Java源码 阅读java的真实体会

刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言如C++,一开始去啃<Core Java>,你是很难从中吸收到营养的,特别是<深入Java虚拟机>这类书,别人觉得好,未必适合现在的你. 虽然Tomcat的源码很漂亮,但我绝不建议你一开始就读它.我文中会专门谈到这个,暂时不展开. 强烈

Memcache-Java-Client-Release源码阅读(之七)

一.主要内容 本章节的主要内容是介绍Memcache Client的Native,Old_Compat,New_Compat三个Hash算法的应用及实现. 二.准备工作 1.服务器启动192.168.0.106:11211,192.168.0.106:11212两个服务端实例. 2.示例代码: String[] servers = { "192.168.0.106:11211", "192.168.0.106:11212" }; SockIOPool pool =