如何阅读源码

简介: 如何阅读源码

为何要阅读源码?可能原因如下:


1.面试要求

2.提升编码能力


在面试中,我们经常被问到,读过Java、Hadoop或者Spark、Flink源码吗?这时候我们可能就想着,既然要考,那就读读源码吧,可是读着读着就读不下去了,因为花费了很多时间,却读不懂,一无所获。


这里针对我们不同的需求,给我们不同的解决方案。

1.面试要求

如果因为面试,去阅读源码,其实我们可以借助外力,帮助我们,比如通过阅读源码的书籍、视频。


2.提升编码能力

需要下下功夫、花时间


其实很多人阅读困难,刚开始都是比较困难的,所以即使我们提升自己也可以先看看相关的书籍、视频、文档等。然后还有一个通用的技巧,那就是“倒推验证”,怎么个倒推验证,我们一步步来,下面我们详细介绍。


1.面试阅读源码

为了面试阅读源码,如果我们采用传统的,按部就班的去搭建环境,调试等,这样的想法和执行。存在问题如下:

1.时间来不及:

面试是当前就需要,可是阅读源码,没有几个月是搞不定的,所以很可能还没开始,就已经结束了,


2.刚开始遇到较多的问题:

在搭建环境、编译源码的时候,就会遇到各种问题,浪费几天的时间,可能环境都没搞定,最终得出结果,阅读源码太难,不可能达到。


3.准备不足

阅读源码,了解项目背景对源码阅读是非常重要的,比如项目说明文档、版本更替等。如果对这些了解,对于代码的理解也容易很多。


4.知识积累不足

如果我们是刚毕业,只知道变量、类,做过简单的项目,然后就去阅读比如Hadoop源码,肯定是搞不定的,因为这里面可能会涉及到多个设计模式,各式各样的函数、偏函数、匿名函数等使用、类、接口、抽象函数等,以及为了具备更好的移植性、方便修改等,会有各种配置文件、配置项等,还有比如代码的混合使用,Java中使用C、Scala等等,没有深厚的功底,这些会让我们头痛不已。


上面都是我们阅读源码的绊脚石,我们一个个去搬开,会花费相当长的时间,如果只是像单纯的应付面试,我们可以查看相关阅读源码的书籍:

比如

Flink,可以看下《Flink内核原理与实现

Java,可以查看《通用源码阅读指导书》

Hadoop可以阅读《大数据处理系统:Hadoop源代码情景分析》

想获取上面两本书籍也可以加微信w3aboutyun获取,附上“源码”

2.提升编码能力

阅读源码,对我们的编码能力提升还是比较大,就像我们搞 研究,是需要看一些文献。所以阅读源码多了,我们在代码能力、代码功底就会有很大的提升。


我们在阅读代码前,首先是需要对你所阅读的代码有一个整体的认知,就比如我们阅读Hadoop源码。2008年1月,Hadoop成为Apache顶级项目。到现在2022年,已经发展了14年了,所以我们正确的认识到,我们行业顶级精英,天才级别的大神,写了14年的Hadoop项目,我们想花费多长时间来去读懂、读透。


显然我们想一周、两周、两个月来读懂读透,这是不大可能的,所以这是为什么很多的同学,在阅读源码的时候,还没有开始就已经结束的原因,很多是因为没有正确认知项目的发展和积累。这有点像我们刚会识字或者写作文,就让我们去看四大名著,而且像快速看完,这显然书达不到的。

在我们对源码有了整体的认识后,接着我们就要具体的去研读源码,那么该如何阅读源码,阅读源码的步骤:


1.首先了解项目背景

前面我们已经涉及到,项目背景是非常重要的,比如Hadoop,我们是否对他所了解。Hadoop为何产生,是为了解决在大数据量的情况下,单机很难计算和处理的数据的情况下,所以产生了价格和成本都非常昂贵的超级计算机。所以有的人就如何通过廉价的普通的计算机来实现计算大数据量,所以Hadoop应运而生。Hadoop又分为Hdfs、Yarn等组件,当然这里面又会细分,我们了解越详细,对我们阅读源码越方便和快捷。


2.了解项目功能、结构

了解项目功能、结构,比如哪些是通用部分,哪些是功能部分。所以这里我们需要一定猜测,这个猜测我们同样需要去验证。有的大神称其为““正向推导+验证””,这里其实也和我们的学习方法和思维关联。我们在学习比如当前的源码,你的学习思路是什么?是一直跟着文件或者文档的思路去学习,还是自己提前有一定的想法,然后去文档或者文件中去验证自己的想法,这二者的学习效果和速度是不一样的。


