前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序员关于学习的10件事

程序员关于学习的10件事

作者头像
半吊子全栈工匠
发布2024-01-11 14:46:00
1590
发布2024-01-11 14:46:00
举报
文章被收录于专栏:喔家ArchiSelf喔家ArchiSelf

【引子】新年伊始,每个人都会定一点儿自己的学习目标或者学习计划。石头兄弟推荐给我一篇文章,其中阐述了一些对学习本身的认知,而且是站在程序员的视角上, https://cacm.acm.org/magazines/2024/1/278891-10-things-software-developers-should-learn-about-learning/fulltext,读后颇有感触,遂编译成文,分享给朋友们。

终身学习,对每个人都可能是必要,对于软件工程师尤其如此。在IT领域,变化是永恒的,新技术不断被发明,旧技术不断更新。因此,软件工程师不会只学习一次编程,还可能要学习许多新的编程语言和框架。

但是,我们学习并不意味着我们理解了如何学习,人们不能凭直觉理解记忆和学习是如何工作的。认知心理学和关于编程的教育为我们如何学习提供了强有力的见解。本文阐述了关于学习的10件事,这些发现适用于软件工程师,并有着实际的意义。

1. 人的记忆不是由比特组成的

记忆是学习的核心,学习意味着一个人的长期记忆发生了变化。软件开发人员都熟悉计算机内存的惊人力量,在那里可以存储一系列的比特,然后通过CPU的控制调整为正确的比特序列。尽管人的记忆有其相似性,但它既不准确,也不可靠。

由于人类记忆的生物学复杂性,可靠性是一个复杂的问题。对于计算机内存,我们使用两种基本操作: 读和写。读取计算机内存不会修改它,也不管写入和读取之间经过多少时间。人的记忆似乎有一个“读取和更新”的操作,在这个操作中,获取一段记忆可以加强和修改它。这种修改更有可能发生在最近形成的记忆上。由于这种修改的可能性,事实不存在于确定已知或未知的二元状态; 它可以存在中间状态。我们可以忘记以前知道的事情,知识可能是不可靠的。

人类记忆的另一个奇特特征是“扩散激活”。我们的记忆储存在相互连接的神经通路中,当试图记住一些东西时,我们会激活一条神经元通路来获取目标信息。然而,激活并不只包含在一个途径中。有些激活会扩散到其他相连的通道,这种扩散的激活使得相关的通路被激活数小时。传播激活对记忆有负面影响,对解决问题有正面影响。传播激活意味着相关但不精确的信息可能与目标信息混为一谈,这意味着对信息的回忆可能是不可靠的。然而,传播激活也与基于洞察力的问题解决或“顿悟时刻”有关,有时候离开一个问题去解决另一个问题,这个问题本身就在扩散,导致两个不相关的区域在中间连接起来。当两个先前不相关的领域连接起来时,就会产生创造性和独特的问题解决方案。这或许就是为什么散步,淋浴,或者其他远离问题的时间里可以帮助我们摆脱困境问题原因。

总而言之,人的记忆不是简单地从特定位置存储和检索就可以工作的,它更加脆弱和不可靠,但是,它也可以通过将知识联系在一起来,为解决问题和深入理解带来好处。

2. 人的记忆是由一个有限的和一个无限的系统组成

人类记忆与学习相关的部分有两个主要的组成: 长时记忆和工作记忆。长时记忆是信息永久存储的地方,其功能是无限的,在这个意义上,它有点像计算机的磁盘存储器。然而,工作记忆用于有意识地推理信息以解决问题,它类似于 CPU 的寄存器,实时存储有限数量的信息以允许访问和操作。

工作记忆是有限的,它的容量在人们出生时大致是固定的。虽然较高的工作记忆容量与较高的智力有关,但工作记忆容量并不是最重要的因素。较高的容量使得学习更快,但是无限的长期记忆消除了我们最终能够学习多少的限制。程序员可能有较低或较高的工作记忆容量,但是,长期记忆的内容使他们成为专家。

随着人们对一个主题了解的内容越来越多,他们把信息联系在一起,形成一个个信息块,允许多个信息块作为工作记忆中的一个信息块。例如,当面对一个电子邮件地址时,一个熟悉的 gmail.com被视为一条信息,而不是随机字符串。因此,信息块越多,工作记忆就越大。与计算机类比,我们的工作记忆类比为CPU 寄存器,可能只允许在长期记忆/磁盘中存储5个指向信息块的指针,但是对于信息块的大小没有限制,所以最佳策略是通过练习使用信息和解决问题来增加信息块的大小,这或许就是建立自己知识体系的意义。

