这是用户在 2024-5-17 11:21 为 https://cacm.acm.org/research/10-things-software-developers-should-learn-about-learning/ 保存的双语快照页面,由 沉浸式翻译 提供双语支持。了解如何保存?
Research and Advances  研究与进展
Computing Profession  计算机专业

10 Things Software Developers Should Learn about Learning
关于学习,软件开发人员应该了解的 10 件事

Understanding how human memory and learning works, the differences between beginners and experts, and practical steps developers can take to improve their learning, training, and recruitment.
了解人类记忆和学习的运作方式、初学者和专家之间的差异,以及开发人员可以采取的实际步骤来改进他们的学习、培训和招聘。

Posted  发布于 2024 年 1 月 8 日

Learning is necessary for software developers. Change is perpetual: New technologies are frequently invented, and old technologies are repeatedly updated. Thus, developers do not learn to program just once—over the course of their careers they will learn many new programming languages and frameworks.
学习对于软件开发人员来说是必要的。变化是永恒的:新技术不断发明,旧技术不断更新。因此,开发人员不会只学习一次编程——在他们的职业生涯中,他们将学习许多新的编程语言和框架。

Just because we learn does not mean we understand how we learn. One survey in the USA found that the majority of beliefs about memory were contrary to those of scientific consensus: People do not intuitively understand how memory and learning work.37
仅仅因为我们学习并不意味着我们了解我们如何学习。美国的一项调查发现,大多数关于记忆的信念与科学共识相悖:人们无法直观地理解记忆和学习是如何运作的。 37

Just because we learn does not mean we understand how we learn.
仅仅因为我们学习并不意味着我们了解我们如何学习。

As an example, consider learning styles. Advocates of learning styles claim that effective instruction matches learners’ preferred styles—visual learners look, auditory learners listen, and kinesthetic learners do. A 2020 review found that 89% of people believe that learners’ preferred styles should dictate instruction, though researchers have known for several decades that this is inaccurate.28 While learners have preferred styles, effective instruction matches the content, not learning styles. A science class should use graphs to present data rather than verbal descriptions, regardless of visual or auditory learning styles, just like cooking classes should use hands-on practice rather than reading, whether learners prefer a kinesthetic style or not.
举个例子,考虑一下学习方式。学习风格的倡导者声称,有效的教学符合学习者喜欢的风格——视觉学习者看,听觉学习者听,动觉学习者做。 2020 年的一项评论发现,89% 的人认为学习者喜欢的风格应该决定教学,尽管研究人员几十年来就知道这是不准确的。 28 虽然学习者有自己喜欢的风格,但有效的教学与内容相匹配,而不是与学习风格相匹配。无论视觉或听觉学习风格如何,科学课都应该使用图表来呈现数据而不是口头描述,就像烹饪课应该使用动手练习而不是阅读,无论学习者是否喜欢动觉风格。

Decades of research into cognitive psychology, education, and programming education provide strong insights into how we learn. The next 10 sections of this article provide research-backed findings about learning that apply to software developers and discuss their practical implications. This information can help with learning for yourself, teaching junior staff, and recruiting staff.
数十年对认知心理学、教育和编程教育的研究为我们如何学习提供了深刻的见解。本文接下来的 10 部分提供了适用于软件开发人员的有关学习的研究结果,并讨论了它们的实际含义。这些信息可以帮助您自学、教授初级员工和招聘员工。

Key Insights 重要见解

  • Learning is vital for programmers, but the human mind works quite differently than a computer.
    学习对于程序员来说至关重要,但人类思维的工作方式与计算机截然不同。

  • Understanding how humans learn can help you learn more effectively.
    了解人类如何学习可以帮助您更有效地学习。

  • The Internet and LLMs have not made learning obsolete; learning is essential and takes time.
    互联网和法学硕士并没有让学习变得过时;学习是必要的,并且需要时间。

  • Expertise changes how you think, letting you solve problems more easily but also potentially hindering your ability to teach.
    专业知识会改变你的思维方式,让你更轻松地解决问题,但也可能会阻碍你的教学能力。

1. Human Memory Is Not Made of Bits
1. 人类记忆不是由位组成的

Human memory is central to learning. As Kirschner and Hendrick put it, “Learning means that there has been a change made in one’s long-term memory.”20 Software developers are familiar with the incredible power of computer memory, where we can store a series of bits and later retrieve that exact series of bits. While human memory is similar, it is neither as precise nor as reliable.
人类记忆是学习的核心。正如克什纳和亨德里克所说,“学习意味着一个人的长期记忆发生了变化。” 20 软件开发人员熟悉计算机内存的不可思议的能力,我们可以在其中存储一系列位,然后检索该精确的一系列位。虽然人类的记忆是相似的,但它既不那么精确也不那么可靠。

Due to the biological complexity of human memory, reliability is a complicated matter. With computer memory, we use two fundamental operations: read and write. Reading computer memory does not modify it, and it does not matter how much time passes between writes and reads. Human long-term memory is not as sterile: Human memory seems to have a “read-and-update” operation, wherein fetching a memory can both strengthen and modify it—a process known as reconsolidation. This modification is more likely on recently formed memories. Because of this potential for modification, a fact does not exist in a binary state of either definitively known or unknown; it can exist in intermediate states. We can forget things we previously knew, and knowledge can be unreliable, especially when recently learned.
由于人类记忆的生物学复杂性,可靠性是一个复杂的问题。对于计算机内存,我们使用两个基本操作:读和写。读取计算机内存不会对其进行修改,并且写入和读取之间经过多长时间并不重要。人类的长期记忆并不是那么贫瘠:人类的记忆似乎有一种“读取和更新”的操作,其中获取记忆既可以强化又可以修改它——这个过程被称为重新巩固。这种修改更有可能发生在最近形成的记忆上。由于这种修改的可能性,事实并不以明确已知或未知的二元状态存在。它可以存在于中间状态。我们可能会忘记以前知道的事情,并且知识可能不可靠,尤其是最近学到的知识。

Human memory seems to have a “read-and-update” operation, wherein fetching a memory can both strengthen it and modify it.
人类的记忆似乎有一个“读取和更新”的操作,其中获取记忆既可以强化它,也可以修改它。

Another curious feature of human memory is “spreading activation.”1 Our memories are stored in interconnected neural pathways. When we try to remember something, we activate a pathway of neurons to access the targeted information. However, activation is not contained within one pathway. Some of the activation energy spreads to other connected pathways, like heat radiating from a hot water pipe. This spreading activation leaves related pathways primed for activation for hours.1
人类记忆的另一个奇怪的特征是“扩散激活”。 1 我们的记忆存储在相互关联的神经通路中。当我们试图记住某件事时,我们会激活神经元通路来访问目标信息。然而,激活并不包含在一种途径中。一些活化能传播到其他连接的路径,例如从热水管辐射的热量。这种扩散的激活使相关通路在数小时内做好激活的准备。 1

