关于提升瓶颈的问题

关于提升瓶颈的问题,可以参考这个问答:https://t.zsxq.com/uRJauBi

如果你做了四年安卓,感觉“技术就那样”,转去做前端,近乎一定也是“就那样”。当然,如果你接触前端,发现你更喜欢前端技术的话,慢慢转去做前端没问题。但具体在什么技术领域,应该不是你现阶段发展的瓶颈。 我的建议是,向上发展,而不是领域迁移。

什么叫向上发展?

选定安卓或者前端某一个技术领域,去研究大厂的高级别的技术职位,需要达到什么标准?他们简历关看什么?期望你有什么经历?什么技术水平?笔试考什么?对应什么知识?面试又面什么?需要你达到什么水平?找到自己的差距,开始向这个标准努力。

或者,如果对管理岗感兴趣的话,研究一下,在自己所在的企业,从你现在的level,怎么往上升?怎么成为你所在组的 leader?甚至成为整个技术部门的 leader?自己还差什么?

不是说要你争名夺利。而是说,眼睛应该往更高的地方去看,去思考,去想,去研究,那些你期望的岗位上的人,他们到底为什么能走到那里?他们和自己的差别在哪里?一旦找到这个差别,努力就好了。

我公众号上转载的一篇文章,给你提供一个可能的方向参考:

https://mp.weixin.qq.com/s/gzZU-pk-aJNUk0vEixtHPA

关于语言选择的问题

关于语言选择的问题,可以参考这个问答:https://t.zsxq.com/ufAieAy

不要选择语言,而是选择领域。

不过你刚大二,说实话,不用想这么多。依托一两个语言,把基础知识学好,真的最重要。 什么是基础知识?算法,数据结构,操作系统,软件工程,网络,数据库,计算机底层原理(可以参考这里:https://mp.weixin.qq.com/s/h9mnGmIUoht7zRtDh6XD-g ),数学(离散数学为主),等等等等。 这些课程应该也是你们现在课程设计的中心。 这些学好了,应用层的开发真的很简单。你去大厂工作也好,将来考研究生也好,就会发现,主要考查的,也是这些基础内容。 更重要的是,等你真的开始吃技术这碗饭的时候,爬得越高,越会意识到,这些基础知识的掌握,决定着你的技术上限。 加油!:)

系统开发,推荐算法,图像,后端,这些都是方向。C++不是方向,Java同理。

任何语言本身不是一个学习的方向。

一个值钱的架构师,道路应该是陡峭的:但从另一个角度看,任何一个值钱的职业,都应该是陡峭的,不容易的。所以,我建议在选择职业道路的时候,不要想难度。第一看自己的兴趣;第二看市场的需求。 我认为优秀的架构师长期有巨大的市场需求。至于你的兴趣是否在这里,只有你自己知道。

如何应对大龄危机,是一个太过宽泛的问题。我不认为存在一个万能之法,使用它就解决大龄危机问题了。如果这个方法存在的话,大龄危机就不是一个问题了。 关于大龄问题,我也一直在思考,以后可能会形成一篇甚至几篇公众号文章。 不过现在,我对这个问题也没什么经验,毕竟我才 34 岁,还年轻的很:)

天生不聪明

https://mp.weixin.qq.com/s/QvXIDpyrpiOmvEhcOUUmxQ

对聪明的不同看法,会影响人的表现和行为发展。

聪明到底是天生的?还是后天学习来的?

认为聪明是后天学习来的孩子,学习成绩明显的高于相信聪明是天生的孩子。

相信聪明是天生的学生,数学成绩持续下降;而那些相信聪明是后天的学习可以弥补的学生,数学成绩是不降反升的!

认知神经科学基础课和补习班

“补习班”——讲解具体的数学知识点。数学考不好?来来来,课后我们多做点儿练习。

“认知神经科学”基础课。课程的内容,主要就是向大家传授当前认知神经科学的最新研究成果:人类的大脑是如何学习到知识的?答案是通过不断的思考。在不断地学习和思考的过程中,人的大脑内部产生着剧烈的神经活动,迫使脑神经之间建立了更多的连接。随着神经元之间连接越来越多,我们对问题的认识也就越来越深刻,遇到类似问题反应也会越来越快。不仅如此,甚至还能触类旁通,举一反三,乃至和其他的领域结合,产生创新性的想法。这表现出来,就是你更聪明了。

维生素B族都是水溶性维生素,它们有协同作用,调节新陈代谢,维持皮肤肌肉的健康,增进免疫系统神经系统的功能,促进细胞生长和分裂(包括促进红血球的产生,预防贫血发生)。其中维生素B1、B6和B12有助保护神经组织细胞,维生素B2则具有抗氧化作用,而植物能合成维生素B2,动物一般不能合成,必须由食物获得维生素B2,而维生素B2是维持动物正常生长所必需的元素之一,如果缺乏则有可能造成生长停顿,或局部损害。

