前言

此文对我影响很大,分享出来给大家,愿大家早日成为大神。

1)不要完美主义!

我观察到的大多数同学犯得最最最最大的“错误”,就是在学习上“完美主义”。乃至后续很多其他的问题,在我看来都和这个问题是直接相关的。

举个最经典的例子,也是我经常举的例子,背英语单词(在这里我们先不聊背英语单词是不是好的英语学习方法,我们只看如果我们想要背英语单词的话,应该怎么背)。

我发现很多同学拿着红宝书,第一个list都没翻过去就放弃了。这是因为每天背完第一个 list 以后,第二天会发现:第一个list还是有很多单词没掌握,然后就继续背第一个 list。然后一周后,发现自己第一个 list 都搞不定,觉得英语好难,彻底放弃了。这就是“完美主义”:不把第一个 list “彻底”掌握不肯继续前进。这样是不对的。背了一个list,能多记一个词,都是进步。就算一个词都没记住,模糊有了印象,也是一种进步。

我们不应该过度着眼于我们还不够完美。

学习不是要么 0 分,要么 100 分的。80 分是收获;60 分是收获;20 分也是收获。有收获最重要。但是因为着眼于自己的不完美,最终放弃了,那就是彻底的 0 分了。

仔细想,这种“完美主义害死人”的例子特别多。我看到过很多同学,其实是在学习的路上,被自己的“完美主义”逼得“放弃了”——由于学习中有一点没有做好,遭受到了一点点挫折,最终就放弃了整个学习计划。每个人都一定要接受自己的不完美。想开一点:我们都不是小升初考了满分,才能上初中的;也不是中考考了满分,才能读高中的;更不是高考考了满分,才能念大学的;将来也不会是大学所有科目都是满分,才能出来工作。不完美其实是常态,根本不会影响我们学习更多更深入的内容。但是在自学过程中,很多同学却要求自己在自己制定的每一步计划中都达到“完美”,才进行下一步。最终结果,通常都是“放弃”:(

可能有的同学会跳出来反驳我:学习当然要认真啊!在这里,我必须强调,我所说的“不要完美主义”,和“学习认真”是不冲突的

什么是“完美主义”,什么又是“囫囵吞枣”,这是一个“度”,每个人其实不一样。不要“完美主义”,不代表学习可以草率前行。

每个人都必须要找到适合自己的学习节奏。我的经验是:在一些情况下,问自己一句:是不是自己又犯“完美主义”的毛病了:)

2)不要过度“学习路径依赖”,学习要冲着自己的目标去。

什么意思?就是现在信息太发达了,对于大多数领域的知识,网上会有很多所谓的“学习路径”。我不是说这些学习路径没有用,但是不能“过度”依赖这些所谓的学习路径。

比如,很多同学想学机器学习,大多数学习路径都会告诉你,机器学习需要数学基础。于是,很多同学就转而学习数学去了,非要先把数学学好再去学机器学习。可是发现数学怎么也学不好(在这里,可能完美主义的毛病又犯了),而机器学习却一点儿都没学。最终放弃了机器学习,非常可惜。

其实,如果真正去接触机器学习,就会发现,至少在入门阶段,机器学习对数学的要求没有那么高。正因为如此,我一直建议:只要你在本科接触过高数,线数,概率这些科目的基础概念,想学机器学习,就去直接学习机器学习。学习过程中发现自己的数学不够用,再回头补数学。在这种情况下,数学学习得也更有目标性,其实效果更好。

类似这样的例子还有很多,很多同学想学习做 iOS app,就先去精通 Swift 语言,或者想做android app,就先去精通 java 语言。在我看来大可不必。以我的经验,只要你有一门编译型语言基础,大概看一下这些语言的基础语法,就可以直接上手 iOS 或者 android app 的开发了。先能做出一个最基本的 app,在这个过程中,就会意识到语言特性的意义,再回头深入研究语言也不迟。此时还能结合真实的开发任务去理解语言特性,比没有上手 app 开发,抽象地理解语言特性,有意义的多。

虽然我一再强调对预算法的学习,语言不重要,但还是有很多同学表示,要先把 C++ 学透,再回来把课程中的算法学好。这是完全没必要的。事实上,在我的这两门课程中,我看到的收获最大的同学,是那些能够把课程中的算法思想理解清楚,然后用自己熟悉的语言去实现的同学:)

依然是:不要“过度”学习路径依赖,什么叫“过度”,每个人的标准不一样。每个人都需要寻找自己的那个“度”。