3.调试代码

调试代码,很多同学卡在了这里,因为跟踪代码的时候,跳来跳去,就整蒙了。要么不知道为何会跟踪到这里,要么跟踪到这里,不认识它,总之很多同学到这里有的就放弃了。


所以在这里我们该如何破解这个关卡?

1.掌握整个代码的流程走向

2.掌握类之间的主次、依赖关系

3.摸清架构层次,整体把控


4.阅读由易到难

先阅读基础模块,然后阅读依赖较多的模块。我们在刚开始阅读文档,就想去攻克难点,这样会非常容易让我们放弃,所以其实这也是做事的策略和方法。


5.总结
我们在阅读完源码后,去总结从代码深度,到类与类之间的关系,总结出代码的逻辑和实现逻辑。这样达到我们读懂源码的目的。


目录
相关文章
|
JavaScript
搭建Vue3组件库:第四章 使用Vitepress搭建文档网站
文档建设一般会是一个静态网站的形式 ,这次采用 Vitepress 完成文档建设工作。 Vitepress 是一款基于Vite 的静态站点生成工具。开发的初衷就是为了建设 Vue 的文档。Vitepress 的方便之处在于,可以使用流行的 Markdown 语法进行编写,也可以直接运行 Vue 的代码。也就是说,它能很方便地完成展示组件 Demo 的任务。
1995 0
搭建Vue3组件库:第四章 使用Vitepress搭建文档网站
|
7月前
|
存储 人工智能 搜索推荐
Shandu:开源AI研究黑科技!自动挖掘多层级信息,智能生成结构化报告
Shandu 是一款开源的 AI 研究自动化工具,结合 LangChain 和 LangGraph 技术,能够自动化地进行多层次信息挖掘和分析,生成结构化的研究报告,适用于学术研究、市场分析和技术探索等多种场景。
583 8
Shandu:开源AI研究黑科技!自动挖掘多层级信息,智能生成结构化报告
|
Java 持续交付 数据库
避免服务分层污水池反模式
【6月更文挑战第30天】本文介绍污水池反模式,分层架构在敏捷性、部署性和性能方面得分较低,但具有高测试性和易开发性。关键在于合理分层以降低耦合和提高解耦效果。
503 1
避免服务分层污水池反模式
|
12月前
|
JavaScript IDE 程序员
你会了吗 HarmonyOS Next 项目级别的注释规范
你会了吗 HarmonyOS Next 项目级别的注释规范
241 1
你会了吗 HarmonyOS Next 项目级别的注释规范
|
API Windows
[原创]MASM32新手指南
[原创]MASM32新手指南
|
存储 并行计算 Java
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析(二)
C++线程 并发编程:std::thread、std::sync与std::packaged_task深度解析
523 0
|
监控 网络协议 JavaScript
tcping和ping命令
【8月更文挑战第2天】`tcping` 是一款基于 TCP 协议的网络测试工具,不同于传统的 `ping` 命令使用 ICMP 协议,`tcping` 通过尝试与目标主机的特定端口建立 TCP 连接来检查网络连通性和端口状态。这使其在一些禁用了 ICMP 的网络环境中特别有用。`
824 3
tcping和ping命令
|
SQL Java 数据库连接
Hibernate 和 JPA 有什么区别?
【8月更文挑战第21天】
851 0
|
SQL 分布式计算 Java
IDEA 打包 Spark 项目 POM 文件依赖
这是一个 Maven POM 示例,用于构建一个使用 Spark 与 Hive 的项目,目标是将数据从 Hive 导入 ClickHouse。POM 文件设置了 Scala 和 Spark 的依赖,包括 `spark-core_2.12`, `spark-sql_2.12`, 和 `spark-hive_2.12`。`maven-assembly-plugin` 插件用于打包,生成包含依赖的和不含依赖的两种 JAR 包。`scope` 说明了依赖的使用范围,如 `compile`(默认),`provided`,`runtime`,`test` 和 `system`。
296 0
|
存储 安全 API
C++一分钟之-C++中的枚举类型(enum class)
【6月更文挑战第25天】C++的`enum class`(强类型枚举)在C++11中引入,增强了枚举的作用域和类型安全,减少命名冲突。它要求使用全名(如`Color::Green`)访问枚举成员,并能显式指定底层类型。常见问题包括默认值非0、隐式转换和范围溢出,解决办法是明确赋值、显式转换和选择合适底层类型。高效技巧包括用于状态机、作为函数参数、创建别名和迭代。掌握这些能提升代码质量。
527 0