gitbook/Redis核心技术与实战/docs/289950.md
2022-09-03 22:05:03 +08:00

12 KiB
Raw Permalink Blame History

加餐(三)| 用户Kaito我希望成为在压力中成长的人

你好我是Kaito。

上一次我分享了我总结的Redis学习路径在留言区的交流和互动中我有了很多新的收获。今天我想再分享一下我对学习这件事儿的认识以及我的学习方法包括领先一步的心理建设、事半功倍的学习方法以及提升效率的小技巧。

领先一步:保持好奇+不设限

我认为,任何领域的学习,在研究具体的方法之前,我们都需要先在心理上领先别人一步。什么意思呢?其实就是要建立并保持好奇心,并且不给自己设限。

我发现,很多人是缺乏好奇心的,突出表现在只知其然,不知其所以然,不善于思考和挖掘问题。

给你举个小例子。刚开始接触Redis时你肯定听说过一句话Redis是单线程高性能。很多人听完也就过去了但是有好奇心的人会进一步思考“单线程如何处理多个客户端的网络请求呢采用单线程的话只能用到一个CPU核心怎么达到高性能呢

顺着这个思路去学习的话你就会发现Redis虽然采用了单线程但是它使用了多路复用技术可以处理多个客户端的网络请求。而且它的数据都存储在内存中再加上高效的数据结构所以处理每个请求的速度极快。

你看,带着好奇心去看问题,最终我们得到的远远超出想象。所以,我们要永远保持好奇心和深入探究的精神,它是我们不断进步的核心驱动力。

我要说的第二点,就是不要给自己设限

不要没有做任何尝试,就先去说“我做不到”。如果你这样做,就相当于提前放弃了自己的成长机会。我特别喜欢的一个心态是:“我现在虽然不会,但是只要给我时间,我就能学会它。

说到这儿,我想给你分享一个我的小故事。

之前我在业务部门做开发时大部分时间都在写业务代码对Redis也只停留在“会用”的层面并不了解它的原理更别说分析和定位性能问题了。

后来一个偶然的机会我可以去公司的基础架构部门做数据库中间件相关的工作。我当时非常犹豫一方面我知道这个工作要求熟练掌握Redis的方方面面难度非常高我觉得我可能无法胜任但另一方面我也非常想踏出舒适区突破一下自己。最终我还是选择了接受挑战。

刚开始时我确实遭遇了难以想象的困难比如说不熟悉Redis的运行原理、看Redis源码时一头雾水、在系统发生问题时不知所措等等。还好面对压力我的斗志被激发了于是就疯狂地恶补数据结构、网络协议、操作系统等知识一行行地去啃源码……

真正走出舒适区之后,我看到了自己的飞速成长和进步,不仅很快就胜任了新工作,而且,我越来越自信了。之后,每次遇到新问题的时候,我再也不会害怕了,因为我知道,只要花时间去研究,就可以搞定一切。

所以,我真的想和你说,面对任何可以让自己成长的机会,都不要轻易错过,一定不要给自己设限。你要相信,你的潜能会随着你面临的压力而被激发出来,而且它的威力巨大!

事半功倍:行之有效的学习方法

有了强烈的学习意愿还不够,我们还要快速地找到科学有效的学习方法,这样才能事半功倍。接下来,我就聊聊我的学习方法。

首先我们要学会快速地搜集自己需要的资料。在搜索的时候我们要尽量简化检索的内容避免无用的关键词例如如果想要搜索“Redis哨兵集群在选举时是如何达成共识的”这个问题我一般会搜索“Redis sentinel raft”这样只搜索重点词汇得到的结果会更多也更符合我们想要的结果。

如果在查资料时,遇到了细节问题,找不到答案,不要犹豫,一定要去看源码。源码是客观的,是最细节的表现,不要只会从别人那里获取东西,要学着自己动手觅食,而源码,往往能够给我们提供清晰易懂的答案。

比如说Redis的String数据类型底层是由SDS实现的当要修改的value长度发生变更时如果原来的内存空间不足以存储新内容SDS就需要重新申请内存空间进行扩容那么每次扩容时会申请多大的内存呢

如果你看到了sds.c中的sdsMakeRoomFor函数就会知道当需要申请的内存空间小于1MB时SDS会申请1倍的内存空间这样就可以避免后面频繁申请内存而导致的性能开销当需要申请的内存空间大于1MB时为了避免内存浪费每次扩容时就只申请1MB的内存空间。类似于这样的问题我们都能很快地从源码中找到答案。

很多人都觉得看源码很难不愿意走出这一步刚开始我也是这样的但是后来有一天我突然想到了“二八定律”。我所理解的“二八定律”就是80%的人甘于平庸遇到稍微难一点的问题就会停下脚步而另外20%的人一直不愿意停留在舒适区只要确定了目标就会一直向前走。我当然希望自己是那20%的人。所以每次我觉得有压力、有难度的时候我就会告诉自己得坚持下去这样才能超越80%的人。不得不说,这招儿还挺有用的。

另外,我还想说,掌握新知识最好的方式,就是把它讲给别人听,或者是写成文章。

