阅读源码是每个优秀开发工程师的必经之路,那么这篇文章就来讲解下为什么要阅读源码以及如何阅读源码。

首先来说下为什么要读源码,有学习源码的必要吗?

为什么要阅读源码?

关于为什么阅读和学习源码,我个人认为可能有以下几点:

(一)吊打面试官,应对面试

为了找到更好的工作,应对面试,因为在面试中肯定会问到源码级别的问题,比如:为什么 HashMap 是线程不安全的?

如果你没有阅读过源码,面试官可能会对回答的结果不满意,进而导致面试结果不太理想,但如果你对源码有所研究,并能够很好地问答面试官的问题,这可能就是你的加分点,可以形成自己独特的竞争力,吊打面试官,升职加薪不是梦。

(二)解决问题(bug)

在开发过程中,我们或多或少会遇到 bug,比如:在 foreach 循环里进行元素的 remove/add 操作,为啥有可能会报 ConcurrentModificationException 异常?

我们可以先在 Google、Stack Overflow 以及对应项目的 Issues 里看有没有类似问题以及解决办法,如果没有的话,我们只能通过阅读源码的方式去解决了。如果我们对相关源码有所涉猎,就可以快速定位到问题所在。

(三)提升编程能力

读一本好书,就是和许多高尚的人谈话。-歌德

和阅读一本好书一样,阅读源码就是和编程大牛面对面交流的机会,在许多优秀的开源项目中,它们的编码规范和架构设计都是很棒的,另外在设计上也使用了大量的设计模式,通过阅读和学习源码,能够快速提升我们的编码水平,以及对设计模式有更深的理解。

同时,在我们阅读完一个源码后,可以触类旁通,能够快速地对其他框架的源码进行阅读和学习,减少时间成本。

除了上述提到的原因之外,可能还有许多,在这里就不一一赘述了,那么在确定了要阅读源码之后,就让我们看下如何阅读源码吧!

如何阅读源码?

如何阅读源码取决于你为什么要读源码,比如:

  • 如果为了应对面试,那就可以围绕常考的基础类、集合类、队列、线程、锁等内容进行阅读和学习;

  • 如果是为了解决 bug,那么就可以只围绕出现问题的相关类进行阅读分析,随着解决 bug 的增多,我相信阅读的源码也会越多,从而更容易去阅读和学习源码;

下面大概说下阅读源码的几点建议:

在阅读之前,可以先从开源项目的官网上看它的架构设计和功能文档,了解这个项目的整体架构、模块组成以及各个模块之间的联系

如果没有对应的项目文档,可以根据代码的模块进行梳理,以形成对项目的初步了解,或者查看已有的源码解析文章或者书籍,在阅读源码之前,了解项目的架构和思路会使阅读源码事半功倍。

在了解一个类的时候,可以使用 ctrl+F12 来查看类中的成员变量和方法。

可以通过 IDEA 的 Diagrams 功能去了解一个类的继承关系。

多打断点调试,断点追踪源码是很好的阅读源码的方式,可以先通过 debug 了解下调用逻辑,都和哪些类有关联,有大致了解后再通过 debug 了解整体代码的功能实现,各个类都起到了什么作用,有没有涉及到设计模式等。

另外,优秀的开源项目中肯定会有许多地方应用到了设计模式,建议在阅读源码之前,需要对常用的设计模式有大致的了解,不然阅读源码的效率会大大降低。

如果遇到读不懂某部分源码的时候,可以先跳过,之后再回来看,如果属于搞不懂这部分就茶不思饭不想的人,可以在网上找是否有该部分源码的解析或者文档,也可以自己通过源码注释和测试用例去阅读学习。

一般优秀的开源项目都会有单元测试,可以通过对应类的单元测试去了解方法的含义和用法,加深对源码逻辑的理解。

在阅读源码的时候,可以在代码上加上注释和总结,同时还可以画出时序图和类图,这样对阅读源码有很大的帮助,可以很清楚地知道类之间的调用关系和依赖关系,也方便以后回顾,重新阅读。

在这里推荐大家一个 IDEA 插件 SequenceDiagram,可以根据源码生成调用时序图,便于阅读源码。

刚开始阅读源码,不建议直接看框架源码,可以先从 jdk 源码看起:

jdk 源码也是非常庞大的,可以分模块来阅读,下面是建议的阅读顺序:

  1. java.lang 包下的基本包装类(Integer、Long、Double、Float 等),还有字符串相关类(String、StringBuffer、StringBuilder 等)、常用类(Object、Exception、Thread、ThreadLocal 等)。

  2. java.lang.ref 包下的引用类(WeakReference、SoftReference 等)

  3. java.lang.annotation 包下的注解的相关类

  4. java.lang.reflect 包下的反射的相关类

  5. java.util 包下为一些工具类,主要由各种容器和集合类(Map、Set、List 等)

  6. java.util.concurrent 为并发包,主要是原子类、锁以及并发工具类

  7. java.iojava.nio 可以结合着看

  8. java.time 主要包含时间相关的类,可以学习下 Java 8 新增的几个

  9. java.net 包下为网络通信相关的类,可以阅读下 SocketHTTPClient 相关代码