当学习新的工具或技能时,了解任务所要求的认知负荷或工作记忆容量很重要。认知负荷分为内部负荷和外部负荷。内部负载是指完成任务所必需的信息或块的数量; 除非通过更改任务,否则不能更改内部负载。相比之下,无关的认知负荷是不必要的信息,然而,是执行任务的一部分。表达是外部认知负荷如何变化的一个例子,如果正在实现一个数据库模式,那么使用带有表和属性的图比使用简单的英语描述更容易,后者具有更高的外部负载,因为我们需要在心理上将描述转换为模式,而图可以直接映射,如下图所示。对于初学者来说,外部负载通常较高,因为他们不能很容易地区分内部信息和外部信息。

当面对一项超出个人能力范围的任务时,重要的是要认识到这可以通过重新组织任务来改变。将问题分解成可以处理的小块,最终将允许人员解决复杂的问题。这个原则可以应用到自己的实践中,但是当与初级开发人员和新人一起工作时,这个原则尤其重要。

3. 专家认知与初学者推理

初学者和专家之间的一个关键区别是,专家以前见过类似的情况。对象棋高手而言,他们的主要优势是记忆和识别棋盘状态的能力。这使得他们能够决定如何更快更省力地做出反应。有人将认知分为“系统1”和“系统2”,系统1速度快,由识别驱动,依赖于长期记忆中的模式识别,而系统2速度慢,专注于推理,需要更多的工作记忆处理。这是双过程理论的一部分。

软件工程师可以通过记住程序代码中的常见模式来进行更高层次的推理,这释放了他们的认知能力。这种情况的一个实例是编程中的“设计模式”,类似于之前讨论的信息块。一个专家可能会立即意识到某段代码正在执行一个排序算法,而初学者可能会逐行阅读,试图理解代码的工作原理,而不会注意到整体情况。

这种情况的一个必然结果是,初学者可以通过阅读和理解大量代码而成为专家。专家们建立了一个模式的心智模型,让他们在将来更容易地读写代码,因此,学习各种编程范例将有进一步的帮助。总的来说,阅读并使用更多代码以及理解更多类型的代码是能够提高编程水平的原因。

4、理解概念从抽象到具体再到回归

高手处理概念的方式与初学者不同,他们使用通用和抽象的术语来寻找基础概念,而不是关注细节,而初学者往往关注表面的细节,很难将这些细节与更大的背景联系起来。这些差异不仅影响专家的推理方式,也影响他们的学习方式。

例如,当向一个新手解释 Python 中可变参数的函数时,高手可能会说,这是一个可以接受不同数量参数的函数。初学者可能会关注一些细节,比如声明和调用函数的确切语法,并可能认为只传递一个参数是一种特殊情况。高手可能更容易理解或预测的细节,通过概念来解释。

当学习一个新概念时,可以从两种形式的解释中受益: 抽象的特征和具体的例子细节。具体而言,我们将受益于所遵循的语义,示例如下图所示:

遵循语义,我们可以不断地在抽象定义和概念的几个不同示例之间切换。例子越多样化越好。与正确的例子相比,错误的例子也能帮助我们理解错误的原因,比如在试图了解常数是什么的时候,可以观测到一个变量被标记为非常数,这一过程称为拆包。

通过这些不同的示例,我们可以(重新)访问抽象定义,并构建对概念的更深入理解。更深入的理解源于认识到多个例子中的细节是如何连接到定义中的一个抽象概念的,这个过程称为重新包装。解决问题被(错误地)认为是一种通用的技能。然而,这并不是解决问题在大脑中的工作方式。

编程经常涉及到学习抽象概念。面对一个需要学习的抽象概念,比如函数,人们经常需要具体的概念实例来检查,比如,返回一个数字的绝对值函数——abs 。一个挑战是,随着概念变得更加抽象(从值到变量/对象到函数/类到高阶函数/元类,最终到范畴理论) ,距离具体的例子越来越远。可取的是,当学习抽象概念时,它们对我们来说变得更加具体。最初,函数是一个抽象的概念,但是经过大量的实践,函数对我们来说变成了一个具体的代码块 ,进而可以学习下一个抽象层次。

