你好,我是蒋德钧。不知不觉中,我和你又一起走过了3个多月的时光。在这3个多月的时间里,我和你一起并肩作战,去学习和了解了Redis的源码。跟第一季的课程内容相比,这一季学习的内容的确更有难度,也更加需要你能静下心来钻研。

这里先感谢你的一路陪伴,我们一起走到了现在。做这样一门专栏,我自己也是收获了很多、成长了很多。那么最后一节课,我就把我在做这门课程里三点最重要的认知分享给你,我们一起持续精进。

用源码重新认知你的知识体系

其实,要是用一句话来总结我的感受,那就是,阅读源码让我感到“从新开始”。

我在学习Redis源码之前,已经对Redis的一些基本原理、一些常见的后端系统设计都有了了解和掌握,本身也有一些C语言的开发经历。我相信,我当时的状态和此刻正在阅读这篇结束语的你可能很相似。

而在学习了Redis源码后,我发现自己在C语言编程技巧、计算机系统关键机制,还有系统设计原则等等很多方面,都有了新的认识。这些新认知,是源于对Redis源码设计与实现的学习,而源码学习本身又给我提供了高于Redis的通用知识的掌握,这让我受益匪浅。

就比如说,我以前在学习操作系统时,了解了进程间通信的方法有消息队列、命名管道、无名管道、共享内存等等,但是一直没能建立直观的认知。而在阅读Redis源码时,我发现Redis广泛地使用了无名管道,来支持父子进程间的通信。这一下子就在我的知识体系中,增加了对管道实际开发使用的新认知,这也让我有了一种实践正好结合理论的体会。

而另一方面,我以前在实现一些数据结构和算法时,都会按照它们在书本上的定义去实现。但是,在阅读Redis源码过程中,我发现其实实践和理论又是有差异的。就像Redis中的字符串根据不同长度,使用了不同的数据结构实现;有序集合使用了两种数据结构的组合来实现;以及LRU算法采用了近似方法来实现等等。

这些实际代码让我的知识体系,对实践结合理论又有了新的认识:其实在实际系统开发中,我们通常要考虑性能、空间、复杂度等约束条件,会在理论基础上进行优化开发。这一新认知对我后来的开发工作有了很大帮助,我会有意识地识别所开发系统面临的约束,进而优化自己的实现方法。

其实从Redis的源码中,我们可以掌握很多计算机系统知识,这些新知识,或许我们在目前的工作里还用不到,甚至在日后不断学习的过程中,还会被更新迭代掉。但是我们要清楚一点,就是我们在某一阶段所掌握的知识,往往会是下一阶段知识的基础。

源码阅读本身就是一个结合之前学习的理论和开发知识,进一步学习实践开发知识的过程,这是一种从知识再到知识的过程,也是让我们重新认知自己知识体系的过程。

用源码重新磨炼你的意志力

阅读源码是一件很辛苦的事情,尤其是当我们面对一个庞大的代码结构时,往往就会感到无从下手了。而等到我们好不容易摸清了代码结构,知道了要从哪些关键函数开始看起时,我们又会面临代码中复杂的调用关系、高级的语法实现,同时,还要尝试去理解代码开发者的思路。这些都是我们在阅读代码过程中的拦路虎,很容易就让我们打退堂鼓了。

我自己在阅读源码时,这些问题也都碰到了。不过,这个过程看成是对自己意志力的一个磨炼,越是遇到困难,越要迎难而上,而不能轻言放弃。

虽然我们也能通过坚持做某些事来磨炼自己的意志力,但是阅读代码的挑战性更大。这是因为代码是细节,而掌握细节需要我们有足够的静心、耐心和细心。这和学习原理不一样,学习原理的时候,我们的头脑往往转得很快,有些机制我们会想当然地认同了。

而阅读代码就不能这样了,一段代码不理解就是不理解,我们是无法想当然认同的。我们只有在不断尝试理解代码的过程中,正视自己想要放弃的心理和消极情绪,并能找到原因记录下来,然后逐渐减少阻力,以及慢慢提高自己想要放弃它的心理阈值。这正是阅读源码给我的意志力带来的新磨炼。

当然除了有意志力的支持,我们也需要有合理的方法。我之前看过一本书叫做《干劲的开关》,其中有句话是这样说的:“影响结果的不是斗志,而是科学”。所以我在读源码的时候,我就把阅读代码的目标拆分得更加细粒度化,每天、每周完成一些小目标,日积月累,等到我把Redis源码主要部分阅读完后,我收获了很大的成就感,因为我做到了。

而且在那之后,我也发现自己再做其他一些具有挑战性的工作时,阅读源码时得到磨炼的意志力就会发挥积极作用,让我自己不再畏惧困难,而是会积极应对。那么相对应地,我希望你在阅读源码的时候,也能够不要被代码的复杂结构或是错综调用关系所吓倒,而是规划好切实可达的目标,一步一个脚印地去完成代码的学习。

用源码重新塑造你的做事原则

我之前在做事时,通常都是直线思维,定了一个目标就希望一次性完成这个目标。但有时受限于自己的知识背景和能力,对如何一次性完成目标会感到很困惑。

而在阅读Redis源码时,我遇到了相同的困惑:我一直奔着一定要把主要代码和关键技术掌握好这个目标而学习。但是在源码阅读的过程中,我有时在阅读了部分代码后,又会忘了之前学习的一些细节。而且对于在学习时已经厘清的概念和方法,等过一段时间之后,我发现又会变得模糊了。

后来,我自己在开发一个系统时,经常会去再回顾Redis源码。等这个系统开发完成后,我发现,原先变得模糊的Redis代码细节,已经变成深刻的记忆沉淀下来了。

在那个时候,我想明白了,源码阅读从来都不是一个一次性的学习过程。相反,源码阅读过程就像是DNA的双螺旋结构一样,是一个循环向上的过程。从源码阅读中学习开发知识,了解系统实现,然后再用学到的知识反哺自己的系统开发。而在开发过程中,又会再次阅读源码,进行学习,将自己的认知重新提升一个层次。这个过程周而复始,循环向上。

其实,我们日常的学习和做事跟源码阅读也是很相似的,它是一个循环向上的过程。很多事情并不是一蹴而就的,我们需要经历“认知、实践、再认知、再实践”这样一个过程。在这个过程中,我们会遇到困难,也会有收获,但是这些困难或收获都是为了下一次的认知和实践打基础。所以,我们不要因为一时的挫折而气馁,也不要因为一时的成就而停滞,就像生命之源的DNA结构一样,我们螺旋上升。

写在最后

今天正好是周六,是个承前启后的时刻,这一季课程也要在今天正式画上一个句号了。不过,这个句号既是一个阶段的结束,更是一个新阶段的开始。

其实很多时候,你的成功并不取决于你知道了多少,而是你知道在无知的时候该怎么做。我希望上面讲的三点关于阅读源码的认知,能够给你的工作和生活提供一些指导方向。当我们在学习一个不会的知识点时,当我们在学习一门新的语言时,当我们面对生活中各种各样的情况必须孤立地做出反应时,我希望你能联想到学习源码的底层逻辑,从而更好地作出自己的选择。

最后,到了我们说再见的时候了,再次感谢你的一路相伴,我相信现在我们都成长了很多。而从今天起,我们在学习的道路上又将是一个新征程,让我们从新开始,学以致用。

最后的最后,我还给你准备了一份毕业问卷,希望你能花两三分钟填写一下,我非常期待能听到你对这门课的反馈。

好了,天长地久有时尽,学习之路绵绵无绝期,我们下一次再会!

评论