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

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

我觉得我不是这块料 

程序员这么苦逼,为什么还要继续做?

亲爱的读者,

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

​本文大纲

1、心理建设,给自己足够自信

2、读源码方法

  • 确定目标

  • 搭建调试环境

  • 调试源码

  • 选取线索

  • 选取阶段

  • 巧用控制台输出

  • 巧用bookmark

  • 无底线

  • 优雅总结

  • 最后

3、总结

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

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

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

你问我为什么?

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

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

或者是为了让自己更专业 

或者是为了屌丝逆袭

抑或是 装逼... ...

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

心理建设

你觉得自己不是这块料?

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

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

而你呢? 

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

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

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

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

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

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

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

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

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

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

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

读源码方法

确定目标

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

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

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

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

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

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

搭建调试环境

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

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

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

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

如果自己的网下载一些包,编译时容易有问题,那就买个vpn。

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

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

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

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

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

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

基于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:

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。这个真的是太方便了

无底线

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

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

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

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

优雅总结

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

select a,b from src where a>3

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

--------unresolved logical plan--------'Project ['a, 'b]+- 'Filter ('a >3)   +- 'UnresolvedRelation [src]

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

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

最后

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

总结

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

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

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

当然,家里有矿的除外!

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

当我们做不喜欢的事情时,我们会反问,这TM的有什么意义?

当我们做不喜欢的工作时,我们会反问,这TM的有什么意义? 

当我们被生活琐事困扰终日碌碌时,我们会感叹,这TM的有什么意义? 

当我们的梦想一再延宕无法实现时,我们会痛苦反思,这TM的有什么意义? 

当我们做了自己喜欢的事,我们会觉得,这才有意义。 

当我们和最重要的人携手走过生命长河,我们会觉得,这才有意义。 

当我们每天都在做自己喜欢的工作,每一天都期待第二天快点到来,我们会觉得,这才有意义。 

当我们帮助了别人,当我们看到这个世界因为自己的存在而多了一份美好,我们会觉得,这才有意义。

推荐阅读:

数仓面试——日期交叉问题

数仓面试——连续登录问题进阶版

数仓面试——连续登录问题


Hey!

我是小萝卜算子

欢迎关注:数据仓库践行者

分享是最好的学习,这里记录我对数据仓库的实践的思考和总结

每天学习一点点

知识增加一点点

思考深入一点点

在成为最厉害最厉害最厉害的道路上

很高兴认识你

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小萝卜算子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值