源码阅读的方法、误区以及三种境界

简介: 源码阅读的方法、误区以及三种境界

在技术职场中普遍存在如下几种现象:


  • 对待工作中所使用的技术不需要阅读源码,只需在开发过程中能够熟练运用就行
  • 看源码太费时间,而且容易忘记,如果从实际使用过程中出现的问题出发,针对性的阅读源码,其学习效率会更高效,所以平时无需看源码。


对此我有着不同的理解,容我慢慢道来。


本文将从如下4个角度进行剖析:


  1. 源码阅读的必要性
  2. 源码阅读技巧
  3. 源码阅读的三种境界
  4. 源码阅读的误区


1、源码阅读必要性


1.1 通用型基础技术应该深入源码研究


在 JAVA 领域中笔者认为通用型基础技术包含 JAVA 集合、Java并发(JUC)。这类技术是项目中使用的高频技术,在合适的场景中选用合适的数据结构、选用合适的线程并发模型、合理控制锁粒度等都能显著提高应用程序的可用性、健壮性。


通用型技术正因为其具有普遍性,横向对比更具代表性,职场面试时的可辨别性非常高,如何在高样本中突出自己就显得极为必要,通过阅读源码,深刻理解其内部原理成为我们的不二法宝。


当然通过阅读源码并不是知晓原理的唯一方法,但作为一个名程序员、直面代码,亲自感受代码的魅力或许来的更加直接。


1.2 重点领域应深入源码研究


为了提高辨识度作为职场的我们应该打造自己的专属标签,即“亮点”。通常情况我们应该选择在日常工作中使用的技术,在积累了丰富的使用经验、线上故障排查经验的前提下,应该深入研究其源码,成体系掌握该技术,从而对其更具掌控性,做到提前预判线上问题,规避大量线上故障,提升稳定性,助力业务降本增效。


例如笔者所在公司在微服务、消息中间件领域分别采用了 Dubbo、RocketMQ,并且笔者有幸参与到这项技术栈的运用与运维,积累了丰富的使用经验,为此笔者为了突出在这两个领域的优势,详细阅读其源码,并作成专栏发布在『中间件兴趣圈』公众号与CSDN等知识分享平台,由于是成体系剖析的原因被出版社相中,邀请出书,《RocketMQ技术内幕》一书就在这样的背景中应运而生,从而成为笔者职业技能中非常亮眼的标签,助力职场


源码阅读确实很重要,但一定需要成体系研究,大部分人认为在处理问题时再根据具体问题去看源码,会更有针对性,觉得没必要成体系看


不可否认这有其正确性的一面,从问题本身出发,看源码效率更快,“投入产出比”更高,随着遇到的问题越来越多,对该技术理解也会越来越深,这个其实就是我们通常讲的“经验”。我觉得大部分情况下是可取的,这个过程其实是一个被动的过程,并且如果生产环节由于并发不高等因素,可能一年、两年也不会出现一两次故障,这样就会造成经验的积累会非常慢,从而使得工作了4、5年的朋友其竞争力还不如工作2,3年的重要原因,所以我的观点是如果是想打造成自己的专属亮点的话,我们还是需要主动通过阅读其源码,成体系掌握其设计理念、实现原理,更好的打造自己的专属亮点。


2、如何阅读源码


既然阅读源码非常有必要,那如何阅读源码呢?笔者根据多年的源码阅读经验整理了如下方法论:


  1. 了解这款中间件的使用场景、以及架构设计中将承担的责任。
  2. 寻找官方文档,从整体上把握这款中间件的设计理念。
  3. 搭建自己的开发调试环境,运行官方提供Demo示例,为后续深入研究打下基础。
  4. 先主干流程再分支流程,注意切割,逐个击破。
  5. 阅读源码过程中带着思考与质疑思维。


理解了其使用场景后,结合官方文档,尝试理解该中间件需要解决的问题、并思考如何解决,思考过程中并不一定要求我们想出一个具体的答案,只是在真正步入源码阅读时能更快感悟其代码含义。


当然在阅读源码的过程中可能会到难题,遇到无法理解作者的实现意图,特别是遇到一些自己不太熟悉的编程方式(例如位运算),此时通常有两种解决方案


  1. 通过DEBUG,结合运行时数据,方便对代码的理解。
  2. 从易到难,可以先尝试阅读一下JAVA集合框架的源码,提炼出一套自己的源码研究方法论。


源码阅读其实最难的不是代码本身,也不是无法理解其设计理念,最难的是坚持,故在这里借用笔者的座右铭与大家共勉:越努力越幸运,唯有坚持不懈。


3、源码阅读的三层境界


