你好,我是王争。
专栏更新过半,我发现有些小伙伴已经掉队,虽然有人掉队也挺正常,但是我还是想尽量拉一把。于是,周末的时间,我就在想,究竟是什么原因让有些小伙伴掉队了?是内容本身太难了吗?是我讲得不够清楚吗?还是小伙伴本身基础太差、不够努力、没有掌握学习方法?
我觉得都不是,让你掉队的原因,从根儿上讲,是你内心的迷茫。如果我们不那么确信能不能看懂、能不能学会的时候,当面对困难的时候,很容易就会否定自己,也就很容易半途而废。
这就好比你迷失在沙漠中,对你来说,肆虐的狂风并不可怕,可怕的是,你不知道该努力多久才能走出沙漠,不知道到底能不能走出沙漠。这种对结果的未知、不确定,导致了你内心的恐惧,最后就差那么一点点就可以走出沙漠的时候,你放弃了。
学习也是同样的道理。所以,我今天不打算讲学习方法,也不打算给你灌输心灵鸡汤,我就讲讲,对这个专栏的学习,或者对于任何学习来说,我觉得你应该建立的一些正确认知。有了这些认知,希望你能在后面的专栏学习中,少一点迷茫,多一份坚持。
没有捷径,没有杀手锏,更没有一招致胜的“葵花宝典”

有小伙伴给我留言说:“看书五分钟,笔记两小时,急求学霸的学习方法”,还有人问,“数据结构和算法好难,到底该怎么学?是我的学习方法不对?还是我太笨?”
我想说,并没有什么杀手锏的学习方法,更没有一招致胜的“葵花宝典”。不知道这么说有没有让你失望。如果你真要“求”一个学习方法,那就再看看我在专栏开始写的“如何抓住重点,系统高效地学习数据结构与算法”那篇文章吧。
说实话,我也挺想知道学霸的学习方法的,所以,在求学路上,每当有学霸来分享学习方法,我都要去听一听。但是,听多了之后,我发现其实并没有太多用。因为那些所谓学霸的学习方法,其实都很简单,比如“认认真真听讲”“认认真真做每一道题”等等。
也不是他们说的不对,但是这种大实话,我总有一种领会不了的感觉,更别说真正指导我的学习了。而且,我觉得,很多时候,这些方法论的难点并不在于能不能听懂,而是在于能不能执行到位。比如很多人都听过“一万小时定律”,坚持一万个小时,你就能成为大牛,但有多少人能坚持一万个小时呢?
所以,这里我要纠正一个认知,那就是,学习没有“杀手锏”似的方法论。不要怀疑是不是自己的学习方法不对,不要在开始就否定自己。因为否定得越多,你就越迷茫,越不能坚持。
不要浮躁,不要丧失思考能力,不要丧失学习能力

有小伙伴给我留言说:“老师,这个地方看不懂,你能不能再解释一下”,还有小伙伴留言说:“《红黑树(上)》里的图为什么跟你的定义不相符?”
对于留言的问题,我都挺重视的,但是当仔细看这些问题的时候,我发现,实际上文章里已经有答案了,他根本没有认真看、认真思考,更别说去自己搜搜资料,再研究下,就来提问了。
一般情况下,我都会回复“你自己再认真看一遍”或者“你自己先去网上搜一下,研究研究,如果还不懂再给我留言”。告诉你答案,并不会花费我太长时间,但是,这样会让你丢失最宝贵的东西,那就是,你自己的思考能力、学习能力,能自己沉下心来研究的能力。这个是很可怕的。
现在,互联网如此发达,我们每天都会面对各种各样的信息轰炸,人也变得越来越浮躁。很多人习惯看些不动脑子就能看懂的东西,看到稍微复杂的东西,就感觉脑子转不动了。
上学的时候还好,要考试,有老师督促,还能坚持学习。但是工作之后,没有人监督,很多人陷入各种手机App中不能自拔,学一会儿就想玩会儿手机,想静下心来学上半个小时都无比困难。无法自律,沉不下心来,那你就基本可以跟学习说拜拜了。
只有做好打硬仗的心理准备,遇到困难才能心态平和