3) 不要迷信权威的“好”教材。

不是说权威教材不好,而是每一本教材都有其预设的读者群,如果你不在这个预设的读者群的范畴里,教材再好也没用。最简单的例子:再好的高数教材,对于小学生来说,都是一堆废纸。

我经常举的一个例子是《算法导论》。我个人建议如果你是研究生或者博士生,已经有了一定的算法底子,才应该去阅读《算法导论》,我在我的课程的问答区,也谈过如何学习使用算法导论。

但是对大多数本科同学,尤其是第一次接触算法的同学,《算法导论》实在不是一个好的教材。

但很可惜,很多同学在学习中有上面的两个毛病,既过度路径依赖,别人说《算法导论》好,学习算法要走学《算法导论》这个路径,自己就不探索其他更适合自己的学习路径了,一头扎进《算法导论》里;同时还“完美主义”,对于《算法导论》的前几章,学习的事无巨细,但其实接触了很多在初学算法时没必要学习的内容。最后终于觉得自己学不下去了,放弃了对“算法”整个学科的学习。认为算法太难了。

诚然,算法不容易,但是,一上来就抱着《算法导论》啃,实在是选择了一条完全没必要的,更难的,甚至可能是根本走不通的路。对于一个领域的学习,了解市面上有什么好的教材是必要的,单也不能迷信权威教材。每个人必须要去探索学习如何寻找适合自己的学习材料。

4)不要看不起“薄薄”的“傻”教材,这些你看不起的学习材料,可能是你入门某个领域的关键。

很多同学问我最初学习算法的是什么教材,我告诉他们是这本教材:《算法设计与分析基础》 。在这里,我完全没有推荐这本教材的意思。事实上,现在我有点儿“鄙视”这本教材。因为我在学习它的过程中,发现这本教材有很多错误(帮助它纠正错误其实也提高了我的水平:)

当然,现在这本书的版本可能也和我当时学习的版本不同了,大部分错误应该已经纠正了。)但它确实是我的一本很重要的算法启蒙教材。

关键原因是,它够薄。

在大多数时候,如果有人问我教材推荐,基本上我的回答都是,如果是入门水平:随便找一本在京东,亚马逊,豆瓣上,评分不太差的“薄”的教材,就 ok 了。

在这里,关键字是够“薄”。

因为“薄”的教材能让你以最快的速度看完,对整个学科有一个全盘的认识:这个领域是做什么的?解决什么问题了?整体解决问题的思路是怎样?解决问题的方法大致是怎样划分的?一些最基础的方法具体是怎样的。这些在初学阶段是至关重要!是让你全盘把握整个领域脉络的。

虽然通过这么一本薄薄的教材,你的脉络把握肯定不够全面细致,但比没有强太多!我看过不少同学,一上来学习《算法导论》,关于复杂度分析的笔记做了好几页,然后就放弃了,可是连什么是动态规划都不知道。这样完全没有对“算法”这个领域有全面的认识,甚至可以说根本没有学过“算法”!

先用薄教材入门,再找“厚”教材,细细体会其中的细节,是我百试不爽的学习方法。

另外,在这里,我还要强调“入门教材”,很多教材虽然够“薄”,但不是“入门教材”。大家要注意。

5)不要迷信单一教材。

很多同学理解了要找“薄”教材入门的道理,却还是非要我推荐一本具体的“薄”教材,说实话,很多时候这让我有点儿哭笑不得。

因为我随便推荐一本,我确实不敢保证它是“最好的”,“最适合你的”,但是各个领域那么多教材,我又不可能都一一看过,一一比较过。

最最重要的是,我的学习经验告诉我,在大多数情况下,学习不是一本固定教材可以搞定的。

非要找到一本“最适合自己的”教材,然后就一头扎进去,其实是不科学的。我印象很深刻,我读本科的时候,那会儿申请了一个项目,要做一个网站(那时候服务端都用 ASP.NET ),我一口气从图书馆借了 10 本 ASP.NET 的教材,然后以一本最薄的书为主干去看,发现这本书介绍不清楚的概念,马上就从其他书里找答案。

通常不同的作者对同一个事物从不同的角度做解读,是能够帮助你更深刻的认识一个概念的。基本上一个月的时间,我就从一个完全的网站搭建小白,做出了这个项目需要的那个网站。

这个习惯我一直延续,研究生的时候,对什么领域感兴趣了,第一件事就是到图书馆,借十本相关书籍回来翻看。