接下来我想再结合笔者4年源码阅读的历程,谈谈我对源码阅读的一些更深层次的理解,介绍一下笔者在各个阶段阅读源码所处的状态。


  1. 源码阅读的初级阶段
    笔者的老粉丝们应该能感觉到笔者初期的源码阅读文章,基本上是记流水账,其最直观的表现现象是对源码一样一行加注释,只关注底层实现细节,但并未形成更高层次认知,对其设计理念并未提炼与深度领悟。
  2. 能提问、思考、并提炼
    随着技术类文章的持续分享,笔者认识了很多大牛、发现与大牛交流的时候,一开始并不会说细节,而是讲设计理念,这就要求我们在阅读源码的时候多思考,并反问自己如果需要自己实现的话我们该如何着手,如何设计,带着疑问去研究源码,通过对比,思考,会对其背后的理念有了更深刻的理解。
  3. 思考、质疑、验证
    其实无论是哪个开源框架都会存在BUG或者实现并不合理的地方,如果大家在阅读源码的时候能够思考并开始质疑其不合理性,并能通过验证证明自己的观点,然后与官方取得联系,交流,建Isuue,共同促进社区的发展,说明我们的能力、思考得到了极大的提升。


关于这一点,可以参考笔者对 Sentinel 对应熔断实现机制进行的质疑与思考过程,其链接如下:Sentinel Dubbo 适配器看限流与熔断(实战思考篇)


4、源码阅读误区


源码阅读是手段,但一定不是目的。


我在面试过程中发现好多候选者在谈到某一项技术时,首先不是介绍其原理,而是一下子具体到某个类啥的,这些类是如何如何工作等等,其实这是不太妥当的,源码阅读的目的是主要是深入理解其设计理念、工作机制,方便我们在实际使用过程中对其成体系的认识,加强对它的驾驭能力,做到提前规避风险。


其次源码阅读非常不建议一上来就直接DEBUG。如果一开始就使用DEBUG,很容易会迷失在代码的各个分支中,缺乏全局视角,从而变得没有头绪,极大的增加了源码理解的难度,很容易让我们半途而废。


最后学习一门技术并一定要深入源码,特别是非主流,非重点打造的领域。对于此类我们通常只需根据阅读官方文档,了解其使用场景、能解决什么问题,理解其设计理念、工作机制,灵活运用解决具体问题即可。


5、总结


源码阅读并不是目的,只是手段。对于通用型基础技术诸如JAVA集合、并发、需重点打造为亮点的领域建议大家阅读其源码,成体系深入细节掌握其工作机制,增强其驾驭能力,拥有提前规避风险的能力。

相关文章
|
监控 前端开发 测试技术
吃透这些软件测试理论知识要点,你就搞懂了软件测试
吃透这些软件测试理论知识要点,你就搞懂了软件测试
368 0
|
设计模式 存储 JSON
如何写出一手好代码(上篇 - 理论储备)?
技术能力是研发同学的立身之本,而写代码的能力又是技术能力的重要体现。但可惜的是理想很丰满,现实很骨感。结合慕枫自己的经验来看,我们在工作中其实没那么容易可以看到写得很好的代码。
|
算法
谈一谈|浅谈单纯形法其中奥妙
谈一谈|浅谈单纯形法其中奥妙
194 0
|
安全 编译器 网络安全
一些碎碎念以及类和对象零碎知识点补充
一些碎碎念以及类和对象零碎知识点补充
104 0
一些碎碎念以及类和对象零碎知识点补充
|
测试技术
初级软件测试面试题怎么找?提供的这两个地方你肯定用得上
最近几年,随着电子产品和互联网的蓬勃发展,各类科技公司如雨后春笋般出现,而软件公司作为科技类公司中的重要组成部分,在这支互联网大军中也占据了重要一席。因而,负责软件问题质检的软件测试岗位也逐渐成了这几年炙手可热的就业岗位之一。
148 0
谈谈讲清楚这件事的重要性
如何讲清楚一件事我相信很多人都很困惑也很无助,尤其是在晋升场合,在向上汇报或者是做大范围分享的时候,恨不得找个地缝钻进去。很多时候我们常常是这样安慰自己,我是实干派技术人,不需要那些花里胡哨的东西,我技术过硬比什么都重要。曾经一度我也是这样认为,最后改变我这个想法的是一句话:如果你讲不清楚多半是想不清楚,如果你都想不清楚如何能够带领更多人拿到结果?
1599 9
|
测试技术
软件测试好学吗 只要选对了学习方式,就并不难学
我们都知道,如今互联网IT行业,在国内可是非常吃香的,尤其是近些年随着软件的普及,人们对软件的要求也是越来越高,因此国内各大互联网企业,也开始大量招聘软件测试人员,但由于这个岗位在我国的发展时间并不长,人员需求也是供应不求的。
198 0
软件测试好学吗 只要选对了学习方式,就并不难学
|
开发者 Python
一日一技:8行炫技代码,知识点多得不得了
一日一技:8行炫技代码,知识点多得不得了
290 0
一日一技:8行炫技代码,知识点多得不得了
|
前端开发 Java C++
谈谈刻意练习
谈谈刻意练习
|
并行计算 Java Go
编程法则和现状:我们明白自认为明白的东西吗?
软件工程领域的知名专家Capers Jones,已经建立了涵盖20,000个项目的范围广泛的项目记录数据库,大部分都是大型的。有了这些数据支持,他经常写文章讨论,哪些活动和方法在实践中发挥着作用,以及如果可能,它们实际上提供多少提升幅度,它们的成本有多少。在这篇客座编辑里,他非正式地评价了一些编程和业务上的流行“法则”在面对软件开发现状时,是如何发挥作用的。
141 0

相关实验场景

更多