5. 间距和重复问题

都听说过不应该临时抱佛脚来应付考试,这个建议是基于认知心理学中最可预测和持久的效应之一: 间隔效应。根据间隔效应,人们通过在多个练习阶段、多天、最理想的是多周间隔练习来学习解决问题的概念。

间隔效应的机理是基于长期和工作记忆之间的关系。当练习解决问题的时候,一般练习两种技能,将问题中的信息与可以解决问题的概念匹配,然后应用该概念来解决问题。第一个技能需要激活通往长期记忆概念的正确神经通路。如果学习者反复解决同一类问题,比如 for-each 循环,那么通往长期记忆的通路就会保持活跃,他们就会错过练习第一个技能的机会。无间隔练习的一个常见结果是,人们可以解决问题,但需要被告知使用哪个概念时才能解决。虽然交织不同类型的问题可能有所帮助,如循环和条件判断,使用间隔学习有必要获得最多的练习时间。此外,大脑需要休息,以巩固新的信息,以便它可以应用于新的问题。

密集的编码训练营要求学习者将解决问题的练习塞进没有间隔的会话中,虽然这并不理想,但大多数学习者仍然喜欢把他们的练习塞进尽可能少的时间里。如果强化训练营是学习编程的唯一可行选择,可以应用间隔效应来最大化学习成果。

为了安排一天的学习时间,应该把学习时间限制在90分钟或更少。大脑中的神经化学平衡使得在这一点之后注意力难以集中。每次学习后,至少花20分钟休息。真正的休息是散步或安静地坐着,不做其他任务,无所事事地浏览互联网,或与他人聊天。休息加速了巩固过程,这也发生在睡眠期间。

有几种策略可以使学习效率最大化。首先,把解决问题的顺序随机化,这样不同的概念就会在长期记忆中被激活。但是要注意的是,随机化的顺序可以提高学习效果,但是需要更多的努力。第二个策略是在随机的时间间隔中进行短暂的休息,以增强记忆巩固。建议每2-5分钟休息10秒钟。

6. 互联网并没有使学习过时

随着互联网的普及,编程知识的获取方式发生了很大的变化。有关语法或 API 的知识从参考书中浏览变成了只需要敲几下键盘。最近,像 ChatGPT、 Codex 和 GitHub Copilot 这样的人工智能工具甚至会为我们填写这些细节,而且大部分是准确的。这就提出了一个显而易见的问题: 如果知识可以在几秒钟内从互联网上获得,为什么还要学习编程的细节呢 ?

我们通过在长期记忆中储存知识片段并在它们之间建立联系来学习。如果知识不存在于大脑中,大脑不能在它们之间建立任何联系,所以更高层次的理解和抽象是不可能的。如果每次需要一段代码来做一个数据库连接,就在网上搜索并复制,然后继续,你将不太可能学到很多关于数据库连接的知识。依赖互联网或人工智能的智慧在初学者和专家之间是不同的: 一个初学者从未学习过细节,因此缺乏记忆联系,而一个专家学习过更深层次的结构,但是寻找被遗忘的细节,这两者之间有着关键的区别。

在互联网上搜索记忆信息的效率较低,一项研究发现,如果信息是通过互联网找到的(与纸质书相比) ,记忆力就会下降,似乎搜索可能会剥夺大脑回忆信息强化效应的好处。还有前面的认知负荷问题。互联网搜索需要一种大脑上下文切换的形式; 它有限的注意力和工作记忆必须从手头的任务(编程)切换到一个新的认知任务(搜索互联网并选择一个结果或评估人工智能生成的结果)。如果所需的知识被记住,那么不仅访问速度更快(比如使用缓存和从硬盘获取) ,而且还避免了上下文切换的认知流失以及从搜索中过滤掉无关信息。因此,尽管信息可以在互联网上获得,但是记忆信息还是有很多原由的。

7. 解决问题并不是一个通用的技能

解决问题是编程中的一个很大的部分。软件开发中一个常见的想法是将问题解决作为一种特定的技能,然后将其应用于开发的不同方面(设计、调试等)。因此,解决问题被错误地认为是一种通用的技能。然而,这并不是解决问题在大脑中的工作方式。

