TL;DR

IT 行业是一个变化非常快的行业,它需要我们持续去学习新的知识和技能。 但是, 工作以后,我们经常会发现自己学习的东西很少了,倒不是没有时间去学习, 而是学习的 效率太低了。久而久之,就演变成『一年的工作经验,重复用十年』。当然,有些人会说自 己经常加班,没有时间学习,这只是表象,时间挤挤总是有的。

你想想你为了上王者,浪 费了多少时间?为了刷今日头条、抖音和 B 站,又消磨了多少 光阴?另外,很多人推崇碎片化学习,但是有一些东西碎片化学习效率是很低的,比如数学 和计算机底层基础知识。(碎片时间对于英语学习是非常有帮助的,另外碎片时间可以多利 用大脑的回想功能,多进行深度思考,本质上,我认为碎片时间是一个对自身掌握知识的深 度加工的过程。)

这篇文章是我学习完 coursera 上面的《Learning How to Learn》MOOC 加上我自己多年来 的学习经验积累整理而来。

注:本文最开始发布于 2017 年,现在读来我感觉还是非常受用,所以修订了一些内容再次 发表。现在网上的垃圾信息太多了,如果你能够利用好自己的时间,有一定的技术品味,有 好的学习习惯。你其实并不需要“头悬梁锥刺骨”,只需要每天多花 1-2 小时提升自己,你 就能够超越大多数人。注:下文中加黑的部分,是我 2021 年新增的。

1 一些学习的坏习惯

1.1 背动反复阅读

通常编程新手在学习一个新东西的时候,喜欢买一本权威指南之类的书(大神或者同事推 荐),比如「C++ Primer」和「Javascript 权威指南」。 而这样一本书,一般页数在 700-1400 页左右,要完整读完,在不求甚解的基础之上大概要花费好几个月甚至大半年时 间。 别说是新手,就算是一个 C++编程老手去读「Javascript 权威指南」这样的书也不可 能在只阅读一遍之后就能理解。 这时,很多人会选择重复多次阅读。有人会从头开始重复 阅读,也有人只挑不理解的章节来阅读。 我以前上大学那会儿就是这么干的,读了好多 C++的书籍,其实自己编写的 C++代码并不多,也没有做过大型的 C++项目。 看了好多书, 其实都是一知半解,效率很低。工作以后,这种学习方式更加不可取,因为你没有那么多时 间这么干。

1.2 喜欢在书上划重点

很多人偏好纸质书,因为在看书的时候手感不错,还可以保护眼睛,另外,还可以在书上把 喜欢的句子和重点的段落用彩色笔标注出来。 这样做除了给自己造成一种假象「书上的重 点我都标出来了,所以我都掌握了」之外,其实并无多大益处。 (我非常喜欢在电脑上面 看 PDF,尤其是技术类 PDF,可以因为边看边写代码。另外,使用 Emacs 的 PDF-tools 插 件,我还可以给 PDF 添加标注和笔记,同时可以提取 pdf 的大纲和笔记,让我很方便地把 书读薄。最后可以通过 org-roam 插件把这些知识点连接起来,这样更有利于构造自己的知 识体系。)读书的时候,还有一个误区,就是大脑被动地跟着作者的思路在走,如果是一本 经典的书,你会每每被作者的真知灼见所震惊, 一种「于我心有戚戚焉」的感觉由然而生。 但是,你一定要把作者的这些思想结合自己的过往经验进行辩证分析,然后把这些知识记录 下来,时不时回顾一下。因为,随着你的阅历和经验增长,你的理解是不断变化的。

1.3 看书中代码示例认为自己就理解了,从不动手编程

这是新手学编程的大忌,不去动手写,不去跟编译器和开发环境做斗争,你永远不知道软件 开发过程中的操蛋事情。有些时候,即使是把示例代码照着敲一遍,对于你的理解和记忆也 非常有帮助。

1.4 拖延

这个问题最大,也是影响 N 多人不去学习的理由。解决的办法只有一个,马上去做!一旦 你开始去做了,你的大脑就不会排斥了。 你的计划再完美,你选的书籍再经典,你挑的视 频水平再高,如果你不马上去看,去学,去动手实践,那永远也只是停留在空想的阶段。 成功学习的典范就是成功战胜拖延症的典范。战胜拖延还有一个好办法就是养成好习惯,比 如每周做一次 ARTS。这是陈浩老师提出来的,每周做一个 algorithm(A),读一篇高质量 的英文文档或教程 Reading(R),总结一个编程中的 Tips(T),然后输出一篇博客或者 一个视频来 Share(S)给别人。

1.5 学习任何东西,只停留在编写「Hello World」的水平

