你好,我叫李兆龙,来自西安邮电大学,是一个软件工程专业的大三学生。很高兴有机会,跟你分享我学习《分布式数据库 30 讲》的经历和心得。

为什么要学习这个专栏

故事还得从大二的寒假说起。2020 年是特殊的一年,因为疫情的原因,很多大学生其实都是在家度过第二个学期的。这对我来说,既是一个坏消息,也是一个好消息。

我说它是坏消息,是因为在家度过了大学八分之一的宝贵时光,这确实是让人觉得可惜的一件事情,毕竟在学校的生活实在是让人怀念。

说是好消息,则是因为这是一个整段的学习时间。它不像在学校上课的日子,时间被拆分成了多个片段,而且晚上十一点半楼管阿姨准时锁门,每次我想去钻研一些有意思的东西时,总感到不够尽兴。平时只有暑期留校的时候才有这种机会,所以我说这也是一个好消息!

其实我最初只是基于 MySQL 学了数据库原理,第一次看到多个机器组合产生的化学反应竟然如此有趣。于是在那个时候,我就已经在心中种下了一颗向往分布式的种子,也才有了后面的故事。

后来我有幸阅读了 Redis 的源码。基础的数据结构部分,包括后面的持久化、网络框架、和内存淘汰策略,虽然比较复杂,但是代码的实现毕竟没有跳出单机的思维,所以我在阅读上是没有什么大问题的。但是这个过程在学习到哨兵机制和集群的时候发生了改变,这些改变来自于两个方面,即分布式代码的设计与实现。

脱离了单机的程序,框架设计是复杂的。因为涉及到很多边界条件的考虑,而相当一部分问题只有在程序的吞吐量到达一定程度的时候才会出现问题。虽然这些思路落地产生的代码看似并不复杂,但涉及分布式的代码调错实在是让人想抓耳挠腮。

总之,在经过了一个漫长的过程以后,我总算是搞清楚了 Redis 集群与哨兵的设计与实现。虽然这一个阶段已经结束,但是我对分布式存储的兴趣却更加浓厚了。后来在一个前辈的指点下,我去学习了MIT 6.824,并且阅读了Designing Data-Intensive Applications。完成了 6.824 的大部分的论文阅读和实验以后,我的心里其实可以说有一些不是滋味。

课程的质量自然没得说,我相信每一个真正沉心其中的人,一定愿意竖起自己的大拇指。让我感到不是滋味的原因是,国内相关资料的匮乏实在是让人咋舌,我能够找到的资料基本都是社区内高质量的博客,而这类博客的内容往往也只是点到为止,很少有相关知识的扩展。这对于像我这样有这方面兴趣的小白来说,确实是一个不小的挑战。

大概七月的时候,我知道了本校软件工程专业在大三上半学期,会开设分布式原理的课程。说实话,我在假期的时候确实是为此兴奋了很久。但是实际课程的效果其实更偏向于科普,对于分布式中每一个细分的地方都是泛泛而谈,跟代码实现的距离着实不近,而且代课老师的研究方向也并不是这个领域。

我所在的实验室“XiyouLinux 兴趣小组”的研究方向,也是偏向于 Linux 内核,而不涉及分布式。因此,我从学校获取更多资源的愿望也泡汤了。所以,很多时候我还是很羡慕一些学校更好的同学的。

于是,更加深入的学习,我就只能靠阅读分布式基础理论论文和一些经典工业实现的论文。这样虽好,但是却缺乏一个站在更高角度的宏观指导。这样的学习其实是事倍功半的,但我却没有更好的办法。在此“绝境之时”,我正好看到了王磊老师的《分布式数据库 30 讲》这门课程,实在可以说是恰逢甘霖!它正好填补了我心中缺失的那块拼图,所以我学习这门课程的信念也就越来越坚定了!

我是如何学习专栏的

我应该算是最早的一批学习这个课程的同学了,在第一次看到课程的时候,它才更新了两讲而已。当时还是暑假期间,每天的时间都非常充裕。

王磊老师的更新进度是一周三更,我的学习过程是“一周四看”。老师会在一三五零点更新课程,我就在第二天早上八点准时坐在电脑前准备把老师想要传达给我们的信息尽可能地汲取到大脑中来,这是三看。

还有一看呢,我分成两个部分。Top half 就是周六周日中某一天的晚上,抽出两个小时左右的时间去把本周的知识点再思考一遍,尝试与以前学过的知识串联起来。比如从全局时钟中想到了 Lamport 的“Time, Clocks and the Ordering of Events in a Distributed System”,进而联想到无锁编程。还记得以前简单学习 C++ 无锁编程的时候,其内存序的设计实在是让人难以理解,由逻辑时钟中得到的启发,也让我对无锁编程理解比以前更深了一步。

