你阅读源码的心态是什么?有哪些经验分享?

2020-05-11 18:03:22 浏览数 (1)

最近有好几个朋友私信我,说:

我觉得我不是这块料 程序员这么苦逼,为什么还要继续做?

亲爱的读者,

我问你:如果你家里没矿,请问做什么不苦逼?

本文大纲1、心理建设,给自己足够自信2、读源码方法确定目标搭建调试环境调试源码选取线索选取阶段巧用控制台输出巧用bookmark无底线优雅总结最后3、总结

  • 确定目标
  • 搭建调试环境
  • 调试源码
  • 选取线索
  • 选取阶段
  • 巧用控制台输出
  • 巧用bookmark
  • 无底线
  • 优雅总结
  • 最后

3、总结

啃一本对你很有用的书,把它讲得滚瓜烂熟,用得滚瓜烂熟。

啃一个常用的框架的源码,把它研究的晶莹剔透,用得滚瓜烂熟。

是的,这个是我对自己的期待和要求。

你问我为什么?

可能是为了 让自己这份薪资还不错的职业的职业生涯更长一些

也可能是为了让自己不那么快被后来者取代

或者是为了让自己更专业

或者是为了屌丝逆袭

抑或是 装逼... ...

以上种种,也许还有一些其它重要的原因,比如说qiong ... 一直以来让我非常非常有内驱力的坚持到现在。

心理建设

你觉得自己不是这块料?

我想说真正的天才很少,几乎没有人天生就具有很超凡的能力。

那些个php祖师爷、java之父、c语言之父、python之父... 你觉得他们是天才,你怎么知道他们是不是用了毕生的精力在编程这件事上?

而你呢?

下班了,要刷剧。周末了,要睡懒觉。放假了,要到处旅游。想想,你有用多少时间 ,在编程这件事上呢?

之前有看过一本书,【刻意练习】,书里通过大量的实验证明,有一些超出常人的能力,可以通过后天的刻意练习获得。

我们都知道摸扎特是音乐天才,被称为具有完美音高。他在很小的时候,听到某种乐器演奏出来的调子时,不论是哪种调子,马上便能准确地辨别出来:是高于中央C音的第二个八度音的升A调,还是低于中央C音的降E调... ... 在400多年前人们的认知里,摸扎特绝对是神童。

可是,大家可能不知道的是,摸扎特的爸爸也是个小提琴演奏家,在莫扎特4岁时,他爸就开始全职教他学习小提琴以及其他乐器。其中训练的强度和时长,可想而知。

莫扎特的完美音高也并不完全是天才,更多是后天刻意练习达到的。因为在现代,有很多小朋友,在通过正确的练习后,也能够达到 完美音高。

所以,如果你觉得自己没有天赋,可以想想,你投入了多少时间,多大的强度?

还是说,只是在某个周六的下午,你在那里毫无头绪的看了一下午的代码,看的头晕脑胀,止不住的蒙逼,然后,告诉自己:算了,我不是这块料。。。

然后,就放弃了,如果这样,那就请放弃吧,接下来,你会继续迷茫,编程这条路,还能走多久?

于是,你开始怀疑自己,然后私信问我,你说,程序员这么苦逼,为什么还要继续做?

那我问你:如果你家里没矿,请问做什么不苦逼?

说这么多,只是想表达,阅读源代码这种能力,可以通过刻意练习获得,看你愿意付出多少时间 和努力,接下来的就方法和方式的问题

读源码方法

确定目标

读书,有精读和泛读之分,看源码也是。

读源码的目的,是为了辅助工作,能更好的解释工作中使用这些框架时出现的现象,能更好的解决工作中使用这些框架时出现的问题,能让你在你所在的职业方向上显的更专业。

因此,我的看法是,要确定一个与平时工作紧密,你有语言基础的,最有欲望,最想要弄明白的一个框架的源码,或者是框架中的一个模块。

一开始,最好只是一个模块 。比如,我日常的工作,主要是数据开发,用sql最多,主要是基于hive、spark、flink ,那就会去选择hive sql编译模块,spark sql模块、flink sql模块。

我的建议和想法是——精读。

一定要精读,好吗?也是就是我开篇讲的,啃一个常用的框架的源码,把它研究的晶莹剔透,用得滚瓜烂熟。

搭建调试环境

读源码并没有什么捷径, 唯有调试 折腾。

通俗一点来说,就是把源码跑起来!可以在源码上修改添加你自己的逻辑,就像调试自己写的代码一样。

这一块真的是很难帮到你,以我的经验来看,这块与你的网速、还有开发工具idea 或者 eclipse等的使用熟练程度 有关。

不过,没关系,哪块弱,就补哪块:

如果自己的网下载一些包,编译时容易有问题,那就访问外国网站。

如果自己开发工具使用的不熟练,好多功能不会,现在有这么多热爱分享的网友,有这么多博客,网上搜搜,基本都能解决问题。

把自己在网上扒拉八卦信息,找种子的劲头,用在找能让自己解决问题上来。

在现在的时代,一切都真的容易的多:

英文看不懂了,有翻译软件;

遇到问题了,网上到处都是解决问题的方案;

你觉得搭建源码调试环境难了,有我的文章——

基于spark源码做单元测试