补充维生素B不会让你更聪明,但是会在你需要的时候促进神经系统产生连接。

我们对聪明的看法,会影响,甚至是严重影响我们的表现!

聪明不是固定的。只要你相信聪明是靠努力可以弥补的,并且努力下去,你就会变聪明。

我们现在可以回到文章开头的问题了:觉得算法好难,自己不够聪明,要花好长时间才能理解一个算法,刷题效率也很低,半天能过一道题就不错了,我该怎么办?

对此,我的回答是:对不起,我没有更好的方法。并且,我坚信,不仅我没有,这个世界上根本不存在这样的一个方法。我经常使用反证法来阐述这个问题:假设这个世界存在一个简单、可行、快速、高效的学会算法的方法,那么,所有的人早就使用这个方法学习算法了,所有的人也早就成为算法大神了,算法也就不是什么让人头疼的事情了。可这是和现实不相符的。所以,这个方法不存在:)

以上证明不仅适用于算法学习,对各个领域的学习都适用。

但是,如果能给你一点安慰的话,我想实话告诉你:在我刚开始接触算法的时候,我也觉得算法好难,自己不够聪明,要花很长时间才能理解一个算法,刷题效率也特别低,别说半天一道题了,一个礼拜死磕一道题都是家常便饭。

或许,你我都是天生不聪明的人。

不过,好在,天生不聪明似乎并没有什么关系。因为,只要你相信聪明是靠努力可以弥补的,并且努力下去,你终将变得很“聪明”。甚至,你会超越这种“聪明”,理解一个很嘻哈又很深刻的道理:聪明不是什么大不了不起的事儿:)

选择和努力同样重要

我用了这么长的文章,回答了一个问题。其实最后答案是一句废话:要努力。换句文绉绉的表示法,就是:万事无他,唯手熟尔

当然,我也承认,只是努力,可能并不够。或者说,至少,还有改进的余地。人生是一个维度极其丰富的过程,用任何一个单一维度去解释它,都是极其幼稚可笑的。比如,我就认为,另外一个非常重要的维度,叫做“选择”。我们经常听到互联网上的一种声音:选择大于努力。对于这个观点怎么看?大家可以期待一下我的一篇文章,我会聊聊我对于“选择”的看法。

但是,在这篇文章里,作为计算机专业的同学,如果想学好算法,将来成为一个计算机科学领域的大神,并且你已经深刻地明白了努力就能更聪明,却不知如何选择从哪里开始努力的话... 咳咳咳,我建议大家从选择我在慕课网上的算法课程开始:)

如果高效学习有什么秘诀的话,那就都在这里了:)

不要完美主义

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

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

可能有的同学会跳出来反驳我:学习当然要认真啊!在这里,我必须强调,我所说的“不要完美主义”,和“学习认真”是不冲突的。什么是“完美主义”,什么又是“囫囵吞枣”,这是一个“度”,每个人其实不一样。不要“完美主义”,不代表学习可以草率前行。每个人都必须要找到适合自己的学习节奏。我的经验是:在自己又因为自己的学习进度而沮丧的时候,问自己一句:是不是自己又犯“完美主义”的毛病了:)

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

比如,很多同学想学机器学习,大多数学习路径都会告诉你,机器学习需要数学基础。于是,很多同学就转而学习数学去了,非要先把数学学好再去学机器学习。可是发现数学怎么也学不好(在这里,可能完美主义的毛病又犯了),而机器学习却一点儿都没学。最终放弃了机器学习,非常可惜。其实,如果真正去接触机器学习,就会发现,至少在入门阶段,机器学习对数学的要求没有那么高。正因为如此,我一直建议:只要你在本科接触过高数,线数,概率这些科目的基础概念,想学机器学习,就去直接学习机器学习。学习过程中发现自己的数学不够用,再回头补数学。在这种情况下,数学学习得也更有目标性,其实效果更好。

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

再比如,我的《算法与数据结构》课程和《玩转算法面试》课程,在视频中都是使用C++进行编码的。虽然我一再强调对于算法的学习,语言不重要,但还是有很多同学表示,要先把C++学透,再回来把课程中的算法学好。这是完全没必要的。事实上,在我的这两门课程中,我看到的收获最大的同学,是那些能够把课程中的算法思想理解清楚,然后用自己熟悉的语言去实现的同学:)

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

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

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

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

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

在这里,关键字是够“薄”。因为“薄”的教材能让你以最快的速度看完,对整个学科有一个全盘的认识:这个领域是做什么的?解决什么问题了?整体解决问题的思路是怎样?解决问题的方法大致是怎样划分的?一些最基础的方法具体是怎样的。这些在初学阶段是至关重要!是让你全盘把握整个领域脉络的。虽然通过这么一本薄薄的教材,你的脉络把握肯定不够全面细致,但比没有强太多!

