帮助阅读源码的8个技巧

大家好,我是Z哥。

之前写了一篇关于阅读源码到底有多少价值的文章《阅读源码的真正价值》,反响还不错。

在文中我向你阐明了阅读源码5个价值。

  1. 面试

  2. 在工作中更快地上手新项目

  3. 给自己创造用新技术的机会

  4. 完善知识体系

  5. 学习别人的设计思路

那么今天我就和你来聊聊如何更好地阅读源码,毕竟阅读源码这件事做起来还是有一定难度的,特别是刚起步的时候。

而且有些巨型源码库,如果你不掌握一些高效的方式,那你阅读起来会让你绝望。就像往大海里投个石子,虽能掀起一丝涟漪,但海面很快就归于平静。

其实从整个程序员群体来看,很少有人去学习这些项目的源码,大部分人都仅仅停留在 API 使用阶段。

很多人对某个框架、项目的了解,最多停留在其它人对源码的解读之上。的确,在搜索引擎如此成熟、信息如此多的时代,如果要快速了解信息,以便解决眼前的问题,这的确是高效的方式。

相信有不少人肯定也尝试过去github上阅读那些开源框架的源码,但是坚持不下去。在我看来原因主要是以下几种,

  1. 花了好几个小时,甚至好几天,才看懂了1、2个文件里的代码。但是毕竟还得工作呢,按这个进度的话,实在没办法拿出太多的时间放在源码的阅读上,还是算了吧。

  2. 第一个选择阅读的项目规模就比较大。一般这种大型项目,必然是经历了多年的迭代而形成的。所以,不管从复杂度还是代码量上都是“困难”级别的。当一次次遇到无法理解而放弃,换一个切入点但困难依旧的时候,你会觉得自己根本无法驾驭它,挫败感会促使你放弃阅读源码这件事情。

  3. 有时我们阅读源码会配合着调试。但是有些源码的环境依赖比较多,一旦我们在部署环境的时候遇到了各种诡异的问题,但是查了很多资料依旧未能解决的时候,就会失去耐心,促使我们放弃。

  4. 看了一段时间的源码,但是感受不到自己获得了什么,没有成就感。渐渐地,阅读源码的热情逐渐消失殆尽,感觉还是打游戏、刷短视频更香。

不知道上面有你的影子吗?

之所以出现这样的情况,在我看来是因为没有找到明确的方向或者目标太大,阅读源码是为了什么?为了提升自己,但是这个目标太大了,大到你还没有接收到正反馈就坚持不下去了。

所以我觉得有效地阅读源码的步骤分为以下两步,when和how,正好对应上一篇《阅读源码的真正价值》的why。

/01  阅读源码的时机/

很多人看源码之所以看不下去,间接说明了一个问题,并不是任何时候都适合阅读源码。

所以,我们的第一个问题就是要搞清楚“什么时候适合阅读源码”。

我亲测有效的方法是,带着问题去阅读源码,哪怕是一个个看似很小的问题。慢慢庖丁解牛,逐渐吃透整个项目。

举个例子,比如你看到网上很多文章都在说redis单线程的性能表现在某些场景下甚至比多线程的memcached还要好。

那么你可以带着这个问题去找到对应的源码去学习,这比你漫无目的的在大量的源码中乱逛,效果好得多。因为当你阅读完源码后你会获得一个正反馈,就是你知道了问题的答案,这种收获与成就感也会大大加深这次学习的效果。

所以,一定要有一个问题或者说目的,没有目的就不要去阅读源码,还不如打游戏刷短视频。因为你大概率没几天就会全部忘记你看过的东西。

如果你只是想学习一下,实在想不到什么问题作为切入点,那么不妨从git仓库里的issue里找一个开始吧。

/02  怎么读/

01  准备工作

阅读源码之前首先你得掌握相关的基础知识。比如,你要去读Linux内核的源码,但是对C语言并不熟悉,这个事情自然没法继续下去。

在具备起码的基础知识后,先去官网看看是否有什么文档,通过阅读文档可以对项目设计思路和演进思路有一个大致的了解,这对你在实际阅读源码的时候可以起到事半功倍的效果。

还可以了解一下,是否有其他项目是该项目的衍生品。因为当你后续觉得阅读该项目的源码举步维艰的时候,那么不妨试试从封装它的上层入手。多一种选择。