还有小伙伴给我留言说:“看不懂,一个4000多字的文章、10分钟的音频,反复看了、听了2个小时都没怎么看懂”。我给他的回复是:“如果之前没有基础或者基础不好的话,看2个小时还不懂,很正常,看一个礼拜试试。”
“一个礼拜”的说法,我一点都不是夸张。虽然专栏的每篇文章都只有三四千字,10分钟左右的音频,但是知识点的密度还是很高的。如果你潜意识里觉得应该一下子就能看懂,就会出现这样的情况:看了一遍不懂,又看了一遍还是不怎么懂,然后就放弃了。
数据结构和算法就是一个非常难啃的硬骨头,可以说是计算机学科中最难学的学科之一了。我当时学习也费了老大的劲,能做到讲给你听,我靠的也是十年如一的积累和坚持。如果没有基础、或者基础不好,你怎能期望看2个小时就能完全掌握呢?
面对这种硬骨头,我觉得我们要有打硬仗、打持久战的心理准备。只有这样,在学习的过程中遇到困难的时候,心态才能更加平和,才能沉下心来有条不紊地去解决一个个的疑难问题。这样,碰到问题,你可能还会“窃喜”,我又遇到了一个之前不怎么懂的知识点了,看懂它我又进步了一点。甚至你还会“坏坏地”想,又多了一个拉开我跟其他人距离的地方了。跨过这些点,我就能比别人更厉害。
一口吃不成胖子,如果你基础不好,那就从长计议吧,给自己定一个长一点的“死磕”计划,比如一年。面对不懂的知识点,沉下心来逐个突破,这样你的信心慢慢也就建立了。
“放弃”的念头像是一个心魔,它会一直围绕着你

还有小伙伴给我留言说:“开始没怎么看懂,看了一下午,终于看懂了”。看到这样的留言,我其实挺为他感到庆幸的,庆幸他没有中途放弃。因为,放弃的念头就像一个心魔,在我们的学习过程中,它会一直围绕着我们,一旦被它打败一次,你就会被它打败很多次,掉队就不可避免了。
我分享一个我最近思考比较多的事情。前一段时间,我在研究多线程方面的东西,它涉及一块比较复杂的内容,“Java内存模型”。虽然看懂并不难,但是要透彻、无盲点地理解并不容易。本来以为半天就能看懂的东西,结果我从周一一直看到周五下午,断断续续花了5天的时间才把它彻底搞懂。回忆起这5天,我有不下10次都想放弃,每次心里都在想:“算了,先放一放,以后再说吧”“太难了,啃不下来,算了。”“就这样吧,反正也用不到,没必要浪费时间”等等。这种放弃的念头就像一个邪恶的魔鬼一样,一直围绕着我这5天的研究中。
现在回想起来,我很庆幸我当时没有放弃,多坚持了几天。如果当时我放弃了,那之后再遇到技术难题时,“放弃”的心魔还会再来拜访我,潜意识里我还是会认输。
之所以没有放弃,我自己总结了两点原因。
第一,我对学习这件事情认识得比较清楚,我一直觉得,没有学不会的东西,没有攻克不了的技术难题,如果有,那就说明时间花得还不够多。
第二,我之前遇到卡壳的时候,几乎从来没有放弃过,即便短暂地停歇,我也会继续拎起来再死磕,而且每次都能搞定,正是这种正向的激励,给了我信心,让我再遇到困难的时候,都能坚信自己能搞定它。
入门是一个非常漫长和煎熬的过程,谁都逃不过

还有小伙伴留言说:“看到有小伙伴有很多疑问,我来帮作者说句话,文章写得很好,通俗易懂,如果有一定基础,看懂还是不成问题的。”
我觉得,有些小伙伴的觉悟还是挺高的:)。我文章写得再通俗易懂,对于之前没有任何基础的人来说,看起来还是挺费劲的。
第一,数据结构和算法这门课程本身的难度摆在那里,想要轻松看懂,本身就不太现实。第二,对于任何新知识的学习,入门都是一个非常漫长和煎熬的过程。但是这个过程都是要经历的,谁都逃不过。只要你挺过去,入了门,再学习更深的知识就简单多了。
我大学里的第一堂课是C语言,现在回想起来,当时对我来说,简直就是听天书。因为之前没有接触过计算机,更别说编程语言,对我来说,C语言就像另一个世界的东西。从完全看不懂,到慢慢有点看懂,再到完全看懂,不夸张地讲,我花了好几年的时间,但是当掌握了之后,我发现这个东西其实也不难。但是如果没有度过漫长和煎熬的入门的过程,如果没有一点韧性,没有一点点信念,那可能也没有现在的我了。
其实我一直觉得情商比智商更重要。对于很多学科的学习,智商并不是瓶颈,最终能够决定你能达到的高度的,还是情商,而情商中最重要的,我觉得就是逆商(逆境商数,Adversity Quotient),也就是,当你遇到困难时,你会如何去面对,这将会决定你的人生最终能够走多远。

