考试成绩好的同学,我们习惯称之为“学霸”。不过,还有一类人,他们是因为对考试技巧很有研究,而取得了高分。这类人虽然通过技巧取得了高分,但对知识缺少系统的理解和灵活的运用,只能称得上是“学酥”。
#### 酥者,看似很硬,一碰即碎
步入社会后,你会发现人生的挑战,远远不只是卷面的写写画画。要想在不同类型的挑战、持续不断的挑战中获胜,单单靠那些花里胡哨的技巧是远远不够的。以前有一位老师曾跟我说过,“你取得成绩的天花板,取决于你对事情的认知”。
下面我们举个例子,一起探讨一下这个话题。近年来,直播带货出现了红利,我国一年因直播带货创造的 GMV 可达万亿元。虽然巨大的市场摆在这里,但对你我而言,很难通过开直播去养活自己。原因非常简单,我们从未涉足过直播,对主播的工作方式、对直播行业的运转规律并不了解。
试想一下,我们把直播行业换成互联网公司,把主播换成程序员,反过来看看程序员的成长。很显然,程序员必须对技术原理有充分的理解和认知。只有这样,你才能成为程序员界的李佳琦。那么,到底该怎么做,才能对技术原理有充分的理解和认知呢?
我认为是“勤修内功”,具体而言:
* 勤,即次数多,可理解为是持续不断的意思。
* 修,即炼,可理解为预习、学习、复习。
* 内功,即认知,是你对这项技术的理解深度。
相对而言,外功更像是一些技巧性的东西。从字面理解,勤修内功就是不断温习技术原理,持续加强技术认知。
#### 勤修
子曰:“学而时习之,不亦说乎。”我们需要通过不断地复习来加深自己对所学知识的理解。第一次学习,你可能会觉得书中所述的内容很好;第二次学习,你可能又会发现有些地方作者话中有话,并没有过度展开;第三次学习,当你的理解深度不亚于作者时,也许你还会发现,这个作者的水平一般般,很多关键细节的表述比较含糊。在经过了多次学习之后,你对作者的态度可能会从崇拜转变为质疑,这个过程就是你的成长。
#### 内功
对于《重学数据结构与算法》专栏而言,重要的内功就是如何降低复杂度。我们从复杂度讲起,讲述了利用算法思维和设计数据结构来降低复杂度的各种方法。这些算法思维和数据结构,就是你通过这门课学会的内家功夫,也是你作为程序员的行业竞争力,更是你未来吃饭的家伙事儿。
关于程序员的行业竞争力,我们多啰唆几句。请你思考这样一个问题,对于两个不同的工程师,是什么因素让一个人收到的 offer 源源不断、薪酬百万,而另一个人只能忍辱负重、处处碰壁呢?
从结果来看,一定是两个人的投入产出比不同。然而,你有没有思考过,又是什么因素造成了两个人投入产出比的不同呢?
其实,是能力。一个人能力的高低,决定了他获得业绩的多少。能力包含方方面面,有的能力可以快速学会,比如骑自行车,大多数人一周就能学会,因此这并不属于竞争力。而有的能力则是慢功夫,比如你对数据结构的理解能力、你的算法能力以及技术选型的判断力等等,这些都是经过长期积累、反复学习,才能有所收获。
当你有了扎实的基本功之后,再面对新鲜、复杂的新知识时,会更容易理解,也就更容易快速学会。反之,则是学什么都很吃力。例如,我看到很多人在研究机器学习、AI 算法上都比较吃力,本质原因是你高等数学的基本功不过关。
因此,你的短期竞争力可能是那些花里胡哨很快就能学会的技能,而你的长期竞争力一定是来自你的内功,也就是数据结构与算法这门学科的基本功。
#### 写在最后
不知不觉,五个模块 21 个课时的内容已经全部更新完毕。不知你是否还记得我在开篇词中提到的设计这门专栏课程的初衷?
我当时这样写道:“通过本专栏的学习,我希望帮助你摆脱盲目刷题与漫无目的地学习方式,更加高效地掌握数据结构与算法知识,真正掌握程序开发、代码优化的方法论,完成从掌握理论知识到解决实际问题的转变。”
在课程设计的过程中,我时刻提醒自己,要站在你们的角度做内容。用尽量少的文字,把一个问题讲清楚。这段时间,我一直关注大家的留言,也在处理大家在留言中提出的问题。在这个过程中,我看到了很多真实的用户反馈和学习体验,这让我收获良多。
数据结构与算法知识虽然复杂难懂,但其实想要学好也并没有想象的那么困难。它有通用的解题思路和宏观层面的方法论,重点在于学以致用。因此,我在每个课时都设置了一道练习题,帮助你巩固本课时的内容,检测自己的学习成果。只有不断地发现问题、提出问题、解决问题,才能真正将书本上的知识活学活用。输出是对掌握最好的检验。如果你还没有完成练习题,希望你回过头来逐一攻破。
当然了,我更希望你通过本专栏的学习,已经具备将知识灵活运用到实际工作中的能力。如果你还有哪些地方不明白,欢迎在留言区留言提问。虽然课程完结了,但我还会持续关注大家,为你答疑解惑。希望正在读这篇文章的你能够学以致用、学有所成。
- 前言
- 开篇词
- 数据结构与算法,应该这样学!
- 模块一:代码效率优化方法论
- 01复杂度:如何衡量程序运行的效率?
- 02 数据结构:将“昂贵”的时间复杂度转换成“廉价”的空间复杂度
- 模块二:数据结构基础
- 03 增删查:掌握数据处理的基本操作,以不变应万变
- 04 如何完成线性表结构下的增删查?
- 05 栈:后进先出的线性表,如何实现增删查?
- 06 队列:先进先出的线性表,如何实现增删查?
- 07 数组:如何实现基于索引的查找?
- 08 字符串:如何正确回答面试中高频考察的字符串匹配算法?
- 09 树和二叉树:分支关系与层次结构下,如何有效实现增删查?
- 10 哈希表:如何利用好高效率查找的“利器”?
- 模块三:算法思维基础
- 11 递归:如何利用递归求解汉诺塔问题?
- 12 分治:如何利用分治法完成数据查找?
- 13 排序:经典排序算法原理解析与优劣对比
- 14 动态规划:如何通过最优子结构,完成复杂问题求解?
- 模块四:面试真题 = 实践问题的“缩影”
- 15 定位问题才能更好地解决问题:开发前的复杂度分析与技术选型
- 16 真题案例(一):算法思维训练
- 17真题案例(二):数据结构训练
- 18 真题案例(三):力扣真题训练
- 19 真题案例(四):大厂真题实战演练
- 特别放送:面试现场
- 20 代码之外,技术面试中你应该具备哪些软素质?
- 21 面试中如何建立全局观,快速完成优质的手写代码?
- 结束语
- 结束语 勤修内功,构建你的核心竞争力