【我走过的弯路】
我不是科班毕业的学生,带我的leader说要打好计算机基础,算法是一个基础。一般就会网上一搜‘如何学好算法’,这么一搜就会有很多的答案:
人们说,算法导论/segdewick的算法好;
人们说,初学者不要看算法导论很难;
人们说,小白先看算法图解;
人们说,清华大学的邓俊辉老师的网课讲的非常好,堂堂爆满;
人们说,Coursera上的网课非常好。。。
于是,在最初的时候,我一看大家说好的书都买,还花了2k买邓老师的课,被同事知道后嘲笑了一番(你为啥还要花钱买课啊,自己看书不就好了吗),但看了第一课就放弃了,因为觉得太慢了,讲的太细了(又被同事嘲笑了一番,竟然还嫌别人讲的慢)。还买了极客时间的小争哥的课,但没有看。书那么多到底看哪本啊,每本书也那么厚,怎么看完啊,算法图解看了一点点也看不懂,更不可能看算法导论了吧。很多时间都陷入在看‘如何学算法’的攻略里,也很多时间陷在看别人的经验里。但是,连第一章都没有看完过。
后来遇到一个阿里的前辈,已经在算法领域做了很多年了。他说对他影响很大的是斯坦福的《Algorithms: Design and Analysis》,其实我对自己的英语能力很怀疑的,而且大家都说算法很难的,我肯定这个也是不能学完的吧。但是他说,得珍惜现在的科技。早年他那个年代,想要去学习国外好大学的课,还要越洋,而现在的学习成本很低了。所以我就决定跟着这个前辈的建议来做。
【我是如何学的】
我的资料就是: 《Algorithms: Design and Analysis》网课+算法导论+这门课配套的教材《Algorithms Illuminated》
定义学完的目标(这点很重要,定义了目标就知道自己学这个东西是在填补什么):
对于每个算法要搞懂这个算法为什么会有,背后的思考方式是什么,要掌握它的由来、原理、实现、复杂度分析、适合解决的问题、应用场景。
作业正确率>80%。
然后就是很规矩的看视频,基本上每节都有困难,前辈建议的是看不懂的地方就反反复复多看遍,但是我没有这样做,因为我反反复复的多看几遍也看不懂。但是这时候知道一些名词,只是不知道这些名词做了什么。我的心理就很难受,这时候就去参考《算法导论》和《Algorithms Illuminated》,就会恨不得把相关章节的文字都扣出来,驱动力非常的强。
这样的情况下最后学完作业正确率是93%。本来可以刷到100%,但是我没有去刷,因为刷到100%可能内心就觉得这块可以放下了。
在头两周的时候,我就是看不懂的反反复复的看,但是花的时间多,效率低,晚上睡觉也不踏实,觉得遥遥无期,觉得自己需要转行了,甚至还为'为什么就搞不懂啊'大哭了两次。
第三周就想不能这么下去了,就尝试用另一个办法,这时候想起大家说算法导论好,但是难,但我难受的管它难不难,反正这门课也看不懂,结果看了算法导论对应的章节后就马上豁然开朗了,于是在往后的视频中,我就开始不为听不懂讲的难受了,听完马上看算法导论,马上看《Algorithms Illuminated》,效果奇好。
【学完的微小经验】
别人说的难和易
之前一直恐惧不敢看《算法导论》,因为大家都说难,总去看别人说简单的东西,然后简单的看不懂,就觉得简单的看不懂难的更看不懂吧。直到我真正去翻看的时候,才发现它写的多么好,我当时甚至都在疑惑写的这么清楚直白的怎么大家会说难,已经写的很清楚了还要其它什么书做铺垫干嘛。所以也还是不要全信网上的,得自己去感受,自己衡量。
筛选你想要的资料
算法的书和资料有很多,它们的名字都取的一样,但是关注点是不一样的。有些资料关注在灌输算法的内容,比如一个排序都要给你弄几个方法出来;有的就关注在算法背景,为什么会有它,它的出现是为了解决什么东西。
我比较喜欢的资料是关注后者的。
一个经典就够了
网上的好书好课很多,但是需要真切的去上一门经典课,看一门经典书。我最开始就是资料收集达人,收集一堆但是关键的不看。当你跟完一个系列,以后遇到类似问题的时候,心理就有数去看哪里的东西会让你搞明白这个问题,而不是漫天的Google看别人解读的信息。当你再次看到公众号里卖课的,别人的经验贴推送,别人又在回答里添加很多的链接,你不会感到慌,感到迷茫从哪里起,甚至看过好的资料,
被好的资料喂养后,你就能自动的过滤低阶的信息。
听不懂视频
我觉得视频带给我的是一些听不懂的名词,为了知道这些名词的意思去驱使看更多资料才是更重要的。这点我在大学也有过相似的经历。
【大学相似的经历】
大学的时候我就发现一个奇怪的现象。每当我课堂上能听懂的课,课下作业一下就解决完的课,最后期末考试成绩总是上不鸟90分;而那些我上课听起来很吃力,做作业也很吃力,最后期末考试的分数总是接近满分。
对于这两类课我的处理方法是:
当课堂能听懂,我课下就根据教材稍稍看看,回顾一下,甚至连回顾都不用就能把作业做完,做完就关了书做其他的了。
而对于课堂不能听懂的课,脑子里有许多的名词,但是连不起来,也不知道这些名词是什么,就有非常强大的驱动力去想要搞懂,会去图书馆找很多的相关参考资料,然后为了一个主题会看不同书的解释。这种情况下把作业做了,把课堂的内容搞懂。我记得有门数学专业课,期末有三分之一的人没有及格,90分以上的只有两个,我用这样的方法那门课得了98分。
我甚至还试过,既然搞懂的点是在自己参考更多的书,主要人是自己,那就不需要去课堂听老师的课了。然而当我这么实践的时候,我发现效率很低,书也看不进去,进度反而慢了。所以关键点就是在课堂上听些名词,让这些名词在脑海里转啊转,我当时自己把这个过程叫‘打点’,因为这些‘点’才会产生大的驱动力去参考更多的资料,我当时把这个搞懂这些点的过程叫‘连线’。
工作后也有这样的情况: 没事的时候看文档怎么也看不进去,自己的代码里发现了一个bug恨不得把文档上的每个字都扣下来。
【相似的读书理论】
后来我发现其实别人已经总结过方法的,一个读书方法就叫‘影像阅读法’,其中有一步就是‘寻找触发词’,是说先把书整体快速翻一遍找到其中存在感比较强的词。你会这些词产生好奇,想要知道它是什么。下一步就是‘激活触发词’,就是再细读去解答之前的‘触发词’。
所以其实
在课堂上听课但听不懂也是有意义的,是在听‘触发词’,这些触发词会驱使你去看更多的资料‘激活’。