如何有效且系统的学习

如何有效且系统的学习

很多时候我们会有这种感觉,即使看了很多的书、做了很多的题,到最后却依然觉得知识掌握的不够牢固,所以今天给大家介绍一下如何有效且系统的学习知识。

在《Outliers》——中文名翻译成《异类:不一样的成功启示录》,一书中有这样一个结论:如果想要精通任何一个领域,需要完成三个步骤:切碎知识点、刻意练习、寻求反馈。

第一步:切碎知识点

切碎知识点可以理解为中文中的庖丁解牛,就是把一个比较大、比较繁复的知识体系,切成一块一块相对比较明确,同时简单化,但是脉络化的知识脑图。他们必须是脉络相连的,因为任何的知识体系都是一棵树,它有最基本的根、由根分出的主干、再由主干分出的枝叶。每个知识点最后都要和你熟悉的知识挂靠在一起,成为一个树形结构。人脑不适合记忆和理解孤立的知识,所以一定要把它弄成一个脑图。

可以用数据结构类比。整个数据结构大概有十几种、二十几种之类的,每一次分法都不太一样,为了简单和利于理解,可以分为三大块:一维数据结构、二维数据结构和特殊数据结构。

一维数据结构可再分为基础和高级两大类。一维最初级的就是数组和链表;高级主要有栈、队列和双端队列,同时还有经常用的一个set和map这样的数据结构。

当一个一维的链表,它的分叉有两个的时候,就变成了一个二维数据结构,相当于树一样。二维基础的结构有树和图;高级的数据结构主要是在树的基础上加了很多的特殊判断和约定条件,比如二叉搜索树、红黑树、AVL、堆、并查集和字典树。

最后就是特殊的数据结构,这些数据结构主要用于工程中特定的情景,比如说位运算和基于位运算得的布隆过滤器,以及缓存LRU Cache。

再比如分解算法,算法总共可分为八大点,前三点就类似于几何里面的公理一样,而前三点是算法最基础的地方。

第1点是if else,所谓的跳转语句。第2个的话就是循环,可以写for loop,也可以写which,你也可以写while的loop。第3个就是函数自己调用自己,即所谓的递归。

这三点是所有算法和数据结构的基石,任何高级的算法数据结构到了最后都会转换成if else或者是for loop或者是递归。为什么呢,因为我们现在用的这些算法和数据结构都是叫做最为初级的,它没有任何人工智能的部分在里面,它是最朴素的一些运算操作,最后要用的语句其实就只能是if else 、for loop或者递归。基于这点的话,后面复杂算法的根本就是找到它的重复单元。

那么基于递归也好或者for loop就好,就有了剩下的五个高级算法。第4个的话就是搜索和一些高级的搜索,比如说深度优先、广度优先等。第5个动态规划。第6个就是所谓的二分查找,二分查找是对一个有序的数组,很快的找到你要的目标节点。第7个就是贪心算法以及排序算法。第8个就是一些数学和几何上的操作。

第二步:刻意练习

刻意练习练习的是基本功,也称为内功,是区别业余选手和职业选手的根本。刻意练习的关键就是能够把基础动作进行分解训练,且进行反复的练习。这里的话我要强调最大的误区是什么?最大的误区就是只练习一遍。一遍是完全不够的,这就好像你学乒乓球、练台球和滑雪,一个动作如果你只做一遍是无法熟练的,而且也没法把它变成自己的一个条件反射的动作。

接下来举例用刻意练习的方式如何进行算法训练,在这里的一个关键就是三个字:过变数。这一点和大家背单词或者进行托福的准备差不多,就是要过遍数,在这里称为五遍刷题法。五遍刷题法,就是任何一个题目的话你要做五遍或者说至少做五遍。

第一遍就是第一次接触这个题目,先花5分钟的时间读题和思考。如果自己基础比较薄弱的话,可以给自己10分钟最多15分钟的时间进行读题和思考。

那么在这10分钟到15分钟时间,你要是没有任何思路的话,以及不知道怎么做的话很正常,那就第2步直接看解法即可,当然如果你有思路就直接开始做就行了。题目的解法一般来说都是有多种的,要做的就是比较不同解法的优劣。另外要背诵和默写好这样的解法,这样一般来说100%都可以理解的,直到反复很多遍之后自己看到一个类似的题目,很快能够写出来以及得到它的思路。

当第一遍默写完之后马上自己写第二遍。这个时候你就不要再看别人的代码,这时候相当于闭卷考试,自己开一个浏览器,一个空白的文件,在里面开始把代码自己敲出来,敲完了之后放在leetcode上面去跑你的程序,一开始可能会写一些bug出来,没关系,然后debug修改,直到自己的程序在leetcode上面是通过的状态。

还是那句话,一个题目可能有多种解法,那么每种解法都得写一遍。不同解法要比较它们的执行时间,同时对于同一种解法,当执行时间偏长时要想一想优化的办法,直到这些不同的解法都能通过,而且执行时间是相对较优的,也就是说比如说领先90%的人,那就很不错了,领先80%的也很好。

接下来就是第三遍,第三遍就是24小时之后,再回过头来重新做一遍昨天的题目,那么不同解法的熟练程度要是不一样的话,对自己不是特别熟练的那些题的话进行专项训练。

第四遍则是一周之后再练习相同的题目,同时对于自己不熟练的题目再进行专项练习。那么前四遍已经完了之后,一般对这一类的题目都会比较熟练。

那么接下来第五遍,就是面试前一个星期进行恢复性训练,再过来把之前做的题目再重新做一遍,当然需要结合面试准备的程度,可以提前两周等,主要是按照自己的时间安排。

刻意练习的关键还有一点就是要练习自己的弱项。虽然这样经常会觉得不舒服、不爽和枯燥,但是有这样的感觉其实就对了,因为它意味着你自己在成长。这就好比在健身房练习某些动作,当你觉得不爽不舒服的时候,正是在长肌肉的时候。

生活的例子也有很多,像乒乓球、台球或者游戏,当你某一个方面练习的非常好、很有信心的时候,这时就会进入所谓的舒适区。而你要提高的话,则要一只脚踏在舒适区之外,把自己的弱项进行反复练习。只有这样过了一段时间之后,你回头看就发现,自己突破了原来的情景。

第三步:寻求反馈

接下来就说这一套方法的第三个步骤就是所谓的反馈。反馈主要分为两种,一种是主动式反馈、另外一种叫做被动式反馈。

当大家在玩撸啊撸时,可能会看一些职业选手的玩法,这时候就会发现,原来这个地方可以这么操作,或者这个地方可以放这么几个技能,从而达到不一样的效果之类的。其实这就是主动的寻求反馈,然后马上就会知道,原来这个地方的最佳时间最佳的操作是这么一种方式,之前自己走了不少的弯路。

代码其实也是这样,当大家主动在 GitHub 上看优秀代码时,就会发现原来这个地方可以这么写,这么写显得特别优雅,而且程序跑的也很快,就应该找到这种感觉并不断的去学习提高自己。

另外就是被动式的反馈,也就是高手看你的程序或者是看你玩游戏给你主动的反馈。

结束语

如果把知识点看作数据,则需要选择对应的数据存储结构。而我们知道,链表是特殊的树,树是特殊的图。所以在学习知识点前,一定要已经勾勒出对应的树,剩下的就是点缀叶子,只有这样你的体系树才会茁壮成长、枝繁叶茂,不至于当和人谈起时,只能拿出几片孤立的小碎叶。