结束语 | 在时间面前,做一个笃定学习的人

你好,我是吴磊。

时间犹如白驹过隙,不知不觉,就到了要和你说再见的时候。当编辑对我说:“老师,这周要把结束语赶出来哟”,我忽然愣住了,觉得有些恍惚和不真实,并没有像往常那样脱口而出:“好嘞,没问题!”因为我似乎已经习惯了赶稿子,也习惯了回答评论区的问题,习惯了和大家互动,更习惯了在群里插科打诨……

但是,无论再怎么习惯,我们的专栏也在今天正式结束了。在这里,我想借着这最后的机会,由衷地感谢屏幕前的你、感谢在听音频的你。感谢你一直以来的陪伴和督促,感谢你参与评论区的讨论,感谢你及时地纠正专栏中的错误,更感谢你对于专栏的包容和理解。

同时,我也希望在这个专栏中,我们不仅能共同探讨快速、高效掌握Spark性能的方法,还能把同样的学习技巧迁移到其他的领域。毕竟,高效的学习效率,永远可以让我们快人一步。

我们到底该如何学习?

说起学习这件事,我们听到最多的,就是“学习是一件反人类的事情”,或是“学习的过程就是成长,而成长本来就是痛苦的”。似乎一提到学习,我们就要随时准备“头悬梁,锥刺股”。那真是这样吗?

坦白地说,关于学习的“痛苦学说”,我不是很认同。原因很简单,我们有很多的方法与技巧可以让学习这件事变得有趣,而且事半功倍。那么,对我来说,3个提升学习效率最有效的方法,分别是生产导向的思维方式、“235”的学习原则和“生活化联想”的学习技巧。

生产者思维

我们先来说说生产者思维。如果把形形色色的信息、知识、原理、理论看作是商品的话,那么毫无疑问,热爱学习的我们就是这些“商品”的消费者,我们花费大量的时间、精力和注意力,尝试从这些商品中获取价值。

然而,商品的消费是单向而又被动的,这就好比你从收音机或是电视中被动地收听、收看那些提前烧制好的节目。无论节目的设计与制作多么精良,作为消费者,我们能够消化和吸收的程度都是有限的。

这个时候,我们可以采用以产出内容为导向的学习方式,它会比被动式的学习方式效率更高。就拿技术博客来说,输出内容的过程,其实是帮你发现漏洞和不足的过程,写着写着发现卡住了、进行不下去了,往往意味着这部分知识点或是原理你掌握得不够牢固,需要回炉另造。因此,带着目的、有针对性地学习,往往会事半功倍。以输出为导向去获取输入,就是我们常说的生产者思维。

不过你可能会说:“就算生产者思维确实能够帮助我提升学习效率,可是我真的不知道,生产这件事该从哪里下手”。如果你已经很久没有动过笔了,那么不妨从做笔记开始。做笔记至少有两点收益:一来,它可以强化记忆,也就是俗话常说的“好记性不如烂笔头”;二来,笔记本身就是一种产品形态,或者说是产品的初级形态,它就是最原始的生产资料。

在我们有了生产资料的原始积累之后,生产的过程就会变得很轻松,只要对它们稍作加工,比如调整上下文排列、理顺逻辑关系、变换呈现形式,我们就可以“换着花样”地交付各式各样的产品,比如技术博客、公众号图文,甚至是极客时间上的专栏课程等等。这些产品形态,依然没有逃脱笔记的范畴,它们都是笔记的“变形”。

因此,关于生产这件事,如果你暂时还没有思绪,那么我强烈推荐你从做笔记下手。古人云:“读书破万卷,下笔如有神”。对于生产,我们也可以说“笔记做到家,输出如有神”。

“235”原则

“235”原则指的是要想充分掌握一项技能或是本领,理论学习占两成,交流讨论占三成,动手实践占五成。按照“235”的指导原则,讨论和实践要比理论学习更重要。

实践对于学习的贡献不言自明,“实践出真知”“实践是检验真理的唯一标准”,这些老生常谈的道理强调的都是实践的重要性。不过,在这三个学习要素当中,要说投入产出比最高的,当属交流讨论。为什么这么说呢?这就要说到学习这件事情的本质了。你可能会说:“学习自然是获取知识、习得技能、掌握本领。”但在我看来,学习的本质是一个不断做熵减、消除不确定性的过程

