随着越来越多的新技术出现和旧技术的更新,软件开发人员在其整个职业生涯中都会学习许多编程语言和框架。 然而,哪怕你学过了很多东西,并不意味着你知道如何学习或理解如何学习,所以月刊《Communications of the ACM》总结了软件开发人员在“学习”中需要知道的东西。
10 Things Software Developers Should Learn about Learning | January 2024 | Communications of the ACM
https://cacm.acm.org/magazines/2024/1/278891-10-things-software-developers-should-learn-about-learning/fulltext

1:人类的记忆不是由比特组成的
正如Kirschner 和 Hendrick 在2020 年发表的一篇论文所说,“学习意味着长期记忆发生了变化”,人类记忆是学习的核心。 如果你是一名软件开发人员,你就会了解计算机内存存储的数据可以精确的搜索定位并读取,但人类的记忆并不那么准确或可靠。
然而,与计算机内存不同的是,当你试图记住一些东西时,它可以通过将它与相关知识联系起来,对解决问题和更深入的理解产生重大影响。
2:人类记忆由长期记忆和工作记忆组成
长期记忆是信息永久存储的地方,功能是无限的;从这个意义上说,它的功能有点像计算机的磁盘存储器。然而,工作记忆被用来有意识地推理信息以解决问题;它的功能就像CPU的寄存器,实时存储有限数量的信息,以允许访问和操作。
工作记忆的能力在出生时几乎是固定的,容量越高,学习速度越快,但工作记忆能力并不是表现的全部和最终目的。 据说,熟练的工程师之所以能成为专家,是因为长期记忆的内容。
另一方面,为了学习新的工具和技能,重要的是要了解任务的认知负荷,即工作记忆容量。 认知负荷可以是完成任务的内在负荷,也可以是不必要的外部负荷。 初学者将遭受外来负载的困扰,因为他们无法区分哪些部分是固有负载。
例如,“Communications of the ACM”引用了同一数据库架构的两种不同描述。 左边图示的东西和右边文章说明的东西是相同的内容,但是因为文章需要在头脑中转换,所以负荷会变高。
即使任务太大或太复杂而无法处理,也可以将其分解为最终可以处理的较小部分。 如果您是初学者或正在为手头的任务而苦苦挣扎的年轻人,请记住上述内容可能会为您提供有关如何完成任务的指导。
3:专家快速感知,初学者思考推理
初学者和专家的区别之一是专家已经经历过了这些事情。
根据一项对国际象棋专家的研究表明,他们的主要优势是他们能够记住和识别棋盘的状态。这使他们能够决定如何更快、更轻松地做出反应。
例如软件开发中,专家可能会立即意识到特定代码段正在执行排序算法,而初学者可能不得不逐行阅读以尝试理解代码的工作原理,而难以从全局去看待系统。
这意味着即使是初学者,如果他们阅读并理解大量代码,也可以变得熟练,阅读的代码类型越多,编程能力就越高,也就越快成为专家。
4:理解一个概念从抽象到具体,反之亦然
在编程中,我们经常学习抽象概念。 人们通常旨在制作概念的具体实例,例如,研究返回绝对数量数字的函数,但问题是,随着概念变得越来越抽象,它们离具体示例越来越远。
研究表明,专家处理概念的方式与初学者不同。专家们使用通用和抽象的术语来寻找潜在的概念,而不关注细节,而初学者则关注表面细节,难以将这些细节与全局联系起来。这些差异不仅影响专家推理的方式,也影响他们学习的方式。
例如,当向刚接触这个概念的人解释 Python 中的可变参数函数时,专家可能会说它是一个可以接受不同数量参数的函数。初学者可能会关注细节,例如声明和调用函数的确切语法,并可能认为传递一个参数是一种特殊情况。专家在向他们解释概念时可能更容易理解或预测细节。
当我们学习抽象概念时,它们对我们来说变得更加具体。最初,函数是一个抽象的概念,但经过大量练习,函数对我们来说变成了一个具体的项目(或块),我们可以学习下一个层次的抽象。
5:间隔和重复是关键
根据“间隔效应(The Spacing Effect)”,通过多个星期的练习间隔来学习练习内容效果最好。 然而,倡导者自己也明白,很多人喜欢在短时间内把计划安排得满满当当。
每天的最大学习时间为 90 分钟,超过此分钟,注意力会降低。 一次学习后,您需要休息至少 20 分钟。 休息是指散步或安静地坐着,而不是做其他工作,无所事事地上网,或与其他人聊天。
提高学习效率的一种方法是随机化要解决的问题的顺序。 这允许在长期记忆中激活不同的概念。 但是,由于随着效率的提高需要更多的努力,因此建议每嗝 2 ~ 5 分钟休息 10 秒。
6:互联网不会让学习过时
仅仅因为互联网和人工智能使人工智能能够近乎准确地创建你需要的代码,并不意味着学习一些东西不再值得学习。 如果你学得不够,你的大脑中没有知识,你的大脑将无法在知识之间建立联系,所以你将无法进行高水平的理解或抽象化。
研究还表明,在线搜索的信息方面的记忆效率低于书籍。 也有人认为,搜索可能会剥夺你通过回忆来增强记忆力的效果。
7:解决问题不是一般的技能
《Communications of the ACM》指出,软件开发中一个常见(但不正确)的想法是直接将解决问题作为一种特定技能来教授,然后可以将其应用于开发的不同方面(设计、调试等)。因此,解决问题被(错误地)视为一种通用技能。然而,这不是解决问题在大脑中的工作方式。
人类无法直接学习“如何解决问题”,因此他们单独学习技能,例如“如何解决编程问题”、“如何找到最佳国际象棋动作”、“如何制作编织图案”。 它们中的每一个都是相互独立的,不会相互影响。 事实上,对国际象棋的研究表明,学习国际象棋对学术和认知技能几乎没有影响。 就像“大脑训练”对一般智力发展无效一样。
唯一的例外是空间技能,例如“能够在头部创建和旋转俄罗斯方块的俄罗斯方块”, 通过培训可以改善其他领域的学习。
从招聘的角度来看,在程序员面试中,问“如何称量一架巨型喷气式飞机”之类的问题或脑筋急转弯谜题是完全没有意义的,如果要衡量编程能力,就应该给出编程问题。
8:专业知识在某些情况下可能会成为问题
程序员使用许多工具和辅助工具来帮助他们更有效地工作,但这些工具因用户而异,当初学者尝试使用专业工具时, 面对众多的选择可能会不知所措。
当专家教初学者时也是如此,没有培训经验的专家可能没有意识到初学者的想法不同。 专家无法用初学者的视角看问题是一个常见的“专家盲点”。 这个问题可以通过询问初学者现在理解到什么程度,并根据情况调整学习内容来克服。
9:衡量编程能力的因素不明确
根据Communications of the ACM的说法,学习编程的成功是建立在内在能力和实践的结合之上的。
已经有许多研究试图来预测编程能力,但没有一项研究产生可靠的结果,研究发现,以下所有因素都无法预测编程能力:性别、年龄、学术专业、种族、以前的数学表现、以前使用另一种编程语言的经验、对 CS 的看法以及对人文或科学的偏好。
在技术人员社区的Stack Overflow中,显示年龄和声誉之间存在相关性,老年人的声誉更高,但最近的研究表明,在职业生涯的相对早期阶段,工作技能和工作技能之间的相关性较弱,能力似乎比经验的影响更大。
因此,《Communications of the ACM》提示:“在雇用程序员时,衡量编程能力没有捷径可走。”
10:心态很重要
虽然长期以来,人们一直认为编程能力存在二进制分裂:你要么会编程,要么不能编程。但有许多相互竞争的理论。 例如,任何人都可以学习物理,即使他们不擅长。 然而,现实情况是,并不是每个人都能获得诺贝尔物理学奖。 在这两个极端之间,我们试图找到我们能力的界限,通过以教师和学习者成长的心态来处理任务,我们往往能够克服挫折和失败。
研究表明,把人的想法转变为成长志向是很难的。但是《Communications of the ACM》希望大家记住,在学习和训练新技能方面,“以成长型思维方式处理任务”是有效的。希望你记住,这也是一项需要培养的技能。
《Communications of the ACM》最后总结:“软件开发人员必须不断学习,以跟上该领域快节奏的变化。学习任何东西,包括编程,都涉及将项目提交到内存中。人类的记忆非常复杂。虽然它与计算机体系结构有一些相似之处,但有一些关键的区别使其工作方式完全不同。”