
2.2 学会学习
前面提到过,在这个技术高速发展的时代,做一个不被抛弃的程序员其实是挺难的,因为几乎每天都会有新的技术诞生。
2017年8月,JCP执行委员会提出将Java的发布频率改为每6个月一次,并且该决定将在Java 9正式发布之后开始实行,新的发布周期严格遵循时间点,将在每年的3月和9月发布。2019年3月,Java 12正式发布,Java 13也会在2019年9月发布,如果你是一名Java开发者,那么这也意味着你所使用的开发语言每半年就会有一个新的版本迭代出来。
这是一件好事,也是一件坏事:Java开发者可以快速地使用新版本的Java语言,更快地体验新的特性,但如果不能主动且高效地学习,那么Java开发者被淘汰的速度会比以前更快。
大多数开发者都深刻理解学习新技术的重要性,但是学习新技术的秘诀是什么?如何快速、高效地学习新的框架、类库和新技术呢?本节将介绍高效学习的几种方法和途径。
2.2.1 高效学习的方法
说到学习,大家可能并不陌生,我们从小到大都经历过很长一段时间的学习,但同样是学习,有些人就能做到很高效,有些人却会浪费大量的时间。不可否认的一个重要原因是,那些高效的人掌握着一套高效学习的方法。
笔者认为,要想比其他人更加高效地学习,就只需做到如下三点:管理好自己的目标、利用好碎片时间,在同一时间只做一件事。
1.管理好自己的目标
有一个明确的目标是做成一件事的基础,在学习上也一样。很多人整天都在忙忙碌碌,也将很多时间用于学习,但是收效甚微,归根结底就是不会管理目标。要想高效地学习,则不仅仅是制定目标这么简单。很多人都很擅长给自己制定目标,但基本上达不到目标,这就是只会制定目标而不会管理目标的结果。
目标管理,主要可以分为如下几步:评估能力、制定目标、评估目标。
1)评估能力
目标管理的第1步,就是正确评估自己的能力。每个人都有不同的能力,并且自己其实是最了解自己能力的人。在评估自己的能力时,可以给自己画一个简单的雷达图,并正确评估自己在各个方向上的能力指标。例如在学习方面,可能要依赖于如下几种能力:理解能力、自控能力、坚持能力、智商能力和专注能力,如图2.5所示。