虽然人类确实拥有一些通用的问题解决技能,但它们远不如特定领域的问题解决技能(如能够调试程序)有效。虽然我们可以学习推理,但是不能学习如何解决一般的问题。相反,我们学习如何解决编程问题,或如何计划最好的流程,或如何创建一个设计模式。每一项技能都是独立的,不会影响其他技能。这种无法转移解决问题的技能说明了“大脑训练”对发展一般智力的开发可能是无效的。

这条规则的一个例外似乎是空间技能。空间技能使我们能够在头脑中想象物体,比如俄罗斯方块的形状,并在头脑中操纵这些物体,比如旋转俄罗斯方块的形状。训练这些通用技能可以改善其他学科的学习。这种现象是很不寻常,空间训练提高了一系列非语言技能的表现,可以提高软件开发人员的效率。即使有这个奇怪的例外,学习如何解决编程问题的最好方法仍然是练习解决编程问题,而不是学习下棋或其他。

这里还有一个招聘上的意义。筛选程序员候选人的一个流行想法是给出一些脑筋急转弯的谜题,比如如何称一架大型喷气式客机的重量。正如谷歌在2013年发现的那样,这是在浪费时间,脑筋急转弯世界中的问题解决与编程世界中的问题解决之间没有可靠的对应关系。如果想判断编程能力,就要直接评估编程代码。

8. 专业知识在某些情况下可能会出问题

专业知识有利于学习和性能的许多方面,然而,成为专家也会导致问题。

程序员使用工具来提高效率,例如版本控制系统或 IDE。这些工具对初学者和专家有不同的影响。由于认知负荷的增加。初学者可能会被专业工具中的大量选项弄得不知所措,并且可能会从初学者友好的关于如何使用工具的提示中受益。然而,专家们发现同样的提示更让人分心,而不是有用。这就是所谓的专业知识反转效应: 帮助初学者的提示和指南可能会妨碍专家的工作,降低他们的工作效率。

程序员通常在整个职业生涯中学习多种编程语言。一旦掌握了多种语言,了解多种语言可能是有益的,但有时将知识从一种编程语言转移到另一种编程语言可能会导致错误的知识。例如,在学习OOP继承的时候,在 Java 中,只要签名匹配,一个方法就会重写父方法,然后将这些知识传递给 C + + ,在 C + + 中,重写父方法还需要将父方法声明为虚方法。这些差异在句法上相似,但语言之间在语义上的不同阻碍了知识的转移。

专家经常会帮助初学者,但是没有培训经验的专家往往没有意识到初学者的想法是不同的。因此,他们无法为具有不同思维模式的人量身定制做解释。这就是所谓的专家盲点问题: 一旦成为专家,就很难通过初学者的眼睛来看待事物。可以通过仔细听初学者解释他们目前的理解并相应地裁剪解释来克服这个问题。

然而,有时候,知识变得令专家们很难用语言来表达它。在这些情况下,初学者可能更好地从支持初学者的教学材料中学习,或者从同行那里学习。一个相对于新手更有知识的同行是一个非常有价值的资源,可以帮助初学者开发新知识,帮助专家重新发现直觉知识,弥合初学者和专家之间的差距。

9. 编程能力的预测因素尚不清楚

像大多数活动一样,学习编程的成功建立在内在天赋和实践的结合之上。有些人认为这纯粹是天资问题,还有一些人认为,这几乎完全是实践问题,“10000小时”的观点认为,只有充分的实践才能获得专业知识。这两种极端的观点都是错误的。

对编程能力进行预测性测试的尝试通常都以失败告终。编程能力测试始于20世纪60年代,预测的准确性很差,这些测试已经不再使用。

经验的重要性与实践有关,这方面好坏参半。在Stack Overflow 上,程序员的声誉与他们的年龄有关联,年长者的声誉更高。然而,在职业生涯相对较早的程序员中,多年的经验和编程任务的成功之间只有很弱的联系,这表明能力可能比经验更有效,至少在程序员的职业生涯早期。

和大多数领域一样,有两个因素不能很好地预测早期编程的成功,这两个因素是一般智力水平和工作记忆能力。这些因素大致代表推理能力和学习者一次能处理多少信息。因此,他们预测的是学习速度而不是绝对能力。这两个因素的一个次级指标,空间推理是编程成功的一个较强的预测因子。空间推理也可以预测其他科学和数学领域的成功,所以这不是编程特有的。此外,由于各种原因,随着经验的增加,这些弱到中等程度的相关性基本上消失了。因此,聪明的人并不总是能成为优秀的程序员,优秀的程序员不一定具有很高的智商水平。

