阅读源码的方法

工作一两年的开发,接触过工程代码,具备了一定的开发经验。如果想在技术上有所提升,阅读优秀的源码是一种有效手段。在阅读源码这条路上,不同实践者会有不同的心得体会。本文介绍下我关于阅读源码的看法。

使用Java语言编写的工程系统,以业务系统和基础组件为主。我在工作中接触过的业务系统主要分为ToC和ToB两类。作为一名业务开发工程师,能够阅读ToC、ToB系统的代码是基本要求。我接触过设计良好的ToC系统,也接手过设计很差的ToC系统。如果系统具备良好的设计,可读性高,阅读起来会非常轻松。如果系统中到处充斥着面向过程的味道,没有经过设计,不遵循规范,就会很难阅读甚至难以阅读。ToC系统一般流程明确,顺着流程阅读代码就能掌握大体设计。将流程上的每一步骤深入下去,必要时通过请求接口来搞明白代码细节,即可上手。

ToC系统以高并发、高性能为特征,而ToB系统的特点是业务复杂。为了加快理解ToB系统源码,需要先了解业务,最简单的方式就是登陆到系统中把整个系统使用一遍。通常对外提供服务的Web系统都会提供用户操作手册,对照着操作手册操作一遍即可。如果是内部系统,若没有操作手册,就查阅文档、请教同事,尽快学会如何操作。在系统中走完一遍操作流程后,便会对业务大致了解,接下来就开始阅读代码。根据我的经验,建议先阅读权限模块,因为权限模块是几乎是ToB系统必备模块,而且比较独立,对理解业务也很关键。看懂权限模块后,再去阅读其他模块。当能弄懂业务到数据、数据到业务如何转换时,就理解到位(对于业务非常复杂的系统,要做到这点并不容易,需要在工作中不断消灭模糊点)。

关于如何上手业务系统,就介绍这么多。下面聊下我关于阅读组件源码的看法。

现在用Java编写的业务系统,基本都基于脚手架编写,不管采用什么样的脚手架,都能看到Spring的身影。如果一个入行不久的业务开发人员,阅读的第一个框架源码是Spring的话,我一点也不惊讶。要阅读Spring源码,建议先买本资料书,像Spring这种太太常见的框架,市面上有不少讲解源码的资料书。俗话说:师傅领进门,修行靠个人,资料书就是那个师傅。对于刚入行不久的Java开发者,Java生态中的知识点接触有限,准备本资料书,能更快进入状态。第一次阅读Spring源码,很多人会感觉不适应。如果跟踪调试,就会发现执行流跳来跳去,一会儿跳到这个类、一会儿跳到那个类,容易找不着北,感觉自己面对的是个庞然大物,甚至有人会因此放弃阅读,这其实是没找到入门的法门。根据我的经验,如果能做到以下几步,入门是没问题的。

  1. Demo
    在阅读某个Spring模块的源码前,很可能在实践中已经使用过该模块的功能,比如IoC模块。这种情况下,可以省去这一步。如果阅读自己未使用过的模块,建议先写个Demo体验一下该功能的用法。写Demo既是体验,也可用作调试的驱动例程。
  2. 类图
    Spring框架是一款设计良好的框架,也是我们学习如何抽象的典范。如果能在动态调试前对类的继承层次、类间关系建立大概印象,就不会在调试过程中有跳来跳去、理不清头绪的感觉了。
  3. 调试
    以某个Demo为入口,跟踪程序执行过程,进一步理清类间关系,加强或补充对类图的理解,掌握整个调用过程。
  4. 细节
    在调试过程中,遇到感兴趣的类、核心逻辑,可做深入阅读。如果不是很复杂,静态阅读就能理解;如果发现背后隐藏着复杂逻辑,可以先记下来,留待后续专攻。
  5. 记录
    将上述的阅读结果做好整理,记录下来。即使当时的印象再深刻,如果不进行记录,阅读成果会大打折扣。
  6. FAQ
    Last but not least,要做FAQ。事实上,我认为这至关重要。像Spring这样的大型框架,代码量庞大,作为业务开发,没必要去弄明白每个细节。有没有思考过自己为什么阅读源码,是想学习源码中的知识?还是好奇它的实现原理?或者只是想跟面试官过上几招?不管出于哪种原因,都希望能获得实在的收益,而不是对源码的模糊认识,FAQ可以帮助自己有效达成这个目的。如何实践FAQ呢?多提问。可以自问自答,也可以去网上找面试题,看看自己能否解答,如果不能就去看源码直至弄懂它。

总结上述阅读Spring源码的过程,实际上就是按照“面-线-点”的思维逻辑来掌握框架源码。以“面”为起点,先借助书籍、网络资料建立对阅读对象“面”上的认识,为“线”维度阅读做好准备;然后再从“线”入手,通过跟踪调试,掌握代码执行过程,并不断补充“面”上的认识;最后,从“点”上强化理解,通过FAQ实践,提升阅读源码的收益。

再说一点。Spring源码是老外写出来的,对于作者的编程风格、背景知识、思维深度,国内程序员很少知道,容易产生阅读难点,甚至失去信心、耐心,但好在市面上有不少讲解的资料书。其实,国内也有不少优秀的开源框架,如果阅读这类框架,就不用担心这种陌生感,阅读起来更好理解。我经常在阅读国内源码的过程中,会有“这里就是用了哪个知识点”的感觉。此处并非指国内源码水平如何(像阿里开源的Dubbo框架,承受住“双十一”流量洪峰的考验,而Spring Cloud中不少组件都还没经过生产中严苛环境的检验),只是想表明,阅读国人开源的框架,阅读者和作者的背景知识、思维方式都更接近,就能更容易理解他们的作品,缺点是资料书会比较少,如点评开源的Pigeon框架。如果要阅读国内的开源代码,推荐大公司的开源作品,向高手学习。最后,祝大家在阅读源码的道路上一帆风顺。


附上个人的一点小结。对象的生命周期包括初始化、使用、销毁三个阶段,系统的生命周期也是如此,在阅读系统源码时可以按照这3个阶段来阅读。另外,Java中的初始化时机有类初始化阶段(static域初始化赋值、static初始化块)、对象初始化阶段(实例域初始化赋值、初始化块、构造器)、Spring中的生命周期机制,如果阅读初始化逻辑,就从这些地方阅读。另外,系统中很多组件要是“唯一”的,Java程序中有两种实现方式:一种是成员全为static的类,另一种是单例对象。如何实现单例对象,去学习下5种单例模式。Spring中的单例bean都是单例对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值