图2.5
2)制定目标
在正确评估自己的各方面能力之后,就可以根据实际情况及时间等因素,给自己制定目标了。在制定目标时,建议给自己制定两个目标,一个长期目标和一个短期目标。短期目标可以是由长期目标分解而来的。比如计划在三个月内学会Java 9的新特性,那么可以计划第1个月学会Jigsaw,第2个月学会JShell,第3个月学会Stack-Walking API。
这里的目标其实等同于计划,不仅有自己要达成的目的,还伴随着时间节点。目标的设定模板可以是:在什么时间节点完成什么事。
3)评估目标
在评估好能力并指定好目标之后,还要养成定期评估自己目标的习惯。这就是我们为什么要设置短期目标,以及为什么要有时间节点,因为这样可以方便我们进行目标的回顾和调整。例如,还是对于学习Java 9的新特性这件事,在第1个月要完成时,要及时检查一下自己是否真的学会了Jigsaw,并根据实际完成的情况重新评估自己的能力和制定新的短期目标,以期完成自己的长期目标。
2.利用好碎片时间
开发者很少有一整块时间可以用来学习,因为平常可能需要加班到很晚,到了周末还要陪陪家人。但是,没有整块的时间不代表没办法学习,如果利用好了碎片时间,则也可以很好地学习。
哪些是碎片时间呢?早晚的通勤路上、午饭后午休前的时间、周末陪孩子上辅导课的时间、甚至是蹲在厕所里的时间,这些都是碎片时间。其实,平时刷朋友圈、刷微博、刷抖音的时间,都是可以用来学习的碎片时间。
在碎片时间里,不适合掏出一本书来看,但可以通过手机或者Kindle等学习。现在,很多技术知识都可以通过网上文章、有声书籍、在线视频的方式获取,只要你把刷朋友圈改为阅读技术文章,将刷微博改为听有声书,将刷抖音改为看在线课程,就可以很好地利用碎片时间。
3.在同一时间只做一件事
前面介绍过高效学习的方法,一个是管理好目标,另外一个是利用好碎片时间。那么,在碎片时间里如何更好地达成目标呢?那就是专注,即在同一时间只做一件事。在学习方面就是指在同一时间只专注地学习一种技术。
比如计划学习Java 9和Spring Boot 2.0,则最糟糕的做法是同时或者交叉学习,这会导致两个技术都学不好。只有专注,才能达到高效学习的效果。
通过管理好自己的目标、利用好碎片时间及在同一时间只做一件事这三种方法,读者就可以高效地学习了。
2.2.2 高效学习的途径
接下来简单介绍开发者学习新技术的途径。
1.阅读书籍
开卷有益,一般来说,学习知识最好的途径就是阅读,这是一种很古老也极其有效的方法。我们正处于一个信息爆炸的时代,经常刷朋友圈、新闻、微博及知乎等,这些平台分别为我们提供了不同领域的内容,但这些内容大多数比较零散,不成体系。阅读书籍则是一种比较好的选择,而且对于技术类知识来说,书籍中的内容也相对权威一些。
如果你想高效地学习,那么阅读相关书籍绝对是很好的选择,它可以让你对所学的知识建立一个很好的知识体系,并且在学习过程中通过反复翻阅来巩固那些容易遗忘的知识点。另外,你在读书的过程中有足够的时间来思考,这个思考的过程在学习中是十分关键的。
最近一年来,国内的很多听书软件也渐渐火起来了。这类软件的好处就是会把别人写下来的内容念给读者听,有的将总结念给读者听,但听众在听书过程中可能没有太多的思考过程,而且,听过的内容容易忘记,知识点也不便于检索。
2.参加在线课程
对技术知识的学习,主要包含两方面:原理和实战。对于原理性的技术知识,建议通过阅读书籍等方式来学习;对于实战性的技术知识,则可以考虑学习在线课程,这或许会更高效一些。
在互联网技术方面,有很多在线课程,既包括直播也包括录播,这种学习方式比较直观,可以看到真正的操作步骤,所以很适合实战类的知识学习。比如在学习Spring Boot应用开发及部署时,有一小段视频讲解的话就会比较容易理解。
但是在线课程也有一定的弊端,比如不容易使参与者集中注意力,没有办法带动参与者一起思考等。所以,笔者认为,这种视频课程比较适用于实战类的知识学习。
3.参与线下会议
线下会议,也是近年来比较流行的一种方式,适合有一定经验的开发者,人们可以在会议中和其他人进行交流。很多时候,别人的经验是很宝贵的,所以,这也是一种很不错的学习方式。国内也有很多类似的线下会议可供参加,比如QCon、ArchSummit等。
4.贡献开源项目
对于有经验的程序员来说,保持自我进步的最好方法就是参与开源项目。例如,如果你需要学习像Apache Spark或Hadoop这样的大数据框架,那么也可以作为开源贡献者参与这个项目。
开源项目的参与者不仅可以根据自身经验来帮助开源社区成长,也可以很好地学习这种新技术。一般的开源项目都是由很多优秀的程序员共同协作的,在参与的过程中和优秀的程序员交流也是一种很好的增长经验的方式。
比如,如果最近想学习Docker,那么完全可以到GitHub上将Docker的代码fork过来,然后clone到本地进行学习。在学习过程中,如果发现问题或者有更好的改进方法,则可以通过pull request的方式向原项目贡献自己的代码。而且,这些热门的新技术都会有自己的开源社区,在社区中和其他开发者交流,也是很好的学习过程。
5.编程竞赛
解决问题其实是提升开发者编程能力的最好方式。除了在日常工作中遇到的一些问题,我们还可以通过参加一些编程竞赛来挑战自己,通过在竞赛中解决编程难题,来快速地学习编程知识和提升编程技能。
目前,国内外有很多编程竞赛网站可供我们选择,例如TopCoder、CodeForces、Hackerrank、LeetCode等。
6.创建博客
没错,创建并记录博客也是一种学习技术的好方式。“教是最好的学习”,学习某技术的最终效果,就是能够把学到的新知识经过自己的理解给其他人讲清楚。相比于其他几种学习方式,创建博客也有很多好处。
◎ 能更深入地了解技术。在很多时候,当我们想学习一个知识并且把它写成文章时,为了避免文章的内容出错,一般都会尽量阅读很多文献,来确保内容是正确的。所以,写文章之前的准备也是自我学习的一个阶段,而且学习的内容往往是比较深入和透彻的,这样才能保证自己写的内容具备权威性。
◎ 能更好地记忆知识点。写作的过程就是最好的记忆过程。因为在写文章的过程中会仔细推敲每一句话。这个过程就是多次记忆的过程。很多时候,你记不住别人说的话是因为其思维方式和你的不一样,但是通过自己的思维方式表达出来的内容就会很容易记住。
当读者试着写一篇关于Java中synchronized的实现方式的文章时,也许首先会去研究javac的编译及javap的反编译,通过反编译后的代码了解到synchronized是通过ACC_SYNCHRONIZED、monitorenter和monitorexit实现的,然后会深入HotSpot源码并了解其背后的锁优化等技术。写好一篇文章,背后可能涉及十几个知识点,这无疑是一种非常好的学习方式。
7.编码训练营
“编码训练营”听起来像是一个新鲜事物,但其实我们一般称其为参加培训机构。这种方式更加适合没有经验的人。很多人没有编程经验,所以可以通过这种方式更容易地过渡到职业生涯中,成为一名开发者。
和其他几种学习方式比较,参加编码训练营需要花费更多的资金,但同时有一些好处,比如有对应的讲师可以直接辅导自己,可以直接解决问题,有些训练营还提供项目实战等。这种方式更适合非计算机专业的新手。
以上几种高效学习途径,可能适用于不同的程序员。有些程序员发现从书中学习很容易,有些程序员觉得学习网上的课程更好,有些程序员喜欢通过创建真实的项目进行学习。简而言之,选择适合自己的学习方法即可。
2.2.3 舒适区与小步子原则
我们习惯待在舒适区是很自然的事情,有励志书籍就讲了,要跳出舒适区,就要挑战自我。舒适不好吗?有知乎上有不少讨论,其中一个回答比较实在。
我们为什么想跳出舒服圈?因为我们想成长,成长的动机来源于自己的追求和社会的期待。例如,我想跳出总是宅在家里的舒服圈,是因为我想增强自己适应社会的能力(自己的追求),或者也可能是你的爸爸妈妈希望你提高交际能力(社会期待)。
这里着重聊一下学习和跳出为什么是困难的,一是动力是否来自自己;二是担心失败的焦虑和负面反馈。比如有人在朋友圈发减肥健身的照片,就可能有人在调侃A8腰不是这么减的!因此要做调整,就应该小频度尝试(小步子原则)、快速反馈(及时反馈原则),通过迭代拿到正面的反馈,逐步消除对挫折的潜在畏惧。编程语言几乎开头都是“Hello World”,可能就是出于这样的考虑。
2.2.4 两个著名的学习理论
下面看看两个著名的学习理论。
1.德雷福斯模型
德雷福斯模型是一种衡量人们的工作方法和能力,反省并提高专业技能的层级模型。它把从新手到专家的技能阶段分成五个层级,如图2.6所示。