但是,大多数同学喜欢仅仅扎进一本书里,一旦选定了自己的学习材料,就对其他材料充耳不闻,甚至是排斥的心理。这种做法,一方面又是“完美主义”的表现——非要把这本教材学透;另一方面,其实也是“犯懒”的表现,不愿意多翻翻,多看看,自己多比较比较,自己去寻找最适合自己的材料,一味地盲目相信所谓“大神”的推荐,殊不知,这些推荐,不一定是更适合自己的材料;更何况,还有很多大神,明明是靠不出名的“薄”教材入的门,但给别人做推荐的时候,就突然变成自己是算法奇才,自幼阅读《算法导论》而所成的神话了:)

6)实践

前面说了很多和教材选择相关的话题,但对于计算机领域的学习来说,教材的意义其实远远小于实践的意义。如果仅仅是看学习材料就是学习的话,那么慕课网的视频后期处理人员就是水平最高的工程师了。因为每段视频,他们都需要看一遍。但是,很显然,仅仅是看视频,是无法学到知识的。

对于计算机领域的学习来说,真正动手实践去编程是异常重要的。怎么夸大其中的作用都不过分。

这就好比学游泳,必须下水去游泳;或者学开车,必须亲自上路。

否则你说的再头头是道,一个小学生文化水平的人,只要他开过车,游过泳,都能在这两个领域瞬间秒杀你。

很多同学都说我的算法讲得好,其实,我一直认为,这其中的一个最简单的秘诀就是:我带领大家把大多数算法都非常细致的实现了一遍;或者对其中的应用进行了非常具体的实践。

反观大多数高校教育,对于算法或者机器学习这种一定程度偏理论的学习,通常非常不强调实践。最终的结果是学习者只是接受了很多抽象的概念,但对其中具体的实现细节,却是云里雾里。

我见过太多同学,都明白什么是 O(n^2) 复杂度,什么是 O(nlogn) 的复杂度,却问我对于 100 万的数据规模,为什么自己的选择排序运行起来就没反应了。答案很简单:O(n^2) 的复杂度太慢了,100 万的数据规模太大了,一般家用计算机转选择排序一时半会儿是转不完的。这些同学一定理解 O(n^2) 的算法比 O(nlogn) 的算法慢,却没有真正实践过,不知道这个差距到底是多少。

在我的课程中,经常遇到有些同学提出这样的问题:这个算法的某句话(或者某段逻辑),为什么要写成 A 的样子,而不是 B 的样子?这种问题其实很好,但我觉得解决方法也很简单,实际的去把算法改写成 B 的样子,实际的运行试试看,看会发生什么。如果发生了错误,仔细分析一下,为什么会有错误?如果没有错误,具体比较一下:A和B两种不同的写法,为什么都正确?又有什么区别?

真正的学习上的提高,就发生在这个过程中。

我当然可以告诉给同学们一个结果,但是自己亲自实践一遍,相比阅读我给出的一个答案,自己对其中问题理解的深刻程度,是完全不可比拟的。

7)debug非常非常重要。

我看到的另一类“经典”问题就是:老师,这个代码为什么错了,然后贴一大段代码。这种问题背后,依然是,透露着学习方法的不对劲:提问的同学懒得 debug 。

在计算机领域,debug 近乎和实践是一个意思。如果只是把材料上的代码“抄”一遍,这不叫实践,这叫抄代码。小学生也能做。但是“抄”一遍,不小心没抄对,发生了错误,然后自己一点一点调试,找到错误的根源,这叫真的实践。小学生不能做。(当然,我更推崇的是:自己理解了算法的逻辑,按照自己的理解,把算法写出来:)

不过很多同学不喜欢 debug,我当然理解。其实谁都不喜欢 debug ,但是,debug 才是最重要的能力。(通常在一个领域里,你最不喜欢做的事情,就是这个领域的核心竞争力:)是计算机领域异常重要的一项技能。我见过的所有计算机领域的“高手”,不管是在哪个细分领域,都无一例外,是个 debug 好手。我经常告诉大家,在实际工作中,其实 debug 的时间要占你真正编程时间的 70%。如果你做一个项目,根本不需要 debug ,要么是你的项目对你来说太简单了,要么是你根本没有接触到这个项目的核心。

debug 不仅仅是找到代码错误,解决错误的手段,其实更是一个重要的学习手段。通过 debug,看看自己写的程序执行逻辑,哪里和自己设想的不一致?再回头看自己哪里想错了,或者想漏了,分析一下自己为什么想错了,或者想漏了,等等等等,依然是,进步就是发生在这个过程的。

