菜鸟程序员如何才能学会阅读源码
阅读源码是每个优秀开发工程师的必经之路,那么这篇文章就来讲解下为什么要阅读源码以及如何阅读源码。
首先来说下为什么要读源码,有学习源码的必要吗?
为什么要阅读源码?
关于为什么阅读和学习源码,我个人认为可能有以下几点:
(一)吊打面试官,应对面试
为了找到更好的工作,应对面试,因为在面试中肯定会问到源码级别的问题,比如:为什么 HashMap
是线程不安全的?
如果你没有阅读过源码,面试官可能会对回答的结果不满意,进而导致面试结果不太理想,但如果你对源码有所研究,并能够很好地问答面试官的问题,这可能就是你的加分点,可以形成自己独特的竞争力,吊打面试官,升职加薪不是梦。
(二)解决问题(bug)
在开发过程中,我们或多或少会遇到 bug
,比如:在 foreach
循环里进行元素的 remove/add
操作,为啥有可能会报 ConcurrentModificationException
异常?
我们可以先在 Google、Stack Overflow
以及对应项目的 Issues
里看有没有类似问题以及解决办法,如果没有的话,我们只能通过阅读源码的方式去解决了。如果我们对相关源码有所涉猎,就可以快速定位到问题所在。
(三)提升编程能力
读一本好书,就是和许多高尚的人谈话。-歌德
和阅读一本好书一样,阅读源码就是和编程大牛面对面交流的机会,在许多优秀的开源项目中,它们的编码规范和架构设计都是很棒的,另外在设计上也使用了大量的设计模式,通过阅读和学习源码,能够快速提升我们的编码水平,以及对设计模式有更深的理解。
同时,在我们阅读完一个源码后,可以触类旁通,能够快速地对其他框架的源码进行阅读和学习,减少时间成本。
除了上述提到的原因之外,可能还有许多,在这里就不一一赘述了,那么在确定了要阅读源码之后,就让我们看下如何阅读源码吧!
如何阅读源码?
如何阅读源码取决于你为什么要读源码,比如:
如果为了应对面试,那就可以围绕常考的基础类、集合类、队列、线程、锁等内容进行阅读和学习;
如果是为了解决
bug
,那么就可以只围绕出现问题的相关类进行阅读分析,随着解决bug
的增多,我相信阅读的源码也会越多,从而更容易去阅读和学习源码;
下面大概说下阅读源码的几点建议:
在阅读之前,可以先从开源项目的官网上看它的架构设计和功能文档,了解这个项目的整体架构、模块组成以及各个模块之间的联系。
如果没有对应的项目文档,可以根据代码的模块进行梳理,以形成对项目的初步了解,或者查看已有的源码解析文章或者书籍,在阅读源码之前,了解项目的架构和思路会使阅读源码事半功倍。
在了解一个类的时候,可以使用 ctrl+F12
来查看类中的成员变量和方法。
可以通过 IDEA 的 Diagrams
功能去了解一个类的继承关系。
多打断点调试,断点追踪源码是很好的阅读源码的方式,可以先通过 debug
了解下调用逻辑,都和哪些类有关联,有大致了解后再通过 debug
了解整体代码的功能实现,各个类都起到了什么作用,有没有涉及到设计模式等。
另外,优秀的开源项目中肯定会有许多地方应用到了设计模式,建议在阅读源码之前,需要对常用的设计模式有大致的了解,不然阅读源码的效率会大大降低。
如果遇到读不懂某部分源码的时候,可以先跳过,之后再回来看,如果属于搞不懂这部分就茶不思饭不想的人,可以在网上找是否有该部分源码的解析或者文档,也可以自己通过源码注释和测试用例去阅读学习。
一般优秀的开源项目都会有单元测试,可以通过对应类的单元测试去了解方法的含义和用法,加深对源码逻辑的理解。
在阅读源码的时候,可以在代码上加上注释和总结,同时还可以画出时序图和类图,这样对阅读源码有很大的帮助,可以很清楚地知道类之间的调用关系和依赖关系,也方便以后回顾,重新阅读。
在这里推荐大家一个 IDEA 插件 SequenceDiagram
,可以根据源码生成调用时序图,便于阅读源码。
刚开始阅读源码,不建议直接看框架源码,可以先从 jdk 源码看起:
jdk 源码也是非常庞大的,可以分模块来阅读,下面是建议的阅读顺序:
java.lang
包下的基本包装类(Integer、Long、Double、Float
等),还有字符串相关类(String、StringBuffer、StringBuilder
等)、常用类(Object、Exception、Thread、ThreadLocal
等)。java.lang.ref
包下的引用类(WeakReference、SoftReference
等)java.lang.annotation
包下的注解的相关类java.lang.reflect
包下的反射的相关类java.util
包下为一些工具类,主要由各种容器和集合类(Map、Set、List
等)java.util.concurrent
为并发包,主要是原子类、锁以及并发工具类java.io
和java.nio
可以结合着看java.time
主要包含时间相关的类,可以学习下 Java 8 新增的几个java.net
包下为网络通信相关的类,可以阅读下Socket
和HTTPClient
相关代码
其他包下的代码也可以做下了解,JDK源码阅读笔记:https://github.com/wupeixuan/JDKSourceCode1.8
再有了一定的源码阅读经验后,可以再去学习 Spring、Spring Boot、Dubbo、Spring Cloud
等框架的源码。
总结
本文主要介绍了为什么读源码以及如何读源码,供大家参考,每个人都有适合自己的阅读源码的方式,希望可以在学习中去摸索出一套属于自己的方式。
阅读源码不是一蹴而就的,这是持久战,只要你能够坚持下来,肯定受益匪浅。阅读源码的过程比较枯燥,可以在社群里一起讨论学习,这样可能效率更高些。
写得不好的或者大家有什么更好的建议,也欢迎留言讨论。
菜鸟程序员如何才能学会阅读源码相关推荐
- 菜鸟程序员如何才能快速提高自己的技术
导语:很久没有这么悠闲的在家撸一篇文章了,最近也在思考怎样才能写一些对程序员帮助非常大的文章,怎样去运营好我们这个移动开发者聚集地的公众号:非著名程序员.当初弄这个公众号的本意就是为广大的开发者提供各 ...
- Thinkphp5内核大型程序员交流博客系统源码
介绍: Thinkphp5内核大型程序员交流博客系统源码 网盘下载地址: http://kekewl.cc/qGKM757akv40 图片:
- 学会阅读源码后,我觉得自己better了
我有一个大学同学,名叫石磊,我在之前的文章里提到过几次,我们俩合作过很多项目.只要有他在,我就特别放心,因为几乎所有难搞的问题,到他这,都能够巧妙地化解.他给我印象最深刻的一句话就是,"有啥 ...
- 程序员看过这篇文章 让你学会阅读源码!
摘要:随着越来越多的公司使用敏捷开发,能够阅读别人的代码比以往显得更重要.这就需要学习一些如何提高这项技能的技巧.本文提供了几种提高代码阅读技巧的方法. 在软件开发人员的职位描述中有阅读源代码.然而, ...
- 趣谈程序员真香定律:源码即设计
来源 | 码砖杂役 责编 | Carol 封图 | CSDN 付费下载自视觉中国 我们经常谈论架构,讨论设计,却甚少关注实现和代码本身,架构和设计固然重要,但要说代码本身不重要,我不同意,Robert ...
- 【华为云技术分享】程序员真香定律:源码即设计
我们经常谈论架构,讨论设计,却甚少关注实现和代码本身,架构和设计固然重要,但要说代码本身不重要,我不同意,Robert C.Martin大叔也不同意,Martin认为"源码即设计" ...
- 神级以下必读! ~程序员学习资料(图书源码) 01
为表示感谢,少见的郑重声明:本文转自- http://blog.csdn.net/fanxiaobin577328725/article/details/51894331?locationNum ...
- 阿里九年架构师教你如何学会阅读源码
读源码的经历 刚参加工作那会,没想过去读源码,更没想过去改框架的源码:总想着别人的框架应该是完美的.万能的,应该不需要改:另外即使我改了源码,怎么样让我的改动生效了? 项目中引用的不还是没改的jar包 ...
- Python开发指南[1]之程序员计时小时钟(附源码)
Python开发指南[1]之程序员计时小时钟 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 Python作为一门编程语言,这门语言的魅力和影响力已经远超C#.C++等编程 ...
最新文章
- Google是否会成为下一个微软?
- python有道词典-Python爬取有道词典
- dockerfile用源码包构建tomcat服务
- iOS-CoreImage简单使用
- 【C++深度剖析教程26】父子间的冲突
- 脉冲宽度调制pdm_STM32第七章-脉冲宽度调制
- ThinkPHP6项目基操(3.控制器获取请求参数)
- MyBatis框架 动态SQL
- mongodb的java驱动包_mongodb的java驱动包
- python输入y继续运行_Python二三事 - 接触Python(x,y)
- 基于matlab模糊pid控制系统,基于MATLAB的模糊自适应PID控制器的设计
- pyspark:basic_operating_1
- 【安全】(三)Django之SQL注入防御
- Web开发之分页功能
- An illegal reflective access operation has occurred警告
- 阿里副总裁、达摩院副院长金榕被曝离职!AI科学家集体“逃离“大厂…
- Latex 公式被压扁过小
- 全网疯传!微信发原图暴露个人信息?微信高冷回应!真相来了...
- 数据仓库简介、数据仓库的发展、数仓理论简介
- 选择尚学堂与传智播客的java培训?