这个是什么意思呢?不是说你真的只会写「Hello World」,而是说要跳出自己的舒适区, 去尝试一些自己不了解的领域,去做一些超过自己能力范围的事情 。这个看似不可能,实 则很多人工作都处出这个状态。比如,在工作中,你的项目需要切换 git,然后你就把它当 svn 用,只学习 git pull 和 git push,根本不管 git 的最佳实践和分支管理艺术。比如 你搞 java 的,某天,你需要学习使用 C++了,你还是用 java 那一套思维去写 C++,不去 管 C++的 best practice,那你其实就是只停留在「Hello World」的水平。

1.6 喜欢加 QQ 群和微信群,美其名曰「技术交流」

这是国内技术圈的一大通病,可能刚开始会聊点技术,但是时间一长就水了。好好的技术群 一秒钟就可能变成水群。 而且经常还有老司机冒然发车,此时马上有人冒出一句「留图不 留种,菊花万人捅」。我强烈建议大家不要过渡依赖 Q 群和微信群来学习技术或者解决问 题,技术论坛,Stackoverflow 和 Github issue 是你更好的去处。另外,推荐大家加入一 些专业领域的 Reddit 和 Discord,里面有全世界的开发者都在里面,也有新手指引的学习 资源推荐。这些资料基本都是第一手的,虽然全部是英文,但是它们的实效性和准确性是非 常高的。

1.7 天天熬夜打王者和 LOL,睡眠严重不足

实践证明,睡眠不足,啥事也干不成,只想睡觉。有人会说我晚上不到那个点睡不着,我这 里有一招。 拿着一本 Kindle,挑一本英文书,躺在床上看,半小时保管睡着。虽然说看书 的效果不一定佳,但是催眠也是极好的。另外,我会在睡前用 Anki 来背诵一些单词,同时 听一些英文经典名著,很容易就睡着了。

1.8 工作中遇到模糊的问题不搞清楚,停留在面向 Google 编程

遇到问题,不假思索「百度」和「Google」,虽然现在 80%的问题都可以找到解决方案,但 是这样做对于自己并无多大益处。 找到解决方案之后,还要花几分钟时间探寻问题根源。 可以查找背景资料,以便自己下次遇到同类型的问题时可以举一反三。最近这些年,我还发 现一个解决问题的好思路,就是面对任何问题,你都列举一下现有方法的不足,我们原来应 该解决哪些问题,现有方法解决了哪些问题,还有哪些问题没有解决,我的新方法能够 Cover 所有的问题吗?请至少提出 2 种以上的解决方案,然后拉相关的人一起讨论,记住, 一定要先提方案再拉起讨论,否则只会浪费时间。

1.9 看几分钟书,敲几行代码就开始刷知乎和朋友圈

做事情不专注,注意力不能集中,这也是学习的大忌。可以利用番茄工作法,给自己一段时 间专注于某件事情,这样可以极大地提高自己的工作效率。这里其实不止是知乎和朋友圈, 你的手机现在是你的时间消耗最大的敌人,还有各种即时通讯软件。B站的何同学介绍过一 些方法可以帮你戒掉手机,但是其实戒掉手机最好的方法就是找到自己真正想做的事,然后 动手去做就行了。这个就像打游戏,你打了王者荣耀,你就没时间打吃鸡了。你背了单词, 刷了算法,写了代码,你自然没有多余的时间去刷抖音了。但是,你可能会说,我 3 天不 刷抖音或者 3 天不玩游戏,我就浑身不舒服。如果你刷抖音或者玩游戏的时候,也不追求 什么,就佛系玩,佛系刷,那么我建议你下载一些挂机游戏,利用碎片时间偶尔玩一下,瞅 两眼就行了。

1.10 从不看书,所有问题的解决方案都从论坛,Q群和 Google 中来

认为看书效率太低,而且收益也不高,看书需要大量的时间,而且看完感觉也没太大的用, 不如直接 Google 和 Q 群来得容易。 如果你真的这样想过,我只想说「小伙子,你思想很 危险!」。当你还是一名新手的时候,看书是最快的学习方法。当你有一定经验之后,看书 就要有策略了,要围绕搭建自己的知识体系的思路来看书,看书也不用逐字逐句来看,而是 重点看你不知道的,对于已经烂熟于心的内容,只需要泛读或者跳过即可。

2 一些学习的好习惯

2.1 与其反复阅读,不如经常回顾

与其一遍又一遍地阅读重复的书籍,编写同样的「Hello World」,不如有意识地总结回顾 看过的书,学过的知识。 只需要每晚趟在床上的时候,回想一下今天都学到了什么?今天 自己有进步一点点吗?工作中遇到问题,也多回想一下为什么会出现这些问题,以后怎么避 免再发生类似的问题。

