序言
本篇文章是基于自己学习各项新技术的过程,结合一些了解到的优秀学习方法总结出的通用方法论,仅供参考。下面通过思维导图总结本篇文章的主要内容,有兴趣的同学细读文档,可以更加深刻理解思维导图中的内容。
1. 培养充分的学习动机
俗话说,兴趣是最好的老师。充分的学习动机是持续学习的源动力。
学习技术,特别是学习新的技术,是一个高失败率的活动。不知道多少次,我们停在安装项目依赖上,停在 Hello World级别的尝鲜上。很多同学把这些失败,归结为自己不够聪明,或者是不够坚持,或者没有一起学习的伙伴等原因。但是,大家忽略了一个很重要的核心因素——学习动机。
学习动机不是一个缥缈虚无的概念,最常见、最显著的一个学习动机就是——工作需求。工作需求,是一个强烈的、持续性的、外部驱动的学习动机。那些跟工作关联起来的技术,通常就是我们掌握得最扎实、构成我们核心技术能力的部分。而那些跟工作关联程度弱的技术,则是最容易中途放弃的部分。
学习动机不够充分而过早放弃,是导致学习失败的重要诱因。
除了工作需求以外,个人兴趣是学习动机的另一大来源。大部分技术岗位的工作需求,可能没有那么多,甚至掌握陈旧的技术栈也能应付好多年。等到突然被输送到社会,才发现自己的技术竞争力不足。我们需要发掘出新的学习动机,去支撑我们不断地扩张技术广度和深度。
学习动机,跟感情一样,也需要培养。混迹于各个技术社区,听听其他人如何宣传不同的技术,我们可以看到那些技术分别做出的承诺,如存储引擎、内存安全、类型安全、高可用、高性能、可维护性等等。渐渐的,某些技术就在我们的心里种下了兴趣的种子。
得到种子以后,我们需要亲自浇灌培育这些兴趣,让它们更加充沛。在所有感兴趣的技术中,去挖掘它们对我们现有工作的潜在价值。即便只是启发价值也好,我们需要让个人兴趣跟工作需求关联起来,如此可以得到更加持久的学习动机。
2. 系统化学习
严肃学习,即系统化学习,是有效学习的核心部分。这个阶段决定你能走多远。
培养学习动机的根本目的,是为了让我们进入严肃学习的阶段。很多同学的学习方式有一个重大问题,就是一直停留在培养学习动机的阶段。什么意思?就是一直在看技术问答、小文章、技术视频或者微信公众号的一些推送文章等,却没有考虑去官方网站里安装工具、下载依赖、阅读文档、编写代码、调试问题、搜索答案等。
事实上,浏览技术社区或者个人博客不等于严肃学习。我更愿意称之为这种学习方式为碎片化学习,因为这一步是为了让我们从他人的技术宣传中获得学习的兴趣和素材;或者查漏补缺,以期构建更完善的知识网络体系。
那么何谓严肃学习?
严肃学习是指通过权威的、一手的、经典的、系统化的学习材料进行学习的过程。
以 Java 为例,入门 Java 的严肃学习过程是,进入官网下载JDK,安装环境并成功跑起来。然后通过查阅资料了解系统性学习Java的经典书籍,例如 《On Java》、《Java 核心技术》或者《Head First Java》当你拿到这些书的时候,如果你花时间和精力去阅读整本书,你将得到的是一个整体的学习过程。
这就是属于严肃学习的过程,我们使用的材料,是一手的,是系统化的,也是 Java 当前的入门经典。而我们在技术社区里看到的,许多是其他开发者基于这些系统而权威的材料产出的技术文章,性质上属于读后感。读后感不是一手的,不是权威的,不是体系化的,不是经典的,不属于严肃学习的材料。
读后感 / 学习心得相比严肃材料,更简单和轻松一点,可以帮助我们建立对 Java 等技术的初步印象和学习信心,但难以作为入门 Java 的充分材料,甚至有一些低质量的读后感会导致你一开始学习就建立错误的认知。包括这篇文章本身,也不属于严肃学习的范畴,而是一个激发学习动机的材料。举例,Java 初学者关注一堆公众号和技术博客,但是发现推送给 ta 的都是《Java 17 新特性!》、《构建 Java 镜像的 10 个最佳实践》等等诸如此类,初学者看了这些文章一定会更加迷茫,因为并不清楚这些东西到底有什么实际意义,隶属于 Java 知识体系哪一块内容。并不是说这些内容不好,对于已经熟练掌握 Java 的有经验的程序员,这些技术博客和文章是可以帮助他们扫盲或者夯实自己以前没注意过的基础知识甚至涉猎新的领域;但是一个初学者因为觉得标题带有 Java 标签,对自己有吸引力而点进去,接收到爆炸的信息只会让 ta 感受到学习 Java 的压力。
一栋大楼的建造一定是从地基开始,按部就班系统性地建造出来的。学习亦如此,跳跃式前进不是不可以,个人经验而言,如果不是为了赶进度,长期保持跳跃前进式学习会导致自己无法估量自己的能力,甚至觉得心虚。
人脑是一个对信息来源很挑剔的器官,技术社区里混杂了很多八卦信息,它会轻视其中的少量干货。而读教科书、经典著作和论文等严肃内容时,大脑对信息的处理模式会切换成严肃学习的状态,更容易记住内容,并尝试去关联知识点。
那些停留在收藏夹里的严肃材料链接,是开启我们有效学习大门的钥匙,而在技术社区搜罗和收藏它们的过程,则是培养学习动机的阶段。
经验来说,当你读了 100 篇读后感,起码要配合读一篇相关的严肃材料去升华和沉淀,去聚拢离散的知识点。 这里提一下我最近在有意识培养自己的能力——利用知识图谱或者思维导图构建属于自己的知识体系。我的想法就是,能够针对不同技术维度,构建尽可能完善且独立的知识网络体系。这一点有利于提升自己的能力自我认知。学习了那么多技术和工具,到底掌握得怎么样,从哪些维度出发来考察,还需要从哪些方面进行提升?在没有知识网络体系之前,这些都使我觉得为难。而当自己在学习过程中逐渐构建起完整的思维导图后,这些问题都迎刃而解了。
3. 高强度间歇性训练
高强度间歇性是高效学习的秘诀。
在具备了学习动机、准备好了严肃学习材料之后,下一步就是规划学习时间了。
高强度间歇性训练方法,原本是用以健身,现在我们借用来描述知识学习的一种时间规划策略。
让学习更高效,本质上是让大脑非理性部分去重视理性认知的成果。人类的理性认知能力,相比大脑的其它功能,比如视觉加工、记忆、语言等,是更晚演化出来的部分。因此,人类记忆的工作机制很大程度上是相对独立的,不是我们想记住什么就记住什么,想忘记什么就忘记什么。在我们具备理性思考的能力之前,我们已经具备记住信息的能力了。
因此,我们需要利用人类的记忆偏好、对信息加工的偏好等各种既定特性,去让大脑记住我们理性上认定是重要的知识点。通过严肃材料进行学习,总结来看就两个方面:
- 保证内容的正确性和系统性;
- 诱导大脑去做深刻加工。
严肃材料对我们的大脑来说,有两重意义。一个是客观层面,学习材料由权威人士编写,经过了层层的检验和时间的考验。一个是主观层面,学习材料对本人很重要,很有意义,关系很大。
找到严肃材料之后,只达成了第一个层面的严肃性。第二层面的严肃性,需要我们自我建设。世界上的严肃材料这么多,如何向我们的大脑证明眼前这一堆确实是严肃的、重要的材料呢?
一个有效途径是,让这些材料反复出现,即高频次、高密度、高强度地出现。
3.1 高强度训练
高强度的持续信息暴露是必要的,三天打鱼两天晒网的学习方式,难以有效的激活大脑对新技术的严肃定位。
下面就是一个高强度训练的例子。
每天规划出一段时间,半小时到两小时左右,比如我规划出晚上 10 点到 12 点之间学习 Java 严肃材料。让它每天都出现在我面前,每天都暴露在我的脑海里,随着它出现时间和频次的增加,大脑自动会逐渐认可 Java 对我的生活的重要性。特别是,学习 Java 过程中会遇到很多问题及其解决方案。它们会启动大脑的另一个认知偏好——对负面内容更敏感。也就是说,对我的大脑来说,每天都有 Java 相关的问题在不断产生和解决,它会分配更多认知资源去处理和消化 Java 知识,它会激发我们对 Java 更有兴趣,因为它会想要获取更多 Java 信息去加工。主观体验就是,我们会感到 Java 越来越好玩。
3.2 间歇性休息
除了高强度训练以外,间歇性休息也很重要。它是指,我们必须适时停下来,娱乐、休息和睡眠。尽量不要废寝忘食地啃学习材料,仿佛一天要学完整本书。这是不现实的,一天强行看完整本书,不代表学习了整本书。大脑需要在睡眠阶段对当天所学习的内容进行加工和整合。不停下来提供消化知识的机会,对身体健康和学习质量都没有帮助。
用权威学习材料达成客观上的严肃性,用高强度间歇性训练思路达成主观上的严肃性,两者结合起来,我们学到了主客观层面都靠得住的严肃知识。
即便不了解上述严肃学习策略,其实很多同学也已有意或无意的通过增加严肃性来优化学习过程。只不过其中很多策略,可能不太经得起推敲。比如报一个培训班,增加老师和同学的监督角色,来提升学习的严肃性;比如去自习室、星巴克等地方增加学习氛围的严肃性;比如购买实体书籍,布置一个富有仪式感的环境去学习等。
我个人的选择是,在线资源结合经典书籍。我的 Chrome 书签会存有当前我要学习的技术相关所有搜集到的学习资源(自行选择资源,包括但不限于在线电子书、视频资源、书籍,只需保证其系统性和权威性)。Java 相关的学习材料会一直保存在我的浏览器书签栏最熟悉的地方,书籍就放在身边或者桌面,只要我有了心思,可以迅速地进入学习状态,并启动 IDE 编写和运行代码验证自己的学习成果。
学习材料的严肃性,包含了真正的知识。而学习环境和学习氛围包含的严肃性,并不包含知识。假设培训班老师自身水平也不过硬,所选教材既不系统也不权威,再严肃的学习氛围下我们也可能吸收不到可靠的知识。而不管身处什么环境,什么氛围,只要我们能沉浸到严肃知识材料中,有效的学习就发生了。
在制定学习规划时,我们需要明确有效学习的干货部分是否得到最优化:
- 我们找的学习材料里包含权威系统性的知识;
- 我们成功让我们大脑认可了这些知识的严肃性,使我们能长时间记住它们。即严肃性的知识得到主客观的统一。
4. 超纲训练
超纲训练是巩固知识的可靠方式。
找到严肃的学习材料,扎实且认真地学习了这些材料之后,下一个阶段是——超纲训练。
看过一遍书,不代表充分理解了书里的知识。我们要去证明自己确实在一定程度上领会了知识。
如何证明?做那些没有参考答案的训练,即超纲训练。
以我学习 Java 为例,可能部分书籍带领我们实现了一些简单的程序,但是,我们的代码实现,跟书里的答案太像了。即便我们能默写答案,也无法劝服我们的大脑,这些代码是我们的自主产出。(有没有同感的小伙伴 🤣 )
因此,我们需要进行超纲训练。这里举一个我最近的想法:
问题&现状 :
- 最近在思考如何培养自己有意识地将所学的设计模式、编程技巧应用到自己所负责的需求开发。但是实际上一些需求开发确实用不上一些过度设计的编码。这就导致我没有一个验证自己学习成果的环境。
创造超纲训练条件:
最近在使用任务清单 App 时发觉没有自己想要的功能:
- 无法实现定制化目标。短期目标长期目标,不同维度的目标,所需要的描述字段不同;
- 创建任务功能单一,没有截止时间和完成进度条,无法明确自己的任务完成情况;
同时也发现了任务清单 App 中好用的功能:
- 对于各项任务可以划分出子任务;
- 数据复盘能力。对于日任务,周任务的完成情况能够进行统计分析。
既然如此,那就自己以此为基础,开发一个类似的任务清单应用,方便自己在编码中实践自己学习到的编码技巧、设计模式以及编程思想等等。
思考:
- 既然在需求开发中没办法轻松找到自己想要的环境,何不自己创造出来呢?自己直接独立开始一个属于自己的沙盒项目,并且这个沙盒项目是有意义的。当最终完善后,可以部署到云服务器,供自己使用。一举两得,既给自己提供了产生学习成果的环境,又锻炼了自己的全局项目开发和管理能力,还给自己提供了VIP级别的软件服务,一举多得。
- 在项目开发的方案设计里,由于自己想实现定制化(个性化)目标的功能,这种灵活的字段构建的表,突然就想到了自己前段时间所学的 MongoDB,显然这里就可以作为一种技术选型。当方案设计好之后就可以开展项目开发工作,在这个过程中灵活度就比日常需求开发要有更多自己发挥的空间。
- 在上述超纲训练里,自己结合实际需求和个人兴趣创造属于自己的训练项目,并且这种项目不是假大空,而是根据实际相关 App 做了一些调研,这就给我们项目实现奠定了复现基础;又由于存在的 App 是 C++ 语言实现的,并不是通过 Java 语言实现的,这相当于就体现了“超纲”的特性。
- 因为超纲训练的精髓就在于我们是没有参考的实现过程,只有一个成熟的结果,而我们要做的就是尽可能复现这个结果。 这个过程就会大大提高自己对于新技术的掌握能力以及灵活应用的意识,不再是纸上谈兵。并且实现这个过程又能够为我们自己积累学习成果,作为里程碑式的学习标志。
- 而里程碑式的学习成果验证了我们的学习是有成效的,所以就会更加激发自己对于学习新技术的兴趣,进而提供学习的源动力;而有了学习动机和源动力,就更容易上手和熟悉新技术,一次王府,形成良性循环。
综上,超纲训练之所以重要,是因为一旦我们将学习到的技术,投入生产。我们所面对的各种问题,几乎都是超纲的,再没有书里的参考答案让我们照抄了。因此,在跟着官方书籍和教程学习完之后,立刻启动一个超纲项目加以巩固,可以有效提升学习的质量。
5. 碎片化学习
碎片化学习旨在查漏补缺,不能作为主要学习途径,但是是形成自己知识网络结构化体系的强有力手段。
当你初步掌握了这门新技术,并在进行超纲训练的过程中。我觉得在这个过程中一定遇到了许多问题,这里其实就会利用到碎片化学习。
这里总结一下我自己关于碎片化学习的途径,包括但不限于以下途径:
- 阅读技术论坛和技术博客中的技术文档,沉淀思考;
- 梳理提炼微信公众号文章的精华,总结自己的沉淀;
- 查漏补缺,在实际编程中查阅资料解决问题并做记录;
- 阅读经典进阶书籍拓展自己的知识体系。
碎片化学习不要求我们又连续的大段时间,也不拘泥于形式,只关心能否解决问题。这是一种高效的,面向结果学习的方式。但是我之所以推崇这种学习方式,是因为我觉得它可以和前面介绍的系统性学习相辅相成。众所周知,教科书不会告诉你真正实战的东西。所以在我们通过系统性学习初步建立知识体系时,就需要利用碎片化学习来完善自己的知识网络结构体系的细节和盲区,拓展自己的能力范围和认知范围。
6. 积累学习成果
成果积累是获得技术自信的必要条件。
一场学习之旅的最后一步,也是最容易被忽视的一步,就是将这次学习之旅汇聚成一个标志性的成果。
成果,可大可小。小到练习成果,大到科研成就。它是一个里程碑,昭示着某段时间的努力的价值。
它可以是一个具体的产物,也可以是一篇总结文章。当我们完成超纲训练时,其实已经自然而然得到了一个学习成果,当我们写成一篇文章时,又产生了另一个成果。尽管在将来的我们看来,这些成果实在微不足道,但是我们现在仍然需要一个成果。
我们的大脑需要一个成果性质的刺激。 是什么区分了一次成功的学习和中途放弃的失败学习?是成果。
如前面所言,创造出的项目,任务清单 App 还可以无限升级,根本学不到头。不管我做成怎样,本质上都是中途放弃了去无限升级难度。因此,我们要创造一个阶段性成果,去明确定义这次学习之旅是成功的,是达到预期的。
随着我们学习的技术越来越多,我们累计的阶段性成果和文章也越来越多。我可以在 Java 学习成果中,援引上次开发任务清单的 Web 网页版本的代码;这些在时间长河中层叠和交织在一起的阶段性成果,可以告诉我们的大脑,它们真的很有用,很有价值,它们值得被铭记。
不断积累的成果,有大有小,有的可能已经被继续升级,甚至得到其他人的广泛认可,它们构成了你的成就。随着我们拥有的成果和成就的增加,我们的技术自信心也会增加,更容易启动去学习新的技术,去创造新的阶段性成果。
我们需要去保留成果,让它们留下痕迹,可举证。一旦我们知道,再也没有什么东西,可以证明我曾经学过和达成过某些目标和成果,我们的大脑可能不再认为它们对我们的生活是息息相关的。而如果我们一直记得,可以从哪里拿出某个材料,作为证据,昭示我们曾经的努力及其价值,我们的大脑会更乐意长时间的记住跟这个功勋章有关的知识。
对于技术学习而言,放在 Github 里的仓库,是一个很好的成果储存媒介。
7. 建立良好心态
学习技术,是一个长期的或者说是一个终身学习的活动。在这个过程中,我们会碰到很多问题,它们可能降低了我们学习的乐趣,可能打击了我们学习的自信心。如何抗住这些负面思绪,正确的看待学习中遇到的各种困惑,是我们需要长期努力的方向。心态建设是快乐学习的关键!
7.1、失败是学习的常态
失败是学习的常态,成功才是罕见的。
开启一次学习之旅,最后却不得不宣告失败。这是很正常的现象,所有人都会经常碰到。难道我现在收集量子力学的教科书,进行严肃学习,我就能学成吗?概率太低了。
很多学习是有前置知识要求的,在满足这些要求之前,越级去攻克某些知识,事倍功半,失败是很显然的。但是,很多时候,我们实在是不知道我们要学习的内容,究竟有什么前置要求,我究竟是否具备这些条件。我们只能亲自学上一学,用实际行动去检验我现在究竟有没有学会这些技术的资质。
也就是说,开启学习之旅,本身就是一场未知的冒险。学习失败,不完全是负面信号,不是指我们彻底完蛋了,它反而提供了很多正面线索:
- 这些材料不适合我的情况;
- 我需要寻找其它材料;
- 我需要过一段时间,有了其它积累再试试。
及时停止低质量的,甚至无效的学习,是在止损,是在保留精力,投资在更有回报的学习中去。不必气馁,来日方长。下一回,我们卷土重来时,胜算更高。
我们去积累成功,但不必去细数失败,徒增伤心,打击士气。
7.2、不必盲目攀比学习效率
在学习时,我们有时会忍不住跟其他人攀比学习效率,恨不得定下 1 天学会 XXX 技术的豪言。一旦在学习过程中卡住,特别是卡在基础概念上时,我们会感到焦急,认为我们学得不够顺畅,拖慢了学习的效率。
然而,仔细一想,我们会发现这些想法是不太现实的,这里给出自己的看法:
- 首先,我们在学习,也就是在面对我们未知的事物,我们凭什么知道花多少天自己就能掌握呢?即便我们准确的说对了学习时间,那也是无根据的猜测,实属巧合。 在没有外部时间压力的情况下,我们为什么要限制一个学习时间?如果我们的目的是学会这门技术,那么保持自己喜欢的学习节奏,默默前行,直到学完即可。时间长短,因人而异,不必攀比。
- 其次,遇到问题被卡住,也没什么值得烦恼的。所谓顺畅的学习,如果是指不被问题卡住的话,说明也没学习到什么,都是一些本质上已经知道和解决的问题。卡住,说明我们碰到了学习要点,在某种程度上是值得高兴的事情。
- 如果我们在卡住时,为了追求阅读进度这种百分比,而选择跳过问题,直奔后面的内容,可能带来我们无法想象的代价。在我们啃完大部头后,我们会认为自己已经掌握了基础知识,已经过了从头学习基础知识的阶段,到了实战或者进阶的时刻。
- 然而,其实我们基础知识并不扎实,我们跳过了自己当时不太理解的基础概念,它会反复困扰我们,成为我们进阶的瓶颈。我们以为自己是因为不够聪明,因此水平才一直没有质的提升,我们可能永远不知道,根源在当时我们跳过的基础知识上,我们不知道我们错过的是什么。
因此,在严肃学习时,除非是投入了足够的努力,证明继续纠结下去也是无益,否则轻易不跳过任何内容。
比如你在学习 Python 之前,已经具备 Java 等语言、运行时和工具的学习和使用经验。Python 很多语法、特性、概念对我而言,已经不算新颖,你可能觉得自己可以跳过很多内容,等到用的时候再查不懂的地方,也能写出代码。但是我的建议是忍住冲动,默默一点点看,扎实的阅读,去培养自己 Thinking in Python 的心智模型。一旦我们选择用 Java 的概念去理解 Python 的特性,那么 Python 就难以被我们的大脑认为是一等的事物,它可能被认为是衍生的、次要的,我们只要记住 Java 就好了。写出 Java 味道的 Python 代码,让其他人难以适应,让自己也难以适应 Python 里代码习俗。
严肃学习需要减少偷懒成分,去扎实的、诚恳的、谦卑的阅读系统化的材料吧,最后它们会给我们带来不可估量的价值。
不要去思考我是不是足够有学习效率,是否比别人学习效率高,转而思考,我是否在忠实地学习?
学习效率是一个客观统计,是我们扎实的学习完毕之后计算出来的,当我们走捷径,不求甚解的快速浏览内容,加快进度时,我们的学习效率并没有提升,只是它无法被正确统计了。只有当我们的学习处处是诚恳的、扎实的,我们阅读速度才反映了学习效率。否则阅读速度只是阅读速度而已,不代表我的学习速度,不代表我充分理解了内容。
我们不知道在学习初期的加速行为,是否导致了后续学习效率的变慢。我们不能盲目的加快入门速度,因为对于我们还不了解的技术,我们实在难以评估后果。有时看似愚笨的默默学习,或许反倒让我们后续的学习之路更加通畅。
严肃而诚恳地学习,即便不是最佳学习策略,也是一个明显不坏的选择。
7.3、不必成为焦虑的学习机器
学习可以是快乐的事情,我们不必追求每天都要有学习进展,不用觉得一天不学习,就落后于人。
人的成长曲线,可能是间歇性的突飞猛进,加上长时间的停滞甚至退步,构成的涨落。一年能完成一两次高质量的严肃学习,已经非常可观了。
在这个快节奏的时代,走得快和走得远是两回事。奉劝各位在终身学习这场长跑旅途中,不要为了跟上旁人的节奏,而忽视了自己的本心。衷心祝愿每一位热爱技术的同学都可以保持终身学习的优良品质,持续在自己的领域内发光发热,认真生活,快乐工作!