对于程序员而言,学习是必不可少的活动。新技术层出不穷,旧技术也在不停地更新,这就意味着变革永无止境。因此,开发人员的学习之路不止一次,他们需要在职业生涯中不断掌握新的编程语言和框架。然而,学习了并不代表我们就懂得了学习的本质。在美国的一项调查显示,大部分人对记忆的看法与科学研究的结论大相径庭: 人们并没有本能地明白记忆和学习的真正运作机制。
我们学东西并不意味着我们理解学习的过程。
以学习风格为例。学习风格理论的支持者认为,教学的有效性取决于是否顺应学习者的偏好——视觉型的人依靠看,听觉型的人依靠听,动觉型的人靠动手操作。2020 年的一项研究回顾显示,有 89% 的人认为教学方式应当基于学习者的偏好风格,而研究者们几十年来已明白这一观点并不准确。28 实际上,虽然学习者各有偏好,但有效的教学应对内容进行匹配,而非适应各种学习风格。举例来说,科学课要用图表而非语言描述来展现数据,不论学习者是视觉型还是听觉型;同样地,烹饪课程应侧重于动手实践而非单纯阅读,不管学生是否偏好动觉式学习。在编程教育、教育和认知心理学领域,几十年的研究给我们带来了深刻的洞见,揭示了我们是如何学习的。
本文的接下来 10 个小节,将提供基于研究的学习发现,这些发现对于程序员来说颇具参考价值,并且我们还将探讨它们在实践中的应用。这些信息有助于你自我提升、指导新人以及招募团队成员。
核心见解
学习对程序员来说至关重要,然而,人脑的工作机制和计算机截然不同。
理解人们的学习方式能够帮助你提高学习效率。
互联网和大语言模型 (LLM) 并未让学习变得不必要; 学习是不可或缺的,且需要投入时间。
专业技能的积累会改变思维模式,使你解决问题更为得心应手,但也可能限制了你的教学能力。
1. 人类记忆并非由比特组成
人类的记忆对于学习至关重要。如 Kirschner 和 Hendrick 所阐述的,"当长期记忆发生改变时,便意味着发生了学习。"程序员对计算机内存的惊人能力并不陌生,在这里我们能存储比特序列,并且能精确地检索出相同的比特序列。然而,尽管人类记忆与此相似,它既不像计算机那样精确,也不如计算机可靠。
人类记忆的生物复杂性导致了可靠性问题的复杂化。在计算机内存中,我们依赖“读”与“写”两个核心操作。读取不会改变计算机内存的内容,无论写入和读取之间经过了多久,这一点都不会改变。但是人类长期记忆的操作并不像计算机内存那样简单:“读取并更新”操作意味着,在提取记忆的过程中,可能会对其进行加固甚至是修改,这一过程被称为记忆重巩固。这种修改对新近形成的记忆尤其容易发生。正因为这种可能性,一个认知事实并不再简单地处于非黑即白的已知或未知二元状态中;它可能存在于多种不确定状态。我们有可能遗忘曾经掌握的知识,尤其当这些知识是最近才学到的时候,它们的可靠性也更加值得怀疑。
人类的记忆好似具备了“读取并更新”的功能,在回忆时不仅能够强化记忆,还可能对记忆进行改变。
人类记忆的另一特点是“扩散激活(spreading activation)”。我们的记忆存储在一个个互相连接的神经网络中。当我们回忆某事时,就会激活某条神经通路以取得目标信息。不过,这种激活并不仅限于一条路径。它会像热水管外的热量一样向其他相连路径散播,使这些路径在几小时内都处于易于激活的状态。
扩散激活对记忆的确存在一些不良影响,但在解决问题方面则有积极作用。扩散激活可能导致与目标信息相关但不精确的信息被混合,这意味着我们对信息的记忆可能不够可靠。然而,扩散激活也与基于直觉的解决问题方式,或者说“顿悟时刻”有关。由于一些路径会保持数小时的激活状态,有时候暂时从一个问题上抽身,转而解决另一个问题,会促使原本不相关的领域在中途产生连接。这种前后不相关的领域的连接,可能会带来创新和独到的解决方案。这也是为什么散步、洗澡或做其他事情以脱离问题有时能帮助我们在问题解决上取得突破。
综上所述,人类的记忆机制并非像计算机内存那样,通过在特定存储位置简单存取就能工作。虽然人类的记忆更加脆弱不可靠,却也因知识间的相互连接,在问题解决和深入理解方面展现出巨大优势。我们将在后续章节中进一步深入探讨,特别是关于如何从记忆中提取信息和加强记忆的策略。
人的记忆不像电脑内存那样,只是简单地存储和检索特定位置的信息。
2. 人类记忆由有限系统与无限系统组成
人类记忆在学习上有两大重要组成部分:长期记忆和工作记忆。长期记忆是信息的永久存储所在,实际上是无上限的;类似于计算机的硬盘存储功能。而工作记忆则用来有意识地处理信息,解决问题;它类似于 CPU 的寄存器,有限地实时存储信息以供访问和操作使用。
工作记忆的容量有限,在出生时就基本固定。虽然工作记忆的容量越大往往意味着一般智力越高,但它并不是衡量表现的全部。较大的容量有助于更快速的学习,但无限的长期记忆意味着我们最终能学习的总量是没有限制的。无论是工作记忆容量大还是小的专家程序员,重要的是他们长期记忆中的内容构成了他们的专业知识。
随着人们对某个话题的了解越来越深,他们开始把信息连接成信息块。信息块化允许将多个信息片段在工作记忆中作为单一信息处理。例如,当记忆一个电子邮箱地址,熟悉的域名如 gmail.com 被作为单一信息对待,而不是将其视作一串无意义字符,比如 xvjki.wmt。因此,信息块化越彻底,工作记忆在功能上就越大。借助我们的计算机类比,我们的工作记忆/CPU 寄存器可能只能让我们存储五个指向长期记忆/硬盘中块的指针,但是块本身的大小是没有极限的,因此一个有效的策略是通过实际使用信息和解决问题来提升信息块的复合程度。
在学习新工具或技能的时候,明白任务对工作记忆容量的需求,即认知负荷,是极其重要的。认知负荷分为两部分:内在负荷和外在负荷。内在负荷是完成任务必然需要的信息或信息块的数量,除非改变任务,否则这部分无法改变。相反,外在认知负荷是在完成任务时不必要的信息。举个例子,展示格式的不同就能体现外在认知负荷的差异。如果你在实现一个数据库架构,使用带有表格和属性的图表要比纯英文描述来得更直观——后者因为需要在心中将描述过程转换为架构图,所以会有更大的外在负荷;而图表可以更加直接地对应(见图 1)。一般来说,对于初学者而言,外在负荷会较大,因为他们还不能轻易区分什么是内在信息和外在信息。
同一个数据库模式描述的两种呈现方式,但认知负荷不同。
左边虚线框中的信息与右边虚线框中笨拙的文字描述完全相同。但如果开发人员只收到其中一个来创建 SQL 数据库,他们可能会发现图表比文本更容易理解。我们说这里的文本具有更高的额外认知负荷。
当面临似乎超出自身能力范围的任务时,认识到通过重新安排任务步骤可以改变这一局面是很关键的。把问题拆分成更小的单元,再通过信息块化处理这些单元,将最终使个人能够应对复杂的问题。当你在尝试解决接近或者超出你现有技能水平的问题时,应当运用这个原则;而对于指导初级开发者和新员工时,这个原则尤为重要。
3. 专家通过识别把握全局,初学者通过推理理解细节
初学者与专家的一个关键差别在于专家对各种情况早已了如指掌。棋类高手的研究显示,专家们主要依靠记住和识别棋盘状态的能力来占优,这让他们反应更快、更省力。Kahneman将认知分为“系统 1”和“系统 2”(这也证明了开发人员并不是唯一在命名事物上挣扎的群体)。系统 1 反应迅速,依赖长期记忆中的模式识别;而系统则步调较慢,专注于推理,需在工作记忆中处理更多信息。这是所谓的双过程理论的一部分。专家开发者凭借记忆中的常见编程模式,通常是隐式地通过经验积累的,能够在更高层面上进行推理,从而节省了认知资源。类似于此前讨论过的信息块化,编程中的“设计模式”就是一个典例。一个专家可能立即就识别出某段代码在执行排序算法,而初学者可能需要逐行阅读去试图理解代码逻辑,却未能把握到整体框架。
经验丰富的开发者可以通过记住代码中的常见模式,在更高层次上进行推理,从而解放他们的认知。
由此产生的一个推论是,初学者可以通过大量阅读和理解代码成长为专家。专家构筑了一个内心的模式库,使他们未来阅读和编写代码时更加得心应手。看到的纯命令式的 C 代码可能不完全适用于函数式的 Haskell 代码,因此了解多种编程范式将有所裨益。总的来说,模式识别正是更多地阅读和操作各种类型代码,提高编程熟练度的关键因素。
4. 理解一个概念往往经 历从抽象到具体再返回抽象的循环
研究显示专家和初学者在处理概念上有所不同。专家倾向于使用泛用和抽象的方式去追寻概念背后的本质,而不拘泥于细节;相反,初学者则专注于具体细节,往往无法将这些细节与更宏观的背景联系起来。这种差别不仅影响专家的推理过程,也影响他们学习的方式。
例如,在向不熟悉这一概念的人解释 Python 中的变参函数时,专家可能会描述它为一个接受可变数量参数的函数。而初学者则可能集中于确切的声明和调用函数的语法这样的细节,并可能把传递单一参数视为一种特殊情形。专家在解释概念时则可能更易于掌握或预见这些细节。
当你在学习一个新概念时,从抽象的特性和带有实例的具体细节两种解释中获取信息将对你有益。更确切地说,你将从理解和跟随“语义波动”中获益,这是澳大利亚科学家 Karl Maton 提出的概念,如图 2 所揭示的。
图2 可变参数函数的语义波。
在理解“语义波动”过程中,你需要不断在抽象定义和多样化的示例之间来回转换。示例的多样性越高越好。即便是错误的示例,当与正确的示例对比时也能帮助你理解错误之处,比如在学习常量的概念时,看到某个可变变量错误地标记为非常量会有助于理解。这一阶段被称为展开。
在这些多样化的例子帮助下,你可以重新来看抽象定义,进而构建对概念更深刻的理解。深层理解源于识别众多细节如何与一项抽象定义中的概念连接,我们称这一阶段为收束。
编程经常需要学习抽象概念。面对抽象概念的学习,如函数,人们往往会倾向于寻找该概念的具体实例进行探索,比如 abs 函数就是返回一个数的绝对值的示例。一个难题在于,随着概念变得越来越抽象(从值到变量/对象,再到函数/类,进而到高阶函数/元类,并最终发展到范畴论),能找到一个具体实例的难度也在增加。但幸运的是,随着我们对抽象概念的逐渐深入理解,这些概念对于我们来说会变得越来越具体。最初,函数可能是一个抽象概念,但在大量的实践之后,函数就变成了我们容易理解的一个具体项目(或信息块),进而我们便能够学习更高层次的抽象。
5. 间隔与重复的重要性
你是否常听说不应该为了考试而临时抱佛脚?除非你想第二天就全部忘掉。这样的忠告基于认知心理学中一种十分稳定且长久的现象——间隔效应。10 间隔效应表明,通过在不同时间段、多天甚至多周的间隔内进行练习,人们能够最有效地学习解决问题所需的概念。
间隔学习之所以见效,是因为它与文章前面提到的长期记忆和工作记忆之间的关系有关。学习者在练习解决问题时,实际上在锻炼两种技能。首先是将问题中的信息与能够解决它的概念(如过滤循环)相匹配;其次是应用该概念来解决问题(例如编写循环)。第一种技能需要启用正确的神经通路,以激活长期记忆中的相应概念。如果学习者一再只解决类似 for-each 循环这样的问题,那么这条通往长期记忆的路径就会保持激活状态,从而忽略了第一种技能的练习。缺乏间隔的练习常见的结果是,人们仅在被告知应用什么概念时才能解决问题。虽然将循环和条件等不同类型的问题交叉练习有一定帮助,但神经通路恢复到初始状态需要时间,因此合理安排间隔非常必要,以便更充分利用练习的时间。此外,大脑需要休息,以加固处理过的新信息,所以这些新知识才能被运用到新的问题中。
违反这一久经考验的原则,紧张的编程速成班要求学员在没有间隔的会话中集中练习解决问题。尽管这不是理想的做法,但从一开始研究间隔效应的研究人员就明白,大部分学习者仍倾向于尽可能压缩学习时间。对于只能通过参加密集的编程速成班来学习编程的人们,我们可以将间隔学习的研究成果应用于他们,以最大化他们的学习成果。
为了安排一天的学习计划,学习者应该将每轮学习时间限定在90分钟或更短。之后的神经化学平衡会使集中精力变得困难。每轮学习结束后,至少需要休息20分钟21 通过散步或安静地坐着来进行真正的休息——不要做其他工作、无目的地上网或与人闲聊。休息可以加速信息巩固的过程,而这一过程也会在睡眠中进行。
在一轮学习中,有几个策略可以提高效率。首先,打乱解决问题的顺序,这样可以在长期记忆中激活不同概念。但请注意,打乱顺序虽然能提高学习效果,却也需要更多的努力。第二个策略是在随机时间点上短暂休息,以增强记忆巩固。推荐每2至5分钟休息10秒。
6. 互联网并没有让学习变得无用
随着互联网的普及,获取编程知识的途径发生了革命性的变化。关于语法或API的知识,曾经需要翻阅参考书才能找到的内容,现在只需几下键盘就能轻松获取。最近,如 ChatGPT、Codex 和 GitHub Copilot 这样的 AI 工具甚至能自动补全这些信息(大多数情况下都很准确)。这就引出了一个明显的问题:如果互联网上几秒钟内就能找到所需的知识,我们还有必要花时间学习细节或任何东西吗?
我们通过将知识片段存储在长期记忆中,并建立它们之间的连接来学习。如果大脑中没有这些知识因为你还没有很好地学会,就无法建立它们之间的联系,从而无法达到更高层次的理解和抽象。如果你每次需要编写数据库连接的代码时都去网上搜寻并使用,而非深入理解它,你很难真正掌握连接的知识。对初学者和专家来说,依赖互联网或 AI 的看法是不同的:缺乏某项知识因而无法建立记忆连接的初学者,与已经掌握了深层结构但偶尔在线搜寻遗忘细节的专家之间存在着关键的差别。
还有证据显示,利用互联网搜索信息的记忆效率可能更低。一项研究发现,通过互联网查找的信息比通过实体书查找的记忆效果要差。另一项研究发现,立即上网搜索信息,相较于先尝试回忆答案再上网搜索,会导致之后的记忆效果更差。看来,搜索可能会剥夺大脑通过回忆信息获得的记忆强化效果。
此外,还存在之前讨论的认知负荷问题。在网络搜索的过程中,大脑不得不进行上下文切换,这涉及其有限的注意力和工作记忆从当前的编程任务转移到一个新的认知任务上(即在互联网搜索、选择结果或评估 AI 生成的结果)。如果能把必要的知识记住,不仅访问速度会更快(就像使用缓存而不是从硬盘检索),而且还能避免上下文切换与筛选搜索结果中无关信息的认知负担。所以,尽管知识可以在互联网上轻易找到,记忆知识仍然有多重价值。
7. 解决问题不是一般性技能
解决问题在编程中占有极其重要的地位。软件开发的一个常见误区是直接把解决问题作为一项可以明确教授并适用于开发多个环节(包括设计、调试等)的技能。因而,人们错误地认为解决问题是一项可普遍应用的技能。不过,我们的大脑并不是以这种方式处理问题解决的。
人们(错误地)将解决问题视为一种通用技能。然而,这并不是大脑解决问题的原理。
虽然人们确有一些通用解决问题能力,这些能力却远不及专业领域内解决问题的效率,如调试程序技能。我们可能学习到推理方法,但实际上并未掌握如何广泛地解决问题。相反,我们专门学习如何解决具体的编程难题、计算下一步最好的国际象棋走子,或者设计编织图案。这些能力相互独立并不相互影响。关于国际象棋的研究没有发现学习它会对其他学术或认知技能产生重大影响,音乐教学和认知培训同样如此。这种问题解决技能无法转移的情况解释了为什么“大脑训练”不会提升人的一般智慧。
尽管如此,空间技能是个例外。空间技能使我们能在心中想象物体(如俄罗斯方块游戏的图形)并进行心理操作(例如旋转方块)。培养这类通用技能确实能在其它学科中提高学习效率,这种现象在认知和学习科学界引起了不小的关注。尽管如此,空间训练无论年龄、初始能力或训练任务类型如何,都能提高一系列非言语技能的表现。最近的研究甚至显示,空间训练可以提高专业软件开发者的工作效率,可能是因为他们仍然在学习新概念。
尽管有这个例外,掌握编程问题解决能力的最佳方式仍是通过实际编程练习,而非通过学习国际象棋或其他形式的认知训练寻求间接效益。在招聘方面也有一定的启示。曾经流行的一种筛选编程候选人的思路是出脑筋急转弯题目,如估算大型喷气飞机的重量。但正如 Google 在 2013 年就意识到的,这种方法实际上是在浪费时间——脑筋急转弯里的问题解决能力与编程领域的问题解决能力之间并无直接联系。如果要评估编程能力,应当直接考察编程能力。
8. 专家身份有时也会带来挑战
我们已经探讨了在学习与执行方面,专业知识带来的诸多益处。然而,成为专家也可能引入某些问题,本节将进一步深入讨论这些问题。
程序员使用各种工具,如版本控制系统或集成开发环境 (IDEs),来提升工作效率。这些工具对初学者与专家产生的影响可能截然不同。由于认知负荷的增加,初学者可能会被专业工具提供的众多选项所压倒,并可能从专为初学者设计的使用提示中获益。但是,对于专家来说,同样的提示可能会产生分心而非帮助作用,因为他们已经熟知操作步骤。这就是所谓的专家反转效应:有助于初学者的提示和指南可能会阻碍专家,进而降低他们的效率。
程序员在职业生涯中通常需要学习多种编程语言。掌握多种语言一旦达成,确实有其优点,但在不同语言间转移知识有时会带来错误理解。举个例子,一个程序员可能在 Java 中学到继承的概念——只要方法签名匹配,一个方法就可以覆盖父类方法。而把这个概念应用到 C++ 时,需要额外满足父方法被声明为虚拟的条件,从而导致知识的错误转移。这类在不同语言间语法相似但语义不同的特性,特别是阻碍知识的有效转移。
专家常常指导初学者,但未有教学经验的专家往往未能察觉到初学者的思考模式有所不同,因此不能针对性地调整讲解以适应不同的心理模型。这就是所谓的专家盲点问题:一旦成为专家,就难以从初学者的视角看问题。仔细聆听初学者介绍他们的现有理解,并据此调整解释,可以帮助克服这一问题。
然而,有时候知识过于自动化,以至于专家难以用言语描述。这种自动化知识是专家能够直觉地解决问题或解释其过程为“我只是知道”的原因。在这种隐性知识的情景下,初学者可能从为初学者设计的教学材料中学得更好,通常这被称为分层指导,或从同伴那里而非专家那里学习会更为有效。一个相对也是新手但知识更丰富的同伴,对于连接初学者和专家这一差距来说是非常宝贵的资源。他们不仅可以帮助初学者构建新知识,也能助专家重新发现那些已自动化的知识。
9. 预测编程能力的因素尚不明确
学习编程的成效,就像其他活动一样,依赖于天分和实践的结合。有些人坚持“天赋决定论”——认为编程能力是与生俱来的;也有人信奉“刻意练习论”——主张只要累积足够的练习(如“10000小时理论”),就能形成专家水平。这两种极端观点都是错误的。
在本节中,我们会讨论不同研究所揭示的天分和练习对学习编程效果的影响。许多研究旨在寻求预测编程潜力的方法,但鲜有确凿成果。尽管试图开发出预测编程能力的测试,但大多数尝试以失败告终。研究表明以下所有因素均不足以预测编程能力:性别、年龄、学术专业、种族、数学成绩、先前的编程经验、对计算机科学的看法,以及对人文学科或科学学科的偏好。从20世纪60年代开始,便有一系列针对编程潜力的测试方法推出,但正如 Robins 所指出的,这些测试的预测精度很低,最终这些测试逐渐被淘汰。
预测编程能力的测试基本上都失败了。
关于多年编程经验是否重要,研究结果各异,这与实践紧密相关。Stack Overflow 上程序员的评价与其年龄有一定联系:更年长的用户往往拥有更高的声誉。但近期的一项研究发现,在职业初期的程序员们的多年编程经历与编程任务上的成功之间仅存在微弱的联系,这暗示在职业生涯的早期阶段,天赋的作用或许超过了经验。
在绝大多数领域中,早期编程成功的两个弱预测因素是总体智能(参见第4节)和工作记忆能力。这两项能力分别是推理能力和学习者一次性能处理的信息量的大致指标。因此,它们更多地预测学习速率而非绝对能力水平。这两项能力的其中一个细分因子,空间推理能力,是对编程成功更为强烈的预测因素,但仍属于适度。空间推理能力也预测了其他科学和数学领域的成就,由此可见,并非仅在编程领域适用。另外,这些相关性从弱到中等,随着经验的积累往往会显著减弱。因此,并非所有智能高的人都会成为好的程序员,优秀的程序员也不必然在智能测试上得高分。
聪明的人不一定能成为优秀的程序员,优秀的程序员也不一定具有很高的智力水平。
简而言之,预测谁最终能成为程序员是极其困难的。程序员可能来自于各种不同的背景,其与编程能力相关的其他因素(例如智能)在实践经验面前往往暂时且不稳定。因此,在招募新的程序员时,并没有任何识别编程能力的快速方法,也无法依靠任何“理想候选人”资料来有效筛选具备编程能力的候选人。
10. 心态的重要性
对于编程能力,存在一种根深蒂固的二元划分观念:你要么有能力编程,要么没有。背后有许多争论不休的理论。其一是学习优势动量理论,主张知识点都相互关联,一旦你掉队,就很难赶上。另一个观点是存在所谓的“极客基因”(要么天生拥有,要么没有),它却缺乏实际证据支持。正如前一节所讨论,我们最近开始将编程能力的差异归结于经验的差异。表面上条件相似的学习者(比如,在同一课堂、拥有同等学历、完成同样的培训营)可能在知识和技能上存在巨大差异,这样在学习优势动量上或者在某个时间点上,可能会显得他们是天生具有或者缺乏编程天份。类似的现象在所有大学前可能教授的高技术领域中都可见(例如计算机科学、物理和工程学)。
这种二元化观点及其对教学和学习的影响,在固定心态与成长心态的研究中得到了学术界的关注。固定心态认为人们的能力是先天固定不变的,与天赋观相一致。在学习中应用时,这种心态认为如果某人在新任务上遭遇挑战,则他们不适合这项工作。另一方面,成长心态则观点认为人的能力是可以塑造的。这种心态在学习中的应用意味着,即便是面对新任务的挑战,通过足够的实践也能掌握成功的要领。
如 Cheryan 等所述,这两种极端的观点都不符合现实。例如,实际上每个人都能学到一些物理知识,即使他们起初并不擅长。然而,无论多么努力练习,也几乎没有人能赢得物理学诺贝尔奖。在这些极端之间,我们通常会尝试探索我们能力的界限。当教师和学习者以成长心态面对新任务,他们往往能够持之以恒地克服困难并更加坚定地战胜失败。
尽管这种效应的证据是充分且直观的,研究意味着要改变个人的心态使其更加成长导向是有难度的。尤其是有两个关于促进成长心态的常见误区有时被证明效果不彰。第一个误区是奖励努力而不是成果,因为成长心态更重视实践而不是天赋。学习者绝非愚蠢;当他们察觉到自己未能进步时,老师对无效努力的赞扬并无裨益。相反,仅当学习者采取有效策略并正走向成功时,才应该对他们的努力给以奖赏。第二个误区是,某个人一旦以成长心态开始某项任务,就会在整个过程中始终保持这种心态。实际情况是,当我们遇到挫折和失败时,人们往往倾向于固定心态,因为我们对自己能力的边界并不了解。因此,我们必须通过持续实践克服挫折和失败,来维持成长心态。
与固定心态和成长心态相关的另一个概念是目标导向性,分为两种类型:接近与避免。具有“接近”目标导向性的人渴望表现出色,而这会激发正面和有效的学习行为:努力工作、寻求帮助以及尝试新的挑战性议题。而“避免”目标导向性的人则是为了防止失败,这会导致消极且无效的行为:缺乏组织的学习、不寻求帮助、对表现感到焦虑以及回避挑战。要引导学习者走向“接近”而非“避免”的方向,对于犯错误的宽容非常重要。
无论是在学习新技能还是培训别人掌握新技能时,请记住,以成长心态面对任务虽有效,但也是一种需要逐步发展的技能。我们不能简单地告诉人们培养成长心态,然后享受其带来的成效。反之,我们应通过寻求或提供对学习过程和策略有效性的真诚反馈来培育这种心态。对于导师而言,应当赞扬学员在某个领域取得的进步,并且接受他们会犯错误的现实而不加指责。对于学习者,在对自己的进展感到怀疑时,要反思过去几周或几个月你是如何提升自己的技能的。另外,要知道,面对失败时,成长心态可能会向固定心态转变,但通过不断的实践又能够重新培养并加强。感到沮丧是正常的,但这并不意味着你会永远沮丧。如果你有放弃的念头,不妨先停下来,去散个步,回顾一下你的策略,然后再试一次。
总结
软件开发者需要持续学习才能赶上技术领域快速的发展。无论是学习编程还是其他内容,都需要记忆相关知识点。人类的记忆系统极为复杂,它与计算机架构有相似之处,但关键的差异决定了其操作方式迥异。本文解释了目前科学对人脑记忆和学习机制的理解,介绍了初学者与专家之间的区别,并将这些知识应用于实际,提供了程序员在提升学习效率、培训和招聘方面可以采取的有效方法。
进一步阅读:
许多关于学习的图书都是针对正式教育编写的,目标读者为学校教师与大学讲师。然而,这些学习原则广泛适用,职业发展也不例外。
在此我们推荐三本书:
《学生为何不喜欢上学?》作者 Daniel T. Willingham,书中简洁易懂地讲述了记忆原理和大脑运作方式。
《程序员超级大脑》作者 Felienne Hermans 等,将这些理论与编程实务相结合,阐述了学校中使用的学习和复习技术如何在职业发展中继续发挥作用。
《学习是怎样发生的:教育心理学中的开创性研究及其实际应用》由 Paul A. Kirschner 和 Carl Hendrick20 编著,通过浅显的语言介绍了一系列有影响力的学术论文,并解释了这些论文之间的联系及意义。
更多好书查看“ 我的橱窗” 。
原文:https://cacm.acm.org/research/10-things-software-developers-should-learn-about-learning/
后台回复“进群”入群讨论。