在我的算法课程中,很多同学对递归想不明白,我的建议都是:用一个小数据量,一步步跟踪程序,看看程序到底是怎么运行的。通常这么做,1 个小时的时间,就足以让你深刻理解递归程序的运转逻辑。可是,很多同学懒得花这1个小时的时间,最终的结果是,花了一个下午,对着代码生看,硬想,最终还是没有理解程序的运转逻辑。

8)量变到质变。

还有很多同学,对于算法的一些问题,会问:老师,你是怎么想到用这样的方法的?对于这类问题,我的回答一般都是:你见的还不够多。

不知道是不是受高中阶段学习的影响,有一些同学特别执着于就着一个单一的问题,寻找其中的“解题路径”。当然,我不是说这是完全错误的,但也有一个“度”。

我的经验是:与其把时间花在这里,不如去见更多问题

比如动态规划,是算法学习的一个难点,很多同学在学会了背包问题的解法之后,总是执着于去追寻:是怎么想到这种状态定义的方法的。可能是我个人水平有限,我无法清楚地解释是如何想到这种状态定义的方法的。但是我的经验告诉我:再去看,去实践 100 个动态规划相关的问题,然后回头看背包问题,你会发现这种状态定义的方式非常自然。

仅仅对着一个问题思考,很多时候都是死胡同。你见识的还不够多,就不足以帮助你总结出更加“普遍”的问题解决的规律。当你见得足够多的时候,一切就都变得很自然,所谓的“量变到质变”。

不过,大多数同学在这个环节都会“犯懒”,企图通过一个问题就理解问题的本质,这其实和企图通过一本教材就精通一个领域的想法是一样的,是不现实的,不可能的。同时,这里又包含着学习过程中的“完美主义”的思想,遇到一个问题一定要把它想的无比透彻。但是我的经验告诉我:大多数问题,其实都是需要“回头看”的。随着你对一个领域理解的越深入,回头再去看那些曾经的问题,都会产生新的视角,对于很多曾经想不明白的问题也豁然开朗。这也是“进步”的根源。如果卡在一个问题上不前进,不给自己“回头看”的机会,甚至最后是放弃了,就什么也没有学会了。

所以,很多时候,你发现对一些问题“百思不得其解”,或许不是因为自己“笨”,而是因为“还不够努力”:)

9)最后,一定要相信时间的力量。

有一天,在我的一个算法课程群里,有个滴滴的后端大神发招聘,结果大家七嘴八舌的就议论开了,大致主题思想就是:自己什么时候能够成为滴滴的后端大神。这位滴滴的后端大神今年 32 岁;大多数议论的同学,其实连 22 岁都不到。我告诉他们,其实 10 年后,你们就是大神。

这其实很好理解,回想十年前,也就是 12 岁的你,和现在的你比较,是不是天壤之别?如果把你扔到一堆 12 岁的小朋友中间,22 岁的你是不是就是个大神?同理,32 岁的人,已经在业界摸爬滚打了那么多年,扔回到22岁的大学生中间,当然是大神:)

很多时候,所谓的“大神”并不神秘,很多时候,仔细观察,会发现时间有着不可磨灭的作用。只要你没有虚度时间,每天都在进步,通常结果都不会太差的。如果再加上一点点机遇,可能就不仅仅是大神。

愿大家也早日成为大神。

End

本文作者为 liuyubobobo,算法大牛,ACM亚洲区奖牌获得者,现居美国,创业者。bobo老师对我影响极大,我的算法入门和进阶都是靠他的指导,希望此篇文章对大家有帮助~

愿大家也早日成为大神。

乐于输出干货的算法技术公众号:「五分钟学算法」。公众号内有 100 多篇原创技术文章、精美动画配图,不妨来关注一下!

转载于:https://www.cnblogs.com/fivestudy/p/10521687.html