Spreading activation has a negative implication for memory1 and a positive implication for problem-solving.32 Spreading activation means that related, but imprecise, information can become conflated with the target information, meaning our recall of information can be unreliable. However, spreading activation is also associated with insight-based problem solving, or “ah-ha moments.” Because pathways stay primed for hours, sometimes stepping away from a problem to work on a different problem with its own spreading activation causes two unrelated areas to connect in the middle. When two previously unrelated areas connect, creative and unique solutions to problems can arise. This is why walks, showers, or otherwise spending time away from the problem can help you get unstuck in problem solving.
传播激活对记忆 1 有负面影响,但对解决问题有正面影响。 32 传播激活意味着相关但不精确的信息可能会与目标信息混淆,这意味着我们对信息的回忆可能不可靠。然而,传播激活也与基于洞察力的问题解决或“啊哈时刻”相关。由于通路会保持数小时的准备状态,有时会离开一个问题,利用其自身的扩散激活来解决另一个问题,从而导致两个不相关的区域在中间连接起来。当两个以前不相关的领域连接起来时,就会出现创造性和独特的问题解决方案。这就是为什么散步、淋浴或以其他方式花时间远离问题可以帮助你摆脱解决问题的困境。

In summary, human memory does not work by simply storing and retrieving from a specific location like computer memory. Human memory is more fragile and more unreliable, but it can also have great benefits in problem solving and deep understanding by connecting knowledge together. We will elaborate further on this in later sections, especially on retrieving items from memory and strengthening memories.
总之,人类记忆并不是像计算机内存那样通过简单地从特定位置存储和检索来工作的。人类的记忆更加脆弱、更加不可靠,但通过将知识联系在一起,它也可以在解决问题和深入理解方面带来巨大的好处。我们将在后面的章节中进一步详细阐述这一点,特别是从记忆中检索项目和强化记忆。

Human memory does not work by simply storing and retrieving from a specific location like computer memory.
人类记忆不能像计算机内存那样通过简单地从特定位置存储和检索来发挥作用。

2. Human Memory Is Composed of One Limited and One Unlimited System
2. 人类记忆由一个有限系统和一个无限系统组成

Human memory has two main components that are relevant to learning: long-term memory and working memory. Long-term memory is where information is permanently stored and is functionally limitless;1 in that sense, it functions somewhat like a computer’s disk storage. Working memory, in contrast, is used to consciously reason about information to solve problems;2 it functions like a CPU’s registers, storing a limited amount of information in real time to allow access and manipulation.
人类记忆有两个与学习相关的主要组成部分:长期记忆和工作记忆。长期记忆是信息永久存储且功能无限的地方; 1 从这个意义上说,它的功能有点像计算机的磁盘存储。相比之下,工作记忆用于有意识地推理信息以解决问题。 2 它的功能类似于CPU的寄存器,实时存储有限数量的信息以允许访问和操作。

Working memory is limited, and its capacity is roughly fixed at birth.2 While higher working-memory capacity is related to higher general intelligence, working-memory capacity is not the be-all and end-all for performance.22 Higher capacity enables faster learning, but our unlimited long-term memory removes limitations on how much we could ultimately learn in total.1 Expert programmers may have low or high working memory capacity but it is the contents of their long-term memory that make them experts.
工作记忆是有限的,其容量在出生时大致固定。 2 虽然较高的工作记忆容量与较高的一般智力有关,但工作记忆容量并不是表现的全部和最终目的。 22 更高的容量可以加快学习速度,但我们无限的长期记忆消除了我们最终总共能学到多少的限制。 1 专家程序员的工作记忆容量可能较低或较高,但正是他们的长期记忆的内容使他们成为专家。

As people learn more about a topic, they relate information together into chunks.a Chunking allows the multiple pieces of information to act as one piece of information in working memory. For example, when learning an email address, a familiar domain, such as gmail.com, is treated as one piece of information instead of a random string of characters, like xvjki.wmt. Thus, the more information that is chunked, the larger working memory is functionally.38 Using our computer analogy, our working memory/CPU registers may only let us store five pointers to chunks in long-term memory/disk, but there is no limit on the size of the chunks, so the optimal strategy is to increase the size of the chunks by practicing using information and solving problems.
当人们对某个主题了解得更多时,他们会将信息组合成块。 a 分块允许多条信息在工作记忆中充当一条信息。例如,在学习电子邮件地址时,熟悉的域(例如 gmail.com)将被视为一条信息,而不是随机字符串(例如 xvjki.wmt)。因此,分块的信息越多,工作记忆的功能就越大。 38 用我们的计算机类比,我们的工作内存/CPU寄存器可能只允许我们存储五个指向长期内存/磁盘中的块的指针,但是块的大小没有限制,因此最佳策略是增加通过练习使用信息和解决问题来确定块的大小。

When learning new tools or skills, it is important to understand the cognitive load, or amount of working memory capacity, demanded by the task. Cognitive load has two parts: intrinsic load and extraneous load. Intrinsic load is how many pieces of information or chunks are inherently necessary to achieve the task, and it cannot be changed except by changing the task. In contrast, extraneous cognitive load is unnecessary information that, nevertheless, is part of performing the task. Presentation format is an example of how extraneous cognitive load can vary. If you are implementing a database schema, it is easier to use a diagram with tables and attributes than a plain English description—the latter has higher extraneous load because you must mentally transform the description into a schema, whereas the diagram can be mapped directly (see Figure 1). Extraneous load is generally higher for beginners because they cannot distinguish between intrinsic and extraneous information easily.
在学习新工具或技能时,了解任务所需的认知负荷或工作记忆容量非常重要。认知负荷有两部分:内在负荷和外在负荷。内在负载是指实现任务本质上需要多少信息或块,并且除非更改任务,否则无法更改。相反,无关的认知负荷是不必要的信息,但它是执行任务的一部分。演示格式是无关认知负荷如何变化的一个例子。如果您正在实现数据库模式,那么使用带有表和属性的图表比简单的英语描述更容易 - 后者具有更高的无关负载,因为您必须在心里将描述转换为模式,而图表可以直接映射(参见图 1)。对于初学者来说,外部负载通常较高,因为他们无法轻松区分内在信息和外部信息。

Two ways of presenting the same database schema description with differing extraneous cognitive load.
使用不同的无关认知负载呈现相同数据库模式描述的两种方式。
The dashed box on the left contains exactly the same information as the awkward textual description in the dashed box on the right. But if a developer only received one of the two to create an SQL database, they are likely to find the diagram easier than the text. We say that the text here has a higher extraneous cognitive load.
左侧的虚线框包含与右侧虚线框中尴尬的文字描述完全相同的信息。但是,如果开发人员只收到两者之一来创建 SQL 数据库,他们可能会发现图表比文本更容易。我们说这里的文本具有较高的无关认知负荷。

When faced with a task that seems beyond a person’s abilities, it is important to recognize that this can be changed by reorganizing the task. Decomposing the problem into smaller pieces that can be processed and chunked will ultimately allow the person to solve complex problems. This principle should be applied to your own practice when facing problems at the edge of or beyond your current skills, but it is especially relevant when working with junior developers and recruits.
当面临似乎超出个人能力的任务时,重要的是要认识到可以通过重新组织任务来改变这种情况。将问题分解为可以处理和分块的更小的部分,最终使人们能够解决复杂的问题。当您面临超出您当前技能的边缘或超出的问题时,这一原则应该应用于您自己的实践中,但在与初级开发人员和新员工合作时尤其重要。

