偶看看到这篇关于学习的事情10 Things Software Developers Should Learn about Learning,看完感觉还不错,这里分享一下。以下摘要和翻译由 FisherAI Chrome 插件 完成,模型使用 gemini-1.5-pro-latest。
摘要
主要观点
本文探讨了软件开发者需要了解的关于学习的十个要点。文章指出,学习对于软件开发者来说至关重要,因为技术领域在不断变化。作者强调,了解人类学习的机制可以帮助开发者更有效地学习。文章还探讨了专业知识的优缺点,以及学习编程能力的预测因素。最后,作者强调了心态在学习中的重要性,并鼓励开发者采用成长型思维模式。
关键细节
- 人类记忆与计算机记忆不同,它并非由比特构成,而是由相互连接的神经通路组成。回忆信息的过程会强化和修改记忆,这被称为“重新整合”。
- 人类记忆分为长期记忆和工作记忆。长期记忆容量无限,而工作记忆容量有限。熟练的程序员通过将信息“组块”来有效地利用工作记忆。
- 专家和新手思考方式不同。专家依靠模式识别,而新手则更多地进行推理。
- 理解概念的过程从抽象到具体再返回。学习新概念的最佳方式是结合抽象定义和具体示例。
- 间隔重复是学习新技能的有效方法。学习时间应该分成较短的间隔,间隔之间要有休息时间。
- 互联网和人工智能工具并没有使学习变得过时。将知识存储在长期记忆中对于形成知识之间的联系至关重要。
- 解决问题不是一项通用技能,而是特定于领域的。解决编程问题的最佳方法是练习解决编程问题。
- 专业知识在某些情况下可能是有问题的。专家可能会发现为新手设计的提示分散注意力,并且可能会将从一种编程语言中学到的知识错误地转移到另一种语言中。
- 预测编程能力的因素尚不清楚。没有可靠的预测测试或候选人资料可以识别编程能力。
- 你的心态很重要。采用成长型思维模式可以帮助你克服学习过程中的挑战。
原文
10 件软件开发者应该了解的关于学习的事情 – ACM 通讯
学习对于软件开发者来说是必要的。变化是永恒的:新技术层出不穷,旧技术不断更新。因此,开发者不是只学习一次编程——在他们的职业生涯中,他们将学习许多新的编程语言和框架。
仅仅因为我们学习并不意味着我们理解我们是如何学习的。美国的一项调查发现,大多数关于记忆的信念与科学共识相悖:人们并不直观地理解记忆和学习是如何运作的。37
仅仅因为我们学习并不意味着我们理解我们*如何*学习。
例如,考虑学习风格。学习风格的支持者声称,有效的教学要与学习者喜欢的风格相匹配——视觉型学习者看,听觉型学习者听,动觉型学习者做。2020 年的一项综述发现,89% 的人认为学习者的偏好风格应该决定教学方式,尽管研究人员在几十年前就已经知道这是不准确的。28 虽然学习者有偏好的风格,但有效的教学方式取决于内容,而不是学习风格。科学课应该使用图表来呈现数据,而不是口头描述,无论视觉型还是听觉型学习风格,就像烹饪课应该使用动手实践而不是阅读,无论学习者是否偏爱动觉型风格。
几十年来对认知心理学、教育和编程教育的研究为我们如何学习提供了深刻的见解。本文接下来的 10 个部分提供了以研究为依据的关于学习的发现,这些发现适用于软件开发者,并讨论了它们的实际意义。这些信息可以帮助你为自己学习、指导初级员工和招聘员工。
关键见解
学习对程序员来说至关重要,但人类的思维方式与计算机有很大不同。
了解人类是如何学习的可以帮助你更有效地学习。
互联网和大语言模型并没有使学习过时;学习是必不可少的,而且需要时间。
专业知识会改变你的思维方式,让你更容易解决问题,但也可能会阻碍你的教学能力。
1. 人类记忆不是由比特构成的
人类记忆是学习的核心。正如 Kirschner 和 Hendrick 所说,“学习意味着一个人的长期记忆发生了改变。”20 软件开发者熟悉计算机内存的惊人力量,我们可以在其中存储一系列比特,并在以后检索出完全相同的比特序列。虽然人类记忆与此类似,但它既不精确也不可靠。
由于人类记忆的生物学复杂性,可靠性是一个复杂的问题。对于计算机内存,我们使用两个基本操作:读和写。读取计算机内存不会修改它,而且写和读之间经过多少时间并不重要。人类的长期记忆并非如此无菌:人类记忆似乎有一个“读-更新”的操作,其中获取记忆可以同时加强和修改它——这个过程被称为*重固化*。这种修改更有可能发生在最近形成的记忆上。由于这种修改的可能性,一个事实并不存在于明确知道或不知道的二元状态;它可以存在于中间状态。我们可以忘记我们以前知道的事情,而且知识可能是不可靠的,尤其是在最近学到的知识。
人类记忆似乎有一个“读-更新”的操作,其中获取记忆可以同时加强*和*修改它。
人类记忆的另一个奇特之处是“扩散激活”。1 我们的记忆存储在相互连接的神经通路中。当我们试图记住某件事时,我们会激活一条神经通路来访问目标信息。然而,激活并不局限于一条通路。一些激活能量会扩散到其他连接的通路,就像热水管散发的热量一样。这种扩散激活使相关的通路在数小时内处于激活状态。1
扩散激活对记忆有负面影响1,对解决问题有正面影响。32 扩散激活意味着相关但不精确的信息可能会与目标信息混淆,这意味着我们对信息的回忆可能是不可靠的。然而,扩散激活也与基于洞察力的问题解决或“顿悟时刻”有关。由于通路会保持数小时的激活状态,有时离开一个问题去处理另一个有其自身扩散激活的问题会导致两个不相关的区域在中间连接起来。当两个先前不相关的区域连接起来时,就会出现创造性和独特的解决方案。这就是为什么散步、淋浴或以其他方式离开问题一段时间可以帮助你在解决问题时摆脱困境。
总而言之,人类记忆并不像计算机内存那样,简单地从特定位置存储和检索。人类记忆更脆弱,更不可靠,但它也可以通过将知识联系在一起,在解决问题和深刻理解方面带来巨大的好处。我们将在后面的章节中进一步阐述这一点,特别是在从记忆中检索项目和加强记忆方面。
人类记忆并不像计算机内存那样,简单地从特定位置存储和检索。
2. 人类记忆由一个有限系统和一个无限系统组成
人类记忆有两个与学习相关的组成部分:*长期记忆*和*工作记忆*。长期记忆是永久存储信息的地方,功能上是无限的;1 在这个意义上,它的功能有点像计算机的磁盘存储。相比之下,工作记忆被用来有意识地推理信息以解决问题;2 它的功能就像 CPU 的寄存器,实时存储有限数量的信息,以允许访问和操作。
工作记忆是有限的,它的容量在出生时就大致固定了。2 虽然更高的工作记忆容量与更高的一般智力有关,但工作记忆容量并不是决定表现的全部因素。22 更高的容量可以使学习更快,但我们无限的长期记忆消除了我们最终可以学习多少的限制。1 专家程序员可能具有低或高的工作记忆容量,但正是他们长期记忆的内容使他们成为专家。
当人们对一个主题了解得越多,他们就把信息联系在一起形成*块*。a 块化允许多个信息在工作记忆中充当一个信息。例如,在学习电子邮件地址时,一个熟悉的域名,如 gmail.com,被视为一个信息,而不是一串随机的字符,如 xvjki.wmt。因此,块化的信息越多,工作记忆在功能上就越大。38 用我们的计算机类比,我们的工作记忆/CPU 寄存器可能只允许我们在长期记忆/磁盘中存储五个指向块的指针,但块的大小没有限制,因此最佳策略是通过练习使用信息和解决问题来增加块的大小。
在学习新工具或技能时,重要的是要了解任务所需的*认知负荷*或工作记忆容量。认知负荷有两个部分:*内在负荷*和*外在负荷*。内在负荷是指完成任务本身需要多少信息或块,除了改变任务外,它不能改变。相比之下,外在认知负荷是不必要的信息,但却是执行任务的一部分。呈现方式是外在认知负荷如何变化的一个例子。如果你正在实现一个数据库模式,使用带有表和属性的图表比使用简单的英文描述更容易——后者具有更高的外在负荷,因为你必须在脑海中将描述转换为模式,而图表可以直接映射 (参见图 1)。外在负荷对于初学者来说通常更高,因为他们不能轻易区分内在信息和外在信息。
当面对一个似乎超出一个人能力范围的任务时,重要的是要意识到通过重新组织任务可以改变这种情况. 将问题分解成可以处理和分块的较小部分,最终将使人能够解决复杂的问题。这个原则应该在你自己的实践中应用,当你面对超出或者在当前技能边缘的问题, 但在与初级开发者和新员工一起工作时尤其重要。
3. 专家识别,新手推理
新手和专家的一个关键区别在于,专家已经见过所有情况。对国际象棋专家的研究表明,专家的主要优势在于他们*记住并识别*棋盘的状态。这使得他们能够更快、更省力地决定如何应对。15 Kahneman19,b 将认知分为“系统 1”和“系统 2” (从而证明了不仅仅是开发者难以命名事物)。系统 1 是快速的,由识别驱动,依赖于长期记忆中的模式识别,而系统 2 是较慢的,专注于推理,需要在工作记忆中进行更多处理。这是被称为双重加工理论的普遍观点的一部分。34
专家开发者可以通过记忆 (通常是隐性的,来自经验) 程序代码中的常见模式来进行更高层次的推理,这解放了他们的认知。4 其中一个例子就是编程中的“设计模式”,类似于前面讨论的块。专家可以立即识别出某段代码正在执行排序算法,而新手可能会逐行阅读,试图理解代码的工作原理,而没有认识到更大的图景。
专家开发者可以通过记忆程序代码中的常见模式来进行更高层次的推理,这解放了他们的认知。
由此可以推论,新手可以通过阅读和理解大量代码成为专家。专家建立了一个模式的心理库,让他们在未来更容易阅读和编写代码。仅仅看到纯粹的命令式 C 代码可能只部分适用于函数式 Haskell 代码,因此看到各种编程范式将会有所帮助。总的来说,这种模式匹配就是为什么阅读和使用更多代码,以及更多类型的代码,会提高编程熟练程度的原因。
4. 理解一个概念从抽象到具体,再回到抽象
研究表明,专家处理概念的方式与新手不同。专家使用通用和抽象的术语来寻找基本概念,而不关注细节,而新手则关注表面细节,并且难以将这些细节与更大的图景联系起来。这些差异不仅影响了专家的推理方式,也影响了他们的学习方式。
例如,在向不熟悉变参函数概念的人解释 Python 中的变参函数时,专家可能会说,这是一个可以接受不同数量参数的函数。新手可能会专注于细节,比如声明和调用函数的确切语法,并可能认为传递一个参数是一个特例。专家可能会更容易理解或预测细节,同时让他们理解这个概念。
当你学习一个新概念时,你将从两种形式的解释中受益:抽象特征和带有示例的具体细节。更具体地说,你将受益于遵循*语义波*,这是一个由澳大利亚科学家 Karl Maton 定义的概念,25 如图 2 所示。
沿着语义波,你不断地在抽象定义和概念的几个不同例子之间切换。例子越多样化越好。即使是错误的例子,与正确的例子相比,也有助于理解为什么它们是错误的,23 例如,在试图学习什么是常量时,看到一个可变变量被标记为非常量。这个过程被称为拆包。
有了这些不同的例子,你就可以 (重新) 审视抽象定义,并构建对概念的更深理解。更深的理解来自于认识到例子中的多个细节是如何与定义中的一个抽象概念联系起来的,这个过程被称为*重新打包*。
编程经常涉及学习抽象概念。当人们面对一个需要学习的抽象概念,比如函数,他们往往会去寻找这个概念的具体实例来研究,例如,返回数字绝对值的abs函数。17 一个挑战是,随着概念变得更加抽象 (从值到变量/对象,再到函数/类,再到高阶函数/元类,最后到范畴论),到具体例子的距离就增加了。令人欣慰的是,当我们学习抽象概念时,它们对我们来说变得更加具体。最初,函数是一个抽象概念,但经过大量的练习,函数对我们来说就变成了一个具体的项目 (或块),我们可以学习下一级抽象。
5. 间隔和重复很重要
你听过多少次不要为了考试而临时抱佛脚?除非你想在第二天就忘记一切。这个建议是基于认知心理学中最可预测和最持久的影响之一:间隔效应。10 根据间隔效应,人类通过将练习分散到多个时段、多天,理想情况下是多周,来学习解决问题的概念效果最好。
间隔有效的原因是由于本文前面描述的长期记忆和工作记忆之间的关系。当学习者练习解决问题时,他们在练习两种技能。首先,将问题中的信息与可以解决问题的概念 (例如过滤循环) 相匹配,其次,应用该概念来解决问题 (例如编写循环)。第一种技能需要激活通往长期记忆中概念的正确神经通路。5 如果学习者反复解决同一种类型的问题,例如 for-each 循环问题,那么通往长期记忆的通路就会保持活跃,他们就会错过练习第一种技能的机会。非间隔练习的常见结果是,人们可以解决问题,但前提是他们被告知使用哪个概念。5 虽然交错不同类型的问题 (例如循环和条件问题) 可以有所帮助,但通路需要时间才能回到基线,这使得间隔对于最大限度地利用练习时间是必要的。10 此外,大脑需要休息来巩固已经处理的新信息,以便将其应用于新问题。
与这一经时间考验的原则相悖,密集的编程训练营要求学习者将解决问题的练习塞进非间隔的时段。虽然这并不理想,但间隔效应的研究人员从一开始就知道,大多数学习者仍然喜欢将练习塞进尽可能少的时间里。10 对于那些唯一可行的学习编程途径是密集训练营的人来说,我们可以应用间隔研究来最大限度地提高他们的成果。
为了构建一天的学习,学习者应该将学习时间限制在 90 分钟或更短。21 过了这个时间点,大脑中的神经化学平衡就会使集中注意力变得困难。21 每次学习结束后,至少要休息 20 分钟。21 真正的休息是去散步或静静地坐着——不要做其他工作,不要漫不经心地浏览互联网,也不要和别人聊天。休息可以加速巩固过程,这在睡眠期间也会发生。
在一个学习阶段中,有几种策略可以最大限度地提高效率。首先,随机化要解决的问题类型的顺序,以便在长期记忆中激活不同的概念。5 但要注意的是,随机化顺序可以提高学习效果,但需要付出更多努力。6 第二种策略是在随机间隔休息一小段时间,以增强记忆巩固。建议每 2-5 分钟休息 10 秒。18
6. 互联网并没有使学习过时
随着互联网的出现,编程知识的获取方式发生了变化。关于语法或 API 的知识从埋藏在参考书中变成了只需敲几下键盘就能找到。最近,人工智能驱动的工具,如 ChatGPT、Codex 和 GitHub Copilot,甚至会 (大部分准确地) 为你填写这些细节。这就提出了一个显而易见的问题:如果知识可以在几秒钟内从互联网上获得,那么学习细节——或者任何东西——还有什么价值?
我们通过将知识片段存储在我们的长期记忆中并在它们之间建立联系来学习。1 如果知识不存在于大脑中,因为你还没有很好地学习它,那么大脑就不能形成任何联系,所以更高层次的理解和抽象是不可能的。1 如果你每次需要一段代码来进行数据库连接时都要在网上搜索它,插入它,然后继续,你就不太可能学到很多关于连接的知识。依赖互联网或人工智能的智慧在新手和专家之间有所不同:一个从未学习过细节、因此缺乏记忆连接的新手,和一个已经学习了更深层次结构但搜索遗忘的细枝末节的专家之间,存在着关键的区别。1
甚至有一些证据表明,在互联网上搜索在记忆信息方面的效率较低。一项研究发现,如果信息是通过互联网找到的 (与纸质书相比),记忆的效果会更差。11 另一项研究发现,与先尝试思考答案,然后再求助于搜索相比,立即在互联网上搜索会导致以后对相同信息的回忆更差。14 搜索似乎会剥夺大脑回忆信息带来的记忆强化效果的好处。
还有前面讨论过的认知负荷问题。互联网搜索需要大脑进行某种形式的上下文切换;它有限的注意力和工作记忆必须从手头的任务 (编程) 切换到新的认知任务 (搜索互联网并选择结果或评估人工智能生成的结果)。如果所需的知识被记忆下来,那么不仅访问速度会快得多 (就像使用缓存与从硬盘获取一样),而且还可以避免上下文切换和过滤搜索中无关信息的认知消耗。因此,尽管信息可以在互联网上获得,但记忆信息有多个理由。
7. 解决问题不是一种通用技能
解决问题是编程的很大一部分。软件开发中一个常见的 (但不正确的) 想法是直接将解决问题作为一种特定技能来教授,然后可以将其应用于开发的不同方面 (设计、调试等等)。因此,解决问题被 (错误地) 认为是一种通用技能。然而,这不是解决问题在大脑中的运作方式。
解决问题被 (错误地) 认为是一种通用技能。然而,这不是解决问题在大脑中的运作方式。
虽然人类确实有一些通用的解决问题的技能,但它们的效率远不如特定领域的解决问题的技能,比如能够调试程序。虽然我们可以学习推理,但我们并没有学习如何解决一般问题。相反,我们学习如何解决编程问题,或者如何计划最佳的国际象棋走法,或者如何创建编织图案。这些技能都是独立的,不会相互影响。对国际象棋的研究发现,学习国际象棋对其他学术和认知技能几乎没有影响,音乐教学和认知训练也是如此。36 这种无法迁移解决问题的能力就是为什么“脑力训练”对发展一般智力无效的原因。29
这条规则的一个例外似乎是空间技能。空间技能让我们能够在脑海中想象物体,比如俄罗斯方块的形状,并在心理上操纵这些物体,比如旋转俄罗斯方块的形状。训练这些通用技能可以提高其他学科的学习。这种现象是如此不寻常,以至于在认知和学习科学领域引起了很大的震动。24 然而,空间训练可以提高一系列非语言技能的表现,而不管初始能力、年龄或训练任务类型如何。40 最近的研究甚至表明,空间训练可以提高专业软件开发人员的效率,这可能是因为他们仍在学习新概念。30 即使有这个奇怪的例外,学习如何解决编程问题的最佳方式仍然是练习解决编程问题,而不是指望从学习国际象棋或其他认知训练中获得性能上的好处。
这对招聘也有第二个含义。筛选编程候选人一个流行的想法是给出脑筋急转弯的谜题,比如如何称量一架大型喷气式飞机的重量。正如 Google 在 2013 年所发现的那样,这是浪费时间7——脑筋急转弯世界中的问题解决与编程世界中的问题解决之间没有可靠的对应关系。如果你想判断编程能力,那就评估编程能力。
8. 专业知识在某些情况下可能会造成问题
我们已经讨论了专业知识在学习和表现方面的许多好处。然而,成为专家也会导致问题,我们将在本节详细介绍。
程序员使用工具和辅助工具来提高效率,例如版本控制系统或 IDE。此类工具对新手和专家可能产生不同的影响。新手可能会被专业工具中大量的选项所淹没 (由于认知负荷增加),并可能受益于新手友好的关于如何使用工具的提示。然而,专家发现同样的提示弊大于利,因为他们已经知道该做什么。这就是所谓的专业知识反转效应:帮助新手的提示和指南可能会妨碍专家,降低他们的效率。
程序员在他们的职业生涯中通常会学习多种编程语言。一旦掌握了多种语言,了解它们就会有好处,但有时将知识从一种编程语言转移到另一种编程语言会导致错误的知识。例如,程序员可能会学习 Java 中的继承,其中只要签名匹配,一个方法就可以覆盖父方法,并将此知识转移到 C++ 中,在 C++ 中,覆盖父方法还需要将父方法声明为虚拟的。这些类型的差异——语言之间的特征在语法上相似,但在语义上不同——特别阻碍了知识的迁移。39
专家经常帮助培训新手,但没有培训他人经验的专家往往没有意识到新手的思维方式不同。因此,他们没有根据具有不同心理模型的人来调整他们的解释。这就是所谓的专家盲点问题:一旦你成为专家,就很难从新手的角度看问题。可以通过仔细倾听新手解释他们目前的理解并相应地调整解释来克服这个问题。
然而,有时知识会变得如此自动化,以至于专家很难用语言表达出来。1 这种自动化的知识就是为什么专家对如何解决问题有直觉,或者将他们的过程解释为“我就是知道”。在这些默契知识的情况下,新手可能最好从旨在支持新手的教学材料中学习,这些材料通常被称为脚手架式教学,或者从同伴而不是专家那里学习。一个更有知识 (但仍然相对新手) 的同伴是一个非常宝贵的资源,可以弥合新手和专家之间的差距。他们可以帮助新手发展新知识,帮助专家重新发现自动化知识。
9. 编程能力的预测因素尚不清楚
学习编程的成功,就像大多数活动一样,是建立在内在能力和实践的混合基础上的。有些人认为这纯粹是能力问题——“你天生就有这种能力”的观点——而有些人认为这几乎完全是实践问题——“一万小时”的观点,即只有足够的练习才能成为专家。这两种极端的观点都是错误的,在本节中,我们将探讨能力和实践的不同影响的证据。
有很多研究试图预测编程能力,但可靠的结果很少。试图为编程能力制定预测性测试的尝试通常都以失败告终。研究发现,以下所有因素都不能预测编程能力:性别、年龄、学术专业、种族、之前的数学成绩、之前使用其他编程语言的经验、对计算机科学的看法以及对人文或科学的偏好。35 在 20 世纪 60 年代,编程能力测试行业开始兴起,但正如 Robins33 总结的那样,预测准确性很差,这些测试也逐渐被淘汰。
试图为编程能力制定预测性测试的尝试通常都以失败告终。
关于多年经验 (与实践相关) 的重要性,存在着不同的证据。在 Stack Overflow 上,程序员的声誉与他们的年龄之间存在着相关性:年龄越大的人声誉越高。27 然而,最近的一项研究发现,在职业生涯相对较早的程序员中,工作年限与编程任务的成功之间只有微弱的联系,31 这表明,至少在程序员职业生涯的早期,能力的影响可能比经验更大。
与大多数领域一样,在早期编程中,两个能够微弱预测成功的因素是一般智力 (参见第 4 节) 和工作记忆容量。4 这些因素大致代表了推理能力和学习者一次可以处理多少信息。因此,它们预测的是*学习速度*,而不是绝对能力。这两个因素的一个子指标,*空间推理*,是编程成功的更有力预测因素,尽管仍然相当温和。30 空间推理能力也能预测其他科学和数学领域的成功,24 所以这不是编程特有的。此外,由于各种原因,随着经验的增加,这些弱到中等程度的相关性在很大程度上消失了。因此,聪明的人并不总是能成为优秀的程序员,而优秀的程序员也不一定具有很高的智力。
聪明的人并不总是能成为优秀的程序员,而优秀的程序员也不一定具有很高的智力。
简而言之,很难预测谁能够编程,尤其是长期来看。程序员可能来自任何背景或人口群体,与任何其他因素 (例如智力) 的联系通常会在经验面前变得 fleeting。因此,在招聘新程序员时,没有捷径可以识别编程能力,也没有任何可靠的“候选人画像”可以用来筛选具有编程能力的候选人。
10. 你的心态很重要
对于编程能力,一直存在着一种二元划分的观点:你要么会编程,要么不会编程。关于这一点,有很多相互竞争的理论。其中一个更有说服力的理论是学习优势势头的概念,33 也就是说,每个主题都依赖于之前的主题,所以一旦你落后了,你就很难赶上。一个不太有说服力的理论是“极客基因”的概念 (你要么天生就有,要么没有),这几乎没有经验证据。26 正如上一节所讨论的,我们最近开始将编程能力的差异理解为先前经验的差异。16 看似相似的学习者 (例如,在同一个班级,拥有相同的学位,完成相同的训练营) 可能拥有 vastly different 的知识和技能,这使得他们在学习优势势头上处于领先或落后地位,或者在某个时间点上,让他们看起来像是“天生就会”或“天生不会”。在大学之前可以选择教授的任何高技术领域 (例如,计算机科学、物理和工程) 中也发现了类似的效应。9
二元划分观点及其对教学和学习的影响,已经在关于固定心态与成长心态的研究中得到了跨学科的研究。12 固定心态与能力是天生的、不可改变的观点一致。应用于学习,这种心态认为,如果一个人在新任务中挣扎,那么他们就不适合这项任务。或者,成长心态与实践观点一致——人的能力是可以改变的。应用于学习,这种心态认为,如果一个人在新任务中挣扎,他们可以通过足够的练习来掌握它。
正如 Cheryan 等人所描述的那样,9 两种极端的观点都不是真的。例如,实际上每个人都可以学到一些物理知识,即使他们最初并不擅长。然而,实际上没有人能够获得诺贝尔物理学奖,无论他们练习多少。在这两种极端之间,我们常常试图弄清楚我们能力的界限。当教师和学习者以成长心态对待新任务时,他们往往会坚持克服困难,更始终如一地克服失败。12
虽然这种效应的证据是强有力的和直观的,但研究表明,改变一个人的心态使其更倾向于成长是困难的。8 特别是,关于如何促进成长心态,有两个常见的误解被证明是无效的。第一个误解是奖励努力而不是表现,因为成长心态重视实践而不是能力。但学习者并不愚蠢;他们能够分辨出自己何时没有进步,而教师表扬无益的努力是没有帮助的。相反,只有当学习者正在使用有效的策略并走在成功的道路上时,才应该奖励努力。13 第二个误解是,当一个人以成长心态对待一项任务时,他们会在整个任务过程中保持这种心态。在现实中,当我们当遭遇挫折和经历失败时,人们倾向于固定型思维模式,因为我们不确定自己能力的边界在哪里。因此,我们必须练习克服挫折和失败,以保持成长的心态。13
与固定心态和成长心态相关的概念是目标导向。这分为两类:趋近和回避。“趋近”目标导向包括想要做好,这会产生积极有效的学习行为:努力学习、寻求帮助和尝试新的具有挑战性的主题。相反,“回避”目标导向包括避免失败。这会导致消极和无效的行为:学习无序、不寻求帮助、对表现焦虑和逃避挑战。重要的是,如果学习者要被引导到“趋近”而不是“回避”,他们就必须能够在没有严重惩罚的情况下犯错。
在学习一项新技能或培训某人学习一项新技能时,请记住,以成长的心态对待任务是有效的,但也是一项需要发展的技能。不幸的是,我们不能简单地告诉人们要有成长的心态,然后就能获得好处。相反,通过寻求或提供关于学习过程和策略有效性的诚实反馈来培养这种技能。对于导师来说,要表扬受指导者正在取得进展的领域,并接受他们会在没有斥责的情况下犯错。对于学习者来说,当你怀疑自己的进步时,反思一下过去几周或几个月里技能是如何提高的。此外,要预料到成长心态会在 faced with failure 时转向固定心态,但它也可以通过练习重新发展并变得更加强大。感到气馁是正常的,但这并不意味着你将永远感到气馁。如果你想放弃,那就休息一下,散散步,考虑一下你的策略,然后再试一次。
总结
为了跟上该领域快速的变化,软件开发者必须不断学习。学习任何东西,包括编程,都涉及将项目提交到记忆中。人类记忆的复杂程度令人着迷。虽然它与计算机体系结构有一些相似之处,但也有一些关键的区别,使得它的工作方式大不相同。在本文中,我们解释了目前关于人类记忆如何工作、学习如何工作、新手和专家的区别的科学理解,并将所有这些与软件开发者可以采取的提高学习、培训和招聘的实际步骤联系起来。
建议
我们将建议分为招聘建议和培训与学习建议。
对于招聘,我们提出以下建议:
编程能力没有好的替代指标。基于性别、种族或其他因素的刻板印象没有证据支持。如果你想知道候选人的编程能力如何,那就看看他们以前的工作或让他们完成真实的编程任务。强调一点:不要用脑筋急转弯的谜题来测试候选人。
至少在年轻的开发者中,工作年限可能不是衡量能力的可靠指标。
Behroozi 等人3 提出的一个相关建议是,让候选人在单独的房间里解决面试问题,然后再展示解决方案,因为面试官在解决问题时进行观察或要求交谈会增加认知负荷和压力,从而影响表现。
对于学习和培训,我们提出以下建议:
阅读大量代码将有助于一个人成为更有效率的程序员。
专家并不总是最擅长培训新手的。
学习需要时间,包括学习*之间*的时间。密集的填鸭式学习是无效的,而间隔重复是有效的。
同样,离开问题一段时间有助于解决问题。
仅仅因为你可以通过互联网搜索或生成式人工智能工具找到它,并不意味着学习已经过时。
使用例子在抽象概念和具体的可学习事实之间进行转换。
寻求成功 (而不是避免失败) 和相信能力是可以改变的,是恢复力和学习的重要因素。