tip: 作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。
推荐:体系化学习Java(Java面试专题)
前言
学习任何知识,我都喜欢先去了解一个知识的脉络,然后再有计划的的学习。举个例子,我是从事 Java 开发的,我习惯了解整个 Java 的生态都需要学习什么,我要进阶成中级工程师,我需要学习哪些技术?我要进阶成资深工程师,我需要学习哪些技术?这些技术都要掌握到什么程度?
我会去梳理这样一张思维导图,这样在我的脑海里,我就能清楚的知道每个阶段需要学会什么,也像游戏一样,我打怪打到什么程度,我就可以升级。
如上图这种,当然这种是偏向于宏观的。还有一个种是微观的方法,是针对于具体学习某个技术的。
逆向思维的学习方法
比如我想要学习一下 Redis ,首先我们得先整理学习 Redis 需要掌握哪些方法,结构化的展示要学习的内容,如下:
1、基础
1.1、找到官方文档、资料,了解什么是 Redis 以及它的应用场景,有什么优缺点;
1.2、学习 Redis 的基本概念和使用方法,包括数据结构、常用命令和配置参数等;
1.3、在项目中使用 Redis,找个使用场景练习;
2、进阶
2.1、了解 Redis 在缓存、消息队列、计数器等方面的应用;
2.2、学习 Redis 的高级特性,包括事务、持久化、复制、集群等;
2.3、搭建 Redis 的环境,对 Redis 事务、持久化、复制、集群等实践操作;
3、精通
3.1、学习 Redis key 的生命周期,以及一些淘汰策略;
3.2、深入学习 Redis 的数据结构是如何设计的;
3.3、深入学习 Redis 的 RDB、AOF 持久化是怎么实现的,实现细节;
3.4、深入学习 Redis 的事件驱动模型,集群、哨兵等;
当然知识脉络的展现形式,我习惯以思维导图的形式,这样更清晰,脑海中映象更深刻。在学习过程中,我习惯用逆向思维去学习知识,举个例子:
比如学习 Redis 的设计细节,那么我习惯思考如果 Redis 是我写的,或者说我要写一个类似于它的缓存,我该从哪些方面考虑呢?这又是一个梳理的过程,可能最终我梳理的不够完全,也可能有偏差,但是跟它的真实设计一对比的时候,你就会发现,原来是这么回事,并且你对这个知识的映象也会很深刻。
我简单陈述下我的思考过程:
让我设计一个缓存,我首先需要清晰的知道缓存是干什么用的,然后再去设计。
1、缓存在我心里就是类似于一个商场里临时的存储柜这样一个东西,我去商场想临时存个东西,那么选择一个柜子,将我的东西存进去,然后拿着对应号牌的钥匙,这样就完成了临时存储。缓存也一样,所以我们需要提供 key-value 这种形式的接口。当然我们 value 有很多种结构。所以这里定义数据结构很重要,我们需要提供用户多种多样的数据结构,方便存储。那么第一我需要设计数据结构。
2、缓存的特性是临时的、但将来也有可能需要保证持久性。那么我就需要提供增、删、改、查的功能,如果要永久存储,那么我们还需要设计落盘。所以第二步我们需要设计增、删、改、查以及持久化。
3、就像上面举例的,商场上存储的东西,也有可能主人忘记了,没有去拿,那么商场如果不提供清理,就一直占着位置,别人就无法使用,缓存也一样,所以第三步我们需要考虑设计一个清理策略。
还有配置化、监控、线程安全等等问题,就不一一介绍了,本文只是展示这样一个学习方法。
如果我们学习的方式如上面这样,我相信真有一天,有人让你手写一个,相信也不是问题。
总结
最后总结一下:
1、要掌握知识生态,就用宏观的方法去梳理;
2、要掌握具体的知识,就用逆向思维就推演;