【架构师成长必备】如何阅读⼀个开源项⽬的源码?【⽯杉的
架构笔记】
⽬录
1、从最简单的源码开始:别幻想⼀步登天
2、循序渐进:先搞定底层依赖的技术
3、⼀定要以Hello World作为⼊⼝来阅读
4、抓⼤放⼩,边写注释边画图
5、反复三遍,真正理解源码
6、借⼒打⼒,参考源码分析书籍及博客
7、最后寄语:⽤⼏年时间锻造⾃⼰的核⼼技术
前⾔
这篇⽂章,给⼤家简单介绍⼀下很多同学都⾮常关⼼的⼀个问题:如何阅读⼀个开源项⽬的源码。
我相信很多同学都希望能够去阅读⼀些源码来提升⾃⼰的技术⽔平,毕竟在⾯试的时候,很多⼤⼚都经常会扣到⾮常深⼊的底层源码。1、从最简单的源码开始:别幻想⼀步登天
其实开源项⽬有很多种,⽐如说有Spring这种框架类的,还有⽐如数据库连接池、log4j等这种⼯具类的。
图片下载站源码当然还有特别重型的中间件类的,⽐如说RocketMQ、Kafka、Redis。更有甚者也有上百万⾏代码的⼤数据类的,⽐如Hadoop、Spark。
所以如果很多同学想要读源码的话,⾯临的第⼀个问题:不知道从何下⼿。
那么是不是说只要随便挑选⼀个开源技术的源码,采⽤愚公移⼭的精神,直接硬着头⽪去读,坚持就是胜利,铁杵⼀定就能磨成针吗?
不是的!其实很多同学始终都没掌握到阅读源码的顺序、技巧和⽅法,所以导致尝试看过⼀些源码,却还是看不懂。
⾸先你要明⽩⼀个前提,⽐如说Kafka的作者,Hadoop的作者,他们本⾝都是有很多年经验,技术功
底极为扎实,都是技术⼤⽜的⼈,站在⼀个很⾼的⾓度去设计和开发出来了这些极为出⾊的分布式系统。
那么如果你的技术实⼒达不到他们的⽔平,你觉得你直接去读他们写出来的源码,就能看懂吗?
那估计是很难的,因为⾥⾯蕴含的各种底层技术细节,分布式架构设计思想,还有复杂的算法和机制,都不是你能理解的。
所以建议⼤家第⼀点,想看源码,先挑⼀个最最简单的,适合⾃⼰技术⽔平的去看。
给⼤家举个例⼦,⽐如说你平时常⽤的⼀些源码都有什么?显⽽易见,每个⼈都会⽤Spring Web MVC、Spring、MyBatis、Spring Boot,等等。
其实这些开源框架的源码也不能说就简单了,他们同样蕴含了开源作者深厚的技术功底在⾥⾯。
但是你要考虑⼀点,这些开源项⽬已经相对来说是普通⼈可以优先触碰的了。因为他们不是分布式系统,不涉及到复杂的架构,⽹络通信,IO,等技术细节。
他们⼤多就是依赖⼀些底层的Java基础技术,⽐如说动态代理、Servlet、HTTP协议、JDBC等等。
⽽他们依赖的那些基础,⼤多数普通⼯程师都是掌握的,你完全可以优先尝试去阅读⼀些这种开源框架类的源码。
2、循序渐进:先搞定底层依赖的技术
好,现在假如说你经过了⼏个⽉的努⼒,把⼀些开源框架的源码,⽐如上⾯说的SSM三⼤框架的源码都看过了,现在你的技术实⼒有了进⼀步的提升。
这些提升,主要体现在对开源项⽬的设计思想,组件设计,组件交互,还有框架封装,等等,都有了进⼀步的理解。
接下来,你就可以尝试去读⼀些更难⼀点的源码。
给⼤家举个例⼦,假设你这个时候去阅读Kafka的源码。没问题。但是这⾥有⼀些是你需要注意的地⽅,Kafka的底层是重度依赖ZooKeeper的。
如果你不把ZooKeeper给掌握精通的话,会导致Kafka你也难以理解。
所以这个时候你得先把底层依赖的技术给搞定,那么你就得回过头去先阅读ZooKeeper的源码,把ZK这个技术先给搞精通⼀些。
同理,如果你在研究ZK的时候,发现他底层有⼀些技术是你掌握不好的,⽐如你发现他⼤量运⽤了Java并发包下的东西。
因此如果你对Java并发包掌握的不够好,那么建议你去把Java并发包下的源码先仔细研究⼀下。
通过这种⽅式,你可以⾃⾏追踪到⾃⼰还不熟悉的很多底层技术,然后⼀个⼀个击破,把这些底层依赖的技术的源码你可以先研究透彻⼀些。
然后,你再⼀步⼀步往上层的技术去研究,这样看那些复杂技术的源码就会轻松很多了。
3、⼀定要以Hello World作为⼊⼝来阅读
阅读源码有⼀个⾮常⾮常有⽤的技巧,那就是你别下载了源码到本地IDE⾥然后直接胡乱的翻看,那是不⾏的。
⼀般建议就是基于⼀个开源技术写⼀个最最基本的HelloWorld程序,就是⼀个⼊门级的程序,然后把他的核⼼功能给跑通。
举个例⼦,假如说你要阅读ZooKeeper的源码,那么你先写⼀个ZK的HelloWorld程序。
⽐如说先连接,然后创建⼀个znode,对znode注册⼀个监听。接着触发这个监听,接着再关闭连接,就这样的⼀个简单的程序。
然后就可以打断点,跟踪这个Hello World级别的源码⼀步⼀步调试追踪,他是如何发起和建⽴连接的,底层的代码流程是什么样的。
4、抓⼤放⼩,边写注释边画图
在看源码的过程中,很多⼈会被核⼼流程中混杂的⼀些特殊业务逻辑的处理给搞懵。
给⼤家举个例⼦,看下⾯的代码,是⼀段随⼿写出来演⽰的:
checkUser();
fetchFromPeers();
countMetrics();
⼤家可以看到,上⾯就三⾏代码,从⽅法名称就可以看出来,先是做了⼀个权限检查之类的操作,然后是核⼼业务逻辑去抓取数据,最后是做了⼀些metric指标统计。
那么很多同学看源码的时候,就喜欢把每⼀⾏代码都看懂,最后不停的点到很深层的地⽅去,把⾃⼰给绕晕了。最后淹死在源码的海洋⾥。。。
其实这个是不对的,这就是没有掌握源码阅读的⼀⼤典型原则:
抓⼤放⼩。
⽐如上⾯的三⾏代码,你应该直接跳过第⼀⾏和第三⾏,连看都别去看,直接进⼊第⼆⾏核⼼逻辑。
也就是说,你只需要抓最核⼼的代码流程就可以了,那些⽆关紧要的代码,千万别有强迫症点进去反复看,那样绝对会让你对源码从⼊门到放弃。
所以,再次强调!强调!强调!重要的事情说三遍。阅读源码,你⼀定要有粗⼤的神经,反复告诉⾃⼰,刚开始先把握代码的主流程即可。很多细节看不懂直接跳过去,别有强迫症让⾃⼰看明⽩每个细节。
此外,⼤家⼀定要形成⼀个习惯,在看源码的过程中尽量多⾃⼰对源码写⼀些注释。
你应该结合⾃⼰的理解,尽可能把⾃⼰对源码阅读过程中的思考都写成注释写在源码⾥。
这个习惯可以促使你⼀边阅读⼀边思考,⽽且有⾃⼰注释的源码,是你宝贵的财富。
此外,还有⼀个⾮常重要的点,那就是⼀定要多画图。
你可以尝试在阅读的过程中,提取源码运⾏的核⼼流程,⼀边读源码,⼀边⾃⼰画在图上,可以⽤那种画图软件来作图即可。
⼤家记住,⼈脑对图⽚的敏感度,是远⾼于对⽂字或者代码的,这个是⼤脑机制决定的。
笔者写的很多篇⽂章,⾥⾯对各种技术的讲解,⽆⼀不是通过⼤量的画图。相⽐于冗长的⽂字描述,图⽚会让⼈容易理解接受的多。通过画图,能帮助你抽象和总结出源码的核⼼流程,以后如果你要回顾和复习,直接看图即可。
5、反复三遍:真正理解源码
另外⼀个要注意的点,源码这个东西,是多看⼏遍理解的就会越深刻。
因为你看第⼀遍,按照上⾯说的抓⼤放⼩的思路,可能很多东西就直接略过去了,因为刚开始你看不懂⼀些⾮核⼼代码在⼲什么。
但是第⼀遍看完以后,通过写注释,⾃⼰动⼿画图,对⼀个开源项⽬的核⼼流程、架构以及原理都有了⼀定的理解了。
此时再去读第⼆遍源码,再过⼀遍,你会发现之前很多看不懂的细节都能看懂了。然后再看第三遍源码,你会发现⼤多数的代码⾃⼰都能看懂了。
所以说任何⼀个源码,都是要⾄少反复看三遍的过程,不是看⼀遍就可以完成的。
6、借⼒打⼒:参考源码分析书籍及博客
其实现在有很多对热门开源项⽬进⾏源码分析的书籍以及博客,你⼤致可以认为就是⼀些技术⽐较⽜的兄弟⾃⼰看了源码之后,写出来的⼀些分析和感悟。
但是那毕竟是别⼈的东西,如果你上来就直接看源码分析书籍或者博客,那么不⼀定可以看懂,因为⽂字的信息传递未必能很好的让你理解有些复杂的东西。
所以⽐较建议的⽅式,就是先⾃⼰尝试看⼏遍,有了⼀定的理解之后,此时可以借助源码分析书籍或者是博客,参考其他技术⽜的同学对这个源码理解,结合⾃⼰之前的⼀些思考,综合起来进⾏分析,相信⼀定会⼤有裨益。
你会发现⼈家的⼀些理解可以很好的补充你没想明⽩的⼀些问题,或者是忽略的⼀些细节。
不过,需要提醒的⼀点,⽹上不少博客,包括⼀些书籍,他们写出的⼀些源码分析,可能是错误的。
所以,尽信书不如⽆书,你需要带着⼀定的纠错眼光。在和你的理解相悖时,不⼀定就是你错了。
7、最后寄语:⽤⼏年时间锻造⾃⼰的核⼼技术
其实上⾯那个过程说起来很简单,做起来⾮常的困难。
因为在上⾯任何⼀个步骤,阅读的过程中你都有⼤量的东西是不会的,⽽且会觉得很难,甚⾄经常有想放弃的冲动。
毕竟⼈的⼤脑天⽣就是会对困难的事情产⽣抗拒感,这是本能,天⽣就是对舒服、放松的事情有向往。
但是只有那些能克服⼈的动物本能,惰性本能,迎难⽽上,坚韧不拔的同学,才能真正攻克各种技术难题。
让⾃⼰的⼤脑不停的开动,不停的思考上⾯那个过程,也许你要持续⼀年才能有个⼩的开悟,持续三年才能有⼀定的⼼得,持续五年甚⾄⼋年,才能说真的融汇贯通,打通任督⼆脉,成为技术⼤⽜。
但是坚持这个事情同样是很可怕的,⼀旦你坚持做到了,那么你将锻造出来⾃⼰最硬核的技术实⼒,远远不是普通⼈,或者刚毕业的年轻同学可以追上你的。技术深度、技术功底,这是每⼀个⼯程师最最硬核的技术实⼒。
希望各位同学可以从现在开始,尝试着⽤笔者分享的技巧阅读源码。跳出舒适区,去拥抱更⼤的舒适区。
真正体验⼀下读透源码之后,根据报错⽇志,从源码层⾯精确定位项⽬问题、精确制导线上bug,感受⼀下这种上帝视⾓解决问题的快感吧!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论