本文作者胡光
前百度高级算法研发工程师,ACM 国际大学生程序设计大赛亚洲区金牌获得者
他曾经是百度高级算法研发工程师。在百度期间,他开发了部门内部的第一版推理引擎,并顺利在人物关系推理等应用场景中落地实施。他的算法之路很早就开始了。高中上大学,他靠的是算法竞赛的保送名额。大学期间,他还参加了 ACM 国际大学生程序设计大赛,拿到了亚洲区金牌,进过两次 ACM 全球总决赛。可以这么说,他的算法知识,是在激烈的竞赛环境中积累起来的。
算法到底有多重要,这已经是一个老生常谈的话题了。
我相信,你在看这个课程之前,肯定也看过非常多的文章,这些文章都从不同的角度告诉你,为什么要学算法,以及怎么学。
但你真的学会了吗?就像有很多的学生,在和我学习算法之前,会问我这几个问题:
- 我知道算法很重要,但是工作中好像总也用不到。
- 我为了面试学算法,刷了那么多题,遇到新题还是不会怎么办?
- 这么多算法知识,总是学了又忘,忘了又学,怎么才算学会呢?
如果你也有同样的疑问,那说明你真没学好算法。想要学好算法,我们必须要纠正几个误区。
误区一:学算法就是为了面试,工作中根本没用
很多大厂的面试都要考算法,所以很多人学算法,就只是为了面试,他们把算法当成了一种应用技术。这会导致我们在学算法的时候,只关注能不能用某个算法解决某个问题。当解决不了这个问题的时候,算法自然就显得“没用”了。
可我想说,有些知识的学习是面向当下的。例如,我想用命令操作一个服务器,那我学习相关命令的使用就行了,不用去了解操作系统底层。而有些知识的学习,是面向未来的,就像算法学习。
为了更形象地说明这一点,我想给你讲一个建筑工人村头老王的故事。首先,我想问你一个问题,如果我让你盖一个“茅草屋”,你会做些什么准备?你会去学习建筑艺术,还是去学习相关的计算机设计软件,又或者是去了解相关知识?
如果你真的去盖了房子,就会发现这些准备都是无用的。因为即便是村头的“王大爷”,在不了解这些专业知识的情况下,也能用现有的材料,给你盖一个像样的茅草屋。那么问题来了,会盖茅草屋就等于懂建筑吗?当然不是。因为我们重复盖 20 次茅草屋,也盖不出 20 层楼。所以,知识有没有用,主要是看你要实现的目标是什么。
如果你要实现的目标,就是盖一个茅草屋,那么建筑学相关的知识很多都是用不上的,凭感觉盖就行了。而如果你的目标是盖 20 层的高楼,那你真的需要花很多时间来学习大量的理论知识。理论与实践永远都是相辅相成的,没有理论的实践会丧失高度,没有实践的理论也会变得空洞无用。
编程或者说我们的程序设计之路,就像是去盖这 20 层高楼,我们必须要学习大量的基础理论知识才能走得更稳,算法就是其中非常重要的基石。
误区二:学数据结构和算法 = 走“弯路”
抛开面试,我们再来谈谈工作。
在 IT 企业中流传着一句老话:大公司造轮子,小公司用轮子。越是大型的互联网公司,自己造的轮子越多。因此,快速掌握行业知识的能力,也是我们必须要具备的核心竞争力。这都是建立在拥有大量专业基础知识之上的。
如果说应用知识标记了你在行业跑道中的距离,基础知识就是你在行业跑道中的加速度。一个加速度大的人,即便他在一开始是落后的,通过几年的发展,最终也会赶上那些起点很高,但速度很慢的人。
可是很多人并不注重基础知识。举个简单的例子,我教过一些学生,他们在最开始学习写代码的时候,就是把代码写出来而已。一旦他们的代码运行出错,就会跑过来问我到底是怎么回事儿。因为他们认为,写代码就是写代码,找代码的错误就是在“走弯路”。可实际上,写代码的目标并不是把代码写出来,而是用代码将逻辑正确地表达出来。只有找到自己代码中的错误,才能使自己的代码能力真正得到增长。
这其实也是我们学习数据结构和算法的意义。换句话说,我们要根据数据的性质,用一套合适的计算流程把它们写到计算机中,然后表达出我们想要的逻辑。
总的来说,我认为,在学习中犯错不是在走弯路,学习基础知识也不是在走弯路,而正是这些所谓的“弯路”才是通往行业核心的真正捷径。所以我说的捷径,其实就是在学习过程中,多给自己一些耐心、努力,找对真正有用的学习方法。这也是我做这门课的初衷。想想我们将来要面对的几十年行业生涯,除了学习应用技术外,多花几个月时间在基础知识的学习上,我觉得一点儿都不多,甚至很划算。
误区三:算法我自己能学,没必要跟老师学
有些同学可能会问,那算法一定要跟着老师学吗?在回答这个问题之前,我想先问你一个事儿:去肯德基点东西的时候,如果多点一个蛋挞会让你这顿饭吃得更满足,你会不会点?我想咱们的答案应该是一样的,肯定会点。
其实肯德基这个例子,就已经回答了最开始的问题,需要跟老师学么?答案就是,不冲突。咱们假设,你现在可选的学习方式有:看技术博客 + 看书学习。那么所谓的跟老师学习,不是剥夺了你看技术博客和看书学习的权利,而是作为你现有学习方法的一种补充。老师的作用,也不是单纯的知识灌输。一个好的老师,最主要的作用,是帮助你抓住学习重点,帮助你规范你的训练方法,帮助你提高学习效率。
所以,跟着老师学习,是对你现有学习方法的补充。如果你自己就能学好,那么跟着一个老师学,肯定会学得更好。只是,你需要选择一个好的老师。尤其是计算机领域的好老师,需要理论和实战两手抓两手硬,这就非常难找。如果你真的碰到了好老师,跟他学,准没错的。
最后,你一定要记住,学习算法最重要的,是学习算法的设计过程,而不是算法本身。
接下来我会继续分享:数据结构与算法学习的方法、实际工作中经常用的三类算法、最重要的数据结构与算法、生活中的算法等系列内容。如果你也对算法感兴趣的话,可以先关注我哦。