我看过不少同学,一上来学习《算法导论》,关于复杂度分析的笔记做了好几页,然后就放弃了,可是连什么是动态规划都不知道。这样完全没有对“算法”这个领域有全面的认识,甚至可以说根本没有学过“算法”!先用薄教材入门,再找“厚”教材,细细体会其中的细节,是我百试不爽的学习方法。

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

不要迷信单一教材。

在大多数情况下,学习不是一本固定教材可以搞定的。非要找到一本“最适合自己的”教材,然后就一头扎进去,其实是不科学的。

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

实践!

前面说了很多和教材选择相关的话题,但**对于计算机领域的学习来说,教材的意义其实远远小于实践的意义。**如果仅仅是看学习材料就是学习的话,那么教学网站的视频后期处理人员就是水平最高的工程师了。因为每段视频,他们都需要看一遍。但是,很显然,仅仅是看视频,是无法学到知识的。**对于计算机领域的学习来说,真正动手实践去编程是异常重要的。怎么夸大其中的作用都不过分。**这就好比学游泳,必须下水去游泳;或者学开车,必须亲自上路。否则你说的再头头是道,一个小学生文化水平的人,只要他开过车,游过泳,都能在这两个领域瞬间秒杀你。

很多同学都说我的算法讲得好,其实,我一直认为,这其中的一个最简单的秘诀就是:我带领大家把大多数算法都非常细致的实现了一遍;或者对其中的应用进行了非常具体的实践。反观大多数高校教育,对于算法或者机器学习这种一定程度偏理论的学习,通常非常不强调实践。最终的结果是学习者只是接受了很多抽象的概念,但对其中具体的实现细节,却是云里雾里。我见过太多同学,都明白什么是O(n2)复杂度,什么是O(nlogn)的复杂度,却问我对于100万的数据规模,为什么自己的选择排序运行起来就没反应了。答案很简单:O(n2)的复杂度太慢了,100万的数据规模太大了,一般家用计算机转选择排序一时半会儿是转不完的。这些同学一定理解O(n^2)的算法比O(nlogn)的算法慢,却没有真正实践过,不知道这个差距到底是多少。

在我的课程中,经常遇到有些同学提出这样的问题:这个算法的某句话(或者某段逻辑),为什么要写成A的样子,而不是B的样子?这种问题其实很好,但我觉得解决方法也很简单,实际的去把算法改写成B的样子,实际的运行试试看,看会发生什么。如果发生了错误,仔细分析一下,为什么会有错误?如果没有错误,具体比较一下:A和B两种不同的写法,为什么都正确?又有什么区别?**真正的学习上的提高,就发生在这个过程中。**我当然可以告诉给同学们一个结果,但是自己亲自实践一遍,相比阅读我给出的一个答案,自己对其中问题理解的深刻程度,是完全不可比拟的。

debug非常非常重要。

我看到的另一类“经典”问题就是:老师,这个代码为什么错了,然后贴一大段代码。这种问题背后,依然是,透露着学习方法的不对劲:提问的同学懒得debug。**在计算机领域,debug近乎和实践是一个意思。**如果只是把材料上的代码“抄”一遍,这不叫实践,这叫抄代码。小学生也能做。但是“抄”一遍,不小心没抄对,发生了错误,然后自己一点一点调试,找到错误的根源,这叫真的实践。小学生不能做。(当然,自己理解了算法的逻辑,按照自己的理解,把算法写出来,才是终极目的:)

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

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

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

量变到质变。

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

不知道是不是受高中阶段学习的影响,有一些同学特别执着于就着一个单一的问题,寻找其中的“解题路径”。当然,我不是说这是完全错误的,但也有一个“度”。我的经验是:与其把时间花在这里,不如去见更多问题。比如动态规划,是算法学习的一个难点,很多同学在学会了背包问题的解法之后,总是执着于去追寻:是怎么想到这种状态定义的方法的。可能是我个人水平有限,我无法清楚地解释是如何想到这种状态定义的方法的。但是我的经验告诉我:再去看,去实践100个动态规划相关的问题,然后回头看背包问题,你会发现这种状态定义的方式非常自然。**仅仅对着一个问题思考,很多时候都是死胡同。你见识的还不够多,就不足以帮助你总结出更加“普遍”的问题解决的规律。**当你见得足够多的时候,一切就都变得很自然,所谓的“量变到质变”。

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

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

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

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

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

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

想了解计算机的底层原理?这些资源通俗易懂又有趣

大家可以关注一下波波老师的公众号和知识星球:是不是很酷

总结

Time waits for no one.