2.2 多做练习,多写代码,从错误中学习

看技术书籍要多写书中的代码,在初学阶段哪怕对着书本敲也没有什么问题。认真完成书中 留的习题,在自己没有尽最大努力的情况下面不要去看答案。 不要怕犯错,每一次犯错都 是自己进步的机会,而且犯过的错误,记忆最为深刻。

2.3 多总结问题的解决方案,多写可复用的代码,拒绝复制粘贴

每天把工作中遇到问题的解决方案总结一下,想想为什么要这么做,是什么导致了这个 BUG, 导致 BUG 的根本原因是什么。 是自己的逻辑混乱,粗心大意,还是程序框架太复杂?做需 求的时候,要尽量避免复制粘贴,不要让代码里面有重复代码。 Don't Repeat Yourself! Don't Repeat Yourself! Don't Repeat Yourself! 「重要的事情说三遍!」

2.4 对于自己想要学习的内容,制订一下计划,有节奏地学习

我是一个非常爱学习的人,但是有时候还是感觉学习不够高效。经常会由于一些突发情况把 原本的学习计划打乱,导致学习效果打折扣。 因为学习一个东西最怕三天打渔,如果能够 持续地学习一个东西,我可以把它学习地很好。这时候,我就得结合我自身的情况,选择一 段最佳的学习时间,在这段学习时间里我可以不被打扰,保持高度专注。比如每天早上 6.30 起床看一个小时书,或者每晚 8.30 看一个技术专题文档,做一些 demo。

2.5 尝试使用不同的方式来解决一个问题

在遇到一个没有显而易见解决方案的问题时,你可能费了好大功夫想出一个方案,但是千万 要记得,该方案不一定是最优的, 而且很大可能还存在一个更佳的方法。而这个方法只需 要你退后一步,换个思路,或者与同事讨论一下就可以得出。 这也是我为什么非常喜欢别 人 Rewview 我的代码的原因,因为别人能看到我代码中存在的不足。另外,有些时候,对 现有的方案做一些 「微创新」也能使原本普通的方案变得不普通。另外,习惯了面向对象, 何不尝尝函数式编程?每年学习一门新的不同范式的编程语言,可以极大地开拓你的眼界, 给你一些不一样的解题思路。

2.6 注意劳逸结合

多参加体育锻炼,多去户外走走,运动能够增强人的记忆力,并且有时候还能产生灵感。 如果身体不好,比如颈椎不好,下了班你就只想葛优躺了,因为你的本能告诉你,我不能再 写代码了,会挂的。。。 想要成为大神,身体好是前提条件。有人 30 岁成为大神,我资 质不好,我 35 岁成为大神总可以吧。 切莫在 30 岁的时候就把身体弄跨了,然后 35 岁 转行了,永远失去了成长为大神的机会。

2.7 向别人解释你的知识,多与人讨论

多写博客,多分享自己的所学所思,这些对于学习者自身也是非常有益的。通过用别人能够 理解的语言来解释你学到的东西, 本身就要求你对该知识充分理解。另外,很多人经常感 叹「跟你讨论一下,我马上变得有思路了」,这其实就是交流的作用。

2.8 保持学习的专注

很多知识没有足够的专注力和足够多的时间是很难学好的,保持学习的专注尤其重要。 因 为人的大脑在专注模式下面,神经细胞更活跃,你学的东西更容易从短期记忆变成中长期记 忆。 而且在高度专注下面,你的解决问题的能力也会提高,原本看起来复杂的东西,在专 注面前说不定就不是事了。

2.9 找到自己的短板并补足自己的短板

发现并找到自己的不足相对来说是比较容易的,但是要补齐短板就非常不易了。 因为人总 是有畏难思想的,拖延症是怎么来的,就是你的大脑出于本能去做一些让自己分泌更多多巴

气掌握数学。 补齐短板就像渡劫,越早渡劫,越快升仙。

2.10 给自己设计学习奖励

比如学好了 3D 数学,就给自己买一台顶配 MacBookPro 之类的。为什么游戏可以让你上瘾, 因为它有反馈,有奖励机制。 学习数学是非常枯燥的,如果有了这个奖励机制,也许自己 就更容易坚持了呢。PS:这一点对于有家室的程序员有用,你想学好什么,要获得什么奖励, 你可以当着你老婆的面立个 FLAG

3 小结

Coursera 的这门 MOOC 《Learning How to Learn》 强烈推荐给每一伴热爱学习的小伙伴,也欢迎大家给我留言,分享你的学习感悟。