02  从最早的稳定版本开始看

coding和造房子一样,结构(架构)在最开始一但确定好,后续几乎无法推翻重改,所以建议你从第一个版本开始看,可以通过阅读最少的代码就能了解到整个项目大部分的内容,包括它的核心设计思路。

后期追加的很多代码其实有不少都在完善最初设计没考虑周全的地方以及异常处理,代码量虽然增加了,但是重要性完全不同。

03  在IDE阅读

很多高手直接在git上看源码,效果如何我不清楚,反正我是觉得不太靠谱。

Z哥建议你一定要把代码放到IDE里阅读,毕竟IDE里可以方便跳转,查看定义,而且只要环境搭好还可以调试,比起在网页上看效率高得多。

如果你实在要在git上直接阅读,好吧,我也帮你一把,推荐你一个chrome插件:SourceGraph。为你提供接近IDE般的操作体验。

04  尽量调试一下

尽可能编译调试一下。因为在Z哥觉得能调试的代码,几乎没有看不懂的。

很多人在工作中修bug为什么喜欢直连生产环境调试?除了修bug效率高之外,还有一个原因就是它直观的体现了一个完整的流程在代码中是如何体现的。

如果一份代码你只能看不能调试,那可能读到一些地方你只能猜这个地方的数据值和跳转结构是怎么样的,而且很有可能你猜的是错的。但如果你能编译运行,那在需要的时候你可以修改,加日志等等来更好地观察和验证你的想法,得到正确的理解。

05  先从宏观再到微观

在看具体的代码之前,建议你先大致过一下整个项目的分层,知道解决方案里每一个项目的作用是什么。比如,这个专门存放全局工具类的项目,这个是数据访问层,等等。

这样当你在后续经过多次代码跳转之后,不至于晕头转向的。

同样的,在你深入代码细节之前,先从“宏观”入手。先捋清楚与这相关的上下游完整的流程是如何映射在代码里的,然后再开始深入其中的具体环节的实现。

另外,interface也是获取宏观信息很好的入口,当然前提是方法的命名比较规范或者有注释。

06  适当跳过一些代码

一个项目的源码规模越大,里面的能跳过不读的代码也越多。

哪些是可以跳过的?

比如,针对数据的处理,json的序列化和反序列化、xml数据的读取和写入等代码,这些代码往往还特别冗长。

07  看一遍无法理解的代码就画图

当你看一遍甚至好几遍都无法完全明白的代码,说明它具有一定的复杂性。

此时,你不要偷懒,老老实实地画流程图、时序图等来帮助你梳理和记忆。它们最终为你省下的时间大概率比你花的时间多得多。

而且画图是把代码具像化了,当你对着一张流程图读源码,就好像拿着地图走迷宫一般,确保自己走在预期的道路上。

08  做笔记

我相信每个人都出现过这样的情况:

  • 这个问题我之前解决过,怎么解决来着?好像想不起来了……

  • 这个问题我之前研究过,是怎么回事来着?好像想不起来了……

  • 更甚之的情况是,早上觉得弄懂了数据流向,中午吃个饭就忘了。

  • ……

如果你当时做了笔记,就不会出现这种情况了。而且,做笔记不仅仅可以用做后续的查阅,还可以帮助你更快地进入前一天的阅读状态。

这里建议用纸和笔就好。如果要用软件的话,最好弄个双屏,这样可以避免频繁地在查看源码的应用和记录笔记的应用之间的切换。

我建议你弄明白一个问题或者收获一个新的信息就记录一下。

然后每天工作结束,稍做整理,并且将当前遗留的未知问题记录好,这样你第二天很容易进入到昨天的状态中继续进行。

如果你打算将阅读源码作为一个长期习惯去做,那么你平时储备的通用知识多少又变得很重要,因为它们可以在阅读源码的时候大大提升效率。

比如,设计模型、常用的算法等。当你看到什么XXXbuilder、XXXfactory,你就心领神会了,自然能大大提高阅读效率。

当然,如果遇到你之前不懂的设计模式、算法,那么应该停下来花点时间,将他们消化掉,这样你的通用知识库就又扩大了一些。

