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

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

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

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

我曾经在某段时间思考过如果是自己来设计一些工具类、类库,除了功能的正常实现之外,还应该考虑什么问题? 在源码中我们可以看到这个问题的答案。我在写数据结构系列的文章时候,尝试自己去实现数据结构,就有去参考过源码,因为我不仅仅是想要简单的实现,更希望设计的良好。我想这里是看源码的第一个出发点, 从源码中学习如何设计一个良好的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本身提供的类库不满足需要,我们该如何造出自己合乎需要的轮子。

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

相关文章
|
1月前
|
XML Java 数据库连接
谈谈Java反射:从入门到实践,再到原理
谈谈Java反射:从入门到实践,再到原理
60 0
|
11月前
|
存储 前端开发 JavaScript
AntV X6源码探究简析
AntV是蚂蚁金服全新一代数据可视化解决方案,其中X6主要用于解决图编辑领域相关的解决方案,其是一款图编辑引擎,内置了一下编辑器所需的功能及组件等,本文旨在通过简要分析x6源码来对图编辑领域的一些底层引擎进行一个大致了解,同时也为团队中需要进行基于X6编辑引擎进行构建的图编辑器提供一些侧面了解,在碰到问题时可以较快的找到问题点。
283 0
|
3月前
|
开发框架 JavaScript Java
分享66个Java框架源码,总有一款适合您
分享66个Java框架源码,总有一款适合您
46 0
|
3月前
|
开发框架 Java 数据库连接
分享88个Java框架源码,总有一款适合您
分享88个Java框架源码,总有一款适合您
44 0
|
4月前
|
SQL Kubernetes Java
深度剖析FlinkX(纯钧)源码
深度剖析FlinkX(纯钧)源码
84 0
|
5月前
|
负载均衡 前端开发 Java
阿里面试:看过框架源码吗?举例说明一下
阿里面试:看过框架源码吗?举例说明一下
80 0
我用10张图总结出这份并发编程最佳学习路线!!
大家好,我是冰河~~ 最近有百度的小伙伴问我:冰河,并发编程要学哪些内容呀?我看你公众号的【精通高并发系列】更新了很多高并发编程的技术文章,你是怎么学习的呢?后面你还会更新吗?啥时候更新完呀?
125 0
我用10张图总结出这份并发编程最佳学习路线!!
|
Java
【每日进步一点点系列】Java基础核心必考面经
【每日进步一点点系列】Java基础核心必考面经
116 0
【每日进步一点点系列】Java基础核心必考面经