阅读 dubbo 源码的一点体会
去年9月开始阅读 dubbo 源码,到现在也有半年多。这期间读的断断续续,一部分原因是在阅读过程中碰到障碍或者太难理解而暂时放弃,另一部分原因有段时间工作上太忙没能兼顾到源码学习上来。
到目前为止,只完成了部分框架源码学习。包括 dubbo分层架构的理解、dubbo扩展点加载机制、服务导出、服务引入、负载均衡、集群容错。
这是我阅读的第一个框架源码,阅读过程中也在不停地踩坑和填坑。这里将阅读源码过程中走的弯路和学习心得分享出来,也当做技术成长道路上的一个里程碑。
先说说我走的几个弯路吧,这就是典型的反面教材!
误区一、闷头看源码
不论看哪个框架源码,最忌讳一上来直接闷头怼源码,一头就扎进代码的海洋。结果一波操作猛如虎,看了半天直接就开始怀疑人生,怀疑自己是否真的适合搞技术。
相信我,在没有充分了解框架背后的架构原理之前,就直接看源码,这是极其愚蠢的做法。看了会很快就会发现自己像无头的苍蝇一样,根本就不知道自己在看什么。
所以在看源码之前要先了解下框架的基本原理、包含了哪些功能模块、用到了什么技术点,做好了准备工作才好迈入源码学习的第一步,正所谓磨刀不误砍柴工。
误区二、深究细节
一个框架能正常的运行起来,必定是由若干条逻辑主线交织而成。结果呈现在我们面前的就是一堆错综复杂的代码,并且主线上的很多方法会层层嵌套调用,读起来并不简单。
如果我们不先看主流程直接追代码细节的话,很快就会发现自己已经迷失在代码里。虽说细节是魔鬼,但是一开始就深入细节那真的会让自己直接放弃治疗。
所以阅读过程中该适当的抓大放小,先看懂核心流程的逻辑,可以适当用流程图时序图等工具辅助,等脑中已经有了对框架的主线代码的把控,到时候再回到细节中一探究竟也不迟。
误区三、没有目的阅读
没有目的阅读是学习效率最隐蔽的杀手。不管读源码也好,学习其他知识也罢。如果学习前没有明确的目的,盲目的往前冲,那最后学习效果一定大打折扣。
读一个模块代码前,先想想它实现了什么功能、在整个架构图中处于什么位置、作者为什么要这么写、自己可以从中学到什么、自己可以照着写一个出来嘛、学到的技巧怎么运用在项目中。
带着目的去读,比过无脑读效果好一千倍。带着疑问去学习,那么读源码就是寻找答案的过程。知道自己在看什么,就不容易迷失方向。
误区四、看不懂就放弃
我在阅读Dubbo过程中遇到的第一只拦路虎就是ExtensionLoader,当时看了两天也不明白自适应类是干啥用的,以及那个 IOC又是如何实现的。看了两三遍都没弄懂,就索性暂时放弃了。
其实阅读一个功能点时,看不懂理解不了是在正常不过的事了。因为看的过程中没人指引,全靠自己一点一点的去摸索。看不懂的话就多看两遍,坚持下去或许就有转机了。
看源码其实就是一个摸索的过程,看不懂的时候越不能放弃,放弃了就前功尽弃了,从心态上说已经失败了。坚持下,就柳暗花明。
误区五、只输入而不输出
学习过程中一直没有输出也是我在学习过程中最大的弊病了。对于学习来说,不管学习什么东西,看懂了、听懂了,这个跟真正理解了中间还有一条鸿沟。
跨越这条鸿沟最有效的手段就是输出了,不管是写一篇文章,还是把自己学到的给被人讲一遍。
所以在阅读的过程中,一定要牢牢记住。就是每看完一个功能模块,试着自己总结下,然后通过讲授/博客的形式输出。这个过程中收获绝对很大,有利于对知识点的深入理解。
接来会说说我在学习dubbo源码过程中,自己的一些亲身体会。
1.当你决定读源码前,先看官方文档,文档才是第一手学习资料。2.可以先看代码的整体流程和代码逻辑,而后再深入学习每个功能点。也就是先整体后局部。对应该代码层面就是先粗读后精读。3.别贪多嚼不烂,集中火力去突破重点难点。特别是重要的流程一定要搞明白,否则将成为你继续阅读的障碍。4.dubbo里用到的知识点不少,动态代理、netty、zookeeper。当这些知识点成为你阅读障碍的时候再针对性的去学,这样会更有效率。如果先把这些知识学完再去看源码,会把战线拉得太长,反而容易丧失信心。5.路子野一点没关系,关键要记住自己的目的是学懂源码。遇到不懂得千万不要钻牛角尖,可以多个方向尝试突破。网上找资料、找人交流、花点钱买个网课都可以,也许别人的一句话就能让你茅塞顿开。6.知识的积累是一个螺旋上课的过程,很多东西得多看几遍才能理解。看不懂可以先放一放,后面看着看着说不定突然就明白了。7.学习就得沉得下心,耐得住寂寞。三天打鱼两天晒网是学不到任何东西的,反而白白浪费了自己的时间。8.学到新的知识就应该分享出去,不管是写博客记录还是给同事讲一遍,这都将有助于加深自己的理解。
独学而无友,则孤陋而寡闻。如果有朋友准备或者正在读dubbo源码的,欢迎一起沟通交流。