总之,阅读源码还是一个比较费神的事情,要有耐心,遇到困难的时候更是如此。

我有时看代码,也会反复好几遍看不明白,感觉真是觉得搞不定了,然而,这意味着要么是你基础知识没准备好,要么是你找错了入口,要知道,任何一份代码,都有一条隐形的线串着,耐心点,总会找到。

好了,总结一下。

这篇呢,Z哥和你分享了我在阅读源码这件事上的一些经验。

首先,一定要带着问题或者目的去读源码,否则就别读了,读源码光“看”是没意义的。

其次在读的时候可以做以下8件事:

  1. 准备工作

  2. 从最早的稳定版本开始看

  3. 在IDE阅读

  4. 尽量调试一下

  5. 先从宏观再到微观

  6. 适当跳过一些代码

  7. 看一遍无法理解的代码就画图

  8. 做笔记

希望对你有所帮助。

源码一开始读不懂是正常的,读不懂才要读,想不明白才要想,这是进步和成长的开始。那些阻挡你的蹂躏你的而又杀不死你的,终将帮助你成长让你变得更强大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php webshell开源,[github开源]webshell连接器--Jeshell

前言:以前连接webshell都是用一个好朋友写的Webshellsniper,但是昨天使用webshellsniper测试的时候,发现不能支持shell_exec()这个php函数,问了一下才知道,他写的默认是只用eval()和assert()函数的webshell。于是&…

robcad和catia是什么关系_proe/CATIA/UG/SolidWorks软件区别与联系

proe/CATIA/UG/SolidWorks软件区别与联系相信你一定清楚proe软件的用途,其实它在机械设计上面的应用也是非常广泛,与CATIA、UG、SolidWorks软件一样,这四大软件可谓是在机械设计应用非常广泛的软件,几乎在这个行业里的设计师无外乎…

活动目录组策略统一管理桌面

使用组策略实现企业统一桌面 在企业中为了实现企业形象的统一性,会要求在企业所有计算机上实现标准的桌面化配置环境。1、统一桌面壁纸在域控上建立存放背景图片的文件夹,将其设置为共享文件夹; 然后在开始—运行中GPedit.msc命令进入…

Kubernetes中分布式存储Rook-Ceph部署快速演练

最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也抽空多了解了一些。项目主要基于Rook-Ceph运行,考虑到Rook-Ceph部署也不那么简单,官方文档的步骤起点也不算低,因此,在整合官方文档的某些步骤的基础上&#…

MATLAB向量化函数 举例,MatLab-向量化技巧

《MatLab-向量化技巧》由会员分享,可在线阅读,更多相关《MatLab-向量化技巧(10页珍藏版)》请在人人文库网上搜索。1、MatLab 向量化技巧家家 2007-05-17 13:53大家都知道MatLab是一种解释性语言,它的长处在矩阵运算。因此需要将问题尽量用矩阵…

IT人的八大修炼神器

看到2018年的KPI,你是否感到崩溃?在这个充满竞争的时代,你需要用最有效的方式,学习最有用的知识,来提高自身技能。小编特意为大家准备IT人的八大修炼神器,推荐能帮助我们提升技术的公众号,欢迎大…

hotelling t2 matlab,pca主成份分析方法

1.应用pca的前提应用pca的前提是,连续信号具有相关性。相关性是什么,是冗余。就是要利用pca去除冗余。2.pca的定义pca是一种去除随机变量间相关性的线性变换。是一种常用的多元数据分析方法。pca将互相关的输入数据转换成统计上不相干的主成分(或者特征)…

如何在 WebAPI 中启用 CORS

浏览器安全策略上的安全限制可以有效的阻止 Ajax 向另外一个域server发起请求,这就是著名的 同源策略,那如何突破这种限制呢?可以使用 CORS (Cross-Origin Resource Sharing) 跨域资源共享来解决此类问题,它…

Kappa信息化谋局电子商务与传统渠道的全面管理

近日,Kappa中国总经理任轶先生与淘宝网首席财务官兼淘宝商城负责人张勇先生会晤于杭州淘宝总部,就淘宝网与Kappa的电子商务战略合作达成全面共识。非常注重企业信息化建设的Kappa在积极推进电子商务的同时,也早早的把电子商务模式下的信息化建…