3. Experts Recognize, Beginners Reason
3.专家认识,初学者推理

One key difference between beginners and experts is that experts have seen it all before. Research into chess experts has shown that the primary advantage of experts is that they remember and recognize the state of the board. This allows them to decide how to respond more quickly and with less effort.15 Kahneman19,b describes cognition as being split into “system 1” and “system 2” (thus proving that it’s not only developers who struggle with naming things). System 1 is fast and driven by recognition, relying upon pattern recognition in long-term memory, while system 2 is slower and focused on reasoning, requiring more processing in working memory. This is part of a general idea known as dual-process theories.34
初学者和专家之间的一个主要区别是专家以前已经见过这一切。对国际象棋专家的研究表明,专家的主要优势是他们记住并认识棋盘的状态。这使他们能够决定如何更快、更省力地做出反应。 15 Kahneman 19 b 将认知分为“系统 1”和“系统 2”(从而证明不仅仅是开发人员在为事物命名而苦苦挣扎)。系统 1 速度快,由识别驱动,依赖于长期记忆中的模式识别,而系统 2 速度较慢,专注于推理,需要工作记忆中的更多处理。这是称为双过程理论的一般思想的一部分。 34

Expert developers can reason at a higher level by having memorized (usually implicitly, from experience) common patterns in program code, which frees up their cognition.4 One such instance of this is “design patterns” in programming, similar to previously discussed chunks. An expert may immediately recognize that a particular piece of code is carrying out a sorting algorithm, while a beginner might read line by line to try to understand the workings of the code without recognizing the bigger picture.
专家开发人员可以通过记住(通常是根据经验隐式地)程序代码中的常见模式来进行更高水平的推理,从而释放他们的认知。 4 这样的一个例子是编程中的“设计模式”,类似于之前讨论的块。专家可能会立即认识到一段特定的代码正在执行排序算法,而初学者可能会逐行阅读以尝试理解代码的工作原理,而不了解更大的情况。

Expert developers can reason at a higher level by having memorized common patterns in program code, which frees up their cognition.
专家开发人员可以通过记住程序代码中的常见模式来进行更高层次的推理,从而释放他们的认知。

A corollary to this is that beginners can become experts by reading and understanding a lot of code. Experts build up a mental library of patterns that let them read and write code more easily in the future. Seeing purely imperative C code may only partially apply to functional Haskell code, so seeing a variety of programming paradigms will help further. Overall, this pattern matching is the reason that reading and working with more code, and more types of code, will increase proficiency at programming.
由此推论,初学者可以通过阅读和理解大量代码成为专家。专家们建立了一个心理模式库,让他们将来更轻松地阅读和编写代码。看到纯粹的命令式 C 代码可能只部分适用于函数式 Haskell 代码,因此看到各种编程范例将有进一步的帮助。总的来说,这种模式匹配是阅读和使用更多代码以及更多类型的代码将提高编程熟练程度的原因。

4. Understanding a Concept Goes from Abstract to Concrete and Back
4. 理解一个概念从抽象到具体再到具体

Research shows that experts deal with concepts in different ways than beginners. Experts use generic and abstract terms that look for underlying concepts and do not focus on details, whereas beginners focus on surface details and have trouble connecting these details to the bigger picture. These differences affect how experts reason but also how they learn.
研究表明,专家处理概念的方式与初学者不同。专家使用通用和抽象的术语来寻找潜在的概念,而不关注细节,而初学者则关注表面细节,很难将这些细节与更大的图景联系起来。这些差异不仅影响专家的推理方式,也影响他们的学习方式。

For example, when explaining a variadic function in Python to someone new to the concept, experts might say that it is a function that can take a varying number of arguments. A beginner may focus on details such as the exact syntax for declaring and calling the function and may think that passing one argument is a special case. An expert may more easily understand or predict the details while having the concept explained to them.
例如,当向刚接触 Python 概念的人解释 Python 中的可变参数函数时,专家可能会说它是一个可以采用不同数量参数的函数。初学者可能会关注细节,例如声明和调用函数的确切语法,并可能认为传递一个参数是一种特殊情况。专家在向他们解释概念的同时可以更容易地理解或预测细节。

When you are learning a new concept, you will benefit from both forms of explanation: abstract features and concrete details with examples. More specifically, you will benefit from following the semantic wave, a concept defined by Australian scientist Karl Maton,25 as illustrated by Figure 2.
当您学习新概念时,您将受益于两种形式的解释:抽象特征和带有示例的具体细节。更具体地说,您将受益于遵循语义波,这是由澳大利亚科学家 Karl Maton 25 定义的概念,如图 2 所示。

The semantic wave for variadic functions.
可变参数函数的语义波。

Following the semantic wave, you continuously switch between the abstract definition and several diverse examples of the concept. The more diverse the examples are, the better. Even wrong examples are beneficial when compared to correct examples to understand why they are wrong,23 such as seeing a mutable variable labeled as non-constant when trying to learn what a constant is. This process is called unpacking.
跟随语义波,您不断地在抽象定义和概念的几个不同示例之间切换。例子越多样化越好。与正确的示例相比,即使是错误的示例也有助于理解为什么它们是错误的, 23 例如在尝试了解常量是什么时看到标记为非常量的可变变量。这个过程称为拆包。

With these diverse examples, you can then (re)visit the abstract definition and construct a deeper understanding of the concept. Deeper understanding stems from recognizing how multiple details from the examples connect to the one abstract concept in the definition, a process called repacking.
通过这些不同的示例,您可以(重新)访问抽象定义并对该概念进行更深入的理解。更深入的理解源于认识示例中的多个细节如何与定义中的一个抽象概念联系起来,这一过程称为重新包装。

Programming frequently involves learning about abstract concepts. Faced with an abstract concept to learn, such as functions, people often reach for concrete instantiations of the concept to examine, for example, the abs function that returns the absolute value of a number.17 One challenge is that as concepts get more abstract (from values to variables/objects to functions/classes to higher-order functions/metaclasses and eventually category theory), the distance to a concrete example increases. The saving grace is that as we learn abstract concepts, they become more concrete to us. Initially, a function is an abstract concept, but after much practice, a function becomes a concrete item (or chunk) to us and we can learn the next level of abstraction.
编程经常涉及学习抽象概念。面对要学习的抽象概念(例如函数),人们通常会通过该概念的具体实例来进行检查,例如返回数字绝对值的 abs 函数。 17 一个挑战是,随着概念变得更加抽象(从值到变量/对象,到函数/类,再到高阶函数/元类,最后是类别论),与具体示例的距离就会增加。可取之处在于,当我们学习抽象概念时,它们对我们来说变得更加具体。最初,函数是一个抽象概念,但经过多次练习,函数对我们来说变成了一个具体的项目(或块),我们可以学习下一个抽象级别。

5. Spacing and Repetition Matter
5. 间距和重复很重要

