作为程序员,是否需要去阅读源代码?原因是什么?

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

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

为什么要阅读源码?

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

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

为了找到更好的工作,应对面试,因为在面试中肯定会问到源码级别的问题,比如:为什么 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.io 和 java.nio 可以结合着看
  8. java.time 主要包含时间相关的类,可以学习下 Java 8 新增的几个
  9. java.net 包下为网络通信相关的类,可以阅读下 Socket 和 HTTPClient 相关代码

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

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

总结

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

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

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

非常感谢邀请回答问题

对于我们大多数程序员来说,也就是我们平常说的金字塔底层的人员,只是工具的使用者而已,简单、直白点就是熟练工,很多程序员只知道怎么用,不知道为什么这么用?

对于个人成长还处于2-3年前的工作经验。


对于一个优秀的程序员来说,阅读源码,分析架构,深入编码核心思想,那么对于你以后的个人能力提升是非常快的一种捷径。在我们阅读源码的时候,我们可以看到一个优秀的程序员的设计思路,编码规范以及编程思想体验的淋漓尽致。


俗话说的好,根据什么样的人学习,我们以后有可能会变成什么样子的人。分析源码,我们可以知道使用它的好处在哪里,为什么会选择它,它的内部的工作原理是怎么样的,从而我们可以将他们应用到我们的实际项目中,毕竟优秀框架的源码正如同一本武林秘籍。


所以,我们平时想要真正的成为高手,就要多多学习高手的优秀作品,模仿它,到最后超越它。

源代码是一定要去读的,我最近就疯狂地迷上了阅读源代码,有J d k的,有spring的,那就斗胆来分析下是不是应该阅读源代码?

1,长城是简单石头建成的:在大学学C语言的时候,我一直觉得数组和链表这么简单的东西没么鸟用,直到我最近读到了IinkedList,LinkedHasmap,ArrayList,AbstractQueueSynchronizer,Hashmap,ConcureentLinkedQueue等等,底层基本上都是使用数组和链表实现的!

2,三人行必有我师焉:在spring的源码里,大量的使用了模板方法适配器,工厂模式,修饰器模式,代理模式等等十几种设计模式,这也是支撑了spring良好架构的原因,在泛型,反射,枚举,重写,重载等代码技巧上,值得我们深入学习!

3,18般武艺,样样精通:现在的JAVA面试基本上都会问,是不是阅读过源码,从源码中学习到了什么?怎么设计的?自己能不能设计出来?虽然这些成熟的框架不需要你再去写,甚至可能没有bug可以挑,但是你还是得懂,因为面试官需要!

4,有人的地方就有江湖:不管在同事面前或者在领导面前,露一手是很有必要的,如果分析原因的时候你笃定的说,底层就是这么这么实现的,别人会觉得你很屌,你是个大牛,可能从此就走上了人生巅峰!

5,出精品之前可能需要先抄袭:比如说我们国家的战斗机,又比如说某迅的游戏都是先抄袭,然后再逐步创新加工,最后全部变为自己的,最后不也有声有色的嘛?从源码中找到对自己有用的,避免重复的造轮子!

总之,我觉得阅读原码是很重要的,而我最近一直都沉浸在源码的海洋里,如果有需要的朋友可以看看我之前的帖子,谢谢!

答案是肯定的,程序员从学习编程那一刻开始就需要阅读别人的源代码,工作以后则更不可避免的要阅读大量的源代码了。

阅读源代码对程序员来说至少有以下几点原因:

第一,程序员的学习往往都是从阅读源代码开始的。从第一个程序Hello World开始,程序员在学习的过程中就需要阅读大量的源代码,以了解程序的语法。程序语言的每一个概念几乎都需要通过源代码来呈现,而程序员当然需要通过阅读这些源代码来理解这些概念,同时还需要通过实验来验证这些源代码。很多计算机专业的学生都是通过阅读Linux源代码来学习操作系统体系结构的,这是一个非常好的学习方法。

第二,工作过程中需要通过阅读源代码来学习新的解决方案。计算机领域的新技术层出不穷,作为程序员来说需要不断学习这些新的技术方案,而阅读源代码是最直接的方式之一。很多程序员在学习新技术时,往往都是从直接搭建开发环境并运行demo开始,通过运行的结果建立对新技术的一个直观理解,而这个过程大部分的时间都是在阅读源代码。

第三,阅读源代码是程序员之间交流的一个重要方式。现在大部分开发团队都会对项目进行Code Review,Code Review的过程既是一个总结的过程,也是一个互相学习的过程,Review的过程一个重要的内容就是阅读别人的源代码。

大部分初级程序员需要掌握的第一个能力就是阅读源代码的能力,按照历史经验来看,具有较强代码阅读能力的初级程序员往往能够更快速的融入开发团队。同样,很多最终没有走向开发岗位的程序员,代码阅读能力不强是一个重要的原因,当然,代码阅读能力差的原因是多方面的。

我从事软件开发工作多年,目前也在带软件开发团队,我会陆续在头条写一些关于软件开发方面的文章,感兴趣的朋友可以关注我的头条号,相信一定会有所收获。

如果有软件开发方面的问题,也可以咨询我。

谢谢!

相关代码参考