【我走过的弯路】
我不是科班毕业的学生,带我的leader说要打好计算机基础,算法是一个基础。一般就会网上一搜‘如何学好算法’,这么一搜就会有很多的答案:
人们说,算法导论/segdewick的算法好;
人们说,初学者不要看算法导论很难;
人们说,小白先看算法图解;
人们说,清华大学的邓俊辉老师的网课讲的非常好,堂堂爆满;
人们说,Coursera上的网课非常好。。。
于是,在最初的时候,我一看大家说好的书都买,还花了2k买邓老师的课,被同事知道后嘲笑了一番(你为啥还要花钱买课啊,自己看书不就好了吗),但看了第一课就放弃了,因为觉得太慢了,讲的太细了(又被同事嘲笑了一番,竟然还嫌别人讲的慢)。还买了极客时间的小争哥的课,但没有看。书那么多到底看哪本啊,每本书也那么厚,怎么看完啊,算法图解看了一点点也看不懂,更不可能看算法导论了吧。很多时间都陷入在看‘如何学算法’的攻略里,也很多时间陷在看别人的经验里。但是,连第一章都没有看完过。
后来遇到一个阿里的前辈,已经在算法领域做了很多年了。他说对他影响很大的是斯坦福的《Algorithms: Design and Analysis》,其实我对自己的英语能力很怀疑的,而且大家都说算法很难的,我肯定这个也是不能学完的吧。但是他说,得珍惜现在的科技。早年他那个年代,想要去学习国外好大学的课,还要越洋,而现在的学习成本很低了。所以我就决定跟着这个前辈的建议来做。
【我是如何学的】
我的资料就是: 《Algorithms: Design and Analysis》网课+算法导论+这门课配套的教材《Algorithms Illuminated》
定义学完的目标(这点很重要,定义了目标就知道自己学这个东西是在填补什么):
对于每个算法要搞懂这个算法为什么会有,背后的思考方式是什么,要掌握它的由来、原理、实现、复杂度分析、适合解决的问题、应用场景。
作业正确率>80%。
然后就是很规矩的看视频,基本上每节都有困难,前辈建议的是看不懂的地方就反反复复多看遍,但是我没有这样做,因为我反反复复的多看几遍也看不懂。但是这时候知道一些名词,只是不知道这些名词做了什么。我的心理就很难受,这时候就去参考《算法导论》和《Algorithms Illuminated》,就会恨不得把相关章节的文字都扣出来,驱动力非常的强。
这样的情况下最后学完作业正确率是93%。本来可以刷到100%,但是我没有去刷,因为刷到100%可能内心就觉得这块可以放下了。
在头两周的时候,我就是看不懂的反反复复的看,但是花的时间多,效率低,晚上睡觉也不踏实,觉得遥遥无期,觉得自己需要转行了,甚至还为’为什么就搞不懂啊’大哭了两次。
第三周就想不能这么下去了,就尝试用另一个办法,这时候想起大家说算法导论好,但是难,但我难受的管它难不难,反正这门课也看不懂,结果看了算法导论对应的章节后就马上豁然开朗了,于是在往后的视频中,我就开始不为听不懂讲的难受了,听完马上看算法导论,马上看《Algorithms Illuminated》,效果奇好。
【学完的微小经验】
别人说的难和易
之前一直恐惧不敢看《算法导论》,因为大家都说难,总去看别人说简单的东西,然后简单的看不懂,就觉得简单的看不懂难的更看不懂吧。直到我真正去翻看的时候,才发现它写的多么好,我当时甚至都在疑惑写的这么清楚直白的怎么大家会说难,已经写的很清楚了还要其它什么书做铺垫干嘛。所以也还是不要全信网上的,得自己去感受,自己衡量。 这个问题就是小马过河,小马要过一条河,问小松鼠,小松鼠说河很深很深,问老牛,老牛说很浅很浅,小马跑回去问妈妈,妈妈说你自己过一下就知道了,小马自己去试了试,发现河不深也不浅。没想到小时候很简单的寓言其实是有大道理的。
除了算法导论这件事,我之前一直也觉得自己学的数学完全跟个没有学过一样,尽管我大学数学专业课绩点加权4.0,很多专业课都接近满分,数学学院院长说我很不错,但我感到自己什么数学都不会,我甚至觉得自己智商不太行,很低落。直到后来毕业后接触更多背景的人,我发现大家连高数都会说难,连线性代数都会说难,甚至有的人看数学书都会感到痛苦,还想睡觉,而且这样的人还很多,我感到很震惊。当时我看过工科的高数课本,觉得这些东西都可以放在初中,初中生都可以学,线性代数我都没正眼看过,觉得那么薄本书跟高等代数比起来也太弱鸡了吧…那些超级大学渣才跨考其它专业,因为这样就可以考高数而不用考数学分析,高等代数了…现在才想明白,学生时代我一直参加数学竞赛,周围的朋友都喜欢数学,大家一说难题都很兴奋滔滔不绝,经常想难题越想越兴奋,在毕业同学录上给我写满奇怪的符号,高中就有朋友在自学大学的数学,我高考完后才自学还觉得迟了,而且大家都是又努力思维又很好,属于又是天赋类型又努力类型,后来到了大学经常玩的朋友也是这种类型,这使得我每次在数学考满分或者接近满分的时候觉得我就应该是这个分数,没啥情绪波动,但下了90分就会感到自我价值受损…出了社会后接触人的类型和背景多起来,花了好些时间才让我感到自己好像还是可以的,没那么无底洞的差。
筛选你想要的资料
算法的书和资料有很多,它们的名字都取的一样,但是关注点是不一样的。有些资料关注在灌输算法的内容,比如一个排序都要给你弄几个方法出来,这种感觉就像是在问你,茴香豆有几种写法,如果一开始就以这种资料入手,你会感到压力大,这边又新出来一个算法,你会感到一辈子都要学习,学不完;有的就关注在算法背景,为什么会有它,它的出现是为了解决什么东西,每一种算法的出现都是为了解决问题。
我比较喜欢的资料是关注后者的。
这种思想也是在我毕业后产生的关注点变化。之前在学校看数学书,最喜欢看的就是证明过程,而书里面的其他文字我感到都是废话,精华肯定是公式啊,现在想来其实是考试导向使得我们关注点关注到公式的具体推导,然而工作后进入到真实环境,现在看书就不会一眼先看证明先看公式,而是喜欢关注它的发明是为了什么用。
大一的时候打数学建模比赛,我们组里面都是数学系的,就一门心思觉得要选公式看起来最难最复杂的,复杂的效果肯定好,不然人家那么复杂干嘛,然而复杂意味着难以理解,就只能看到最浅层那一面,那时候用模拟退火算法只因为它我看不懂,肯定就是好的,你都看不懂这个算法你咋用的好。旁边一组的人都不是数学专业,所以他们思想就刚好跟我们组相反,他们就是用最简单的算法,哪个简单用哪个,可能是看不懂,所以只能选最简单的,当时我们组还嘲笑他们用个Excel就想处理数据,还用了个很简单的算法,那么简单的怎么你们在搞笑吗。结果他们组后来得了国奖…我们组什么都没有…这个结果出来后我深深的反思了一下为什么,后来才想通,其实算法没有好和坏,只有适合不适合,拿到数据首先看它的数据特征,是根据数据特征来选择相应的适合的算法,而不是哪个难选哪个。所以这导致后来我在看每一个算法的时候都会先关注它适合解决哪类问题,当你遇到这样的数据你才会想到它,而不是陷入到证明的细节中去。细节其实多磨一下都能磨出来,关键是你遇到问题脑子中能有适合算法的备选项。
一个经典就够了
网上的好书好课很多,但是需要真切的去上一门经典课,看一门经典书。我最开始就是资料收集达人,收集一堆但是关键的不看。当你跟完一个系列,以后遇到类似问题的时候,心理就有数去看哪里的东西会让你搞明白这个问题,而不是漫天的Google看别人解读的信息。当你再次看到公众号里卖课的,别人的经验贴推送,别人又在回答里添加很多的链接,你不会感到慌,感到迷茫从哪里起,甚至看过好的资料,被好的资料喂养后,你就能自动的过滤低阶的信息。
其实入门最难,后来反而不难。新手在入一个新领域,因为不了解,总会在心理上造成很大的阻碍,这时候我的解决办法就是把入门这个东西当成一个项目,用一个小的项目管理软件把它分成小的步骤,做每个步骤的时候用番茄钟的专注模式做。刚开始可能得逼自己吧,毕竟刚开始是没有正反馈的,反正这门课我都是靠番茄钟逼自己的。
听不懂视频
我觉得视频带给我的是一些听不懂的名词,为了知道这些名词的意思去驱使看更多资料才是更重要的。这点我在大学也有过相似的经历。
【大学相似的经历】
大学的时候我就发现一个奇怪的现象。每当我课堂上能听懂的课,课下作业一下就解决完的课,最后期末考试成绩总是上不鸟90分,就算上了90分也是90+的低分段,跟我预期的“这门这么简单不考满分不太行”;而那些我上课听起来很吃力,做作业也很吃力,小小心心都不敢考虑能考几分的课,最后期末考试的分数总是接近满分。
对于这两类课我的处理方法是:
当课堂能听懂,我课下就根据教材稍稍看看,回顾一下,甚至连回顾都不用就能把作业做完,做完就关了书做其他的了。 代表课就是大一的数理统计和概率论,那时候和它同期的数据分析高等代数比起来,上概率论简直就是拿来休息的,不需要太用力就能全程听懂,也不需要动脑子就能做完作业,结果最后给我考了个88,当时看到这个成绩真的是让我好伤心。而同期的高等代数把我虐哭,每堂课都听不懂,做作业也做的吃力,期末花大量时间推公式,最后考了97。
而对于课堂不能听懂的课,脑子里有许多的名词,但是连不起来,也不知道这些名词是什么,就有非常强大的驱动力去想要搞懂,会去图书馆找很多的相关参考资料,然后为了一个主题会看不同书的解释。这种情况下把作业做了,把课堂的内容搞懂。一般情况下,一节90分钟的课,集中精力30分钟就能全部搞懂。因为其实课堂上已经听了很多碎片,只是没有完全想通,老师又讲的贼快,但看看其它书串串就能串起来。 这样的方法会让你理解比较深刻,当你想通串通了知识,你就会觉得它其实很简单的,以至于你有时候会想不通为什么其他童鞋搞不懂,经常有童鞋拿数学题来问我,我看了抽出了几个关键点后就给他们讲,我觉得关键点提出来了,每个点也走通了,而听的同学觉得,你讲的太快了,太抽象了,讲多了我就会脾气不好,同学就觉得我耐心不好…代表课是抽象代数,这门课期末全年级在老师严重扣分放水情况下仍然有三分之一的人没有及格,大片人踩及格线,年级上90分以上的只有两个,我用这样的方法那门课得了98分。当时以及到现在我也想不通为什么其它童鞋会考那么差,考这门课的时候我用40分钟就做完了,没觉得有什么区别,一般数学专业课我都能在40分钟搞定,甚至证明完最后一道大题放下笔的时候我还默默地在想,这门课怕是有好多满分吧,又是一门不能区分排名的课。最后的结果和我猜想简直完全相反。
主题学习还有个好处,因为看的多,你会越看越起劲,而且因为是问题驱动,你眼睛扫描的东西都很准,学的比较快,会感到比较轻松,以至于我有期就觉得数学专业课有点少,于是萌生了想要提前修上一级的课,想要提前1年毕业,于是我就给数学学院申请给我诺两门高一级的专业课让我本期上,最后选到了,但那期也累惨了。
主题学习的坏处也有,你会感到自己什么都不会,即使当时我的专业课绩点是4.0,很多数学专业课都接近满分,即使当时的辅导员和数学院院长都说我不错,但我依然深深的感到自己好差好差,没有人比我更差,以至于毕业后我对自己的判断一直严重低于市场对我的判断,我一直感觉自己是没有人要的辣鸡,你最后的选择都是取决于你觉得自己是谁,现在觉得盲目自信比自卑好很多。
我甚至还试过,既然搞懂的点是在自己参考更多的书,主要人是自己,那就不需要去课堂听老师的课了。然而当我这么实践的时候,我发现效率很低,书也看不进去,进度反而慢了。所以关键点就是在课堂上听些名词,让这些名词在脑海里转啊转,我当时自己把这个过程叫‘打点’,因为这些‘点’才会产生大的驱动力去参考更多的资料,我当时把这个搞懂这些点的过程叫‘连线’。
工作后也有这样的情况: 没事的时候看文档怎么也看不进去,自己的代码里发现了一个bug恨不得把文档上的每个字都扣下来。
【相似的读书理论】
后来我发现其实别人已经总结过方法的,一个读书方法就叫‘影像阅读法’,其中有一步就是‘寻找触发词’,是说先把书整体快速翻一遍找到其中存在感比较强的词。你会这些词产生好奇,想要知道它是什么。下一步就是‘激活触发词’,就是再细读去解答之前的‘触发词’。
所以其实在课堂上听课但听不懂也是有意义的,是在听‘触发词’,这些触发词会驱使你去看更多的资料‘激活’。
【最后的感悟】
”为一个目标努力,收获的从来不是目标本身,做难的事情,会拓宽自己的认知边界,放弃一个目标也不是放弃目标本身,同时也放弃了与该目标类似的难题们。“
后来我还把deepleaning.ai那几门课看了,之前看网课之前从来不会想过自己能看完,因为之前看过一个调查,说网课的完成率非常低,自己做完这件事情之前会把 自己代入”完不成的人“,因为是先验概率~,自己做完后,就会把自己代入少数人的群体。因为行动已经为我的角色投了票。
之前看《微习惯》的时候,里面说你要做成一件事情,很重要的前提就是你要找到你的身份认同,你要认同你的身份,你的每一次行动都是为这个角色投票。而本文里面正好是先行动,再改变自己的身份认同。