最近学习Redis源码也有半个月的时间了,有不少收获也有不少感悟,今天来好好聊聊我学习的感悟。
1 发现问题
人非圣贤孰能无过,只要是人难免会犯错,回顾我之前的学习历程,其实是可以发现不少的问题,大概有学习方式混乱、流于形式、忘记、不深入、精神面貌欠佳、敷衍了事、收获不足、不够求真、无趣。
1、 学习方式混乱;
2、 学习动力不足;
下面具体分析下这些问题,看下这些问题究竟是什么,为什么会产生这些问题,那又怎么解决这些问题。
2 学习方式混乱
2.1 缺少方向感
Redis的代码非常多,从哪里学,怎么学都是问题,如果没有一个好的学习规划的话,则很容易失去学习方向。
刚开始学习Redis源代码的时候,我是一腔热血,也没管那么多,想着先开始再说,直接就下载源代码开始阅读起来,反正想着就从最简单的开始,然后慢慢的读下去,其实这样也没有什么大问题,但是这样容易失去大方向,对Redis源代码的组织结构不清楚的话,犹如在走迷宫一样。
为了避免这样的问题加深,所以在后面我会重新审视下Redis源代码的组织结构分布,并且绘制一幅Redis源代码的地图,这样不仅能够增加对Redis源代码的组织结构的了解,也能给自己指引一个明确的方向,今天学习哪里,下一步学习哪里。
2.2 整体与局部
整体与局部的问题其实就和盖房子一样,盖房子的时候要先把地基和框架做起来,然后再铺上水电,最后再来装修。那么学习Redis源码也是一样,整体就先搞清楚大概那些文件是干什么的,那些方法是干什么的,有了一个整体的了解,在把一些细节逐个攻破。
不过这样也是有一个问题,就是整体与局部的界限的把握,如果过于整体的学习,可能只是走了个形式;如果过于局部的学习,可能深陷其中。
为了避免这个问题,还是要定义一个清晰的界限,整体到哪个范围就可以,到哪个范围就是局部,只要清楚这个界限,就能做到游刃有余,而不是一直纠结这个要不要深入研究,要不要学习。
3 学习动力不足
3.1 老目标分析
其实学了这半个月,有时也会产生自我怀疑,我学习Redis源码究竟是为了什么,我学这个到底有没有用,我还要不要坚持下去。
先来回顾一下我之前学习Redis源码的目标都有哪些。
1、 工作中Redis接触的比较多;
2、 可以系统性地学习一门知识;
3、 增强阅读源码的能力;
4、 学习遇到瓶颈,想突破瓶颈;
5、 一探究竟;
看起来貌似都没啥大问题,但其实现在看起来这些目标多多少少是不够强有力的,如果没有一个强有力的目标来支撑自己,仅仅是靠以上目标还是难以走下去,肯定还需要一个足够大的目标和动力去驱动我做这件事情。
3.1.1 工作中Redis接触的比较多
这一条其实是不够有说服力的,工作中虽然用的很多,但是还不够促使我要去阅读代码,基本只要我能够使用Redis就可以胜任工作,所以这条不行。
3.1.2 可以系统性地学习一门知识
这一条只能说中规中矩,最近这些年确实学了很多乱七八糟的东西,但是都没有系统地学习一门东西,与其说系统性地学习一门知识,不如说是借此次机会,将自己所有学习的知识系统化,将所有的知识点串联起来。所以这条可以更正为将自己的知识的系统化。
3.1.3 增强阅读源码的能力
这一条怎么说呢,也有点差强人意,因为阅读源码的能力确实是一项不错的能力,但并不是一项非常必要的能力,做与不做貌似都没有太大的影响,当然如果想提高自己的话,确实还是可以尝试增强这项能力。
3.1.3 学习遇到瓶颈,想突破瓶颈
这条简单一点的说,就是最近自己不知道学啥了,但是不学点东西又感觉有点荒废时间,然后也不知道从哪里听说学习源码可以提升自己的能力,具体能提升啥能力咱们也不清楚,反正能提升能力那就来呗,所以综合分析起来,这条目标的动力也不够强劲。
3.1.4 一探究竟
每个人都有好奇心,只是好奇心的程度不同,可能我的好奇心就比较强,使用过Redis就想知道它是怎么实现的,话又说回来了,那我使用过Mysql为什么不想去阅读它的源码,或者其他的软件。
这里其实就要深挖更深层次的需求,弄清楚自己到底想要什么、想做什么,是什么原因让自己必须要对Redis一探究竟,搞清楚它是怎么实现的,只有弄清楚这一点,才能坚定自己的目标,并且提供源源不断的学习动力。
3.2 新目标分析
3.2.1 提升能力
其实之前的老目标中好几条其实都可以归结于提升能力,很简单我们学习任何东西都是要提升自己的能力,不管是什么能力,只要提高了总会有收获和提升,在没有合适的提升能力的方法或者渠道的话,那么就找一个合适的方式,我觉得学习Redis源码可以提升我的能力,那么我就尝试这个方式。
那么说到提升能力有什么用,简单一点就是升职加薪,赚更多的钱买更多自己想买的东西。
说的长远一点,提升自己的能力,可以研究更有难度、更高级的东西,何尝不是一件有趣的事情。
3.2.2 动手实现一个中间件
其实当我们用了很多中间件,并且去研究这些中间件的时候,可以发现很多底层逻辑和实现方式,大差不差,那为什么我们自己不去实现一个简单的中间件玩一玩,可能有人说重复造轮子没意义,但是只要我们自己觉得有意义就行,自己实现一个中间件并能跑起来难道不是一件非常有意义的事情。
那为什么要选择Redis呢,原因是Redis是一款比较成熟的中间件,而且性能也是非常不错,并且是开源的,源代码很容易找到,所以选择学习Redis源码是一个很合适的方案。
我们学习Redis源码可以了解服务端、客户端、网络通信、IO多路复用、主从、哨兵、集群、数据结构、内存等相关知识,但是学习只是学习,假如我们能把学习到的知识用于实践之中,那么这样才能把知识融会贯通,上升到一个更高的层次。
可能讲到这里,很多人就打退堂鼓了,本身学习Redis源代码就是一个很庞大的工程耗时耗力,如果再加上要自己实现一个和Redis一样的中间件,工程量更是巨大,其实这里大家可能有一些误区,我们并不是要照搬人家的功能,也不是要实现和人家一模一样,我们只是去实现一个可以把所有知识点体现出来的简易版Redis即可,所谓学到就是赚到。
如果有了这个目标,我们就有了足够的动力去学习Redis源码,因为知己知彼百战百胜,只有足够了解Redis源码,才能游刃有余的去实现一个简易版的Redis,否则就是非常被动的抄一抄人家的代码效果不大。
4 慢下来
4.1 走马观花
最近仔细想想自己半个月的学习过程,里面有很多时候都是走马观花,为了快点学习完,有一种敷衍了事赶进度的感觉,导致有一些学习不够细致,忽略了很多东西,也少了许多思考。半个月学习完五种数据类型的源代码,说快说慢,还是看自己每天投入了多少时间在上面。
本来想着学习完就进入下一阶段的学习,但是仔细想想前面大部分的学习都有点草率,就不能在这种状态下草率地进入下一阶段的学习,还是要先把之前的学习内容查漏补缺后再考虑后面的事。并且之前很多篇学习博客的质量也要好好提高一下,完善每一篇文章才能提高自己。
查漏补缺属于亡羊补牢,为了避免这种问题的发生,还是要调整好心态,学习源代码本身就是一件耗时比较久的事情,企图短时间内就完成它是不太可能的,所以要想清楚自己要在一定时间内学习完它,还是要把它学习好,这完全是两件不同的事。
对于之前的状态,我可以说是想在一定时间内学习完它,但忽略了学习的细节和质量,所以以后就不给自己设定时间期限,认真学习好每一个方法和细节,做好每一件小事,才能把一件事情整体做好。
最近看到一句话其实非常好,这里也分享给大家,所有看起来很爽的东西,都是瞬间的感觉,而人类真实的快乐一定是很久的努力。
4.2 不够专注
前有走马观花,后有三心二意,我在学习的过程当中容易被各种乱七八糟的事情打断,例如聊天、看手机、听音乐、或者看下抖音休息一下。就很难静下心来去专注的学习源码,这也是导致学习质量下降的原因之一。
所以以后在学习源码的时候,尽量把一些乱七八糟的事先处理好,把手机也丢一边,学习就学习不想其他的事情,慢慢培养自己的专注力。
5 收获
虽然上面分析了学习中发生的问题,但也不代表我们这半个月完全在打酱油一无所获,总体而言还是有很多收获的。
5.1 熟悉代码
虽然刚开始不熟悉Redis代码,但是天天看、天天分析,一遍两遍总会熟悉的,这半个月来看了不少代码,也分析了不少代码,渐渐地对Redis很多方法越发的了解,以及它整体流程和一些通用逻辑,方法命名规律。
5.2 了解命令实现原理
这半个月主要学习的内容是我们常用的一些Redis命令,通过学习掌握了不少命令的实现方式,以后在使用这些命令的时候,脑海中也会有印象,可能灵光一闪原来是这样实现的。
5.3 发现自己的不足
5.3.1 对Redis命令不够了解
学习Redis源代码之前,觉得自己应该对Redis挺了解的,并且平常用的命令也挺多,但是到了实际学习之后发现自己对Redis很多命令其实并不了解,甚至很多命令都不知道。
5.3.2 对C语言不熟悉
虽然大学的时候很认真的学习了C语言,但是毕业之后也一直没有怎么用过,觉得自己应该很了解了,结果学习源码之后发现很多语法自己都不太清楚,造成了一定的阅读障碍,所以要花点时间把C语言的一些语法重新温习一下,并巩固一下没有掌握的知识。
5.3.3 缺少思考
学习是要经过思考,经过一番大脑的纠缠,才能将所学的东西深刻印在脑海中,如果只是简单的过一下表面的东西,那么很多东西犹如浮云,转瞬间就忘记,那么这样的学习显然是没有好的效果的。经过这次学习发现自己就缺少思考,很多东西没有提出自己的想法,所以在以后的学习里会加入一个思考环节,专门提出一些自己的想法或者疑问。
6 总结
6.1 想法
经过这两天的反思和总结,想清楚了不少东西,也算是不错。
1、 做正确的事,而不是做更多的事;
2、 学习要追求质量,而不是数量;
3、 想清楚自己真正想要什么,再去追求自己想要的;
4、 做事要认真专注,而不是敷衍了事;
5、 要学会把一件事情变得有趣;
6.2 接下来的行动
经过一番思考,接下来的行动,有了一个新的计划。
1、 回顾之前的学习内容,查漏补缺;
2、 回顾以往的学习博客,完善一些细节,并总结写的不好的地方;
3、 重新梳理学习计划;
4、 温习C语言的基础知识;
5、 绘制Redis源码地图,熟悉一下整体的结构;
6、 进行下一步学习计划,数据类型对应的几种数据结构;
End
前路漫漫,希望大家一起加油,鼓起勇气去追寻自己的向往。