How often have you heard that you should not cram for an exam? Unless, of course, you want to forget everything by the next day. This advice is based on one of the most predictable and persistent effects in cognitive psychology: the spacing effect.10 According to the spacing effect, humans learn problem-solving concepts best by spacing out their practice across multiple sessions, multiple days, and ideally, multiple weeks.
您有多少次听说过考试不应该死记硬背?当然,除非你想在第二天忘记一切。该建议基于认知心理学中最可预测和最持久的效应之一:间隔效应。 10 根据间隔效应,人类通过将练习间隔在多个会话、多天、理想情况下是多周来最好地学习解决问题的概念。

The reason spacing works is due to the relationship between long-term and working memory previously described in this article. When learners practice solving problems, they practice two skills. First, matching the information in the problem to a concept that can solve it (such as a filtering loop), and second, applying the concept to solve the problem (such as writing the loop). The first skill requires activating the correct neural pathway to the concept in long-term memory.5 If learners repeatedly solve the same kind of problem, such as for-each loop problems, then that pathway to long-term memory stays active, and they miss practicing the first skill. A common result of un-spaced practice is that people can solve problems, but only when they are told which concept to use.5 While interleaving different types of problems, such as loop and conditional problems, can help, pathways take time to return to baseline, making spacing necessary to get the most out of practice time.10 In addition, the brain needs rest to consolidate the new information that has been processed so that it can be applied to new problems.
间隔起作用的原因是由于本文前面描述的长期记忆和工作记忆之间的关系。当学习者练习解决问题时,他们练习了两种技能。首先,将问题中的信息与可以解决问题的概念(例如过滤循环)相匹配,然后应用该概念来解决问题(例如编写循环)。第一项技能需要激活长期记忆中概念的正确神经通路。 5 如果学习者反复解决同一类问题,例如 for-each 循环问题,那么通往长期记忆的途径就会保持活跃,他们就会错过练习第一项技能的机会。无间隔练习的一个常见结果是人们可以解决问题,但前提是他们被告知要使用哪个概念。 5 虽然交错不同类型的问题(例如循环和条件问题)可以有所帮助,但路径需要时间才能返回到基线,因此需要间隔才能充分利用练习时间。 10 此外,大脑需要休息来巩固已经处理过的新信息,以便能够应用于新问题。

Going against this time-tested principle, intensive coding bootcamps require learners to cram their problem-solving practice into un-spaced sessions. While this is not ideal, researchers of the spacing effect have known from the beginning that most learners still prefer to cram their practice into as little time as possible.10 For people whose only viable option to learn programming is intensive bootcamps, we can apply the spacing research to maximize their outcomes.
与这一经过时间考验的原则相反,密集的编码训练营要求学习者将解决问题的练习塞进不间隔的课程中。虽然这并不理想,但间隔效应的研究人员从一开始就知道大多数学习者仍然喜欢将练习塞进尽可能短的时间里。 10 对于那些学习编程唯一可行的选择是密集训练营的人来说,我们可以应用间隔研究来最大化他们的成果。

To structure a day of learning, learners should limit learning bouts to 90 minutes or less.21 The neurochemical balance in the brain makes concentration difficult after this point.21 After each learning bout, take at least 20 minutes to rest.21 Really rest by going for a walk or sitting quietly—without working on other tasks, idly browsing the Internet, or chatting with others. Rest speeds up the consolidation process, which also happens during sleep.
为了安排一天的学习,学习者应将学习时间限制在 90 分钟或更短。 21 大脑中的神经化学平衡使得在此之后难以集中注意力。 21 每次学习结束后,至少休息20分钟。 21 通过散步或安静地坐着来真正休息——不要做其他事情,无所事事地浏览互联网,或与他人聊天。休息会加速巩固过程,这也在睡眠期间发生。

Within a learning bout, there are a couple of strategies to maximize efficiency. First, randomize the order of the type of problem being solved so that different concepts are being activated in long-term memory.5 Be forewarned, though, that randomizing the order improves learning outcomes but requires more effort.6 The second strategy is to take short breaks at random intervals to enhance memory consolidation. A 10-second break every 2-5 minutes is recommended.18

6. The Internet Has Not Made Learning Obsolete
6. 互联网并没有让学习变得过时

The availability of programming knowledge changed with the advent of the Internet. Knowledge about syntax or APIs went from being buried in reference books to being a few keystrokes away. Most recently, AI-powered tools such as ChatGPT, Codex, and GitHub Copilot will even fill in these details (mostly accurately) for you. This raises an obvious question: Why is it worth learning details—or anything at all—if the knowledge is available from the Internet within seconds?
随着互联网的出现,编程知识的可用性发生了变化。有关语法或 API 的知识不再是埋藏在参考书中,而是只需敲击几下键盘即可。最近,ChatGPT、Codex 和 GitHub Copilot 等人工智能驱动的工具甚至可以为您填写这些详细信息(大部分是准确的)。这就提出了一个明显的问题:如果知识可以在几秒钟内从互联网上获得,为什么值得学习细节或任何东西?

We learn by storing pieces of knowledge in our long-term memory and forming connections between them.1 If the knowledge is not present in the brain, because you have not yet learned it well, the brain cannot form any connections between it, so higher levels of understanding and abstraction are not possible.1 If every time you need a piece of code to do a database join you search online for it, insert it, and move on, you will be unlikely to learn much about joins. The wisdom of relying on the Internet or AI differs between beginners and experts: There is a key distinction between a beginner who has never learned the details and thus lacks the memory connections, and an expert who has learned the deeper structure but searches for the forgotten fine details.1
我们通过将知识片段存储在长期记忆中并在它们之间形成联系来学习。 1 如果知识不存在于大脑中,因为你还没有学好它,大脑之间无法形成任何联系,所以更高层次的理解和抽象是不可能的。 1 如果每次您需要一段代码来进行数据库连接时,您都会在线搜索它,插入它,然后继续,那么您将不太可能了解有关连接的很多知识。初学者和专家之间依赖互联网或人工智能的智慧是不同的:初学者从未了解过细节,因此缺乏记忆联系,而专家则了解了更深层次的结构,但寻找被遗忘的内容,这两者之间有一个关键的区别精美的细节。 1

There is even some evidence to suggest that searching the Internet is less efficient for remembering information. One study found that information was remembered less well if it was found via the Internet (compared to a physical book).11 Another found that immediately searching the Internet led to worse recall of the same information later, compared to first trying to think of the answer before resorting to searching.14 It seems that searching may rob the brain of the benefits of the memory-strengthening effect of recalling information.
甚至有一些证据表明,互联网搜索对于记忆信息的效率较低。一项研究发现,通过互联网找到的信息(与实体书相比)的记忆效果较差。 11 另一位发现,与在搜索之前首先尝试思考答案相比,立即搜索互联网会导致稍后对相同信息的回忆更差。 14 搜索似乎可能会剥夺大脑通过回忆信息来强化记忆的效果。

