当我们说起看源码时,我们是在看什么

简介: 当我们说起看源码时,我们是在看什么

本篇是看源码系列的总纲, 讲下自己对看源码的认识,也是后面看源码文章的行文风格。

许多面试都要求看源码,这是市场的需求,然后开发者为了应聘上一份好的工作也去看,在网上你可以看到许多这方面的文章,但多数文章给我的感觉这是在为了看源码而看源码, 将源码贴出来, 然后将自己听到的关于对源码的理解写在对应的注释上,其中也会自己设问,自己答。但设问的也终归是面试的高频题目, 着眼于几个方法,如果将源码比做一篇文章的话,这类看源码的文章就有点像是上语文课听老师讲课的笔记。我个人是不大喜欢这类风格的文章,大多数只有结论,没有思考。

我曾经在某段时间思考过如果是自己来设计一些工具类、类库,除了功能的正常实现之外,还应该考虑什么问题? 在源码中我们可以看到这个问题的答案。我在写数据结构系列的文章时候,尝试自己去实现数据结构,就有去参考过源码,因为我不仅仅是想要简单的实现,更希望设计的良好。我想这里是看源码的第一个出发点, 从源码中学习如何设计一个良好的API,对于一些数据结构自己实现一遍,然后再参考源码的设计,思考源码为什么要这么设计。对于数据结构之类的源码,我们大体上可以说看源码可以增进自己对这种数据结构的理解,以及API的整体设计。

那么对于非数据结构类的源码呢,我们该如何看源码呢?或者说当我们在看源码的时候,我们在看什么呢?大体上源码我们可以将其分为以下几种类型:

  • 数据结构相关的类库(JDK中的集合类是其中的代表)
  • 工具类库(Guava、Apache Commons系列 )
  • 网络相关的类库(JDK 11新实现的HttpClient,以及Netty)
  • Spring家族(Spring Spring Boot Spring Cloud等)
  • MyBatis、Mybatis Plus Hibernate等
  • Druid、C3P0、线程池(池化思想)
  • 多线程相关(AQS相关)

从集合相关的类库我们可以着眼于API设计,体会其他开发者对此数据结构的实现,增进我们对该类数据库的认识。工具库类库的看,也是同样的,主要在看别人是如何设计一个工具类库的,如何做到通用。Guava的属性比较特殊, 既有工具类,也有对JDK的扩展,从这个角度来说看源码的另一重的意义在于如果现有的不满足需要,我们该如何在原来的基础上进行扩展。而网络相关的类库看源码则可以帮我们熟悉对于的网络协议,像JDK 11新实现的HttpClient、WebSocket。Netty则是很多中间件的基础框架,你可以在很多Java的开源中间件见到Netty的影子,在Netty中我个人目前比较感兴趣的就是封装,Java原生的NIO编写起来是颇让人头痛,Netty是如何在原生的NIO之上又包装一层,做到简单易用的同时又高性能。而Spring家族的源码, 我们看的时候应该着眼于哪一点呢?我想应该是设计思想吧,大量设计模式的运用,接口的设计,如何让开发者简单的易用。对于ORM框架来说, 看源码的意义一方面也在于扩展,像MyBatis Plus一样就是对MyBatis的扩展,另一方面在于解决问题,看过源码之后,出现问题之后更能确定这个问题的原因。像Druid、C3P0、线程池,我个人比较感兴趣的就是其池化的思想,这三个都是池化思想的演化。而多线程相关的源码,我觉得一方面可以增进我们对多线程的理解,另一方面也是方便自己做扩展,如果JDK本身提供的类库不满足需要,我们该如何造出自己合乎需要的轮子。

所以总结一下,不同的类库带有不同的属性,我们在看源码的时候一方面可以增进对类库相关属性的了解(比如网络类库,我们就可以增进网络类库的认识。连接池、线程池我们重在体会池化的思想),另一方面就是体会其类库设计思想,也就是函数设计和类设计,比如处理异常输入,应该给予调用者怎样的提示, 应该如何设计接口,使用继承。 再一方面就是理解其设计思想,方便我们对其进行扩张,或者是了解了这个开源类库的不足之后,造出更加优秀的轮子。最后则是看其开源框架对一些语法的应用,这一方面我感觉像是萧峰用太祖长拳也能大杀四方一样,我们重点看如何用,增进我们对该语法的认识。

相关文章
|
9月前
|
存储 安全 Java
小白聊《JAVA编程思想》-一切都是对象(一)
小白聊《JAVA编程思想》-一切都是对象(一)
41 0
编程要搞明白的东西(一)
编程要搞明白的东西(一)
97 0
|
SQL Kubernetes Java
深度剖析FlinkX(纯钧)源码
深度剖析FlinkX(纯钧)源码
192 0
|
Java
编程要搞明白的东西(二)
编程要搞明白的东西(二)
101 0
直击灵魂!美团大牛手撸并发原理笔记,由浅入深剖析JDK源码
并发编程这四个字想必大家最近都在网上看到过有很多的帖子在讨论。我们都知道并发编程可选择的方式有多进程、多线程和多协程。在Java中,并发就是多线程模式。而多线程编程也一直是一个被广泛而深入讨论的领域。如果遇到复杂的多线程编程场景,大多数情况下我们就需要站在巨人的肩膀上利用并发编程框架——JDK Concurrent包来解决相关线程问题。
|
SQL Java 数据库
Java虚拟机开发与实践专栏介绍
Java虚拟机开发与实践专栏介绍

相关实验场景

更多