如何阅读源码
阅读代码的目的
如何优雅的阅读代码
参考资料: 译文:从源码中学习(阅读源码,初学者的有效成长方式) | BoHolder的网站:博客,小玩意及其他
建议先学习 How to read a book》
预先准备:
- 一个趁手的IDE,熟悉快速搜索关键字、变量名、函数的引用和定义,最好使用
快捷键
- 掌握基本git或其他版本工具,方便
比较代码版本间的差异
- 源码相关文档,尤其是设计文档、代码规范《阿里巴巴JAVA规范手册》
- 具有一定的编程语言与设计模式的知识和经验,根据时间慢慢来吧
- 用纸笔、idea的diagrams、sequence diagrams(插件)、drawio进行生成、重新绘制UML图
阅读流程:
- 了解使用场景、前后对比、主要职能
- 自顶而下,通过官方文档,抓取主要流程,搭建demo,再分割,逐个击破
- 有目的性的专题阅读、调试、掌握,并输出文章
- 从下到上,汇总主线、分支。
阅读源代码的方法
- 了解这套软件的使用场景,在架构设计中承担的责任
- 通过官方文档,整体把握软件设计理念
- 搭建环境,运行demo,为下一步深入做准备
- 先主干、后分支,做好切割,逐个击破
案例:阅读一款中间件MQ
1、了解 RocketMQ的应用场景
使用场景:新用户注册送积分、送优惠券场景
基本职责:解耦与削峰填谷
设计理念:倡导设计模式中的对修改关闭、对扩展开放
原始架构设计:
有了MQ以后的架构设计
要点分析:简化注册流程并通过mq解耦,后续调整积分、优惠券业务或新增其他服务,只需调整服务模块即可。
2、通读官方文档,从全局把握其设计理念
了解使用场景以后,接下我们可以去查阅官方文档,主要包括用户设计文档(架构设计),用户使用手册等,从全局了解其设计理念。
通过通读官方文档,不仅可以得出MQ的整体脉络(例如NameServer路由发现、消息发送、消息存储、消息消费、消息过滤),也能对顺序消费,零拷贝、同步刷盘、异步刷盘等“高端大气上档次”的高级特性产生兴趣与好奇,驱动我们去阅读其源码,探究其实现细节,使得我们在阅读源码中进行一定的自我思考成为了可能。
3、搭建开发调试环境
安装RocketMQ与IDEA Debug环境搭建
先主干,再分支
在搭建好本地开发环境后,切忌直接用Debug去跟踪消息发送的整体流程,因为这个流程实在是太长了,从比较粗粒度来看其流程如下图所示:
如果大家想一次性将上述流程的源码全部看一遍,几乎是不可能的。 因为消息发送高可用设计、消息存储、刷盘、同步等机制,每个点详细展开的工作都是海量的,我们没有这么多连续的时间,所以适当的拆分非常有必要。
经过这样一分解,就能专注理解其某一块的设计原理,所需要的连续时间也能大大减少,一口一口“吃”,最终完成整个体系的理解。
这还带来了一个额外的好处:分批次输出多篇文章,提高了文章产出,提高了成就感。
阅读代码的顺序
- 做基础,熟悉Java核心基础概念
- 学核心,系统学习Java 核心知识点
- 集合、IO、反射、并发、锁、多线程
- 数据库原理、JVM基础、
- 常用中间件(Dubbo、Kafka、Redis、Zookeeper)核心原理
- 框架(Spring、Mybatis、SpringBoot、SpringCloud)核心原理
- 看源码和看书为主,看博文和看视频为辅
- ArrayList
- 源码有1400多行(注释估计占了一半),不需要全看,我们只需要看其中重要的内容:
- 基础属性、构造方法、get 方法、set 方法、add 方法、remove 方法、扩容方法等
- LinkedList
- HashMap
- Java 并发编程的艺术
- Java 并发编程实战
- 深入理解 Java 虚拟机
- Redis设计与实现
- ArrayList
- 找亮点,提升自己的知识深度和项目实践
- 挑选一到两个常用的中间件或框架,来深入学习其源码,例如:Spring、Mybatis、SpringBoot、SpringCloud、RPC(Dubbo、gRpc、公司自研)、MQ(Kafka、RocketMQ、公司自研)、Redis、Zookeeper、JVM、数据库中间件(TDDL、MyCat)等。
- 合理的的学习方法是反复debug源码+做笔记,我一般是把源码下载到本地,然后直接在源码上做笔记。
- 高并发、大数据量的情况,那么找亮点应该不难
- 1)比较复杂的场景方案设计;
- 2)系统稳定性保障方面的设计:限流、熔断、降级等(6位数的密码保护2位数的存款);
- 3)线上问题的排查和解决:死锁、宕机、Full GC 频繁等。
实操计划
- 先刷面试题一个月 (3条消息) Java 基础高频面试题(2022年最新版)_程序员囧辉的博客-CSDN博客_java面试题
- 刷jdk8,
- 参考如何阅读源码? - SegmentFault 思否
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
相关代码- 再有了一定的源码阅读经验后,可以再去学习
Spring、Spring Boot、Dubbo、Spring Cloud
等框架的源码。
补充
- uml知识学习(快速)
- 单元测试(快速)
- 如何阅读一本书
实战
- 下载jdk8的源码包,按上面的顺序进行阅读,先尝试记录流水账,每行补充注释,对比 wupeixuan/JDKSourceCode1.8: Jdk1.8源码解析 (github.com)
- 按【如何阅读一本书】的逻辑,重新审视上一篇源码,提高技术!再对比!
- 尝试思考作者是如何设计、解决问题,并提交issue与作者进行讨论。
补充资料:
- 程序羊推荐的开源项目
- halo,开源博客项目,主要用springboot编写,是不错的学习案例
- hutools,工具集
- piggymetrics,微服务项目,多模块
- hanlp,自然语言处理
- 补充【爬坡】pdf,视频资料,来自公众号搜索、已下载
- 一个优秀开源工程师
- 通过searchcode搜索项目,或github trending推荐,code-nav.cn
- 应用github1s快速查看源码
- 国外的公司都是如何对待大龄程序员的?在国内该如何应对?_Java架构师迁哥_InfoQ写作社区
- 模型的威力:基于模型,快速梳理源码 (qq.com)
- Java 全栈知识体系 (pdai.tech)
- 开发者学堂_课程_学习路线_技术谱图_训练营_体验实验室_阿里云开发者社区-阿里云 (aliyun.com)
评论系统未开启,无法评论!