图2.6
◎ 新手(Novice):新手需要指令清单,在该技能领域经验很少或者没有经验。这里提到的经验,指的是通过实施这项技术促进了思维的改变。
◎ 高级新手(Advanced Beginner):高级新手不想要全局思维。一旦经过新手的历练,人们就开始以高级新手的角度看待问题。高级新手能够或多或少地摆脱固定的规则,可以独自尝试任务,但仍难以解决问题。
◎ 胜任者(Competent):胜任者能够解决问题,处于这一水平的人通常被认为“有主动性”和“足智多谋”。他们往往在团队中发挥领导作用(无论是否有正式的头衔),既可以指导新手,也不会经常“骚扰”专家。
◎ 精通者(Proficient):精通者能够自我纠正。精通水平的从业者需要全局思维,将围绕某种技术,寻找并想了解更大的概念框架。对于过于简单化的信息,他们会非常沮丧。
◎ 专家(Expert):专家凭直觉工作。专家是各个领域知识和信息的主要来源,总是不断地寻找更好的方法和方式去做事。他们有丰富的经验,可以在恰当的情境中选取和应用这些经验。他们写文章,并做巡回演讲。
《程序员的思维修炼》的作者针对德雷福斯模型给出一些诀窍。
◎ 新手使用规则;专家使用直觉。
◎ 新手通过模仿和观察来学习;专家要保持实践来维持专家水平。
2.刻意锻炼理论
首次提出“刻意练习(Deliberate Practice)”这个概念的是佛罗里达州立大学的心理学家K. Anders Ericsson。这套练习方法的核心假设是,专家级水平是逐渐练出来的,而有效进步的关键在于找到一系列的小任务让受训者按顺序完成。这些小任务必须是受训者正好不会做,但又正好可以学习和掌握的。完成这种练习要求受训者思想高度集中,这就与那些例行公事或者带娱乐色彩的练习完全不同。
2.2.5 终身成长
在经过数年研究之后,斯坦福大学心理学家卡罗尔·德韦克发现了思维模式的力量。她在《终身成长》中表明:我们获得的成功并不是能力和天赋决定的,更受到我们在追求目标的过程中展现的思维模式的影响。
终生成长理念将人的思维分为固定型思维和成长型思维。
◎ 拥有固定型思维的人喜欢与人对比,并不断证明自己最棒,挫折、批评和否定能让其收到打击或者重创。
◎ 拥有成长型思维的人则只考虑能不能够学到知识,可不可以变得更强,能不能够继续成长。
其实,我们耳熟能详的名人也不是一开始就这么强的,比如乔丹。在高中时,乔丹被校队淘汰了。他沮丧地回家向母亲倾诉,他的母亲说,那就回校好好训练。从此以后,乔丹每天早上6点离开家到校练习,并在上大学时进一步训练防守、控球和投篮能力。如果输了比赛,他会在赛后更加努力地练习,即使赢了比赛,也会对不满意的地方寻求改进。所以我们要思考一个问题,乔丹靠的是天赋还是不断努力呢?
有趣的是,在大部分活动比如工作中,我们会在面试环节、晋升环节评价一个人的潜力。潜力是面试官的一种判断,支撑的素材来自面试者叙述的现实案例。潜力是变化的,因为这个面试者也是可以成长的,只要他拥有成长型心态并努力。