其他包下的代码也可以做下了解,JDK源码阅读笔记:https://github.com/wupeixuan/JDKSourceCode1.8

再有了一定的源码阅读经验后,可以再去学习 Spring、Spring Boot、Dubbo、Spring Cloud 等框架的源码。

总结

本文主要介绍了为什么读源码以及如何读源码,供大家参考,每个人都有适合自己的阅读源码的方式,希望可以在学习中去摸索出一套属于自己的方式。

阅读源码不是一蹴而就的,这是持久战,只要你能够坚持下来,肯定受益匪浅。阅读源码的过程比较枯燥,可以在社群里一起讨论学习,这样可能效率更高些。

写得不好的或者大家有什么更好的建议,也欢迎留言讨论。

菜鸟程序员如何才能学会阅读源码相关推荐

  1. 菜鸟程序员如何才能快速提高自己的技术

    导语:很久没有这么悠闲的在家撸一篇文章了,最近也在思考怎样才能写一些对程序员帮助非常大的文章,怎样去运营好我们这个移动开发者聚集地的公众号:非著名程序员.当初弄这个公众号的本意就是为广大的开发者提供各 ...

  2. Thinkphp5内核大型程序员交流博客系统源码

    介绍: Thinkphp5内核大型程序员交流博客系统源码 网盘下载地址: http://kekewl.cc/qGKM757akv40 图片:

  3. 学会阅读源码后,我觉得自己better了

    我有一个大学同学,名叫石磊,我在之前的文章里提到过几次,我们俩合作过很多项目.只要有他在,我就特别放心,因为几乎所有难搞的问题,到他这,都能够巧妙地化解.他给我印象最深刻的一句话就是,"有啥 ...

  4. 程序员看过这篇文章 让你学会阅读源码!

    摘要:随着越来越多的公司使用敏捷开发,能够阅读别人的代码比以往显得更重要.这就需要学习一些如何提高这项技能的技巧.本文提供了几种提高代码阅读技巧的方法. 在软件开发人员的职位描述中有阅读源代码.然而, ...

  5. 趣谈程序员真香定律:源码即设计

    来源 | 码砖杂役 责编 | Carol 封图 | CSDN 付费下载自视觉中国 我们经常谈论架构,讨论设计,却甚少关注实现和代码本身,架构和设计固然重要,但要说代码本身不重要,我不同意,Robert ...

  6. 【华为云技术分享】程序员真香定律:源码即设计

    我们经常谈论架构,讨论设计,却甚少关注实现和代码本身,架构和设计固然重要,但要说代码本身不重要,我不同意,Robert C.Martin大叔也不同意,Martin认为"源码即设计" ...

  7. 神级以下必读! ~程序员学习资料(图书源码) 01

     为表示感谢,少见的郑重声明:本文转自- http://blog.csdn.net/fanxiaobin577328725/article/details/51894331?locationNum ...

  8. 阿里九年架构师教你如何学会阅读源码

    读源码的经历 刚参加工作那会,没想过去读源码,更没想过去改框架的源码:总想着别人的框架应该是完美的.万能的,应该不需要改:另外即使我改了源码,怎么样让我的改动生效了? 项目中引用的不还是没改的jar包 ...

  9. Python开发指南[1]之程序员计时小时钟(附源码)

    Python开发指南[1]之程序员计时小时钟 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 Python作为一门编程语言,这门语言的魅力和影响力已经远超C#.C++等编程 ...

最新文章

  1. Google是否会成为下一个微软?
  2. python有道词典-Python爬取有道词典
  3. dockerfile用源码包构建tomcat服务
  4. iOS-CoreImage简单使用
  5. 【C++深度剖析教程26】父子间的冲突
  6. 脉冲宽度调制pdm_STM32第七章-脉冲宽度调制
  7. ThinkPHP6项目基操(3.控制器获取请求参数)
  8. MyBatis框架 动态SQL
  9. mongodb的java驱动包_mongodb的java驱动包
  10. python输入y继续运行_Python二三事 - 接触Python(x,y)
  11. 基于matlab模糊pid控制系统,基于MATLAB的模糊自适应PID控制器的设计
  12. pyspark:basic_operating_1
  13. 【安全】(三)Django之SQL注入防御
  14. Web开发之分页功能
  15. An illegal reflective access operation has occurred警告
  16. 阿里副总裁、达摩院副院长金榕被曝离职!AI科学家集体“逃离“大厂…
  17. Latex 公式被压扁过小
  18. 全网疯传!微信发原图暴露个人信息?微信高冷回应!真相来了...
  19. 数据仓库简介、数据仓库的发展、数仓理论简介
  20. 选择尚学堂与传智播客的java培训?

热门文章

  1. Java构建递归树工具类
  2. IDEA配置MAVEN_OPTS
  3. 传递矩阵法求声波透射系数绘图求解决
  4. 天合化工上市以来,成为股市模范,专家分析全球股市欺诈案慢慢减少原因
  5. Unity读写飞控参数mavlink
  6. jdk 卸载报错 内部错误2503
  7. 1.MySQL面试宝典
  8. 数据挖掘项目_挖掘社区项目
  9. vim最新版本安装 安装vim9
  10. R语言统计—多重比较(1)