druid字段级_Druid的数据结构

Druid的数据结构Druid数据存储结构可以分为三层: 1. DataSource 2. Chunk 3. SegmentDataSource相当于传统数据库的按时间分区的表,Chunk相当于MySQL中的按时间分区的表一个分区,但是Chunk不是一个实体,只是一个虚拟的概念&#x…

数据分析师+做过名企项目+懂运营+985毕业=跳槽失败?

数据已经成为很多企业的重要资源,数据分析已经成为了各行业的指导军事,但是数据分析师的工作从来都不是容易的。如今,数据分析师是一个互联网从业人士转型最快捷的入门职位,人工智能、大数据都要依附于数据分析。很多人也因为前途…

matlab 如何画二维图形,Matlab 学习 画图篇 一 二维图形

matlab给绘制二维图形提供了很多的函数,把一些绘制二维图形的基本函数做成一张表,如下图所示:我就按照表的顺序一一记录一些个函数的简略用法。首先是1.plot函数plot函数有很多重载方法,这里只做简单的介绍1.1 plot(Y)1.1 若Y是向…

Newbe.Claptrap 框架入门,第二步 —— 创建项目

接上一篇 《Newbe.Claptrap 框架入门,第一步 —— 开发环境准备》,我们继续了解如何创建一个 Newbe.Claptrap 项目。安装项目模板 打开控制台运行以下命令来安装最新的项目模板:dotnet new --install Newbe.Claptrap.Template安装完毕后&…

TTL expired in transit--问题篇~

今天在做东航事件处理时&#xff0c;发现远程登陆DMS服务器后&#xff0c;ping所有三层交换机<cisco 3550> 都发现一个现象:TTL expired in transit&#xff1b;如图1所示:之后用tracert -d IP 后&#xff0c;如图2所示:如图可见&#xff0c;可以清楚的发现&#xff0c…

生成drl文件_我如何通过编程方式生成.drl文件。任何示例对我都将有所帮助

我搜索了很多站点&#xff0c;但找不到有关.drl文件生成的任何特定相关示例。 .drl文件生成方面的文档也不值得。解决方案//- ---- package部分-------PackageDescr pkg new PackageDescr();pkg.setName(" com.demo.model");// -------此处的导入部分-------ImportD…

【干货】机器学习中样本比例不平衡的处理方法

推荐阅读时间&#xff1a;5min~12min主要内容&#xff1a;机器学习中样本比例不平衡的处理方法在机器学习中&#xff0c;常常会遇到样本比例不平衡的问题&#xff0c;如对于一个二分类问题&#xff0c;正负样本的比例是 10:1。这种现象往往是由于本身数据来源决定的&#xff0c…

Newbe.Claptrap 框架入门,第一步 —— 开发环境准备

Newbe.Claptrap 框架依托于一些关键性的基础组件和一些可选的辅助组件。本篇我们来介绍一下如何准备一个开发环境。必要组件 这些组件是使用本框架进行开发是必须要安装的组件。Docker DesktopDocker Desktop 是以下所有组件运行的基础。开发可以通过以下链接下载对应操作系统的…

php sequelize,node,express_sequelize 联合查询,node,express,mysql,sequelize - phpStudy

sequelize 联合查询我用sequelize 联合查询db.user.hasMany(db.bbsuser,{foreignKey:userId});db.bbsuser.belongsTo(db.user);db.user.findAll({include:[db.bbsuser]})&#xff1b;得到结果格式以下&#xff1a;{"id": 9,"username": "CallMeSoul&q…

vs中断点不能设置

确保你的exe和pdb文件是从当前源代码里编译出来的。或者在 Tool -> options -> debug. 从中找到并取消掉“源代码必须和调试文件的版本一致”。 转载于:https://blog.51cto.com/ustcer/265179

android 弹窗有边框_Android 多种简单的弹出框样式设置代码

简介这是一个基于AlertDialog和Dialog这两个类封装的多种弹出框样式&#xff0c;其中提供各种简单样式的弹出框使用说明。同时也可自定义弹出框。特性1.使用链式开发代码简洁明了2.所有的弹出框样式都在DialogUIUtils这个类中完成&#xff0c;方便查阅方法3.可以自定义弹出框字…