Bottom half 则为思考老师对我和其他同学留言中所提问题的解答,以及其他优秀的同学的解答。我认为这也是学习中很重要的一个部分,因为课程的读者中也有很大一部分经验丰富的优秀工程师,他们的见解往往也是精准老辣,也让我受益匪浅。

还有一点也非常的重要,就是对于老师课程中提到的以前没有了解过的知识点,在了解以后及时记录,如果有新的理解或者现有的博客描述不清的话还可以记录成一篇博客,既方便自己以后温习,又能为其他朋友提供一个参考,何乐而不为呢?

美好的事物总是短暂的,最典型的代表就是假期。暑假这个大段的适合钻研自己喜欢的东西的学习时间没有了,取而代之的是需要遵循学校的课程时间。

学校的课程压力确实很重。虽然这学期的课程的知识大多我都已经在大二学习完了,但是老师布置作业的时候却是手下不留情;而且计算机网络和 OS 这些课,以前学习的一些细节我遗忘也比较严重;此外,每天还必须要写的算法题和完善马上春招的项目,这些基本把工作日全部的时间都牢牢占据了。

于是,我学习老师课程与阅读论文的时间就只能放在周末了,所以在学校内一般是在周末去学习老师本周的更新内容。当然,虽然学习王磊老师课程的时间被压缩了,但学习质量是不能够被压缩的,在学习两到三讲以后,还是需要像假期一样温习前几讲所学的东西。其实对大多数像我这样的普通人来说,学习没有什么捷径,不如像个卖油翁一样,无他,唯勤奋尔。

学习专栏给我的帮助

从开篇词中就可以看出,王磊老师的经验是非常丰富的。在看到第一眼的时候我就想,如果老师能够把这些经验用文字呈现出来,哪怕只是一部分,对于我的帮助也绝对是巨大的。

因为我在前面就提到过,我现阶段学习分布式,最大障碍就是无法站在一个宏观的角度看问题。我之前的学习路线,是看分布式基础理论和成功的工业实现的论文,仅靠我一个人其实很难把全部的知识串联起来,进而形成网状的知识体系。

而且一个成功的分布式系统往往是根据某些特定的需求,在此基础上做出取舍。论文往往只说它用了什么,而很少提及为什么不用别的。我也不知道有没有其他解决此类问题的方法,要解决只能去花很大的功夫查找资料,而资料又是匮乏的。此时老师的课程就显得尤为珍贵,因为老师对于课程涉及到的问题,基本上把相关的解决方案都列举出来了,而且还详细地对比了各种方案之间的异同。

比如在第 5 讲介绍全局时钟的时候,老师对于多种方案的比较确实是让人耳目一新的。以前我只是简单了解过 Spanner 的 TrueTime,就以为搞懂了授时这个问题。在学习了这一课以后,我才知道授时的方案该如何划分,还知道了其他的授时方案。如此看来,以前实在是见识短浅啊,在学完这一课以后,我才算是真正地初步了解这个问题。

老师的课程不仅仅是包含分布式相关的描述,更多的部分是描述数据库的设计要领与各种抉择,而这些于我们来说也是很重要的,值得仔细思考。

很多看起来微不足道的进步,都是在不计其数的大牛经过漫长的时间研究和试错才得出的,更不必说分布式数据库这样璀璨耀眼的软件。而我们却能够站在巨人的肩膀上去学习,这对像我这样爱好者来说也未尝不是一种幸运。能够深入、正确地学习喜爱的东西,我想这就是最大的收获了。

总结

当今的互联网环境无时无刻不在贩卖焦虑,尤其以互联网专业为最,我这个大三的普通学生更是感到迷茫不已。摆在面前的问题是很严峻的,在学校学习,如何把精力用在刀刃上?如此迅速的技术变革我们该如何立足?技术的背后共通点是什么?

私以为,技术的变革来源于需求的变革或者创新,刀刃与共通点就是基础技术。如果我们能够静下心来好好学习这些基础技术,比如这门课所展现给我们的作者宝贵的经验,我相信在未来可预测到的新的技术浪潮中,一定有我们的一席之地!

博观而约取,厚积而薄发。这是 XiyouLinux 兴趣小组教给我的,我想这也是每一个现在或者未来的 IT 行业从业者所要牢记心中的。坚持学习,如果现在还没有看到效果,也不必灰心,在可见的未来一定可以绽放属于自己的那一道光!

正如王磊老师在开篇词中所言,分布式数据库凝聚了无数学者与工程师的智慧,灿若星辰!我希望学习这门课程的每一个人都能成为那个“手握日月摘星辰”的人!