在技术职场中广泛存在以下几种现象:程序员
- 对待工做中所使用的技术不须要阅读源码,只需在开发过程当中可以熟练运用就行
- 看源码太费时间,并且容易忘记,若是从实际使用过程当中出现的问题出发,针对性的阅读源码,其学习效率会更高效,因此平时无需看源码。
对此我有着不一样的理解,容我慢慢道来。面试
本文将从以下4个角度进行剖析:编程
- 源码阅读的必要性
- 源码阅读技巧
- 源码阅读的三种境界
- 源码阅读的误区
一、源码阅读必要性
1.1 通用型基础技术应该深刻源码研究
在 JAVA 领域中笔者认为通用型基础技术包含 JAVA 集合、Java并发(JUC)。这类技术是项目中使用的高频技术,在合适的场景中选用合适的数据结构、选用合适的线程并发模型、合理控制锁粒度等都能显著提升应用程序的可用性、健壮性。数据结构
通用型技术正由于其具备广泛性,横向对比更具表明性,职场面试时的可辨别性很是高,如何在高样本中突出本身就显得极为必要,经过阅读源码,深入理解其内部原理成为咱们的不二法宝。架构
固然经过阅读源码并非知晓原理的惟一方法,但做为一个名程序员、直面代码,亲自感觉代码的魅力或许来的更加直接。并发
1.2 重点领域应深刻源码研究
为了提升辨识度做为职场的咱们应该打造本身的专属标签,即**“亮点”**。一般状况咱们应该选择在平常工做中使用的技术,在积累了丰富的使用经验、线上故障排查经验的前提下,应该深刻研究其源码,成体系掌握该技术,从而对其更具掌控性,作到提早预判线上问题,规避大量线上故障,提高稳定性,助力业务降本增效。框架
例如笔者所在公司在微服务、消息中间件领域分别采用了 Dubbo、RocketMQ,而且笔者有幸参与到这项技术栈的运用与运维,积累了丰富的使用经验,为此笔者为了突出在这两个领域的优点,详细阅读其源码,并做成专栏发布在『中间件兴趣圈』公众号与CSDN等知识分享平台,因为是成体系剖析的缘由被出版社相中,邀请出书,《RocketMQ技术内幕》一书就在这样的背景中应运而生,从而成为笔者职业技能中很是亮眼的标签,助力职场。运维
源码阅读确实很重要,但必定须要成体系研究,大部分人认为在处理问题时再根据具体问题去看源码,会更有针对性,以为不必成体系看。微服务
不能否认这有其正确性的一面,从问题自己出发,看源码效率更快,“投入产出比”更高,随着遇到的问题愈来愈多,对该技术理解也会愈来愈深,这个其实就是咱们一般讲的**“经验”**。我以为大部分状况下是可取的,这个过程实际上是一个被动的过程,而且若是生产环节因为并发不高等因素,可能一年、两年也不会出现一两次故障,这样就会形成经验的积累会很是慢,从而使得工做了四、5年的朋友其竞争力还不如工做2,3年的重要缘由,因此个人观点是若是是想打形成本身的专属亮点的话,咱们仍是须要主动经过阅读其源码,成体系掌握其设计理念、实现原理,更好的打造本身的专属亮点。高并发
二、如何阅读源码
既然阅读源码很是有必要,那如何阅读源码呢?笔者根据多年的源码阅读经验整理了以下方法论:
- 了解这款中间件的使用场景、以及架构设计中将承担的责任。
- 寻找官方文档,从总体上把握这款中间件的设计理念。
- 搭建本身的开发调试环境,运行官方提供Demo示例,为后续深刻研究打下基础。
- 先主干流程再分支流程,注意切割,逐个击破。
- 阅读源码过程当中带着思考与质疑思惟。
理解了其使用场景后,结合官方文档,尝试理解该中间件须要解决的问题、并思考如何解决,思考过程当中并不必定要求咱们想出一个具体的答案,只是在真正步入源码阅读时能更快感悟其代码含义。
固然在阅读源码的过程当中可能会到难题,遇到没法理解做者的实现意图,特别是遇到一些本身不太熟悉的编程方式(例如位运算),此时一般有两种解决方案:
- 经过DEBUG,结合运行时数据,方便对代码的理解。
- 从易到难,能够先尝试阅读一下JAVA集合框架的源码,提炼出一套本身的源码研究方法论。
源码阅读其实最难的不是代码自己,也不是没法理解其设计理念,最难的是坚持,故在这里借用笔者的座右铭与你们共勉:越努力越幸运,惟有坚持不懈。
三、源码阅读的三层境界
接下来我想再结合笔者4年源码阅读的历程,谈谈我对源码阅读的一些更深层次的理解,介绍一下笔者在各个阶段阅读源码所处的状态。
-
源码阅读的初级阶段 笔者的老粉丝们应该能感受到笔者初期的源码阅读文章,基本上是记流水帐,其最直观的表现现象是对源码同样一行加注释,只关注底层实现细节,但并未造成更高层次认知,对其设计理念并未提炼与深度领悟。
-
能提问、思考、并提炼 随着技术类文章的持续分享,笔者认识了不少大牛、发现与大牛交流的时候,一开始并不会说细节,而是讲设计理念,这就要求咱们在阅读源码的时候多思考,并反问本身若是须要本身实现的话咱们该如何着手,如何设计,带着疑问去研究源码,经过对比,思考,会对其背后的理念有了更深入的理解。
-
思考、质疑、验证 其实不管是哪一个开源框架都会存在BUG或者实现并不合理的地方,若是你们在阅读源码的时候可以思考并开始质疑其不合理性,并能经过验证证实本身的观点,而后与官方取得联系,交流,建Isuue,共同促进社区的发展,说明咱们的能力、思考获得了极大的提高。
关于这一点,能够参考笔者对 Sentinel 对应熔断实现机制进行的质疑与思考过程。
从Sentinel Dubbo 适配器看限流与熔断(实战思考篇)
四、源码阅读误区
源码阅读是手段,但必定不是目的。
我在面试过程当中发现好多候选者在谈到某一项技术时,首先不是介绍其原理,而是一会儿具体到某个类啥的,这些类是如何如何工做等等,其实这是不太稳当的,源码阅读的目的是主要是深刻理解其设计理念、工做机制,方便咱们在实际使用过程当中对其成体系的认识,增强对它的驾驭能力,作到提早规避风险。
其次源码阅读很是不建议一上来就直接DEBUG。若是一开始就使用DEBUG,很容易会迷失在代码的各个分支中,缺少全局视角,从而变得没有头绪,极大的增长了源码理解的难度,很容易让咱们半途而废。
最后学习一门技术并必定要深刻源码,特别是非主流,非重点打造的领域。对于此类咱们一般只需根据阅读官方文档,了解其使用场景、能解决什么问题,理解其设计理念、工做机制,灵活运用解决具体问题便可。
五、总结
源码阅读并非目的,只是手段。对于通用型基础技术诸如JAVA集合、并发、需重点打造为亮点的领域建议你们阅读其源码,成体系深刻细节掌握其工做机制,加强其驾驭能力,拥有提早规避风险的能力。
欢迎关注公众号『中间件兴趣圈』,共同探究源码,交流高并发、架构经验,回复 PDF 更是可获取大量学习资料。