再谈源码阅读
在软件开发中遇到问题的时候,我倾向于在不需要阅读源码的情况下解决问题,我会优先去查官方文档、faq、google或*等网站,去看下有没有前人已经遇到过同类问题。阅读源码来解决问题,算是杀手锏。当然,还有另一种需求,就是希望通过阅读源码了解软件的设计细节,来达到学习的目的,例如,通过阅读dubbo的源码,我可以了解一个rpc框架的设计细节。
前提
阅读源码之前要做一定的准备工作。
首先,确保自己掌握了相关的基础知识,例如,如果你要阅读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面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。
下一篇: 我混不好,你就别回来了!