一、从最简单的源码开始:别幻想一步登天node
二、按部就班:先搞定底层依赖的技术面试
三、必定要以Hello World做为入口来阅读算法
四、抓大放小,边写注释边画图数据库
五、反复三遍,真正理解源码网络
六、借力打力,参考源码分析书籍及博客架构
七、最后寄语:用几年时间锻造本身的核心技术并发
这篇文章,给你们简单介绍一下不少同窗都很是关心的一个问题:如何阅读一个开源项目的源码。框架
我相信不少同窗都但愿可以去阅读一些源码来提高本身的技术水平,毕竟在面试的时候,不少大厂都常常会扣到很是深刻的底层源码。分布式
其实开源项目有不少种,好比说有Spring这种框架类的,还有好比数据库链接池、log4j等这种工具类的。微服务
固然还有特别重型的中间件类的,好比说RocketMQ、Kafka、Redis。更有甚者也有上百万行代码的大数据类的,好比Hadoop、Spark。
因此若是不少同窗想要读源码的话,面临的第一个问题:不知道从何下手。
那么是否是说只要随便挑选一个开源技术的源码,采用愚公移山的精神,直接硬着头皮去读,坚持就是胜利,铁杵必定就能磨成针吗?
不是的!其实不少同窗始终都没掌握到阅读源码的顺序、技巧和方法,因此致使尝试看过一些源码,却仍是看不懂。
首先你要明白一个前提,好比说Kafka的做者,Hadoop的做者,他们自己都是有不少年经验,技术功底极为扎实,都是技术大牛的人,站在一个很高的角度去设计和开发出来了这些极为出色的分布式系统。
那么若是你的技术实力达不到他们的水平,你以为你直接去读他们写出来的源码,就能看懂吗?
那估计是很难的,由于里面蕴含的各类底层技术细节,分布式架构设计思想,还有复杂的算法和机制,都不是你能理解的。
因此建议你们第一点,想看源码,先挑一个最最简单的,适合本身技术水平的去看。
给你们举个例子,好比说你平时经常使用的一些源码都有什么?显而易见,每一个人都会用Spring Web MVC、Spring、MyBatis、Spring Boot,等等。
其实这些开源框架的源码也不能说就简单了,他们一样蕴含了开源做者深厚的技术功底在里面。
可是你要考虑一点,这些开源项目已经相对来讲是普通人能够优先触碰的了。由于他们不是分布式系统,不涉及到复杂的架构,网络通讯,IO,等技术细节。
他们大多就是依赖一些底层的Java基础技术,好比说动态代理、Servlet、HTTP协议、JDBC等等。
而他们依赖的那些基础,大多数普通工程师都是掌握的,你彻底能够优先尝试去阅读一些这种开源框架类的源码。
好,如今假如说你通过了几个月的努力,把一些开源框架的源码,好比上面说的SSM三大框架的源码都看过了,如今你的技术实力有了进一步的提高。
这些提高,主要体如今对开源项目的设计思想,组件设计,组件交互,还有框架封装,等等,都有了进一步的理解。
接下来,你就能够尝试去读一些更难一点的源码。
给你们举个例子,假设你这个时候去阅读Kafka的源码。没问题。可是这里有一些是你须要注意的地方,Kafka的底层是重度依赖ZooKeeper的。
若是你不把ZooKeeper给掌握精通的话,会致使Kafka你也难以理解。
因此这个时候你得先把底层依赖的技术给搞定,那么你就得回过头去先阅读ZooKeeper的源码,把ZK这个技术先给搞精通一些。
同理,若是你在研究ZK的时候,发现他底层有一些技术是你掌握很差的,好比你发现他大量运用了Java并发包下的东西。
所以若是你对Java并发包掌握的不够好,那么建议你去把Java并发包下的源码先仔细研究一下。
经过这种方式,你能够自行追踪到本身还不熟悉的不少底层技术,而后一个一个击破,把这些底层依赖的技术的源码你能够先研究透彻一些。
而后,你再一步一步往上层的技术去研究,这样看那些复杂技术的源码就会轻松不少了。
阅读源码有一个很是很是有用的技巧,那就是你别下载了源码到本地IDE里而后直接胡乱的翻看,那是不行的。
通常建议就是基于一个开源技术写一个最最基本的HelloWorld程序,就是一个入门级的程序,而后把他的核心功能给跑通。
举个例子,假如说你要阅读ZooKeeper的源码,那么你先写一个ZK的HelloWorld程序。
好比说先链接,而后建立一个znode,对znode注册一个监听。接着触发这个监听,接着再关闭链接,就这样的一个简单的程序。
而后就能够打断点,跟踪这个Hello World级别的源码一步一步调试追踪,他是如何发起和创建链接的,底层的代码流程是什么样的。
在看源码的过程当中,不少人会被核心流程中混杂的一些特殊业务逻辑的处理给搞懵。
给你们举个例子,看下面的代码,是一段随手写出来演示的:
checkUser();
fetchFromPeers();
countMetrics();
你们能够看到,上面就三行代码,从方法名称就能够看出来,先是作了一个权限检查之类的操做,而后是核心业务逻辑去抓取数据,最后是作了一些metric指标统计。
那么不少同窗看源码的时候,就喜欢把每一行代码都看懂,最后不停的点到很深层的地方去,把本身给绕晕了。最后淹死在源码的海洋里。。。
其实这个是不对的,这就是没有掌握源码阅读的一大典型原则:
抓大放小。
好比上面的三行代码,你应该直接跳过第一行和第三行,连看都别去看,直接进入第二行核心逻辑。
也就是说,你只须要抓最核心的代码流程就能够了,那些可有可无的代码,千万别有强迫症点进去反复看,那样绝对会让你对源码从入门到放弃。
因此,再次强调!强调!强调!重要的事情说三遍。阅读源码,你必定要有粗大的神经,反复告诉本身,刚开始先把握代码的主流程便可。
不少细节看不懂直接跳过去,别有强迫症让本身看明白每一个细节。
此外,你们必定要造成一个习惯,在看源码的过程当中尽可能多本身对源码写一些注释。
你应该结合本身的理解,尽量把本身对源码阅读过程当中的思考都写成注释写在源码里。
这个习惯能够促使你一边阅读一边思考,并且有本身注释的源码,是你宝贵的财富。
此外,还有一个很是重要的点,那就是必定要多画图。
你能够尝试在阅读的过程当中,提取源码运行的核心流程,一边读源码,一边本身画在图上,能够用那种画图软件来做图便可。
你们记住,人脑对图片的敏感度,是远高于对文字或者代码的,这个是大脑机制决定的。
笔者公众号写的不少篇文章,里面对各类技术的讲解,无一不是经过大量的画图。相比于冗长的文字描述,图片会让人容易理解接受的多。
经过画图,能帮助你抽象和总结出源码的核心流程,之后若是你要回顾和复习,直接看图便可。
另一个要注意的点,源码这个东西,是多看几遍理解的就会越深入。
由于你看第一遍,按照上面说的抓大放小的思路,可能不少东西就直接略过去了,由于刚开始你看不懂一些非核心代码在干什么。
可是第一遍看完之后,经过写注释,本身动手画图,对一个开源项目的核心流程、架构以及原理都有了必定的理解了。
此时再去读第二遍源码,再过一遍,你会发现以前不少看不懂的细节都能看懂了。而后再看第三遍源码,你会发现大多数的代码本身都能看懂了。
因此说任何一个源码,都是要至少反复看三遍的过程,不是看一遍就能够完成的。
其实如今有不少对热门开源项目进行源码分析的书籍以及博客,你大体能够认为就是一些技术比较牛的兄弟本身看了源码以后,写出来的一些分析和感悟。
可是那毕竟是别人的东西,若是你上来就直接看源码分析书籍或者博客,那么不必定能够看懂,由于文字的信息传递未必能很好的让你理解有些复杂的东西。
因此比较建议的方式,就是先本身尝试看几遍,有了必定的理解以后,此时能够借助源码分析书籍或者是博客,参考其余技术牛的同窗对这个源码理解,结合本身以前的一些思考,综合起来进行分析,相信必定会大有裨益。
你会发现人家的一些理解能够很好的补充你没想明白的一些问题,或者是忽略的一些细节。
不过,须要提醒的一点,网上很多博客,包括一些书籍,他们写出的一些源码分析,多是错误的。
因此,尽信书不如无书,你须要带着必定的纠错眼光。在和你的理解相悖时,不必定就是你错了。
其实上面那个过程提及来很简单,作起来很是的困难。
由于在上面任何一个步骤,阅读的过程当中你都有大量的东西是不会的,并且会以为很难,甚至常常有想放弃的冲动。
毕竟人的大脑天生就是会对困难的事情产生抗拒感,这是本能,天生就是对舒服、放松的事情有向往。
可是只有那些能克服人的动物本能,惰性本能,迎难而上,坚韧不拔的同窗,才能真正攻克各类技术难题。
让本身的大脑不停的开动,不停的思考上面那个过程,也许你要持续一年才能有个小的开悟,持续三年才能有必定的心得,持续五年甚至八年,才能说真的融汇贯通,打通任督二脉,成为技术大牛。
可是坚持这个事情一样是很可怕的,一旦你坚持作到了,那么你将锻造出来本身最硬核的技术实力,远远不是普通人,或者刚毕业的年轻同窗能够追上你的。技术深度、技术功底,这是每个工程师最最硬核的技术实力。
但愿各位同窗能够从如今开始,尝试着用笔者分享的技巧阅读源码。跳出温馨区,去拥抱更大的温馨区。
真正体验一下读透源码以后,根据报错日志,从源码层面精肯定位项目问题、精确制导线上bug,感觉一下这种上帝视角解决问题的快感吧!