There is also the issue of cognitive load discussed earlier. An Internet search requires a form of context switching for the brain; its limited attention and working memory must be switched from the task at hand (programming) to a new cognitive task (searching the Internet and selecting a result or evaluating an AI-generated result). If the required knowledge is instead memorized, then not only is access much faster (like using a cache versus fetching from a hard disk), but it also avoids the cognitive drain of context switching and filtering out extraneous information from the search. So there are multiple reasons to memorize information, despite it being available on the Internet.
还有前面讨论过的认知负荷问题。互联网搜索需要大脑进行某种形式的上下文切换;其有限的注意力和工作记忆必须从手头的任务(编程)切换到新的认知任务(搜索互联网并选择结果或评估人工智能生成的结果)。如果记住所需的知识,那么不仅访问速度会更快(例如使用缓存与从硬盘获取相比),而且还可以避免上下文切换和从搜索中过滤掉无关信息的认知消耗。因此,尽管信息可以在互联网上获得,但记住信息的原因有多种。

7. Problem-Solving Is Not a Generic Skill
7. 解决问题不是一种通用技能

Problem-solving is a large part of programming. One common (but incorrect) idea in software development is to directly teach problem-solving as a specific skill, which can then be applied to different aspects of development (design, debugging, and so on). Thus, problem-solving is (incorrectly) conceived as a generic skill. However, this is not how problem-solving works in the brain.
解决问题是编程的很大一部分。软件开发中一个常见(但不正确)的想法是将解决问题作为一种特定技能直接教授,然后可以应用于开发的不同方面(设计、调试等)。因此,解决问题被(错误地)视为一种通用技能。然而,这并不是大脑解决问题的方式。

Problem-solving is (incorrectly) conceived as a generic skill. However, this is not how problem-solving works in the brain.
解决问题被(错误地)视为一种通用技能。然而,这并不是大脑解决问题的方式。

While humans do have some generic problem-solving skills, they are much less efficient than domain-specific problem-solving skills, such as being able to debug programs. While we can learn to reason, we do not learn how to solve problems in general. Instead, we learn how to solve programming problems, or how to plan the best chess move, or how to create a knitting pattern. Each of these skills is separate and does not influence the others. Research into chess found little or no effect of learning it on other academic and cognitive skills, and the same is true for music instruction and cognitive training.36 This inability to transfer problem-solving skills is why “brain training” is ineffective for developing general intelligence.29
虽然人类确实具有一些通用的问题解决技能,但它们的效率远低于特定领域的问题解决技能,例如能够调试程序。虽然我们可以学习推理,但我们并没有学习如何解决一般问题。相反,我们学习如何解决编程问题,或者如何计划最好的国际象棋动作,或者如何创建编织图案。这些技能中的每一项都是独立的,不会影响其他技能。对国际象棋的研究发现,学习国际象棋对其他学术和认知技能影响很小或没有影响,音乐教学和认知训练也是如此。 36 这种无法转移解决问题的技能是“大脑训练”对于发展一般智力无效的原因。 29

The one exception to this rule appears to be spatial skills. Spatial skills allow us to visualize objects in our mind, like a Tetris shape, and mentally manipulate those objects, like rotating a Tetris shape. Training these generic skills can improve learning in other disciplines. This phenomenon is so unusual that it has caused much consternation in cognitive and learning sciences.24 Yet, spatial training improves performance on a range of non-verbal skills regardless of initial ability, age, or type of training task.40 Recent work has even demonstrated that spatial training can improve efficiency for professional software developers, likely because they are still learning new concepts.30 Even with this strange exception, the best way to learn how to solve programming problems is still to practice solving programming problems rather than looking for performance benefits from learning chess or other cognitive training.
这一规则的一个例外似乎是空间技能。空间技能使我们能够在脑海中想象物体(例如俄罗斯方块形状),并在精神上操纵这些物体(例如旋转俄罗斯方块形状)。培训这些通用技能可以改善其他学科的学习。这种现象非常不寻常,以至于在认知和学习科学界引起了极大的恐慌。 24 然而,空间训练可以提高一系列非语言技能的表现,无论初始能力、年龄或训练任务类型如何。 40 最近的工作甚至表明,空间培训可以提高专业软件开发人员的效率,可能是因为他们仍在学习新概念。 30 即使有这个奇怪的例外,学习如何解决编程问题的最佳方法仍然是练习解决编程问题,而不是从学习国际象棋或其他认知训练中寻求性能优势。

There is a secondary implication here for recruitment. One popular idea for screening programming candidates was to give brain-teaser puzzles, such as how to weigh a jumbo jet. As Google worked out by 2013, this is a waste of time7—there is no reliable correspondence between problem-solving in the world of brain teasers and problem-solving in the world of programming. If you want to judge programming ability, assess programming ability.
这里对招聘还有第二个含义。筛选编程候选人的一个流行想法是提供一些脑筋急转弯的难题,例如如何称大型喷气式飞机的重量。正如谷歌在 2013 年得出的结论,这是浪费时间 7 ——脑筋急转弯世界中的问题解决和编程世界中的问题解决之间没有可靠的对应关系。如果你想评判编程能力,就评估编程能力。

8. Expertise Can Be Problematic in Some Situations
8. 在某些情况下,专业知识可能会出现问题

We have discussed many ways in which expertise benefits learning and performance. However, being an expert can also lead to problems, as we will detail in this section.
我们已经讨论了专业知识有利于学习和绩效的多种方式。然而,成为专家也可能会导致问题,我们将在本节中详细介绍。

Programmers use tools and aids to be more effective, such as version control systems or IDEs. Such tools can have different effects on beginners and experts. Beginners may get overwhelmed by the amount of options available in professional tools (due to increased cognitive load) and may benefit from beginner-friendly hints on how to use the tool. However, experts find the same hints more distracting than useful because they already know what to do. This is known as the expertise-reversal effect: Hints and guides that help beginners can get in the way of experts and make them less productive.
程序员使用工具和辅助工具来提高效率,例如版本控制系统或 IDE。这些工具对于初学者和专家来说可以产生不同的效果。初学者可能会对专业工具中提供的大量选项感到不知所措(由于认知负荷增加),并且可能会从对初学者友好的关于如何使用该工具的提示中受益。然而,专家们发现同样的提示更分散注意力而不是有用,因为他们已经知道该怎么做。这被称为专业知识逆转效应:帮助初学者的提示和指南可能会妨碍专家并降低他们的工作效率。

Programmers usually learn multiple programming languages throughout their careers. Knowing multiple languages can be beneficial once they have been mastered, but sometimes transferring knowledge from one programming language to another can lead to faulty knowledge. For example, a programmer may learn about inheritance in Java, where one method overrides a parent method as long as the signatures match, and transfer this knowledge to C++, where overriding a parent method additionally requires that the parent method is declared virtual. These kinds of differences—where features are similar in syntax but different in semantics between languages—specifically hinder the transfer of knowledge.39
程序员通常在其职业生涯中学习多种编程语言。一旦掌握了多种语言,了解它们可能会很有帮助,但有时将知识从一种编程语言转移到另一种编程语言可能会导致错误的知识。例如,程序员可以了解 Java 中的继承,其中只要签名匹配,一个方法就会重写父方法,并将此知识转移到 C++,其中重写父方法还需要将父方法声明为虚拟方法。这些差异(即语言之间语法相似但语义不同的特征)特别阻碍了知识的转移。 39

