You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 lines
8.6 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 结束语 | Redis源码阅读让我们从新开始
你好我是蒋德钧。不知不觉中我和你又一起走过了3个多月的时光。在这3个多月的时间里我和你一起并肩作战去学习和了解了Redis的源码。跟第一季的课程内容相比这一季学习的内容的确更有难度也更加需要你能静下心来钻研。
这里先感谢你的一路陪伴,我们一起走到了现在。做这样一门专栏,我自己也是收获了很多、成长了很多。那么最后一节课,我就把我在做这门课程里三点最重要的认知分享给你,我们一起持续精进。
## 用源码重新认知你的知识体系
其实,要是用一句话来总结我的感受,那就是,阅读源码让我感到“**从新开始**”。
我在学习Redis源码之前已经对Redis的一些基本原理、一些常见的后端系统设计都有了了解和掌握本身也有一些C语言的开发经历。我相信我当时的状态和此刻正在阅读这篇结束语的你可能很相似。
而在学习了Redis源码后我发现自己在C语言编程技巧、计算机系统关键机制还有系统设计原则等等很多方面都有了新的认识。这些新认知是源于对Redis源码设计与实现的学习而源码学习本身又给我提供了高于Redis的通用知识的掌握这让我受益匪浅。
就比如说我以前在学习操作系统时了解了进程间通信的方法有消息队列、命名管道、无名管道、共享内存等等但是一直没能建立直观的认知。而在阅读Redis源码时我发现Redis广泛地使用了无名管道来支持父子进程间的通信。这一下子就在我的知识体系中增加了对管道实际开发使用的新认知这也让我有了一种实践正好结合理论的体会。
而另一方面我以前在实现一些数据结构和算法时都会按照它们在书本上的定义去实现。但是在阅读Redis源码过程中我发现其实实践和理论又是有差异的。就像Redis中的字符串根据不同长度使用了不同的数据结构实现有序集合使用了两种数据结构的组合来实现以及LRU算法采用了近似方法来实现等等。
这些实际代码让我的知识体系,对实践结合理论又有了新的认识:其实在实际系统开发中,我们通常要考虑性能、空间、复杂度等约束条件,会在理论基础上进行优化开发。这一新认知对我后来的开发工作有了很大帮助,我会有意识地识别所开发系统面临的约束,进而优化自己的实现方法。
其实从Redis的源码中我们可以掌握很多计算机系统知识这些新知识或许我们在目前的工作里还用不到甚至在日后不断学习的过程中还会被更新迭代掉。但是我们要清楚一点就是**我们在某一阶段所掌握的知识,往往会是下一阶段知识的基础。**
源码阅读本身就是一个结合之前学习的理论和开发知识,进一步学习实践开发知识的过程,这是一种从知识再到知识的过程,也是让我们重新认知自己知识体系的过程。
## 用源码重新磨炼你的意志力
阅读源码是一件很辛苦的事情,尤其是当我们面对一个庞大的代码结构时,往往就会感到无从下手了。而等到我们好不容易摸清了代码结构,知道了要从哪些关键函数开始看起时,我们又会面临代码中复杂的调用关系、高级的语法实现,同时,还要尝试去理解代码开发者的思路。这些都是我们在阅读代码过程中的拦路虎,很容易就让我们打退堂鼓了。
我自己在阅读源码时,这些问题也都碰到了。不过,**我****把****这个过程看成是对自己意志力的一个磨炼,越是遇到困难,越要迎难而上,而不能轻言放弃。**
虽然我们也能通过坚持做某些事来磨炼自己的意志力,但是阅读代码的挑战性更大。这是因为代码是细节,而掌握细节需要我们有足够的静心、耐心和细心。这和学习原理不一样,学习原理的时候,我们的头脑往往转得很快,有些机制我们会想当然地认同了。
而阅读代码就不能这样了,一段代码不理解就是不理解,我们是无法想当然认同的。我们只有在不断尝试理解代码的过程中,**正视自己想要放弃的心理和消极情绪,并能找到原因记录下来,然后逐渐减少阻力,以及慢慢提高自己想要放弃它的心理阈值**。这正是阅读源码给我的意志力带来的新磨炼。
当然除了有意志力的支持我们也需要有合理的方法。我之前看过一本书叫做《干劲的开关》其中有句话是这样说的“影响结果的不是斗志而是科学”。所以我在读源码的时候我就把阅读代码的目标拆分得更加细粒度化每天、每周完成一些小目标日积月累等到我把Redis源码主要部分阅读完后我收获了很大的成就感因为我做到了。
而且在那之后,我也发现自己再做其他一些具有挑战性的工作时,阅读源码时得到磨炼的意志力就会发挥积极作用,让我自己不再畏惧困难,而是会积极应对。那么相对应地,我希望你在阅读源码的时候,也能够不要被代码的复杂结构或是错综调用关系所吓倒,而是规划好切实可达的目标,一步一个脚印地去完成代码的学习。
## 用源码重新塑造你的做事原则
我之前在做事时,通常都是直线思维,定了一个目标就希望一次性完成这个目标。但有时受限于自己的知识背景和能力,对如何一次性完成目标会感到很困惑。
而在阅读Redis源码时我遇到了相同的困惑我一直奔着一定要把主要代码和关键技术掌握好这个目标而学习。但是在源码阅读的过程中我有时在阅读了部分代码后又会忘了之前学习的一些细节。而且对于在学习时已经厘清的概念和方法等过一段时间之后我发现又会变得模糊了。
后来我自己在开发一个系统时经常会去再回顾Redis源码。等这个系统开发完成后我发现原先变得模糊的Redis代码细节已经变成深刻的记忆沉淀下来了。
在那个时候,我想明白了,**源码阅读从来都不是一个一次性的学习过程。相反源码阅读过程就像是DNA的双螺旋结构一样是一个循环向上的过程。**从源码阅读中学习开发知识,了解系统实现,然后再用学到的知识反哺自己的系统开发。而在开发过程中,又会再次阅读源码,进行学习,将自己的认知重新提升一个层次。这个过程周而复始,循环向上。
其实,我们日常的学习和做事跟源码阅读也是很相似的,它是一个循环向上的过程。很多事情并不是一蹴而就的,我们需要经历“认知、实践、再认知、再实践”这样一个过程。在这个过程中,我们会遇到困难,也会有收获,但是这些困难或收获都是为了下一次的认知和实践打基础。所以,**我们不要因为一时的挫折而气馁也不要因为一时的成就而停滞就像生命之源的DNA结构一样我们螺旋上升。**
## **写在最后**
今天正好是周六,是个承前启后的时刻,这一季课程也要在今天正式画上一个句号了。不过,这个句号既是一个阶段的结束,更是一个新阶段的开始。
其实很多时候,你的成功并不取决于你知道了多少,而是你知道在无知的时候该怎么做。我希望上面讲的三点关于阅读源码的认知,能够给你的工作和生活提供一些指导方向。当我们在学习一个不会的知识点时,当我们在学习一门新的语言时,当我们面对生活中各种各样的情况必须孤立地做出反应时,我希望你能联想到学习源码的底层逻辑,从而更好地作出自己的选择。
最后,到了我们说再见的时候了,再次感谢你的一路相伴,我相信现在我们都成长了很多。而从今天起,我们在学习的道路上又将是一个新征程,让我们从新开始,学以致用。
最后的最后,我还给你准备了一份毕业问卷,希望你能花两三分钟填写一下,我非常期待能听到你对这门课的反馈。
[![](https://static001.geekbang.org/resource/image/64/bc/64c4e4174ab844d70307a87b42898abc.jpg?wh=1142x801)](https://jinshuju.net/f/vasdJg)
好了,天长地久有时尽,学习之路绵绵无绝期,我们下一次再会!