尤其是在写文章的时候,我们需要确定文章的结构,梳理知识点的脉络,还要组织语言,在这个过程中,我们会把一些零碎的内容转化为体系化、结构化的知识。那些散乱的点,会形成一棵“知识树”,这不仅方便我们记忆,而且,在复习的时候,只需要找到“树干”,就能延伸到“枝叶”,举一反三。

而且,在梳理的过程中,我们往往还能发现自己的知识漏洞,或者是对某些内容有了新的认识和见解。

例如我在写《Redis如何持久化数据》这篇文章的时候就已经知道了RDB+AOF两种方式但在写的过程中我发现自己并不清楚具体的细节比如为什么生成的RDB文件这么小这是如何做到的RDB和AOF分别适合用在什么场景中呢

翻阅源码之后我才发现RDB文件之所以很小一方面是因为它存储的是二进制数据另一方面Redis针对不同的数据类型做了进一步的压缩处理例如数字采用int编码存储这就进一步节省了存储空间。所以RDB更适合做定时的快照备份和主从全量数据同步而AOF是实时记录的每个变更操作更适合用在对数据完整性和安全性要求更高的业务场景中。

这种用输出反哺输入的方式,也是强化收获的一种有效手段,我真心建议你也试一试。

持续精进:做好精力管理

拥有了好奇心,也找到了合适的方法,也并不是万事大吉了。我们可能还会面临一个问题:“我非常想把某个技术学好,但是我总是被一些事情打断,而且有的时候总想犯懒,这该怎么办呢?”

其实这是一个效率问题。人天生是有惰性的所以我们需要借助一些东西去督促我们前进。想一下工作时什么时候效率最高是不是接近deadline的时候呢

这就说明当我们有目标、有压力的时候才会有动力、有效率地去执行。所以我常用的一个方法是在学习某个领域的知识时我会先按照从易到难的顺序把它拆解成一个个大的模块确定大框架的学习目标接着我会继续细化每个模块细化到一看到这个任务就知道立马应该做什么的程度。同时我还会给每项任务制定一个deadline。

简单举个例子。我在学习Redis的基础数据类型时首先确定了String、List、Hash、Set、Sorted Set这五大模块。接着我又对每个模块继续进行拆分例如Hash类型底层实现可以拆分成“压缩列表+哈希表”这两种数据结构实现,接下来,我就继续细化这两个模块的内容,最终确定了一个个小目标。

怎么完成这些小目标呢?我采用的方式是用番茄工作法

我会把这些细化的目标加入到番茄任务中并且排列好优先级。随后我会在工作日晚上或者周末抽出一整块的时间去完成这些小目标。在开启番茄钟时我会迅速集中精力去完成这些任务。同时我会把手机静音放在自己够不到的地方。等一个番茄钟25分钟结束后休息5分钟调整下状态然后再投入到一个番茄任务中。

在实施的过程中,我们可能会遇到一些阻碍,比如说某个任务比想象中的难。这个时候,我会尝试多用几个番茄钟去攻克它,或者是把它的优先级向后放,先完成其他的番茄任务,最后再花时间去解决比较难的问题。

长时间使用这种方法,我发现,我的效率非常高。而且,把番茄任务一个个划掉之后,也会有一些小小的成就感,这种成就感会激励我持续学习。

最后,我还想再说一点,就是要投入足够多的时间。不要总是抱怨想要的得不到,在抱怨之前,你要先想一想,有没有远超出他人的投入和付出。想要走在别人的前面,就要准备好投入足够多的时间。

有时候,可能你会觉得,学习某一个领域的技术感觉很枯燥,因为细节很多、很繁琐,但这都是很正常的。现在我们所看到的每一项技术,都是开发者多年的总结和提炼的成果,它本身就是严肃的,你必须花足够多的时间去分析、研究、思考,没有捷径。

千万不要指望着借助碎片化学习,搞懂某个领域的知识。我所说的碎片化有两层含义:一是指内容碎片化,二是指时间碎片化。

不知道你没有遇到这种情况,当你看完一篇技术文章时,可能以为自己已经掌握了这些知识点,但是,如果别人稍微问一下相关的知识点,你可能就答不上来了。这就是因为,你学到的东西是碎片化的,并没有形成知识体系。

但是,只有系统化学习,你才能看到这项技术的全貌,会更清晰边界,知道它适合做什么,不适合做什么,为什么会这样去设计。

另一方面,不要幻想着只在地铁上学一会儿,就能把它学会,这样就有点太高估自己了。因为在很短的时间内,我们没有办法深入地去思考,去深入了解这个知识点的前因后果。你必须在晚上或者周末抽出一整块时间,去理清每个知识点之间的关系和边界,必要时还需要动手实践。

因此,如果真正想去要握某项技术,就必须需要付出整块的时间去学习,而且,必须是系统化的学习。

总结

今天,我跟你分享了我的一些学习总结,包括领先别人一步的心理建设,事半功倍的学习方法,以及持续精进的精力管理方法。

这些道理其实很简单也很容易理解但是能真正做到的也只有20%的人,甚至是更少。所以,希望我们都能真正地行动起来,进步的路很长,我们一定要让自己在路上。

最后,希望这些内容对你有所帮助,我也很期待你在留言区聊一聊你的学习方法或习惯,我们一起交流和进步。