在软件开发中遇到问题的时候,我倾向于在不须要阅读源码的状况下解决问题,我会优先去查官方文档、FAQ、google或stackoverflow等网站,去看下有没有前人已经遇到过同类问题。阅读源码来解决问题,算是杀手锏。固然,还有另外一种需求,就是但愿经过阅读源码了解软件的设计细节,来达到学习的目的,例如,经过阅读Dubbo的源码,我能够了解一个RPC框架的设计细节。java
阅读源码以前要作必定的准备工做。面试
首先,确保本身掌握了相关的基础知识,例如,若是你要阅读Linux内核源码,要掌握C语言的语法、操做系统的基本概念和原理,若是你要阅读Spring的源码,要掌握Java语言基础、Maven的使用、一些设计模式等等;算法
第二,要学会使用这个软件或框架,了解这个软件或框架的使用场景,有什么功能,同类竞品有哪些,在学习使用软件或框架的过程当中,最重要的参考资料是官方文档,一款优质的软件或框架,官方文档通常包括三块:快速开始,即一些demo;参考文档,最详细的文档,包括概念、特性的解读;FAQ:对于使用者来讲常见的问题的解答;后端
第三,初步了解代码的总体组织结构,每一个文件夹是作什么用的。设计模式
调试环境很是重要,有了调试环境,就能够根据须要进行断点,对阅读源码很是有帮助。至于说如何搭建调试环境,不一样的状况有不一样的处理办法,例如MAT的源码,我是先将它的核心逻辑剥离出来,而后本身用单元测试进行调试;对于Dubbo源码,我则是写了一个Dubbo服务提供者、一个Dubbo服务消费者,以及安装了ZK以后才搭建起来的;对于Spring最简单了,利用Spring Boot启动一个hello word的demo就能够。框架
在作完上述准备工做后,我会按照使用功能或场景来阅读源码,例如,在阅读MAT(内存分析工具)的源码的时候,我是按照如下几个步骤来阅读:文件解析、索引建立、类直方图查询、支配树查询、线程视图查询等等;在阅读Spring源码的时候,我会按照Spring容器的启动、IoC的工做过程、AOP的工做过程、静态属性的引入等功能来阅读;在阅读Dubbo源码的时候,我会按照服务发布、服务订阅、服务调用三个主要场景进行源码阅读。按照功能或场景阅读,可让咱们从总体上对代码有所理解,而后就能够进入本身关注的一些细节了,例如:在MAT中,索引文件是如何建立的,在Dubbo中,请求的超时机制和心跳机制是如何实现的。函数
阅读源码的过程当中,我总结出了一些须要注意的点:工具
上述就是我本身针对源码阅读的一些经验,若是你有好的经验或想法,欢迎在留言区与我交流单元测试
本号专一于后端技术、JVM问题排查和优化、Java面试题、我的成长和自我管理等主题,为读者提供一线开发者的工做和成长经验,期待你能在这里有所收获。学习