六千字干货文:到底要怎么去学算法?相关推荐

  1. 直播聊天室的无限用户优化实践(六千字技术文)

    融云近期推出直播 SDK,两步即可实现视频直播能力.在第二步"开始直播"阶段,调用一个接口就能发布视频流,其他用户便可加入房间观看直播并在公屏发送弹幕与主播互动.移步[融云全球互联 ...

  2. 《程序员修炼之道:从小工到专家》六千字读后总结

    <程序员修炼之道:从小工到专家>六千字读后总结 读完这本书,其实花的时间并不多,因为我自己有些基本的认知.这里主要是记录了一下当时的思考和总结,仅是我个人思考与经验. 这本书和极客时间的& ...

  3. 我花了三个小时写了一道题的六千字题解....(POJ 2888 Magic Bracelet)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 前置知识:小学生都能看懂的群论从入门到升天教程 <群论全家桶> 一道简单的题目 Probl ...

  4. Mysql安装配置和Mysql使用六千字详解!!

    目录 课前导读 一.Mysql的安装和配置 二.数据库简介: 1.数据库中典型代表: 2.数据库类型: 3.Mysql简介: 4.客户端和服务器简介: 三.初始MySQL 四.数据库操作 五.表的基本 ...

  5. 一万六千字的MySQL数据库操作详细教学,看完别说你不会

    1.做测试为什么需要学习数据库? (1)只有会数据库操作,才能更全面准确的开展功能测试: (2)测试环境搭建:web系统里有数据库,你就必须会数据库,从而搭建好环境,开展测试: (3)为性能测试做准备 ...

  6. 【跨保985计算机】2022跨保实录|六千字保姆教程

    文章目录 一.我的基本背景 二.跨保规划 决定的勇气: 决定后规划: 1.第一步:主专业成绩排名. 2.第二步:辅修,408专业课. 3.第三步:算法基础. 4.第四步:计算机相关科研经历与项目. 科 ...

  7. 大学毕业论文字数有上限吗,我写了一万六千字,指导老师让我删掉一万字关键第二天就要交,怎么办?...

    毕业论文的字数是有学校规定限制的,一般本科的字数为8000-12000字, 也有一些学校的字数要求是2万以上,不同学校的要求不同,建议你下载下 本校的毕业写作规范,上面会有明细的要求,包括写多少字,查 ...

  8. [硬核]卷起来!两万六千字总结的JavaWeb核心技术学习笔记

    文章目录 前言 http协议笔记 JavaWEB笔记_1 JavaWEB笔记_2(JSP) JavaWEB笔记_3(web项目) Servlet Tomcat笔记 总结 前言 大家好,我是ChinaM ...

  9. hashmap取值_一万六千字的HashMap深度剖析

    概论 HashMap 是无论在工作还是面试中都非常常见常考的数据结构.比如 Leetcode 第一题 Two Sum 的某种变种的最优解就是需要用到 HashMap 的,高频考题 LRU Cache ...

  10. 论文超详细精读|六千字:ST-GCN

    文章目录 前言 总览 一.Introduction 背景与局限 解决问题思路 新方法及主要贡献 二.Related work Neural Networks on Graphs(图神经网络) Skel ...

最新文章

  1. php curl 下载网页,php 通过cURL函数抓取网页、下载网页的简单示例
  2. json可视化编辑器_推荐一个基于 Vue 的前端界面可视化设计器项目
  3. pandas读取excel,设置默认读取类型
  4. /dev/null 21
  5. SAP Hybris Accelerator和SAP Spartacus的比较
  6. 西安电子科技大学研究生计算机专业王宇平教授学生就业岗位,西安电子科技大学计算机学院导师信息情况...
  7. 图 之遍历----深度优先遍历0.o
  8. Java 导出 Excel 文件
  9. JDK 动态代理与 CGLIB 动态代理,它俩真的不一样
  10. 嘌呤含量高的食物大全
  11. 趋势科技修复已遭利用的 Apex Central 0day
  12. java 子类 继承父类的注解,spring使用注解通过子类注入父类的私有变量
  13. mybatis 插件
  14. 【ubuntu如何卸载mysql(ubuntu卸载mysql的具体方法)】
  15. Java 嵌入 SPL 轻松实现 Excel 文件合并
  16. 条件覆盖,路径覆盖,语句覆盖,分支覆盖
  17. 【公开课】国内外公开课网址
  18. hadoop集群安装配置Kerberos(二):搭建kerberos基础环境(主从kdc)
  19. avaya基本配置方法
  20. Modelica示例——比较器电路

热门文章

  1. cp 时间长 linux,为了节省cp命令时间,结果换来了重装linux系统的差事
  2. 二十四、K8s集群强化2-授权
  3. STP中各算法接口开销(COST)计算方式
  4. [C语言循环应用]--打印字符金字塔
  5. Linux之DNS配置及案例
  6. HDOJ--2066--一个人的旅行
  7. NYOJ -11--奇偶数分离
  8. python基础08
  9. 通过命令行运行java出现错误: 找不到或无法加载主类 解决办法
  10. 给我一个软件,我将操控一个机器人军团!