熵减听上去过于玄乎,我们来举个例子。假设有两个房间,每个房间都有5个男生和5个女生,男女比例都是1:1,如果按照性别来统计的话,那么这两个房间的信息熵都是1。然后,我们让第一个房间中所有的女生都移步到第二个房间,同时让第二个房间里所有的男生都移步到第一个房间。交换完成之后,每个房间的信息熵都降低至0。这就是一个熵减的过程,它消除了房间内“性别”这个属性的不确定性。

学习的过程也类似。对于一项新技术,它是什么?谁创造了它?它解决了什么问题?它的组成要素都有哪些?它是如何工作的?它的适用场景都有哪些?每一个问题都是一个未知变量,所有这些未知变量交织在一起,让这项技术的熵无限趋近于1。而学习的过程,正是以蚕食鲸吞的方式,将一个个未知变量转化为已知变量的过程。在这个过程中,新技术的熵逐级递减,不断趋近于零。

在学习的过程中,不同的方法对熵减的贡献有所不同。交流讨论对于熵减的贡献是指数级的,它是最高效的熵减途径。而这,也是我为什么一直鼓励你参与课后讨论。通过参与讨论,你可以把一些工作中未曾遇到的问题和解决办法,内化为自己的一部分,在拓展认知边界的同时,加深对于技术本身的理解。

而另外两种途径,也就是理论学习和动手实践,它们对于熵减的贡献都是线性而平缓的。你可能会说:“动手实操才应该是贡献最高的呀!”实践固然重要,但你不妨回想一下过往的工作经历,对于某一项技术成百上千条的Code Paths来说,你真正触达到的,总共能有几条呢?

无论我们多么投入、多么勤奋,我们的认知边界总是有限的。而要拓展认知边界,只有通过不断地分享、交流和讨论,才能够做到,这也就是所谓的“他山之石,可以攻玉”。

生活化联想

生活化联想指的是把技术中的原理和知识点映射到生活中来,也就是运用生活化的类比、拟人、比喻等手法,让那些枯燥的原理和知识与生活产生连接。利用“生活化联想”的学习技巧,我们能够很快地吸收新知识。更重要的是,这个技巧可以延长我们的记忆曲线,让我们记得更久。

《人月神话》的作者Frederick Brooks曾经说过:“任何一种软件架构的设计,都逃不脱人类社会的组织结构”。同理,对于层出不穷的技术、琳琅满目的知识点,我们也都能在生活中找到它们的投影。因此,在日常的学习中,我们就可以放心大胆地大开脑洞,勇敢地去尝试把你的所见所学,与生活中有意思的场景建立连接。一旦你开始这么做了,你就会发现,相比同龄人,上帝似乎为你多开了一扇门,那扇门的后面就是绚烂多彩而又有趣的新世界。

而这,也是我为什么会不遗余力、绞尽脑汁、挖空心思地,尝试用一个又一个类比、一个又一个故事,去为你讲解Spark核心概念、关键知识点以及它的工作原理。我的初衷朴素而又简单,就是想让你既能轻松、迅速地消化、吸收,又能把那些枯燥的理论知识记得更牢固、更持久。

建立技术与生活这二者之间的连接,自然少不了要消耗精力和能量,去激活大脑中更多的神经元。但是,你千万别觉得这个过程很痛苦,相反,它其实会让你有一种莫名的期待与兴奋。因为你知道,一旦连接建立完成,那么这条连接两端的东西,技术也好、生活也罢,就都内化成为你的一部分了。

有了生产者思维,遵循“235”原则,同时结合“生活化联想”的学习技巧,我相信,你的学习效率一定会与日俱增。

不见不散

最后,我还是想发自内心地和你说一声:“谢谢!”谢谢你陪我走完了这趟Spark调优之旅。对我来说,陪伴即是最大的认可

你知道,我既不是Spark Committer,也不是Spark Contributor,只不过是一个对Spark有着无限热情和多年实战经验的开发老兵。我能做的也 仅仅是把我的所学、所见、经验、积累、思路与技巧,像榨汁一样从我的脑海中一滴不剩、毫无保留地压榨出来,再用专栏的形式呈现给你。

才浅学疏,我个人的能力与视野是极其有限的,专栏的内容难免有所疏漏。我真的觉得,就这个专栏来说,我不过是个发起者,就像是一个GitHub项目的创建者,而专栏的勘误、丰富、打磨与完善,实际上仰仗的是每一个像你一样参与订阅的开发者。

因此,尽管我们的专栏结束了,但是,我们学习并不会止步于此。在接下来的一段时间,我会在GitHub中创建一个名为potatoes,也就是“土豆”的项目,把专栏中涉及的代码、数据、结果,以及常见问题等内容汇总到这个项目中去。