Flink_sql_client1.10源码在IDEA中集成hive并运行

Hive源码系列(三)hive2.1.1源码导入eclipse并做初步运行

Hive源码系列(二)hive2.1.1源码编译并编译成eclipse项目

这块,我的看法就是,一定要把调试环境折腾起来,要不然,你很难有成就感,很难坚持下去!

调试源码

首先要搞搞清楚你并非是0基础来调试源码的,如果你是0基础,那我劝你,先不要想调试源码这回事了。

在调试前,你一定是查了很多资源,做了很多功课,对这块代码的架构,框架有了最基本的认识,知识大概流程是个什么样子,框架源码的入口在什么地方。

关于大数据sql方向的,如果你还不知道流程和入口,那我写了:

Hive源码系列(四)hive2.1.1源码包介绍及调试

Hive源码系列(五)编译模块之整体介绍

Hive sql、Spark sql和flink sql的整体流程基本是相通的,搞清楚一个,其它的也触类旁通。

选取线索

知道入口后,我们要精读,依据一条线索,分阶段调试一遍。

是的,我的方法就是必须要调试一遍,事无巨细。

有必要的时候,要记bookmark。

选取线索时,要从简单的开始,当你有了一些认知时,可以选复杂一些的。

比如写一个简单的sql:

代码语言:javascript复制
select a,b from src where a>3

可以把这个sql可以做为一条线索,专注这条线索,与这条线索无关的部分,我们可以不考虑(比如,在调试时,代码中也会有order by group by 等模块,这些在我们sql中没有写,就不要关心,遇到可以直接跳过)。

也就是说,专注该专注的,精读该精读的。

选取阶段

都说一口吃不了个胖子,虽然你选择了hive 或者spark中的sql模块,相对于整个框架来说,已经是很具体的小模块了,但是sql模块中的代码也是盘根错节,足够让你眼花缭乱。

所以,一定要确定一个阶段,比如,你要先搞定 从asttree 到 unresolved logical plan 这个阶段,那么,在调试时,到生成 unresolved logical plan 结束,就可以。不要把战线拉的太长,容易疲劳

甚至,要把阶段再缩短,比如,缩短到第一步生成UnresolvedRelation [src]。

巧用控制台输出

debug很耗费注意力,一个不留神,就划过去了,这时,可以借助控制台输出,在源码中,随心所欲,打印一切你想打印的关键信息。

不要考虑什么优雅不优雅,需要println时,就println

巧用bookmark

idea和eclipse都有bookmark的功能,在读到关键点时,记录bookmark。这个真的是太方便了

无底线

放开一切规范和设计模式的束缚~~

我们就是要无底线的嚯嚯的源码,把它当成是自己的写的代码,需要修改一下,看看效果时,就大胆修改。

不要套太多理论,再复杂的框架,无非就是类多了些,方法多了些,无非就是很多方法间的来回调用,因此不要老想着,这个设计模式,那个设计模式。

你的主要目标就是要搞清楚,代码间的调用逻辑,以及他们执行了什么操作,最后达到了什么效果。

优雅总结

当某个阶段的代码逻辑,都调试清楚之后,比如,此刻,你非常清楚:

代码语言:javascript复制
select a,b from src where a>3

这个sql,在生成unresolved logical plan 时,遍历了哪些节点,做了什么样的操作,最终又经过哪个类的包装,生成了下面这个样子的结果:

代码语言:javascript复制
--------unresolved logical plan--------
'Project ['a, 'b]
 - 'Filter ('a >3)
    - 'UnresolvedRelation [src]

好的,如果达到这个阶段,革命已经成功了一大半,但并没有结束。

此刻,你需要总结一下:这中间的哪些方法,会被频繁调用,这些方法都担当了什么角色,这些方法设计的有什么巧妙之处;有哪些工具类,它们的作用又是什么,用到了哪些设计模式......等等。

最后

相信,经过上面几个步骤的刻意练习,从无底线到优雅,你一遍遍的提升自己的认知和能力。要知道,有好多代码都是互通的,只要搞清楚了其中一个,其它的,你也能够很快的切入,更快速度的搞明白。

总结

首先,给自己心理暗示:我可以,我能够。天才,也是经过刻意练习才有了好的成就。自己不要先被自己吓到。

其次,相信重复的力量,重复重复再重复。一遍看不懂,就再来一遍,还不行,就再来十遍~~~

最终,相信我,坚持下来,你会看到不一样的世界。

当然,家里有矿的除外!

以上,引用网上的一段话:

当我们做不喜欢的事情时,我们会反问,这TM的有什么意义? 当我们做不喜欢的工作时,我们会反问,这TM的有什么意义? 当我们被生活琐事困扰终日碌碌时,我们会感叹,这TM的有什么意义? 当我们的梦想一再延宕无法实现时,我们会痛苦反思,这TM的有什么意义? 当我们做了自己喜欢的事,我们会觉得,这才有意义。 当我们和最重要的人携手走过生命长河,我们会觉得,这才有意义。 当我们每天都在做自己喜欢的工作,每一天都期待第二天快点到来,我们会觉得,这才有意义。 当我们帮助了别人,当我们看到这个世界因为自己的存在而多了一份美好,我们会觉得,这才有意义。

0 人点赞