如何阅读源码,阅读源码的难点和方法分析
本文转载自知乎 IT小透明,已获得转载授权。
几次想阅读源码,但是每回都坚持不下去,毕竟读源码真的是一件很难得事情。随便一份源码,动辄几百个类,每个类几百行,没点毅力真的坚持不下来。当然,也有阅读方法的缘故。
直到我看到了一本书《通用源码阅读指导书》,感觉才找到了源码阅读的方法,也正是在这本书的指导下,我读完了第一份开源源码MyBatis。
1 意义与难点
这本书最开始讲了源码阅读的优点,作者总结了四点:
透彻地理解项目的实现原理
接触到成熟和先进的架构方案
学习到可靠与巧妙的实施技巧
发现自身知识盲点,提升自身知识储备
然后讲解了为什么阅读源码十分困难,作者总结原因为每一个优秀的工程项目都凝聚了众多开发者的缜密思维逻辑;每一个优秀的工程项目都经历了从雏形到成熟的曲折演化过程。最终,这些思维逻辑和演化过程都会投射和堆叠到源码上,使得源码阅读的过程是一个通过源码去逆推思维逻辑和演化过程的工作,因此十分困难。
2 源码选择
阅读源码的一个重要工作就是选择合适的源码,作者总结了选择源码的几个纬度:
项目的成熟度
项目的应用广度
项目的涉及面
项目的规模
并给出了每个纬度的评判指标。
3 源码阅读方法
选好源码项目之后,要做的就是阅读源码。
作者介绍了源码阅读的方法、技巧、经验。主要包括两个大的步骤:
项目初探
源码阅读
在项目初探环节,主要是通过断点运行项目,然后分析项目的整体框架、跳转流向。而源码阅读部分则是最为主要的阅读环节。
在源码阅读环节,作者总结了许多的源码阅读方法。
4 源码阅读
作者介绍了以下几个主要的阅读方法:
- 模块分析:通读整个模块中的类,分析模块的主要功能。
- 模块归类:按照模块功能将模块进行分类,例如分为基础模块、核心模块、解析模块等等。
- 自底向上:阅读源码的一个重要的思路就是自底向上,先阅读外围模块,再深入核心模块,这样可以避免阅读源码时牵扯到太多的未阅读模块,打乱源码阅读的思路。
- 合理猜测:阅读源码时,可以根据功能合理猜测其具体实现,然后再通过源码分析是否和猜测一样。这样可以提升源码阅读的效率,也能提升自己的架构能力。
- 类比阅读:可以通过相似代码的比较,找出架构的异同点,然后分析这样架构的意义。
- 善于汇总:需要不断汇总每个模块的含义,与其他模块的关系等,从而整体理解整个项目。
- 网格阅读:作者提出要纵向阅读以从浅到深,也要横向阅读,找准同层次的架构关系。
为了讲解以上知识点,作者以MyBatis源码为例子,通读了整个源码。我读完之后,真的对MyBatis的源码有了十分透彻的理解。
而在每个章节前,作者还介绍了相关的基础知识,使得源码的阅读比较顺畅。
5 总结
《通用源码阅读指导书》是一本很好的源码阅读入门书,是一本教会你“如何阅读源码”的书籍,也能让你在源码阅读中总结相关的架构知识。
读完收获很大,推荐。
如何阅读源码,阅读源码的难点和方法分析相关推荐
- ConcurrentHashMap源码解析_02 预热(内部一些小方法分析)
前面一篇文章中介绍了并发HashMap的主要成员属性,内部类和构造函数,下面在正式分析并发HashMap成员方法之前,先分析一些内部类中的字方法函数: 首先来看下ConcurrentHashMap内部 ...
- 【Android 进程保活】应用进程拉活 ( 系统 Service 机制拉活 | Service 组件 onStartCommand 方法分析 | 源码资源 )
文章目录 一. Service 组件 onStartCommand 方法分析 1. onStartCommand 函数返回值分析 2. onStartCommand 函数 START_STICKY_C ...
- Windows上IDEA搭建最新Spark2.4.3源码阅读及调试的开发环境
相信很多同学都想通过阅读一些框架的源码,来提高自己的代码能力,但往往在第一步,搭建环境的时候就碰了壁. 本篇就来介绍下如何在Windows下,将最新版的Spark2.4.3编译,并导入到IDEA编译器 ...
- 应用监控CAT之cat-client源码阅读(一)
CAT 由大众点评开发的,基于 Java 的实时应用监控平台,包括实时应用监控,业务监控.对于及时发现线上问题非常有用.(不知道大家有没有在用) 应用自然是最初级的,用完之后,还想了解下其背后的原理, ...
- centos下将vim配置为强大的源码阅读器
每日杂事缠身,让自己在不断得烦扰之后终于有了自己的清静时光来熟悉一下我的工具,每次熟悉源码都需要先在windows端改好,拖到linux端,再编译.出现问题,还得重新回到windows端,这个过程太耗 ...
- 源码阅读:AFNetworking(十六)——UIWebView+AFNetworking
该文章阅读的AFNetworking的版本为3.2.0. 这个分类提供了对请求周期进行控制的方法,包括进度监控.成功和失败的回调. 1.接口文件 1.1.属性 /**网络会话管理者对象*/ @prop ...
- 源码阅读:SDWebImage(六)——SDWebImageCoderHelper
该文章阅读的SDWebImage的版本为4.3.3. 这个类提供了四个方法,这四个方法可分为两类,一类是动图处理,一类是图像方向处理. 1.私有函数 先来看一下这个类里的两个函数 /**这个函数是计算 ...
- mybatis源码阅读
说下mybatis执行一个sql语句的流程 执行语句,事务等SqlSession都交给了excutor,excutor又委托给statementHandler SimpleExecutor:每执行一次 ...
- 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment
24 UsageEnvironment使用环境抽象基类--Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类--Live555源码阅读 ...
- Transformers包tokenizer.encode()方法源码阅读笔记
Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode
最新文章
- Android selector 使用注意.
- 内存分析工具MAT介绍
- 想拿下互联网大厂OFFER,都需要准备什么?
- idea 远程调试_我的天!你竟然不会用IDEA远程调试Tomcat...
- 医学数字成像设备中计算机系统的作用包括,医学影像实用技术教程全部习题答案...
- 如何在SQL Server计算XX年第XX周是哪几天
- oracle中job的retry次数,Oracle 19c注意事项: DBMS_JOB 行为变化
- matlab画图一片空白的问题
- Flash遮罩层初识
- mir2ei源码韩文乱码处理
- 读书:在别人的盯梢儿和嚼舌根中茁壮成长 | 杂谈
- 安徽公司红蓝军训练营-WriteUpDocker复现
- The <Router /> component appears to be a function component that returns报错解决方式
- opencv-python 视频抽帧成一张张图片
- 游戏金币单位换算管理类
- 华为鸿蒙操作系统全景解构
- Pytorch 分布式训练中DP和DDP的原理和用法
- 模拟登录淘宝并拍下购物车商品
- Camera 的曝光校正概述
- qt窗体设置圆角后出现黑色的直角