不仅如此,结合你的需要,我还会持续不断地向其中添加诸如笔试面试题、工作机会、职业发展等内容,把potatoes项目打造成我们共有的Spark私塾。通过这个私塾,我们不仅能进一步深入学习Spark,还可以建立更多的连接、拓展人脉,并触达更多的机会与可能。项目的地址是:https://github.com/wulei-bj-cn/potatoes.git,我在那里等你,不见不散!

天行健,君子以自强不息。持续学习,与君共勉。

最后的最后,我还为你准备了一份毕业调查问卷,题目不多,希望你能花两分钟的时间填一下。一起走过了这些时间,期待听到你对我和这个课程的反馈和建议!

精选留言

  • 猿鸽君

    2021-09-03 13:45:57

    老师您好,首先真的很感谢您开了这门课,对我来说获益匪浅。
    先自我介绍下个人情况,我是一名刚工作一年的小白,最初选择的是大数据平台研发的岗位,结果分配到了别的部门,现在每天的工作大多都是用spark做etl,所以老师的调优课对我的工作有很大帮助。但随之而来的就是自己对以后发展的迷茫,因为部门没有大数据方向的资深人员,自己的导师是后端开发,也是爱莫能助。所以想借此机会,有几个问题想请教下老师:
    1.大数据这个领域有什么发展的方向?现在我知道的一个就是AI,一个就是做平台开发,对组件魔改。
    2.现在涉及大数据的技术繁多,像docker,k8s,flink。没工作前以为这些会用到,自学过,结果现在工作了一年也没用到,都忘的差不多,感觉自己在做很多无用功。如何能够系统地规划自己的学习路线,而不是这样盲目的学习呢?
    3.老师能够否分享一下自己的学习经历,和在大数据方向上的一些选择和取舍。
    最后,再次感谢老师开了这门课。
    作者回复

    老弟的困惑和迷茫我感同身受,首先我想说,才工作一年,就开始有这样的疑问和困惑,其实你已经打败90%的同龄人了。这个不是安慰你,据我的观察,很少有初入职场就开始考虑职业发展的同学。我自己其实就是个例子,我其实在工作满3年的时候,才忽然意识到,我应该考虑职业发展这回事。所以首先恭喜老弟,你已经想到别人前面去了。

    言归正传,咱们聊聊职业发展这回事。首先,我觉得,你需要明确,你的兴趣点,在什么地方。至少有两个方向,供你选择,第一:研究型,第二:应用型。啥叫研究型呢?就比如你做大数据二次研发,这就是研究型,就是把一个工具或者算法做到极值,把技术本身,做到极值。第二个是应用型,意思是,技术就是个工具,学好技术是为了解决业务问题,是为了落地业务应用,所以叫它“应用型”。

    明确了兴趣点之后,其实大方向上就清晰了。先不用管这两个方向未来的薪资潜力,两个方向其实在薪资方面,都不弱,都有各自的用武之地。所以,说到底,还是要看你个人的兴趣,到底是哪个方向会让你觉得更有意思,做起来更有激情。这两个方向(当然,或许还有更多的别的方向),没有优劣之分,没有对错之分,纯粹是看你更喜欢哪一个,没有好坏。

    OK,大的基调定下来之后。我们再说大数据这个领域的发展。一个,就是刚刚说的研究型,你可以做spark二次开发,为spark社区做贡献,或者是其它任意的大数据产品。另外一个,就是从大数据的几大应用场景着手,做应用开发,比如数仓是个方向、流处理是个方向、图计算是个方向、机器学习,更是个方向。同样,每个方向做好了,都有前景和钱景,并无优劣之分。这些应用场景,还是要看哪个你更有兴趣,更喜欢。其实,每个应用方向,又有“研究型”和“应用型”之分,这个跟刚刚说的,其实是一样的。

    第二个问题是“学了就忘”,其实这个大家都一样,纯学理论知识,没有机会应用的话,确实很难记得住,这个不用懊恼,大家都一样的。所以还是要结合工作需要,有的放矢,用“学习、运用、输出”的迭代式学习法,来夯实已有的知识体系。光学不用的话,确实很难。

    第三个问题是我自己的经历,我的经历其实挺简单的,就是数据库 -> 数仓 -> 数据分析 -> 机器学习,我是属于“应用型”的,我对技术的应用比较感兴趣,我比较懒,不喜欢做研究,所以选择了这个路线。另外我对数据分析,数据当中蕴含的价值,很感兴趣,这也是为什么会沿着数据分析这条路,慢慢地会入了机器学习的坑,目的就是想挖掘数据中的规律,来指导决策。当然,转行机器学习,也有一些功利心,毕竟机器学习比较火爆,应用场景多,对于个人的职业发展来说,选择的面会更大一些。

    大概其就是这些思路,头上一句、腚上一句,不成体系,希望对老弟有所帮助~

    2021-09-04 23:20:10

  • CycleGAN

    2021-10-23 18:45:28

    极客时间买了几十门课,这是我第一门完全听完的。。这门课在我的的这么多课里我觉得是top3的。。老师深入浅出的能力很强,大赞。我期待的课程是《spark源码分析》!!,感觉现在市场上没有见过特别好的。
    关于spark我有个问题请教,在spark中遇到长尾task执行不完的该怎么kill掉重启呢,比如节点故障,让他在其他执行器重启,我看spark好像没有超时重试机制,是出于什么原因呢。有什么办法发现与重试呢,总不能爬spark ui去感知吧。。感谢老师!
    作者回复

    感谢老弟的认可与陪伴!恭喜老弟完成课程~ 💯

    长尾task的话,一定意味着有倾斜,解决类似的问题,几个思路吧:
    1)开启Speculative推断,Spark会自动启动单独的task,来执行同样的任务。这个就是你说的超时重试机制,Spark会推断,哪些tasks属于长尾任务,然后会自动在其他Executors去launch task,计算同样的数据分片,也就是说,在长尾task失败之前,就开始“重试”了
    2)AQE自动倾斜,消除倾斜
    3)手工加盐,消除倾斜

    希望对老弟有所帮助~ 再次感谢!

    2021-10-26 22:49:40

  • markliang

    2021-06-07 09:30:14

    期待机器学习课啊😎,fighting
    作者回复

    哈哈,后面会考虑的~

    2021-06-07 15:35:10

  • Stony.修行僧

    2021-05-27 02:57:08

    头一次,紧跟步伐,没有掉队,这也跟目前手上的项目有关。学到特别多,一堆调优骚操作 发现产线上数据过大而内存有限,最后又回到原点 哎
    作者回复

    恭喜老弟完成课程~ 持续学习,一起加油~

    2021-05-27 14:42:57

  • 2021-12-22 00:19:49

    确实写的蛮好的,很用心,并且很多问题都和大家有互动,我一个平时不喜欢看书的人都觉得蛮有意思的,哈哈哈, 吴老师,强列推荐你在写篇flink的,如果不会,你就去学!!!
    作者回复

    哈哈,感谢老弟认可~ Flink懂一些,不过确实不像Spark那么熟悉,而且公司这边事情积压成山,实在没精力再写啦。不过感谢老弟的鼓励,等忙完这一阵子,以后找机会再写吧~

    2021-12-22 23:04:58

  • Sam

    2021-07-24 03:12:57

    深研完磊哥的大作,深感自豪!~估计在日后的推荐算法工作中经常运用,也能在面试中加分。感谢磊哥,希望磊哥再出一个flink课程,我们同仁都很期待,也想帮忙~
    作者回复

    感谢兄弟的认可!非常感谢兄弟的美意,不过精力、能力确实有限,Flink恐怕爱莫能助了。后面看看吧,有可能的话,再写一些东西,希望对大家能有所帮助。祝老弟工作顺利、前程似锦、平步青云~

    老弟不妨加我微信,搜索“方块K”或是“rJunior”,后面找机会一起合作~

    2021-07-28 20:37:22

  • 斯盖丸

    2021-05-28 14:24:37

    吴老师,每节课课后的思考题都挺难的,有的至今还不知道答案,还会给我们讲一下吗?
    作者回复

    没问题,可以讲的,老弟可以把不知道答案的题列在留言区,或者是github上面。其实咱们每讲后面都有很多讨论,我理解大部分课后习题大家应该都讨论过,不过也难免有漏网之鱼,老弟可以帮忙整理个“待解答列表”,然后我们一起过一下~

    2021-05-28 23:40:03

  • DarrenChan陈驰

    2024-11-02 15:25:48

    老师能不能开一个flink的课程啊,好期待
  • 光羽隼

    2024-01-04 21:11:06

    非常棒的课程,期待老师后续的spark源码以及flink相关课程。。。。虽然已经过去两三年了,哈哈哈
  • 王天雨

    2021-05-27 20:54:47

    感谢吴老师!
    作者回复

    恭喜兄弟完成课程~ 持续学习,与君共勉~

    2021-05-28 23:26:14