logo头像

分享技术,品味人生

如何阅读源码

阅读代码的目的

如何优雅的阅读代码

参考资料: 译文:从源码中学习(阅读源码,初学者的有效成长方式) | BoHolder的网站:博客,小玩意及其他

建议先学习 How to read a book》

预先准备:

  • 一个趁手的IDE,熟悉快速搜索关键字、变量名、函数的引用和定义,最好使用快捷键
  • 掌握基本git或其他版本工具,方便比较代码版本间的差异
  • 源码相关文档,尤其是设计文档、代码规范《阿里巴巴JAVA规范手册》
  • 具有一定的编程语言与设计模式的知识和经验,根据时间慢慢来吧
  • 用纸笔、idea的diagrams、sequence diagrams(插件)、drawio进行生成、重新绘制UML图

阅读流程:

  • 了解使用场景、前后对比、主要职能
  • 自顶而下,通过官方文档,抓取主要流程,搭建demo,再分割,逐个击破
    • 有目的性的专题阅读、调试、掌握,并输出文章
  • 从下到上,汇总主线、分支。

阅读源代码的方法

  • 了解这套软件的使用场景,在架构设计中承担的责任
  • 通过官方文档,整体把握软件设计理念
  • 搭建环境,运行demo,为下一步深入做准备
  • 先主干、后分支,做好切割,逐个击破

案例:阅读一款中间件MQ

1、了解 RocketMQ的应用场景

使用场景:新用户注册送积分、送优惠券场景

基本职责:解耦与削峰填谷

设计理念:倡导设计模式中的对修改关闭、对扩展开放

原始架构设计:

img

有了MQ以后的架构设计

img

要点分析:简化注册流程并通过mq解耦,后续调整积分、优惠券业务或新增其他服务,只需调整服务模块即可。

2、通读官方文档,从全局把握其设计理念

了解使用场景以后,接下我们可以去查阅官方文档,主要包括用户设计文档(架构设计),用户使用手册等,从全局了解其设计理念。

img

通过通读官方文档,不仅可以得出MQ的整体脉络(例如NameServer路由发现、消息发送、消息存储、消息消费、消息过滤),也能对顺序消费,零拷贝、同步刷盘、异步刷盘等“高端大气上档次”的高级特性产生兴趣与好奇,驱动我们去阅读其源码,探究其实现细节,使得我们在阅读源码中进行一定的自我思考成为了可能。

3、搭建开发调试环境

安装RocketMQ与IDEA Debug环境搭建

先主干,再分支

在搭建好本地开发环境后,切忌直接用Debug去跟踪消息发送的整体流程,因为这个流程实在是太长了,从比较粗粒度来看其流程如下图所示:

img

如果大家想一次性将上述流程的源码全部看一遍,几乎是不可能的。 因为消息发送高可用设计、消息存储、刷盘、同步等机制,每个点详细展开的工作都是海量的,我们没有这么多连续的时间,所以适当的拆分非常有必要。

img

经过这样一分解,就能专注理解其某一块的设计原理,所需要的连续时间也能大大减少,一口一口“吃”,最终完成整个体系的理解。

这还带来了一个额外的好处:分批次输出多篇文章,提高了文章产出,提高了成就感。

阅读代码的顺序

  • 做基础,熟悉Java核心基础概念
  • 学核心,系统学习Java 核心知识点
    • 集合、IO、反射、并发、锁、多线程
    • 数据库原理、JVM基础、
    • 常用中间件(Dubbo、Kafka、Redis、Zookeeper)核心原理
    • 框架(Spring、Mybatis、SpringBoot、SpringCloud)核心原理
    • 看源码和看书为主,看博文和看视频为辅
      • ArrayList
        • 源码有1400多行(注释估计占了一半),不需要全看,我们只需要看其中重要的内容:
        • 基础属性、构造方法、get 方法、set 方法、add 方法、remove 方法、扩容方法等
      • LinkedList
      • HashMap
      • Java 并发编程的艺术
      • Java 并发编程实战
      • 深入理解 Java 虚拟机
      • Redis设计与实现
  • 找亮点,提升自己的知识深度和项目实践
    • 挑选一到两个常用的中间件或框架,来深入学习其源码,例如: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.iojava.nio 可以结合着看
    • java.time 主要包含时间相关的类,可以学习下 Java 8 新增的几个
    • java.net 包下为网络通信相关的类,可以阅读下 SocketHTTPClient 相关代码
    • 再有了一定的源码阅读经验后,可以再去学习 Spring、Spring Boot、Dubbo、Spring Cloud 等框架的源码。

补充

  • uml知识学习(快速)
  • 单元测试(快速)
  • 如何阅读一本书

实战

  • 下载jdk8的源码包,按上面的顺序进行阅读,先尝试记录流水账,每行补充注释,对比 wupeixuan/JDKSourceCode1.8: Jdk1.8源码解析 (github.com)
  • 按【如何阅读一本书】的逻辑,重新审视上一篇源码,提高技术!再对比!
  • 尝试思考作者是如何设计、解决问题,并提交issue与作者进行讨论。

补充资料:

评论系统未开启,无法评论!