比尔·盖茨曾说过:“如果你自以为是一个很好的程序员,请去读读Donald E. Knuth的《计算机程序设计艺术》吧……要是你真把它读下来了,就毫无疑问可以给我递简历了。”虽然比尔·盖茨推荐的是《计算机程序设计艺术》这本书,但是本质却折射出了算法的重要性。
大家好,我是Jerry银银,购买过算法专栏的同学应该时不时会看到我的留言!目前我是一名Android应用开发工程师,主要从事移动互联网教育软件的研发,坐标上海。
我为何要学算法?
细细想来,从毕业到现在,7年多的时间,我的脑海里一直没有停止过思考这样一个问题:技术人究竟能够走多远,技术人的路究竟该如何走下去?相信很多技术人应该有同样的感受,因为技术的更新迭代实在是太快了,但是我心里明白:我得为长远做打算,否则,就算换公司、换工作,可能本质也不会有什么改变。
但是,我其实不太清楚自己到底应该往什么地方努力。于是,我翻阅了好多书籍,搜寻IT领域各种牛人的观点。多方比较之后,我终于决定,从基础开始,从计算机领域最基础、最重要的一门课开始。毫无疑问,这门课就是数据结构和算法。
我是如何遇见极客时间的?
既然找到了方向,那就开始吧。可是问题来了,从哪儿开始呢?大方向虽然有了,可是具体的实现细节还是得慢慢摸索。大学没怎么学,工作这么多年也没有刻意练习,起初我还真不知道从哪儿开始,只是买了本书,慢慢地啃,也找了一些简单的题目开始做。有过自学经历的同学,应该有同感吧?刚开始连单链表翻转这样简单的题都要折腾半天,真心觉得“痛苦”。
之前我在极客时间上订阅过“Java核心技术36讲”,体会到了专栏和书本的不同。极客时间的专栏作者都是有着丰富的一线开发经验,能很好地把知识和实战结合在一起的大牛。这些课听起来非常爽。估计你应该经常跟我一样感叹:“哦!原来这些知识还可以这么使用!”当时我就在想,极客时间啥时候有一门算法课就好了。
说来真是巧,没多久,极客时间就推出了“数据结构与算法之美”。我试读了《为什么要学习数据结构和算法》和《数组:为什么很多编程语言中数组都从0开始编号?》这两篇之后,立即购买了。
到现在,专栏学完了,但是我依然记得,王争老师在《为什么要学习数据结构和算法》这篇文章里面提到的三句话,因为这每一句话都刺痛了我的小心脏!
第一句:业务开发工程师,你真的愿意做一辈子CRUD Boy吗?
第二句:基础架构研发工程师,写出达到开源水平的框架才是你的目标!
第三句:对编程还有追求?不想被行业淘汰?那就不要只会写凑合能用的代码!
我每天是怎么学专栏的?
于是,每天早上醒来,我的第一件事就是听专栏!专栏在每周的一、三、五更新,每周的这三天早上,我会听更新的文章。其它时间,我就听老的文章,当作复习。
听的过程,我一般会分这么几种情况。
第一种情况,更新的内容是我之前就已经学过的,基本已经掌握了的。这种情况下,听起来相对轻松点,基本上听一遍就够了。起床之后,再做一下老师给的思考题。这种情况在专栏的基础部分出现得比较多,像数组、链表、栈、队列、哈希表这些章节,我基本上都是这么过来的。
第二种情况,更新的内容是我学过的,但是还不太精通的。这种情况下,王争老师讲的内容都会将我的认知往前“推进”一步。顺利的话,我会在上班之前就搞懂今天更新的内容。这种情况是曾经没有接触过的内容,但是整体来说不难的理解的,比如跳表、递归等。
还有一种情况,就是听一遍不够,听完再看一遍也不行,上午上班之前也搞不定的。不过,我也不会急躁。我心里知道,我可能需要换换脑子,说不定,在上午工作期间,灵感会突然冒出来。这种情况一般出现在红黑树、字符串查找算法、动态规划这些章节。
到了中午休息时间,我会一个人在公司楼下转一圈,同样,还是听专栏、看专栏。
如果今天的文章,早上已经搞定了,我会重新看下其他同学的留言,看看其他同学是如何思考文章的课后思考题的,还有就是,我会看看其他同学学习过程中,会有哪些疑问,这些疑问自己曾经是否遇到过,现在是否已经完全解决了。
如果今天的文章,早上没有彻底搞懂,这种情况下,我会极力利用中午的时间去思考。
晚上的时间通常无法确定,我有时候会加班到很晚,回到家,再去啃算法,效率也不高。所以,我一般会在晚上“看”算法。为什么我会用双引号呢?是因为我真得只是“看”,目的就是加深印象。
以上基本是我工作日学专栏的“套路”。
等到了周末或者其它节假日,就是“打攻坚战”的时候了。估计很多上班族和我一样,只有周末才有大量集中思考的时间。这时候,我一般会通过做题来反向推动自己的算法学习。
像红黑树、Trie树、递归、动态规划这些内容,我都是在周末和节假日搞懂的。虽然到现在对其中一些知识还不能达到游刃有余的地步,但是对一般的问题,大体上我都知道该如何抽象、如何拆解了。


