想读项目源码?可为什么总是读不下去?

本篇是专题《如何高效阅读源码》的第一篇,来聊一聊阅读源码的错误姿势!以及本专题的内容及章节。

似曾相识的场景

你听说Spring已经有一段时间了,它已经是Java企业级开发事实上的标准。你觉得自己应该读一读Spring的源码,深入理解一下Spring的实现,这能使自己更好的使用Spring,同时也能提高自己项目设计和编码能力。

于是你泡了一杯咖啡,从github上下载最新的Spring源码,导入到IDE中,写了一个demo,然后就开始debug。你一边StepOver,一边嘴里嘟囔着「A类的a方法调用了B类的b方法,然后又调用了C类的c方法,然后又执行到了这里」。嗯,很清晰嘛,喝口咖啡。咦,刚才看到哪里了?!没办法,只好重新debug!

「A类的a方法调用了B类的b方法,然后又调用了C类的c方法。。。。。。这里是个接口,要执行的是子类,子类在哪里呢」?你在IDEA里按下ALT+F7,发现有几十个实现,到底是哪个实现呢?你按下F7 StepIn想确认下。我去,一堆AOP的包装方法,按了半天,就是进不到最终的类!

最后,好不容易找到了执行的类。咦,刚才看的是什么来着?!唉,算了,看不下去了,先来把王者吧!然后,就没有然后了!!!
为什么你没办法把源码读下去呢?因为你的方法不对

  • 不了解项目就读源码

  • 一上来就读最新版本的源码

  • 直接读完整的源码

  • 通过debug的方式阅读源码

我们一个个的来说!

不了解项目就读源码

首先,你了解项目了吗?你有实际使用过项目吗?你对项目的执行流程了解多少?如果你还没有熟练的使用项目,那你就不要急着去读项目源码。
读源码需要在熟练使用的基础上进行。为什么呢?

你想想你读源码的目的是什么?你是希望能了解这个项目是如何设计实现的,代码如何组织的,有哪些技巧或思路可以学习。但是你连项目都不了解,你怎么去理解这个项目是怎么设计的?

就像上面,你只知道Spring是目前企业级开发事实上的标准,但是你不知道原因,也不知道它解决了什么问题,以及解决问题的方式。那你如何能理解代码为什么要这么写?!假如你最终千辛万苦的终于将Spring源码读完了,你也只知道Spring构建了Bean塞到了容器中,然后使用的时候获取这个Bean,而不清楚深层次的用意。

一上来就读最新版本的源码

很多开源项目经历了很多年,代码量成指数级增长。版本越新,代码量也就越多。以Spring来说,现在Spring已经到了5.*版本,从git上下载下来的spring-framework的源码大小有200多兆,你能想象这得有多少代码吗?一上来就读这种庞然大物,心里不瘆得慌才怪!

所以从相对老一点的版本入手,代码量上会少很多,阅读起来也会容易很多。但是版本也不能太老,太老的版本可能使用的技术已经过时了,读了也没有什么太大的用处。

直接看完整代码

虽然老版本的代码量相对少一点,但是一个相对较大一点的项目的代码量还是比较多的。比如Spring3的代码量也已经很多了。
所以,无论是哪个版本的源码,你都不应该看完整的代码。那该怎么去读源码呢?这就是本专题要解决的问题之一,在后面的章节中会进行详细的讲解。

通过debug的方式阅读源码

很多源码分析的博客都是通过debug的方式来讲述源码。也有不少教读源码的文章,也是建议通过debug的方式来进行阅读。但是,实际上通过debug的方式来阅读源码不是一个好方法,至少一上来就进行debug,是个很不好的习惯

大部分人应该都知道,人的记忆可以分为「短时记忆」和「长时记忆」!对于「短时记忆」来说,一般正常人一次只能记忆7(加减2)个左右的无规律信息。对于通过debug进行源码阅读的方式,每一次的方法跟进,实际就是一次信息记忆,所以最多7次左右的StepOver,你就没法记住所有的调用关系了。所以你就会出现看了后面忘了前面的情况。

同时像Spring这种使用了AOP的项目,由于在运行时有多层的代理,所以debug的层级更多,也就更加的难以阅读了。
再加上众多的子类实现,很容易就迷失在了一堆没用的代码中。

专题内容

既然已经知道了错误的阅读源码的方式,那正确的阅读源码的方式是什么呢?这就是本专题的内容!
本专题包括四部分内容:

  • 错误的阅读源码的方式

  • 提高阅读效率的方法

  • 高效阅读源码的步骤

  • 以及一个完整的演示实例

看完本专题,你将学会:

  • 一种高效阅读源码的方法

  • 理解阅读源码的目的是什么

  • 理解设计模式的用途

  • 理解如何从架构层面看源码

预备知识

为了更好的理解本专题,你最好需要:

  • 至少掌握一门编程语言,本专题使用Java语言讲解,故掌握Java语言最佳

  • 了解UML,本专题会绘制一些简单的UML图

  • 了解常用设计原则

  • 了解常用设计模式,了解设计原则和设计模式能更快的理解项目

  • 熟练使用一款IDE,本专题使用Intellij IDEA演示,故熟悉Intellij IDEA最佳

  • 熟练使用纸和笔或熟悉一款绘图软件,本专题使用draw.io进行绘图

  • 熟练使用你需要阅读源码的项目,本专题使用JUnit进行讲解,故熟练使用JUnit最佳

适用人群

    • 想快速了解一个项目的源码结构的开发人员

    • 想阅读源码,但是一直找不到方法,读不下去的开发人员

上一篇:JavaServlet原理


下一篇:spring数据源抽取