使用社交账号登陆

当前位置: 主页 > 前沿 > 信息 • 能源

编程究竟是数学还是语言?

时间: 2021年04月19日 | 作者: 青苹果 | 来源: 数据实战派
虽然编程与语言的相似性并非我们想象的那样,但两者似乎都是越早学越受益。

image.png

图片来源:Pixabay


作者 青苹果

来源 公众号“数据实战派”


2016 年盖洛普民意测验(Gallup poll)调查发现,在美国,大多数学校希望开始教授编程,且 66% 的美国基础教育(简称 K-12 教育)学校的校长认为,非计算机专业的学生也应该考虑学习计算机科学。


大多数欧洲国家都在学校课程中增设了编程课和计算机科学,其中法国和西班牙早在 2015 年就开设了这些课程。很显然,在这样高速增长的势头之下,新生代程序员持续涌现,预计会将全球开发人员的规模从 2019 年的 2390 万增加到 2024 年的 2870 万。


而在中国,编程教育有多火热就更不用赘述了,“内卷” 这个词便被频频用来形容该领域。


尽管各行各业在编程的教育上做了如此多的努力,但对于如何教授编程仍然存在一些困惑。比如说,我们至今都没搞明白,它究竟更像一种语言,还是更像数学?


尤其从脑科学的角度来看,计算机编程是一种新颖的认知工具,已经改变了现代社会。哪些认知和神经机制支持这项技能?这个问题至关重要,因为它将决定着我们的传授该领域知识的方式应该遵循怎样的底层方法。


正如麻省理工学院的神经科学家安娜・伊万诺娃(Anna Ivanova)所说:“我们有兴趣探讨语言和计算机编程之间的关系,部分原因在于,计算机编程是一个新的发明,我们知道不可能有任何结构上的硬件机制(hardwired mechanisms)让我们成为优秀的程序员。”


安娜・伊万诺娃也和她的同事进行了一项新的研究,尝试通过观察受试者在阅读 Python 代码时的大脑活动,来回答这个问题。



编程语言本质是什么?两种不同的解答


目前,针对上述疑问,存在两种思想流派 ——“语言派” 和 “数学派”。


其中,较为流行的观点是,编程是一种语言,必须遵循自己的语法规则和语义规则。毕竟,它们被称为编程语言是有原因的。


在某些方面,学习计算机编程也与学习新语言相似。它要求学习新的符号和术语,必须正确组织这些符号和术语以指导计算机该怎么做。计算机代码还必须足够清晰,以便其他程序员可以阅读和理解。


因此,依附于该观点之下,还有一个颇为时髦的缩写:CAL, Coding as Another Language。而与之对立的是,有些人认为编程更像是学习数学中的逻辑,即借助公式和算法来创建输入和输出。


究竟哪种方法更贴近真理?自编程进入到教育体系以来,争论就从未休止,但目前看来,“语言派” 显然已占据上风。比美国得克萨斯州、俄克拉何马州和佐治亚州的法律均允许高中生选修计算机科学课程,以完成他们的外语学分。


但这场辩论对神经科学家似乎有着特殊的意义:由于计算机编程才出现了几十年,大脑还没有进化出任何特殊的区域来对其进行处理,所它必须重新利用大脑中通常用来处理其他事情的区域。

.

因此,去年年底麻省理工学院(MIT, Massachusetts Institute of Technology)的神经科学家试图观察人们在处理计算机编程时会用到大脑的哪些区域和所对应的功能系统。


他们认为,“解释计算机代码的能力是一种非凡的认知技能,与包括一般执行功能、数学、逻辑和语言在内的不同认知领域有着相似之处。”


image.png


考虑到一个人成年后可以学会编程的事实,它一定是依赖于我们大脑中某些预先存在的认知系统。


由此看来,以下两个大脑系统似乎是可能的 “候选者”:要么是大脑的语言系统,要么是处理复杂认知任务的系统,如解决数学问题或填字游戏的 “多需求网络”(multiple demand network)。



大脑中的编程


在这支 MIT 团队的实验中,研究人员要求精通代码的参与者躺在磁共振功能成像(fMRI, Functional Magnetic Resonance Imaging)机器中,以方便测量他们的大脑活动,规则是要求被试者阅读编程问题并预测输出答案。


在这项研究中使用的两种编程语言是以 “可读性”(readability)著称的 Python 和 ScratchJr。其中,后者是以符号为基础,专门为儿童开发的语言,以便尚未学会阅读的儿童也可以使用它。


首先,研究的主要任务包括给定一个人的身高和体重参数,让参与者计算一个人的身体质量指数(BMI, Body Mass Index)。


image.png

实验中的代码示例和难题


这个问题要么以 Python 风格的代码的形式呈现,要么以普通句子的形式呈现。类似地,ScratchJr 也采用了同样的方法,只是参与者被要求去追踪小猫走路和跳跃时的位置。


其次,研究的控制任务包括两项:其一记住网格上的一系列方块,以激活参与者的多重需求系统;其二阅读一个正常和一个无意义的句子,以激活他们的语言系统。


最后,研究结果表明,当参与者在阅读代码时,大脑的语言部分反应微弱,论文作者认为,这很可能是在整个过程中未涉及口语和听力的原因。相反地,这些任务主要由多需求网络处理。


具体来说,多需求网络分布在我们大脑的额叶(frontal lobes)和顶叶(parietal lobes),它主要负责处理复杂繁重的心理任务,即日常生活中我们需要努力思考的部分。


该网络大致可以分为负责逻辑的左侧部分和主管抽象思维的右侧部分。此外,MIT 的研究人员发现,阅读 Python 代码似乎可以同时激活多需求网络的左、右两侧,而在 ScratchJr 语言的实验中则显示,相对于左侧来说,右侧激活的比例更大。


他们写道:“我们发现,尽管代码和自然语言之间有许多相似之处,但语言系统在代码理解过程中的反应并不一致。”


编程似乎进化出了新的处理网络


有趣的是,解码过程激活了多需求网络的部分,而这些部分在解决数学问题时没有被激活,因此,大脑并没有把它当作语言或逻辑来处理,它更像是自己独立的一个部分。


尽管阅读计算机代码可以激活多需求网络,但与数学或逻辑问题相比,它似乎更多地依赖于网络的不同部分,这表明编程并不能精确地复制数学的认知需求。


“这些发现表明,大脑将编码视为一个独特而复杂的过程。理解计算机代码似乎是独立的事件。它和语言不一样,和数学和逻辑也不一样……”,麻省理工学院研究生、该研究的主要作者安娜・伊万诺娃说。


同时作者指出,这并不排除经验丰富的程序员可能有专门用于编码的大脑区域的可能性。


去年,日本神经科学家做的另一项实验,支持解释了计算机代码所涉及的大脑独特过程。


在那项研究中,分别向新手级、经验级和专家级程序员展示代码片段,与此同时,他们需要躺在 fMRI 中完成将这些代码片段分类到四种类型算法的任务。


正如预期的那样,具有更高技能的程序员可以更好地分类代码片段。


不过,研究人员还发现,与自然语言处理(natural language processing)、情景记忆检索(episodic memory retrieval)和注意力控制(attention control)相关的大脑区域的活动,也随着程序员的技能水平而加强。


由此看来,虽然编程与语言的相似性并非我们想象的那样,但两者似乎都是越早学越受益。


Refenrence:

https://elifesciences.org/articles/58906