通过学习专栏,我有什么不一样的收获?
首先,专栏学习拓宽了我的知识面。例如,很多书本不讲的跳表,王争老师用了一篇文章来讲解。犹记得当我看完跳表时,心想,这么简单、易懂、高效的数据结构,为什么很多书籍都没有呢?这个专栏真的买值了!
其次,专栏的理论和实践结合很强。书籍是通用性很强的教材,一般很少会涉及软件系统是如何使用具体的数据结构和算法的。在专栏中,老师把对应的知识和实践相互结合,听起来特别过瘾!比如堆这种数据结构,理解起来不难,但是要用好它,还得下点功夫,经过老师一讲解,搭配音频,我的理解也变得更加深入了。
最后,专栏留言这个功能真的太好了,为自学带来了诸多便利,也让我获得了很多正向反馈。很多时候,经过相当长的一段时间思考,还是不能打通任督二脉,其实后来回想,当时就差那一层窗户纸了。于是,我在文末留下了自己的疑问,结果王争老师轻描淡写一句话我就明白了。
留言功能还有个非常大的好处。如果你用心学习,用心思考,用心留言,你的留言很大概率会被同伴点赞,很多时候还能被置顶。这本身就是一种正向反馈,也会更加促进自己的学习动力。还有一种更爽的体验,突然有一天早上,我照例醒来听专栏,突然听到了自己的名字。这个专栏4万多人订阅,老师居然记得我!可见王争老师真的认真看了每一条留言。
最后,我总结下自己学这个专栏的收获。尽管很多,但是我想用三句话来概括。
第一,写代码的时候,我会很自然地从时间和空间角度去衡量代码的优劣,时间、空间意识被加强了很多。
第二,学习算法的过程,有很多的“痛苦”,也正是因为这些“痛苦”,我学到了很多知识以外的东西。
第三,过程可能比知识更重要。要从过程中体会成长和精进的乐趣,而知识是附加产品!
专栏虽然结束,但是学习并没有结束。同学们,我们开头见!
精选留言
2019-02-13 08:28:43
2019-02-13 08:47:12
吴军老师说过:
基础理论知识是一个人的基线,理论越强基线越高。再为自己定一个目标和向上攀附的阶梯,那么达到目标就是时间问题。
而很多野路子工程师搞了半辈子也未达到优秀工程师的基线。很多他们绞尽脑汁得出的高深学问,不过是正规工程师看起来很自然的东西。
关于工程师发展路线,或是成长阶段,吴军老师给出了一个参考(每一级能力相差一个数量级):
- 第五级: 能独立解决问题完成工程工作
- 熟练应用工程知识和技能,无需他人指导,根据分配的需求完成任务。
- 第四级: 能指导和带领其他人一同完成更有影响力的工作
- 根据大需求确立目标以及实现方式,并将解决方案进行分解,领导团队(分配、协调、沟通等)完成此目标
- 第三级: 能独立设计和实现产品,并且在市场上获得成功
- 充分了解行业,提炼需求,并独立领导团队完成产品研发。随后可以将其量产化并营销至市场。
- 第二级: 能设计和实现别人不能做出的产品,具有不可替代性
- 对行业有深入认知和独特见解,能够做出先前没有的产品,且别人无法复制。
- 第一级: 能开创一个产业
- 站在科技最前沿,充分认识哪些科研成果已经成熟,在当前时代已经被满足,并将其产业化,形成巨大的生态链
2019-02-13 15:38:51
下面的路该怎么走?这是无论多么焦虑都要面对的问题。智能时代是变革的时代,在新生产力的驱动下,一些旧业态将被淘汰,新产业出现,还有一些传统产业被重新塑造、如虎添翼。投身于最新生产力的创造,无遗更机会成为时代的弄潮儿。然而,使新生产力迸发出最惊人创造力的场景,往往是在与传统产业的结合上。第一次工业革命的“蒸汽机+传统产业”,第二次工业革命的“发电机+传统产业”,二战后信息革命的“电子化+传统产业”,本世纪初的“互联网+传统产业”,以及当下的“机器智能+传统产业”,都成为或将成为人类文明加速腾飞的推进器。也许这是我的选择被赋予的新使命,当然它需要千万人的共同努力。新的时代已经来临,无论我们愿不愿意。在这个时代,我们可以做技术的主人,可以做技术的仆人,也可以做“隐身人”,但唯独不能站在技术的对立面。我不能做技术的敌人,也不想做“隐身人”,那么我就要同技术站在一起。
从哪里开始?单纯的写写Java和Python代码,也许可以建立与智能时代联系,但它难以建立宏观、深刻、系统的时代体感。我认为要从最根本的地方入手,直接切入这个时代的“第一性原理”,也就是机器智能的“第一性原理”。算法与数据结构是机器的思维方式,依旧是智能时代的灵魂,这里应该是我再出发的起点。相应的还有计算机体系结构、计算机网络、操作系统,以及有关的数学知识体系。然而这些知识我在学校都学过,仅仅再回忆一遍就可以吗?不,这远远不够。因为我需要更系统的学习,需要知道这些知识在工业界的最新进展与实践,需要把这些知识连接到更广泛的行业领域中举一反三,需要能够判断哪些任务适合交给机器而哪些还不能,需要引发更多有价值的深入思考……很幸运我遇到了极客时间。
带着问题学习、用学到的知识解决实际问题,是最高效的学习方法。记得在学校学习算法与数据结构的时候,我实在无法理解这些反直觉的机器逻辑,能够理解的知识点非常有限,更不用说形成完备知识体系了。更可惜的是,那时心浮气躁,没有沉下心由浅入深,却靠疯狂做题刷存在感,以题量衡量学习水平,实则是狗熊掰棒子、只见树木不见森林,更很少能与工业场景建立联系。走出校园后没有优质的学习环境,缺乏有效学习渠道,再想“补课”就难了。极客时间提供了比较优质的环境与渠道,降低了领域间的信息门槛,使我能够接触到一线工程师与技术人员的新视角,与工业界建立一定的联系。在这里计算机知识不是数字游戏与考试题,而是一个个真实的工程问题,有助于引导建立时代体感。
师傅领进门修行在个人。然而想学好算法与数据结构,乃至于达到个人目标,仅仅啃一遍王争老师的课是远远不够的。这是一个很好的开始,它很重要,但也只是一个开始,后面的路还要靠自己。这个时代没有地图,也没有路标,只有广阔的天地和一块指南针。那么就从更多的接触、更加系统的学习、更加深入的思考,以及第二遍阅读《算法与数据结构之美》开始吧。
2019-02-13 07:34:57
2019-09-17 08:20:06
2019-02-13 22:20:27
2019-02-13 08:39:39
2019-02-21 10:49:37
2019-02-13 09:56:21
《数据结构和算法之美》是我在极客订阅的第一个专栏,我个人觉得看专栏和书的区别是——看书是一个人在看,而专栏里有老师的答疑,用户的相互探讨,集思广益。
半年时间过得很快,虽然专栏里的文章已经看过大半,但老师列出的课后练习和算法实战还没有完全掌握,专栏里的文章我仍需多次阅读。
谢谢老师!
2019-02-13 08:32:36
2019-04-09 21:33:01
2019-02-13 10:55:39
2019-02-13 08:22:29
2019-02-13 01:03:44
另,老师开设这么好的一个专栏,真的谢谢!
2020-05-15 15:10:21
2019-03-13 14:18:12
2019-02-13 18:15:55
人生道路上我们不断优化自己的信息源,初级阶段更多的是接收已有的信息,比如以接受教育开始,利用大块时间系统性学习新知识,构建某一领域的知识大厦。后期更多的是思考与使用,在接收新信息的同时,归纳总结到之前构建的属于自己的知识殿堂,这一阶段知识不在单纯是知识,融合为可以提高效率,运用自如的“智慧”。
另外也向老师和同学们提一些问题:
- 在社区、社交(twitter、 medium、quora、reddit)等互联网平台上有哪些值得关注的人、blog、或专栏
- 网络上大部分内容是讲“怎么用”,对于入门来说这些知识确实有用,但是在爬坡的时候,原理性的“为什么”及历史脉络更有用处,这类“为什么”的信息源有那写
2019-02-13 09:19:21
2020-10-30 17:37:27
2019-12-21 15:26:24