Experts often help to train beginners, but experts without experience in training others often do not realize that beginners think differently. Thus, they fail to tailor their explanations for someone with a different mental model. This is known as the expert blind-spot problem: difficulty in seeing things through the eyes of a beginner once you have become an expert. It can be overcome by listening carefully to beginners explain their current understanding and tailoring explanations accordingly.
专家经常帮助培训初学者,但没有培训他人经验的专家通常不会意识到初学者的想法不同。因此,他们无法为具有不同心理模式的人量身定制解释。这就是所谓的专家盲点问题:一旦你成为专家,就很难以初学者的眼光看待事物。可以通过仔细聆听初学者解释他们当前的理解并相应地调整解释来克服它。

Sometimes, however, knowledge becomes so automated that it is difficult for experts to verbalize it.1 This automated knowledge is why experts have intuitions about how to solve problems or explain their process as, “I just know.” In these cases of tacit knowledge, beginners might better learn from instructional materials designed to support beginners, often called scaffolded instruction, or from a peer rather than an expert. A more knowledgeable (but still relatively novice) peer is a highly valuable resource to bridge the gap between beginners and experts. They can help the beginner develop new knowledge and the expert to rediscover automated knowledge.
然而,有时,知识变得如此自动化,以至于专家很难用语言来表达它。 1 这种自动化知识就是为什么专家对如何解决问题有直觉,或者将他们的过程解释为“我就是知道”。在这些隐性知识的情况下,初学者可能会更好地从旨在支持初学者的教学材料(通常称为支架式教学)或从同行而不是专家那里学习。知识渊博(但仍然相对新手)的同行是弥合初学者和专家之间差距的非常有价值的资源。它们可以帮助初学者开发新知识,帮助专家重新发现自动化知识。

9. The Predictors of Programming Ability Are Unclear
9. 编程能力的预测因素尚不清楚

The success of learning programming, like most activities, is built on a mix of inherent aptitude and practice. Some people believe it is purely about aptitude—the “you’re born with it” view—and some believe it is almost entirely about practice—the “10,000 hours” idea that only sufficient practice is required for expertise. Both extreme views are wrong, and in this section, we will explore the evidence for the differing effects of aptitude and practice.
与大多数活动一样,学习编程的成功是建立在固有能力和实践的基础上的。有些人认为这纯粹与能力有关——“你与生俱来”的观点——而另一些人则认为这几乎完全与实践有关——“10,000 小时”的观点,即只需要足够的练习就能获得专业知识。这两种极端观点都是错误的,在本节中,我们将探讨能力和实践不同影响的证据。

There has been much research to try to predict programming aptitude but few reliable results. Attempts to produce a predictive test for programming ability have generally come to naught. Research has found that all of the following fail to predict programming ability: gender, age, academic major, race, prior performance in math, prior experience with another programming language, perceptions of CS, and preference for humanities or sciences.35 There was an industry of aptitude tests for programming that began in the 1960s, but as Robins33 summarizes, the predictive accuracy was poor and the tests fell out of use.
已经有很多研究试图预测编程能力,但可靠的结果却很少。对编程能力进行预测测试的尝试通常都以失败告终。研究发现,以下所有因素都无法预测编程能力:性别、年龄、学术专业、种族、之前的数学表现、之前使用另一种编程语言的经验、对计算机科学的看法以及对人文或科学的偏好。 35 编程能力倾向测试行业始于 20 世纪 60 年代,但正如 Robins 33 所总结的那样,预测准确性很差,测试也不再使用。

Attempts to produce a predictive test for programming ability have generally come to naught.
对编程能力进行预测测试的尝试通常都以失败告终。

There is mixed evidence for the importance of years of experience, which relates to practice. There is a correlation between the reputation of programmers on Stack Overflow and their age: older people have a higher reputation.27 However, a recent study found only a weak link between years of experience and success on a programming task among programmers who were relatively early in their careers,31 suggesting that aptitude may have a stronger effect than experience, at least early in programmers’ careers.
有不同的证据表明多年经验的重要性,这与实践有关。程序员在 Stack Overflow 上的声誉与他们的年龄之间存在相关性:年龄越大的声誉越高。 27 然而,最近的一项研究发现,在职业生涯相对早期的程序员中,多年的经验与成功完成编程任务之间的联系很弱, 31 表明能力可能比经验有更强的影响,至少在早期是这样在程序员的职业生涯中。

As in most domains, two factors that weakly predict success in early programming are general intelligence (see section 4) and working memory capacity.4 These factors roughly represent reasoning skills and how much information a learner can process at once. As such, they predict the rate of learning rather than absolute ability. A sub-measure of these two factors, spatial reasoning, is a stronger predictor of success in programming, though still quite moderate.30 Spatial reasoning also predicts success in other science and math fields,24 so this is not programming-specific. Further, these weak-to-moderate correlations largely disappear with increased experience for various reasons. Thus, intelligent people will not always make good programmers, and good programmers need not be high in general intelligence.
与大多数领域一样,在早期编程中预测成功的两个因素是一般智力(见第 4 节)和工作记忆容量。 4 这些因素大致代表了推理能力以及学习者一次可以处理多少信息。因此,他们预测的是学习速度而不是绝对能力。这两个因素的子衡量标准,即空间推理,是编程成功的更强预测因素,尽管仍然相当温和。 30 空间推理还可以预测其他科学和数学领域的成功, 24 所以这不是特定于编程的。此外,由于各种原因,这些弱到中等的相关性随着经验的增加而很大程度上消失。因此,聪明的人不一定会成为优秀的程序员,而优秀的程序员也不一定具有很高的一般智力。

Intelligent people will not always make good programmers, and good programmers need not be high in general intelligence.
聪明的人不一定会成为优秀的程序员,而优秀的程序员也不一定具有很高的一般智力。

In short, it is very hard to predict who will be able to program, especially in the long term. Programmers could come from any background or demographic, and links to any other factors (such as intelligence) are generally fleeting in the face of experience. Therefore, in recruiting new programmers, there are no shortcuts to identifying programming ability, nor are there any reliable “candidate profiles” to screen candidates for programming ability.
简而言之,很难预测谁将能够编程,尤其是从长远来看。程序员可能来自任何背景或人口统计,与任何其他因素(例如智力)的联系在经验面前通常是转瞬即逝的。因此,在招聘新程序员时,识别编程能力没有捷径,也没有可靠的“候选人档案”来筛选候选人的编程能力。

10. Your Mindset Matters 10.你的心态很重要