简而言之,很难预测谁将能够编程,程序员可能来自任何背景或人口统计,而且与任何其他因素的联系在面对经验时通常是转瞬即逝的。因此,在招聘新程序员时,没有确定编程能力的捷径。

10. 心态很重要

在编程能力中有一个长期存在的说法:要么能编程,要么不能。这背后有许多相互矛盾的理论。其中一个更引人注目的理论是学习优势动量的概念,每个主题都依赖于以前的主题,所以一旦落后了,你将很难赶上。一个不那么引人注目的理论是“极客基因”概念,它没有什么经验证明。最近开始把编程能力的差异理解为先前经验的差异。看起来相似的学习者可能拥有截然不同的知识和技能,使他们在学习优势方面领先或落后,或者在短时间内使他们看起来“与生俱来”。

几乎每个人都可以学习一些物理,即使他们一开始并不擅长。然而,几乎没有人能够获得诺贝尔物理学奖,无论他们多么努力地练习。在这两个极端之间,我们经常试图找出自己能力的边界。

很难改变一个人的心态,使其更加以成长为导向。有两个常见错误观念,第一个是奖励努力而不是表现,因为成长心态更喜欢实践而不是才能。但是学习者并不愚蠢,他们可以看出自己什么时候没有进步,表扬徒劳的努力是没有帮助的。相反,只有当学习者使用有效的策略并在通往成功的道路上时,努力才会得到回报。第二个误解是当一个人带着成长心态处理一项任务时,他们会在整个任务过程中保持这种心态。在现实中,当我们面对挫折和经历失败时,我们不确定自己的能力界限在哪里。因此,我们必须练习克服挫折和失败,以保持成长的心态。

目的导向分为两类: 接近和回避。“接近”是想要做好,这会产生积极有效的学习行为: 努力学习,寻求帮助,尝试新的富有挑战性的课题。相比之下,“回避”是避免失败,这会导致消极和无效的行为: 无组织的学习,不寻求帮助,对表现的焦虑,以及回避挑战。需要注意的是,如果被指向“接近”而不是“回避”,人们可以在没有严重惩罚的情况下犯错误。

当学习一项新技能或训练某人掌握一项新技能时,以成长心态处理任务是有效的,也是一项需要发展的技能。不幸的是,不能简单地告诉人们要有成长的心态并从中获益。相反,需要通过寻求或提供关于学习过程和策略有效性的真实反馈来培养这种技能。感到沮丧是正常的,但这并不意味着你总是感到沮丧。如果你想放弃,休息一下,散散步,考虑一下你的策略,然后再试一次。

小结

软件工程师必须不断学习,以跟上该领域的快速变化。学习任何东西,包括编程,都需要将内容放到记忆中。人的记忆非常复杂,虽然与计算机体系结构有一些相似之处,但是有一些关键的差异使得它的工作方式完全不同。

就招聘而言,如果你想知道应聘者的编程水平,看看他们以前的工作或者在真正的编程任务上测试他们,不要用脑筋急转弯来测试候选人。至少在年轻的开发人员中,多年的经验可能不是衡量能力的可靠指标。让求职者在提出解决方案之前,先自己在一个房间里解决面试问题,因为面试官在解决问题时观察或要求谈话会增加认知负荷和压力,从而影响表现。

就学习而言,阅读大量的代码可以帮助人们成为一个更有效率的程序员。专家并不总是最擅长培训初学者。学习需要时间,临时抱佛脚没有效果,但间隔重复有效。同样,花时间远离一个问题或许可以帮助解决这个问题。互联网搜索或AIGC工具可以提高工作效率,但并不意味着学习已经过时。使用例子在抽象概念和具体可学习的事实之间切换。寻求成功而不是避免失败),并相信能力是可变的,这些都是学习进步的重要因素。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 喔家ArchiSelf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 人的记忆不是由比特组成的
  • 2. 人的记忆是由一个有限的和一个无限的系统组成
  • 3. 专家认知与初学者推理
  • 4、理解概念从抽象到具体再到回归
  • 5. 间距和重复问题
  • 6. 互联网并没有使学习过时
  • 7. 解决问题并不是一个通用的技能
  • 8. 专业知识在某些情况下可能会出问题
  • 9. 编程能力的预测因素尚不清楚
  • 10. 心态很重要
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档