好了,今天我想分享的关于学习的几个认知就讲完了。现在,你有没有对学习这件事有更加清晰的认识呢?能不能让你少一点迷茫,多一份坚持呢?
最后,我有一句送给你:吃得苦中苦,方为人上人。耐得住寂寞,才能守得住繁华。
精选留言
2018-11-23 09:57:14
2018-11-23 09:04:46
2018-11-23 01:55:14
个人觉得,学习的关键在于决心和自律。
加油吧各位。
2018-11-24 10:16:40
在学习的算法的过程中,个人也有一些感触,分享给大家。极客时间留言字数有限制,我只好将留言完整版放到了其它地方,然后只截取了一小段放在这里。有兴趣的,可以看看完整的心路历程:https://zhuanlan.zhihu.com/p/50733874
【做好心理准备:学习过程,时而兴奋,时而备受打击】
我学习算法的主线,是通过机械工业出版社出版的、Ellis Horowitz等人著作的《数据结构(C语言版)》。说实话,刚开始只看这一本书,问题也不太大,但是当我学习红黑树的时候,问题就来了。如果不知道这种数据结构如何由来的话,直接去学,就很容易懵。中间我因为工作繁忙,晚上经常加班到深夜,而红黑树很多次又看不懂,再加上身心很疲惫,很容易放弃;中间,我确实放弃了很多次,又重新捡起来很多次。所幸的是,我没有真正的放弃(因为有梦想的支持)。某一天,我真正决定了:必须搞懂红黑树。于是,在国庆节期间,再加上我请了三天假,总共花了十天左右的时间,仔细研究二叉树查找树的特性,再去leetcode上找二叉树基础性的题目做;等二叉树学习得差不多了,再继续深入2-3树,真正理解二叉树为什么需要『平衡』,仔细研究2-3树如何构造,反复在草稿纸画图;当搞明白了2-3树的时,深入研究红黑树,理解rotate left、rotate right,这中间依然是在草稿纸进行反复画图,理解红黑树的构造。
这中间还有一个小插曲,在《算法》一书中,红黑树的定义是这样的:红黑树是含有红黑链接并满足下列条件的二叉查找树:
1. 红链接均为左链接;
2. 没有任何一个结点同时和两条红链接相连;
3. 该树是完美黑色平衡的,即任意空链接到根结点的路经上的黑链接数量相同。
当看到第一条的时候,我直接就懵了。因为,我看到《算法导论》和一些网络博客对红黑树的定义允许有红色右链接呀。为了解答这个问题,我查阅了各种资料,最后在wikipedia红黑树条目中找到了真相:原来Robert Sedgewick 这样定义,是为了简单化红黑树,精简红黑树实现的代码。
学习红黑树的过程,我犯了一些错误:
1. 贪快,缺乏耐心。有时候会看得过快,忽略之前章节的学习,直接进入后续章节学习。但是『专业性很强的教课书』一般都会有条理的进行编排,也就是说,前面的章节可能是后面章节的『原因』,如果基础不是很好,直接进入『结果』的学习,导致的情况就是:懵!
2. 一本书看不懂,就死磕。书籍是人写的,每个人对每个领域的理解不一样,阐述也可能不一样,某一个人说出来的『东西』不是很容易理解,也有可能是对方讲的不够好嘛。试试找找其它的材料看看呢!我在学习红黑树的时候,死磕了一本书之后,发现不行,终于意识到得找找其它同类型的资料了,最终发现了《算法》一书(这么经典的书,我都不知道),同时还在网上发现了一个比较好的网站:https://visualgo.net/en 《算法》一书用的描述语言是Java,合胃口; 理解红黑树,我就通过《算法》一书理解的。我觉得作者就非常抓重点和让人容易理解,后来一查,才发现,作者 Robert Sedgewick 曾经对红黑进行改造,让红黑树的代码实现精简了很多。可想而知,作者对红黑树的理解够透彻和权威了吧。
通过这次的经历,我稍微把自己学习算法的方式进行了调整:
1. 我购入了《算法图解》一书,在稍微轻松的心情中,对算法有了一个整体的脉络,连带急切想知道的图和动态规划都稍微了解了一下
2. 我开始用线上的一些比较好的网站,进行一些『练习』。比如在熟悉基础概念阶段,使用https://visualgo.net/en进行练习,基础概念掌握差不多了之后,开始在leetcode上找一些easy的题目开始做(leetcode上easy题目,虽说找到最优解也要花一点功夫,可以至少起初能找到一些方案)
既然为了精通算法,多买几本算法参考书还是要的,多花点钱也没什么大不了的。😄 为了搞懂问题,我参考的资料一般有:权威的专业书籍、Wikipedia、一些人的博客
写完这一段时,我突然想到《士兵突击》中那句经典的台词:“不抛弃,不放弃”。 对算法也得多喊喊:“不抛弃,不放弃”!
2018-11-23 08:37:14
1、执行力不足,每当开始学习的时候,一些小的基础概念都没有弄明白,一味地学习后边的知识,导致学习的挫败感越来越强。
2、学习技巧。王争老师也说了,学霸有没有学习方法我们不知道,毕竟我们是玩技术的,不像是学霸每天和各种学科打交道,我之前也是一个学渣,更别说是数据结构与算法了,最基础的程序语言都很难弄明白,但是当我入门一门语言的时候,感觉再学习其他的语言和编程就感觉很快就会入门。我认真反思了一下,原因就是一个好的学习方法实在是太重要的,就说数据结构吧,很多人可能没有想过怎么才能让自己王争老师分享的每一篇文章都找到一根线掌握起来,然后将所有的课和知识点掌握起来,这就涉及到学习方法问题了,因为自己对学习方法研究比较深,也经常在朋友圈和公众号给我的小伙伴们更多的分享学习方法,因为我觉得这比分享更多的技术更为重要,有句话说的好「治病先治根」,哪里有病,首先找到病根的原因,然后对症下药。
3、习惯。我觉得坚持学习,还不如说成一种习惯。自从王争老师出了这门数据结构与算法课程之后,我逐渐爱上了这门科目,之前课老师上讲很基础,涉及不到那么深,再加上买的那些书籍资料太乏味,导致让我很难学习下去。王争老师这门课出了之后,感觉学习数据结构也没有这么难,自己也研究了一套学习数据结构的方法,正在努力给自己完善中。在学校做小项目时,很多问题导致我无法去解决,身边几乎没人去学习这么重要的科目,学习有的重要的技巧就是活学活用,这门课很多的技术解决了我实际的问题,有时候就是恍然大悟,由于自己跟着王争老师学习的比较深入,遇到问题就像是条件反射一样,遇到了一个很难解决的问题,脑子里就不由自主的跳出一个数据结构的解决方法,然后仔细一想,确实可以解决这个方法。也逐渐的,每天看王争老师分享的数据结构与算法成为了一种习惯,每天都去学习思考,都要简单做做笔记,一天不去看,就感觉今天有什么事情没有完成一样,我觉得自己已经深爱上了这个课程,成为了一种习惯。
最后感谢极客时间,感谢王争老师能够出这么一门好的数据结构与算法的文章,让我受益很多。
2018-11-23 08:52:59
授人以鱼更授人以渔,很庆幸我能坚持,一周也就三更硬啃下来不要掉队太久就能跟上大队
我的学习方法是先把理论和概念先弄懂,至于代码的实现与细节以后有时间再来专栏看一遍仔细雕琢。这样以后遇到问题起码有解决思路了再说,再对症下药把解决方案对应的专栏里代码与实现细节弄懂它
然后就是多看留言,真正的精华其实在这里。大家一起坚持,加油
2020-08-03 21:47:24
2018-11-23 08:15:14
2018-11-23 09:40:10
2018-11-25 22:26:04
2018-11-26 10:10:56
2018-11-23 07:34:00
说一点自己的想法,看了老师这篇文章,其实心里还是有点窃喜的,为什么呢?因为我发现老师这样的大牛,以前也被这些问题卡死了这么久。哈哈……所以没什么害怕的。比如红黑树的学习,我自己当时是手动把treemap的的代码相当于自己改了一遍,把<key,value>改成了<E>的那种红黑树,虽然写完后自己大部分也忘记了,尤其是删除那块。但是写的过程中自己是在思考的,会在边上写下注释和自己的想法,我认为这些东西比代码本身重要,因为这些才是自己学习留下来的东西。学习知识,然后把知识忘记,剩下来的东西就是你学到的,我认为就是这个了。
2018-11-24 11:40:10
平日里内心明明白白的知道基础差或者可以说基础不够系统,
因为确实平时业务压力大,加班,家庭慢慢在更多的占用精力。
以前我有很好的学习习惯,但是最近有了孩子这两年,我放松了。我给自己的理由是家庭占据了平时的学习时间。
听过你的开头的课程对我来说是一种警醒和反思。我对自己重新做了学习规划,不仅仅是算法。
我没有掉队,只是在慢慢消化你前面讲解的东西,还有评论中有些大牛提到的知识盲点。
我会平时开车或者地铁时候看或者听。会有很多的不懂的地方,也会了解整个的知识点和体系。我就带着问题通读一遍书籍,或者我通读一遍书籍后再来听,带着问题和重点再去查资料。
深入完一块内容后,我会写博客整理思路。然后出ppt分享给组内成员。
也有过怀疑和困惑,团队的领导或者其他人普遍认为算法结构太难,学习了没用。我也想说,之前看到你回复给其他人的留言:算法就像学习数学一样。所以,我的理解是有没有用自己说的算。学习了就要思考,思考了就要争取在项目中反复观察留意。比如复杂度,比如递归,比如二分法。先用,好不好另说。至少不要停留在理论。很多人学习完留个笔记就走了,或者跟着几次就掉队的人吧。我想这些人的一部分,有可能成为将来在周围那种说学习算法有什么用的人。我现在周围很多开发都用异样的眼光看我,有点像在说:别装了,有什么用。
即便是没人怀疑,有时候自己也会问自己,有什么用吗?
我不管,学到了就是我的,只要能从中学习到东西就是好的。毕竟,技术需要慢慢积累。
从中不仅仅是学习文章内容。有可能收获的是别人的学习技巧,或者重燃学习动力,再或者是评论中学习到的新的知识点。
我前几期也是留过问题和评论。我没有掉队。我只是在好好消化,好好反馈,有可能我在学习到后面几期也会有问题提问。希望争哥能略微关注,也希望大家都回头看看。坚持却是不容易。
大家也不要为了学习而学习,多多消化。我这次评论因为我是开发中确实遇到一个问题。正巧想上来评论一下,让大牛们提点一二。一会我再发个问题。
2019-04-30 16:04:59
2. 我学的时候是按照这样的路径:把书读薄,然后再读厚,然后再读薄。读薄就是先大体看一遍,觉得难的地方先跳过,知道有这么个东西,把整体先过一遍;读厚就是回头把不懂的东西再深挖认真看;再读薄就是真的懂了,运用起来得心应手。
3. 学习曲线是螺旋上升的。
2019-01-25 11:33:24
1.每天就看一讲,不多不少2小时。(这里可以用一些计时软件计时);因为我知道数据结构这一块很烧脑,看多了人会烦躁,因此就2小时。如果时间有余,我会去leetCode找些题目来练。
2.这两小时做笔记是一定要的,不管是你精简老师的话,写成自己的东西,还是按你的理解写下来的。
3.切勿贪快。以前我看数据结构的时候,一看觉得自己已经会了,下面就没细看;其实想想,没人逼你学,也不需要考试,别人有可能聪明学的快半年掌握了。我们要花一年,但是,最终我们还是掌握了不是么
4.不断地回顾和复习。怎么复习?看自己的笔记,如果看到自己的笔记回忆不起来,再去看一遍老师说的文章
5.不要死磕实现代码,就像老师说的要知道每个数据结构与算法后面的思想和适用场景,死记代码是没用的
2018-11-23 08:57:04
2018-11-23 09:45:57
我认为对于学习来说,过程比结果重要,理解比结论重要。因为我们生活的环境、应对的问题都是复杂且动态变化的,没有固定的结论和结果可用。而学习的目的是为了掌握灵活应对各种问题的方法,它可以是思维方式、科学方法,是忘记知识点之后剩下的真本事。
由此可知,学习不是知识的线性累加,而是负责的系统问题,一般来讲学习过程会遵循所谓的学习曲线,或称为J曲线,它是一个先下降后上升的过程。为什么这样呢?我个人认为这与学习的生理过程有关。大脑是学习主要器官,大脑是肉长的,无论知识点的记忆,还是思维习惯的养成,都是要经历机体重塑的过程,也就是说学习不是复印,而需要一段生长的过程。这也说明了为什么学习是一件苦差事,就好比健身,我们撸铁、跑步其实都是对机体的“破坏”,然后通过饮食、睡眠刺激机体重塑,以变得更加强大,以大脑为核心的学习也是如此。所以学习不可能一蹴而求,需要长期坚持,学习没有捷径,也不可能轻松,跳出舒适区,进入学习区,如切如磋、如琢如磨才是正道。
吾生也有涯,而知也无涯,以有涯随无涯,歹矣。人生苦短、精力有限,要学的东西太多了,如果我们什么都学,那一定是什么都学不会。因此结合自身需要,合理选择学习方向和深度是非常重要的。比如我本硕学了七年计算机,但是工作也计算机几乎没有关系了,所以我在学习算法课的时候,不会纠结于每一个实现细节,更多了是去理解算法与数据结构背后的思想精髓。比如红黑树插入、删除后复杂的再平衡步骤,我主要是一带而过,更多的去体会红黑树通过放弃一些二叉查找树的原则,来换取稳定高效查询速度的思想。还有,针对于自己特别感兴趣的技术细节还是会啃一啃的,不过如果啃不动,我也会暂时放一放,过一阵儿再来看。有些时候学不下去,真不是我们不够聪明,而是因为基础不足,知识的入门门槛比较高。比如我在极客时间订了“区块链课程”,但是听了几节课发现有难度,问题可能出在算法、体系结构、计算机网络等基础知识不牢固上,于是我干脆把整个课程放下,先去学王老师的算法课和刘老师的网络课。所以我觉得掉队并不一定可耻。
最后谈谈我对算法与数据结构的看法。算法与数据结构是计算机科学技术之旅的新手村和出发点,是无论如何也绕不过,否则学习计算机就变成了无源之水、无本之木。不仅如此,算法与数据结构可以为每一个工程师提供赋能与加持,它是工程领域的易筋经。这块硬骨头是必须啃,也是最值得啃的。
2018-11-23 07:58:07
2018-11-23 15:24:48
2018-11-23 11:09:44
我在学跳表的时候,花了几天的时候才想清楚,领略到妙点的时候,后来有种拍大腿的感觉,觉得这种数据结构的设计怎么好神奇。学快排和归纳排序,也感受到了算法的奇妙,都是前人很多研究的结果。专栏也有提到,跳表这种数据结构在很多年都没有真正的去写好的,都是存在缺陷,也证明了数据结构和算法,其实是一种在成长和演化。我们有幸跟随王峥老师学习,用最通俗的学习很难得。我大学的时候学数据结构我记得是很糊涂,知其然,不知所以然。而且大学泛于理论,学起来没什么兴趣和枯燥。
王峥老师举了很多实用的例子,还有结合实现,在工作中很常用的,比如redis、map用到跳表、散列表这种数据结构,拍大腿,原来是这样的。也感受到了,如果你不懂数据结构,很难真正理解,为什么它会存在和发展。在前段时间,我用阻塞队列实现了跟踪第三方交易状态,能在不损害性能的情况下,秒同步第三方的结果,这让我感受到数据结构的强大。也许我们还能用于很多地方。
这里很多大神,希望跟着王峥老师一点点学习和进步。希望大家不要放弃。也不要去背。真正理解了,把数据结构算法奇妙领略到,将来变种成自己设计成自己的数据结构,去实现和设计这些问题才真正有趣。