There is a long-standing idea of a binary split in programming ability: You either can program or you cannot. There have been many competing theories behind this. One of the more compelling theories is the idea of learning edge momentum,33 that each topic is dependent on previous topics, so once you fall behind you will struggle to catch up. A less compelling theory is the idea of a “geek gene” (you are born with it or not), which has little empirical evidence.26 As discussed in the previous section, we have recently come to understand differences in programming ability as differences in prior experience.16 Learners who might seem similar (for example, in the same class, with the same degree, completing the same bootcamp) can have vastly different knowledge and skills, putting them ahead or behind in terms of learning edge momentum or, within a snapshot of time, making them seem “born with it” or not. A similar effect is found in any highly technical field that is optionally taught before university (for example, CS, physics, and engineering).9
长期以来,人们对编程能力的二元划分有一个看法:你要么可以编程,要么不能。这背后有许多相互竞争的理论。更引人注目的理论之一是学习边缘动量的想法, 33 每个主题都依赖于之前的主题,因此一旦落后,您将很难赶上。一个不太令人信服的理论是“极客基因”(无论你是否生来就有)的想法,它几乎没有经验证据。 26 正如上一节所讨论的,我们最近开始将编程能力的差异理解为先前经验的差异。 16 看似相似的学习者(例如,在同一班级,具有相同学位,完成相同的训练营)可能拥有截然不同的知识和技能,使他们在学习优势动力方面领先或落后,或者在时间的快照,使它们看起来是否“与生俱来”。在大学之前可选择教授的任何高技术领域(例如计算机科学、物理和工程)中都存在类似的效果。 9

The binary split view, and its effects on teaching and learning, have been studied across academic disciplines in research about fixed versus growth mindsets.12 A fixed mindset aligns with an aptitude view that people’s abilities are innate and unchanging. Applied to learning, this mindset says that if someone struggles with a new task, then they are not cut out for it. Alternatively, a growth mindset aligns with a practice view—that people’s abilities are malleable. Applied to learning, this mindset says that if someone struggles with a new task, they can master it with enough practice.
二元分裂观点及其对教学和学习的影响已经在固定心态与成长心态的研究中进行了跨学科的研究。 12 固定型思维模式与能力观相一致,即人们的能力是与生俱来且不可改变的。应用于学习时,这种心态表明,如果某人在一项新任务上遇到困难,那么他们就不适合这项工作。或者,成长心态与实践观点相一致——人们的能力是可塑的。应用于学习时,这种心态表明,如果有人在新任务上遇到困难,他们可以通过足够的练习来掌握它。

As described in Cheryan et al.,9 neither extreme view is true. For example, practically everyone can learn some physics, even if they are not initially good at it. However, practically no one can earn the Nobel Prize in Physics, no matter how much they practice. In between these extremes, we are often trying to figure out the boundaries of our abilities. When teachers and learners approach new tasks with a growth mindset, they tend to persist through difficulties and overcome failure more consistently.12
正如 Cheryan 等人所述,9 这两种极端观点都不正确。例如,几乎每个人都可以学习一些物理,即使他们最初并不擅长。然而,实际上没有人能够获得诺贝尔物理学奖,无论他们多么努力。在这两个极端之间,我们经常试图找出我们能力的界限。当教师和学习者以成长心态处理新任务时,他们往往会坚持不懈地克服困难并克服失败。 12

While the evidence for this effect is strong and intuitive, research suggests it can be difficult to change someone’s mindset to be more growth-oriented.8 In particular, there are two common misconceptions about how to promote growth mindset that prove ineffective. The first misconception is to reward effort rather than performance because growth mindset favors practice over aptitude. But learners are not stupid; they can tell when they are not progressing, and teachers praising unproductive effort is not helpful. Instead, effort should be rewarded only when the learner is using effective strategies and on the path to success.13 The second misconception is that when someone approaches a task with a growth mindset, they will maintain that mindset throughout the task. In reality, as we face setbacks and experience failure, people skew toward a fixed mindset because we are not sure where the boundaries of our abilities lie. Thus, we must practice overcoming setbacks and failures to maintain a growth mindset approach.13
虽然这种效应的证据是有力且直观的,但研究表明,改变一个人的心态以更加注重成长是很困难的。 8 特别是,关于如何促进成长心态,有两种常见的误解,但事实证明是无效的。第一个误解是奖励努力而不是表现,因为成长心态更注重实践而不是能力。但学习者并不愚蠢;他们可以看出自己什么时候没有进步,而老师赞扬无效的努力是没有帮助的。相反,只有当学习者使用有效的策略并走上成功的道路时,努力才应该得到奖励。 13 第二个误解是,当有人以成长心态完成一项任务时,他们会在整个任务过程中保持这种心态。事实上,当我们面临挫折和失败时,人们会倾向于固定心态,因为我们不确定自己能力的界限在哪里。因此,我们必须练习克服挫折和失败,以保持成长心态。 13

A related concept to fixed and growth mindsets is goal orientation. This is split into two categories: approach and avoidance. The “approach” goal orientation involves wanting to do well, and this engenders positive and effective learning behaviors: working hard, seeking help, and trying new challenging topics. In contrast, the “avoidance” goal orientation involves avoiding failure. This leads to negative and ineffective behaviors: disorganized study, not seeking help, anxiety over performance, and avoiding challenge. It is important that learners can make mistakes without severe penalties if they are to be directed towards “approach” rather than “avoidance.”
与固定思维和成长思维相关的一个概念是目标导向。这分为两类:接近和回避。 “方法”目标导向涉及想要做得好,这会产生积极有效的学习行为:努力工作,寻求帮助,并尝试新的具有挑战性的主题。相反,“避免”目标导向涉及避免失败。这会导致消极和无效的行为:学习杂乱、不寻求帮助、对表现焦虑以及逃避挑战。重要的是,如果学习者被引导到“接近”而不是“避免”,他们就可以犯错误而不会受到严厉的惩罚。

When learning a new skill or training someone in a new skill, remember that approaching tasks with a growth mindset is effective but also a skill to be developed. Unfortunately, we cannot simply tell people to have a growth mindset and reap the benefits. Instead, nurture this skill by seeking or providing honest feedback about the process of learning and the efficacy of strategies. For mentors, praise areas where a mentee is making progress and accept that they will make mistakes without chastising them. For learners, reflect on how skills have improved in the past weeks or months when you are doubtful about your progress. Further, expect that a growth mindset will shift toward a fixed mindset in the face of failure, but it can also be re-developed and made stronger with practice. Feeling discouraged is normal, but it does not mean that you will always feel discouraged. If you feel like quitting, take a break, take a walk, consider your strategies, and then try again.
当学习新技能或培训某人新技能时,请记住,以成长心态处理任务是有效的,但也是一项需要发展的技能。不幸的是,我们不能简单地告诉人们拥有成长心态并从中受益。相反,通过寻求或提供有关学习过程和策略有效性的诚实反馈来培养这种技能。对于导师来说,表扬学员取得进步的领域,并承认他们会犯错误,但不要惩罚他们。对于学习者来说,当您对自己的进步存疑时,请反思过去几周或几个月的技能进步情况。此外,在面对失败时,成长型思维模式会转变为固定型思维模式,但它也可以通过实践重新发展并变得更强。感到灰心是正常的,但这并不意味着你会一直感到灰心。如果您想放弃,请休息一下,散散步,考虑一下您的策略,然后再试一次。

Summary 概括

