当前位置:首页 > 公众号精选 > 架构师社区
[导读]阅读源码是每个优秀开发工程师的必经之路,那么这篇文章就来讲解下为什么要阅读源码以及如何阅读源码。 首先来说下为什么要读源码,有学习源码的必要吗? 为什么要阅读源码? 关于为什么阅读和学习源码,我个人认为可能有以下几点: (一)吊打面试官,应对面

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

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

为什么要阅读源码?

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

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

为了找到更好的工作,应对面试,因为在面试中肯定会问到源码级别的问题,比如:为什么 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 等框架的源码。

总结

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

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

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

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

近日某厂员工爆料,公司程序员因线上流量异常BUG事故,被公司进行处罚。处罚的结果是被要求将去年发的 4 万多年终奖归还给公司,否则就收取滞纳金并辞退,逾期将以每天万分之 5 的利息收取滞纳金。

关键字: 程序员 BUG 事故 年终奖 工程师

2023年10月18日,中国在第三届“一带一路”国际合作高峰论坛期间发布《全球人工智能治理倡议》,围绕人工智能发展、安全、治理三方面系统阐述了人工智能治理中国方案。

关键字: 人工智能 大模型 代码

业内消息,近日有媒体报道一名女子将年度总结发到朋友圈并将状态设为私密,但随后她发现其好友可以看到她发了朋友圈,尽管无法看到具体内容。随即,微博话题#微信私密朋友圈被吐槽有BUG# 很快冲上热搜第一,许多网友也纷纷表示遇见...

关键字: 微信 BUG

我们看到这么多的安全问题,部分原因在于我们对待安全的方式:安全性通常被认为是事后考虑的问题,是在开发结束时才添加到设备上的东西。然而,复杂的系统,尤其是嵌入式系统,有一个很大的攻击面,这让攻击者有机可乘,能够在“盔甲”上...

关键字: 代码 嵌入式系统 软件漏洞

新富人群财务需求多元发展,投顾服务迎来新机遇 上海2023年9月20日 /美通社/ -- 2023年9月19日,上海交通大学上海高级金融学院(高金)与全球领先的金融服务机构嘉信理财(Charles Schwab)联合发...

关键字: BSP ADVANCED INA 代码

北京2023年9月14日 /美通社/ -- 生物医药高科技公司诺诚健华(港交所代码:09969;上交所代码:688428)今日宣布,新型蛋白酪氨酸磷酸酶SHP2变构抑制剂ICP-189联用针对表皮生长因子受体(EGFR)...

关键字: IC HP 代码 ARMA

上海2023年9月1日 /美通社/ -- 2023上半年,安集科技(股票代码:688019)市场拓展规划成效显现,营业收入稳健增长。 全球半导体产业挑战持续存在的情形下,安集科技秉承发扬"克难攻坚,敢打硬...

关键字: 安集科技 BSP 代码 半导体材料

国际酒店运营商升级其在线支付功能 上海2023年8月28日 /美通社/ -- 加拿大金融科技公司Nuvei Corporation(以下简称“Nuvei”或“公司”)(纳斯达克代码:NVEI)(多伦多证券交易所代码:N...

关键字: 代码 IP SE 纳斯达克

2023年上半年收入7.459亿元 同比增长5.1% 毛利率水平上升 海外收入同比增长65.4% 香港2023年8月22日 /美通社/ -- 金邦达宝嘉控股有限公司及其附属公司(以下合称「金邦达」、「...

关键字: 数字化 代码 嵌入式软件 COM

我们经常对正在进行数字化转型的亚马逊云科技客户建议,将云迁移视为其数字化转型的一部分,数字化转型本身必须由业务成果驱动。其中治理计划的有效性决定了云迁移和数字化转型的成功与否。数字化转型中的云迁移总有结束的时候,但是如果...

关键字: 代码 数字化 云服务
关闭
关闭