Software developers must continually learn in order to keep up with the fast-paced changes in the field. Learning anything, programming included, involves committing items to memory. Human memory is fascinatingly complex. While it shares some similarities to computer architecture, there are key differences that make it work quite differently. In this article we have explained the current scientific understanding of how human memory works, how learning works, the differences between beginners and experts, and related it all to practical steps that software developers can take to improve their learning, training, and recruitment.
软件开发人员必须不断学习才能跟上该领域快节奏的变化。学习任何东西,包括编程,都需要将项目记入记忆中。人类的记忆极其复杂。虽然它与计算机体系结构有一些相似之处,但存在一些关键差异,使其工作方式截然不同。在本文中,我们解释了当前对人类记忆如何运作、学习如何运作、初学者和专家之间的差异的科学理解,并将其与软件开发人员可以采取的改进学习、培训和招聘的实际步骤联系起来。

Recommendations. 建议。

We have split up our recommendations into those for recruiting and those for training and learning.
我们将建议分为招聘建议和培训学习建议。

For recruiting, we make the following recommendations:
对于招聘,我们提出以下建议:

  • There are no good proxies for programming ability. Stereotypes based on gender, race, or other factors are not supported by evidence. If you want to know how well candidates program, look at their previous work or test them on authentic programming tasks. To emphasize a specific point: do not test candidates with brain-teaser puzzles.
    编程能力没有好的指标。基于性别、种族或其他因素的刻板印象没有证据支持。如果您想了解候选人的编程能力,请查看他们以前的工作或在真实的编程任务中测试他们。强调一点:不要用脑筋急转弯的谜题来测试候选人。

  • At least among young developers, years of experience may not be a very reliable measure of ability.
    至少对于年轻的开发人员来说,多年的经验可能并不是一个非常可靠的能力衡量标准。

  • A related recommendation from Behroozi et al.3 is to get candidates to solve interview problems in a room on their own before presenting the solution, as the added pressure from an interviewer observing or requiring talking while solving it adds to cognitive load and stress in a way that impairs performance.
    Behroozi 等人的相关建议。 3 是让应聘者在提出解决方案之前先在一个房间里自己解决面试问题,因为面试官在解决问题时观察或要求谈话会增加认知负担和压力,从而损害表现。

For learning and training, we make the following recommendations:
对于学习和培训,我们提出以下建议:

  • Reading a lot of code will help someone become a more efficient programmer.
    阅读大量代码将帮助某人成为更高效的程序员。

  • Experts are not always the best at training beginners.
    专家并不总是最擅长培训初学者。

  • Learning takes time, including time between learning sessions. Intense cramming is not effective, but spaced repetition is.
    学习需要时间,包括学习课程之间的时间。激烈的死记硬背没有效果,但间隔重复却有效。

  • Similarly, spending time away from a problem can help to solve it.
    同样,花时间远离问题也有助于解决问题。

  • Just because you can find it through an Internet search or generative AI tool does not mean learning has become obsolete.
    仅仅因为你可以通过互联网搜索或生成人工智能工具找到它,并不意味着学习已经过时了。

  • Use examples to go between abstract concepts and concrete learnable facts.
    使用示例来了解抽象概念和具体的可学习事实。

  • Seeking to succeed (rather than avoid failure) and believing that ability is changeable are important factors in resilience and learning.
    寻求成功(而不是避免失败)并相信能力是可变的,是韧性和学习的重要因素。

Further reading. 进一步阅读。

Many books on learning center around formal education: They are aimed at school teachers and university lecturers. However, the principles are applicable everywhere, including professional development. We recommend three books:
许多关于学习的书籍都以正规教育为中心:它们的目标读者是学校教师和大学讲师。然而,这些原则适用于任何地方,包括专业发展。我们推荐三本书:

  • Why Don’t Students Like School? by Daniel T. Willingham provides a short and readable explanation of many of the principles of memory and how the brain works.
    为什么学生不喜欢上学?丹尼尔·T·威林汉姆 (Daniel T. Willingham) 的著作对记忆的许多原理以及大脑的工作原理进行了简短易读的解释。

  • The Programmer’s Brain by Felienne Hermans et al.c relates these concepts to programming and describes how techniques for learning and revision that are used at school can still apply to professional development.
    《程序员的大脑》作者:Felienne Hermans 等人。 c 将这些概念与编程联系起来,并描述了在学校使用的学习和复习技术如何仍然适用于专业发展。

  • How Learning Happens: Seminal Works in Educational Psychology and What They Mean in Practice by Paul A. Kirschner and Carl Hendrick20 provides a tour through influential papers, explaining them in plain language and the implications and linkages between them.
    学习如何发生:教育心理学的开创性工作及其在实践中的意义 Paul A. Kirschner 和 Carl Hendrick 20 提供了一些有影响力的论文导览,用通俗易懂的语言解释了它们以及它们之间的含义和联系。

The papers cited can also serve as further reading. If you are a software developer you may not have access to all of them, ACM members with the digital library option will have access to the ACM papers, although many of our references are from other disciplines. For more recent papers, many authors supply free PDFs on their website; you may wish to try searching the Web for the exact title to find such PDFs. Many authors are also happy to supply you with a copy if you contact them directly.
引用的论文也可以作为进一步阅读。如果您是软件开发人员,您可能无法访问所有这些论文,但具有数字图书馆选项的 ACM 会员将可以访问 ACM 论文,尽管我们的许多参考文献来自其他学科。对于最近的论文,许多作者在他们的网站上提供免费的 PDF;您可能希望尝试在网络上搜索确切的标题来查找此类 PDF。如果您直接联系许多作者,他们也很乐意为您提供副本。

Acknowledgments 致谢

We are grateful to Greg Wilson, who was instrumental in initiating and proofreading this paper, and to our other proofreaders: Philip Brown, Kristina Dietz, Jack Parkinson, Anthony Robins, and Justin Thurman. This work is funded in part by the National Science Foundation under grant #1941642. Any opinions, findings, and conclusions or recommendations expressed in this material are those of the authors and do not necessarily reflect the views of the National Science Foundation.
我们感谢格雷格·威尔逊(Greg Wilson),他在本文的发起和校对中发挥了重要作用,并感谢我们的其他校对者:菲利普·布朗(Philip Brown)、克里斯蒂娜·迪茨(Kristina Dietz)、杰克·帕金森(Jack Parkinson)、安东尼·罗宾斯(Anthony Robins)和贾斯汀·瑟曼(Justin Thurman)。这项工作部分由国家科学基金会资助#1941642。本材料中表达的任何意见、发现、结论或建议均为作者的观点,并不一定反映国家科学基金会的观点。

Join the Discussion (0)
加入讨论 (0)

Become a Member or Sign In to Post a Comment
成为会员或登录发表评论

The Latest from CACM

Shape the Future of Computing

ACM encourages its members to take a direct hand in shaping the future of the association. There are more ways than ever to get involved.

Get Involved

Communications of the ACM (CACM) is now a fully Open Access publication.

By opening CACM to the world, we hope to increase engagement among the broader computer science community and encourage non-members to discover the rich resources ACM has to offer.

Learn More