是否研究过“不是每个人都可以成为程序员”吗?


182

许多程序员坚持的一句古老谚语是:“学习编程需要某种心态,并非所有人都能做到。”

现在,我确定我们都有自己的轶事证据库,但是是否对此进行了科学研究?


63
听起来像是一个很好的怀疑论者问题。
乍得哈里森

10
学习如何编程与实际成为一名有价值的程序员大不相同。编程在大多数情况下非常简单。阅读规格书,相应实施。测试。重复。是的,每个人都可以成为程序员。并非每个人都能成为有价值的程序员。特别是某些任务比其他任务需要更多的思考和实验。这样的事情最好留给真正喜欢这样做的人。一个示例可能是实现低级构造,不使用任何现代programmig工具或任何东西来计数时钟周期,位和字节。并非每个人都能处理。
zxcdw 2012年

9
@zxcdw-我并不是真的在问“不是每个人都可以成为优秀/有价值的程序员”。这是给定的,因为“几乎每个人都不可能成为一个好/有价值的X”对于X的几乎任何价值都是一种普遍真理。我要问的是学习编程能力并为普通人缠住头的能力。
系统停机

37
每天在Programmers <
sigh

15
我认为这个问题的实质不是程序员的素质,而是更多的是“每个人都可以接受培训,以非人类语言来解决问题并提出逻辑上正确的解决方案”,我有时认为这不是每个人都可以做的事情。设计逻辑来指示非人类机器基于非物质的行为的概念非常抽象,这一抽象级别要求一个人能够在心理上遵循许多逻辑上的间接指示,因为您无法触摸每一个产品的产品用双手踩。
吉米·霍法

Answers:


87

另一项研究,调查初学者程序员持有的心理模型的可行性

本文描述了对Java初学课程结束时新手程序员使用的心理模型的可行性的调查。定性的发现确定了参与者持有的价值观念和参考分配的心理模型的范围。定量分析显示,大约三分之一的学生持有价值分配的不可行心理模型,只有17%的学生持有参考分配的可行心理模型。此外,通过比较参与者的心理模型与他们在课程评估和期末考试中的表现,发现具有可行的心理模型的学生的表现明显好于没有可行的模型的学生。这些发现被用来提出一个更“建构主义的”

另外,请参见《羊与山羊》研究的同一作者的后来研究(要明确,该研究从未真正发表过)。他们在2009年以来关于该主题的最新研究是对一致性对编程早期学习成功的影响的Meta分析(pdf)。

设计了一个测试,该测试显然检查了学生在编程第一门课程之前的作业和顺序知识,但实际上旨在捕获他们的推理策略。一项实验发现了两个截然不同的学生群体:一个可以建立并始终如一地应用程序执行的心理模型;另一个可以建立一个程序模型。另一个似乎无法建立模型或无法始终如一地应用模型。就成功或失败而言,第一组在课程结束时的考试成绩要好于第二组。该测试不能非常准确地预测性能水平,但是通过结合实验的六次重复,英国的五次和澳大利亚的五次重复的结果,我们证明了一致性确实对早期学习编程的成功有很大影响-但另一方面,有后台编程经验


24
“ ...第一年Java编程课程...” <-我发现了您的问题。
乔恩·加洛韦

4
博尔纳特(Bornat)除了收回原始论文外,还讨论了重现2009年结果的尝试-对我来说,它们似乎并不令人鼓舞:eis.mdx.ac.uk/staffpages/r_bornat/papers / ...
布莱索拉德

6
如上所述,在此原纸缩回:retractionwatch.com/2014/07/18/...
Spongeboy

92

是的,在线上有一篇非常有名的论文旨在或多或少地确定“谁被选为程序员”。

编程早期学习的认知研究 -Richard Bornat教授,Ray Adams博士

所有程序设计老师都发现他们的结果显示出“双重驼峰”。好像有两个种群:可以[编程]的人和不能[编程]的人,每个人都有自己独立的钟形曲线。

几乎所有对编程教学的研究都集中在教学上:更改语言,更改应用程序区域,使用IDE并进行激励。它们都不起作用,并且双峰仍然存在。

在课程开始之前,我们进行了一项测试,挑选出可以编程的人群。我们可以分开双峰。您可能不相信这一点,但是您会在听完演讲后再说。我们不知道确切如何/为什么运行,但是我们有一些很好的理论。


这是杰夫·阿特伍德(Jeff Atwood)的博客文章,该文章解释了结果并将某些内容置于上下文中。

尽管自1950年代发明电子计算以来发生了巨大的变化,但某些事情仍然顽固地保持不变。特别是,大多数人不会学习编程:每个大学计算机科学系的入学人数中有30%至60%的人没有通过第一门编程课程。

有经验的老师很疲倦,但从来没有忘记这一事实。聪明的初学者认为老人一定做错了,他们从痛苦的经验中学到了真理。自从1960年代开始研究这个话题以来,已经有近两代人了。


46
公平地说-这项研究证明,学校录取的30-60%的人不会被打扰做任何工作。所有学科和所有时间都是如此!
马丁·贝克特

15
这是一篇非常有趣的论文,它确实支持了并非所有人都被编程的想法。不幸的是,作者后来的工作(也在链接页面上)表明,他们的测试没有最初想象的那么可预测。“我们不能声称要把编程山羊和非编程山羊分开。不幸的是,结果没有达到最初的承诺,但是还没有完全关闭我们的探索之门。”
AShelly 2012年

26
需要明确的是,2006年的第一篇论文只是草稿,从未发表过。因此,它没有经过科学审查。也许最好在作者的页面上查看以后的研究。
杰夫·阿特伍德

17
研究学术课程中的成功是研究这种现象的一种怪异方法。首先,讲座可能是最不适合教授编程的方法。第二,并不是每个人都从讲座中学到(好)的东西。那里的设计对我来说太过偏颇了。
拉斐尔2012年

5
由于当时的精神健康问题,博尔纳特教授后来不愿自愿撤回该草案。eis.mdx.ac.uk/staffpages/r_bornat/papers/…此外,我对第二节的阅读。第三点是其他人未能复制该结果-正如他们所说,甚至2009年的荟萃分析结论“也至少受到文化环境和教育实践的影响 ”。总的来说,我最好的猜测是课程很糟糕,这并不奇怪,因为“如何有效教授编程”是一个研究问题。
Blaisorblade 2015年

33

任何人都可以成为程序员。考虑人们如何轻松地掌握电子表格。考虑一下艾伦·凯(Alan Kay)在可编程环境中通过实验和探索将孩子介绍给编程的可能性。

人们可能会在大学课程中学习成功,然后得出结论:“有些人不适合学习编程”。但是,这样的结论严重超越了所观察到的证据的范围。多少失败可以归因于如何教授编程(太抽象?),或教导哪种编程风格(太命令?)或编程环境(编译,没有即时反馈?)。

众所周知,人们已经在使用多个具体实例之后最容易掌握抽象-即,我们只有几乎已经知道一些东西,才能学习到东西。因此,从抽象开始是教授编程的完全愚蠢的方式。如果在更具体的环境中接受实时反馈(例如,在卡恩学院的CS中)进行教学,然后鼓励他们准备好抽象的阶梯,许多迷失了误解的“心理模型”的人就会壮成长。可学习编程是Bret Victor最近发表的一篇文章,提请人们注意程序员在学习中面临的不必要的环境挑战。

在某些情况下,是学生不及格。智力懒惰和故意的无知将存在于任何一大群人中。聪明的人也不例外,任何以出色的曲柄争论的人都可以证明。但是,尤其是对于编程和数学,往往是班级让学生不及格。


7
我认为几乎任何人都可以像学习基本音乐一样学习基本编码。但是,以此为生是另一回事。例如,我喜欢弹吉他,但我不会很快去多城市体育场巡演或出现在大型录音室专辑中。
jfrankcarr 2012年

4
看一下Serg的答案中链接的论文。即使并没有像他们最初想象的那样清晰,事实是,即使经过一两个月的课程,有些人还是无法将最基本的编程概念束之高阁,例如:x = 1; y = x;问题是“ x和的值是y什么?”
Izkata 2012年

3
你好,欢迎光临!您可能不知道这一点,因为您很新,但是我们真的不喜欢开放式和/或讨论型问题。我已经Is it true that not everyone can learn how to program?从问题中删除了这一行,我们经验丰富的成员将其忽略了,意识到它不符合我们的指导原则,并将他们的答案集中在问题的研究/科学方面。你能做同样的吗?
yannis 2012年

3
@jfrankcarr-专业或竞争水平的任何技能,都将使许多从业者落伍。大多数人甚至不能说或写自然语言。
dmbarbour's

3
@Izkata-Serg链接的论文具有可疑的科学价值;任何教学水平差的班级都可以得到类似的结果:已经了解该主题的人做得很好。关于示例问题:更常见的是假设命令式语义的问题,这些问题肯定不是直观的。如果您不能假设没有并发,您甚至可以回答自己的问题?
dmbarbour,2012年

19

也许这是轶事,但是当我向数百名文科学生教授入门编程时,我发现没有这种“双重障碍”。在我看来,他们都很有能力,尽管有些人比其他人更努力,而很少有人试图虚张声势。

这与教学方式有很多关系。

欲望也与很多事情有关-有些人觉得编程没什么趣味。但是即使这样,只要他们诚实地努力,他们仍然可以学习。


5
我经常想知道欲望在哪里发生,我们都知道编程对于绝大多数普通百姓来说完全没意思,这使我想知道有多少人尝试用钱赚钱,但让普通人完全缺乏兴趣。电脑工作。
吉米·霍法

6
@Jimmy:我试图通过让他们进行有关游戏,科学,金融,音乐等个人项目的有趣项目来使其变得有趣。编程是达到目的的一种手段,它会变得更加有趣。
Mike Dunlavey 2012年

2
@Den:好吧,他们必须做一些小作业来做小程序,进行测验和测试,而且每个人都必须做一个重要的个人编程项目,所有这些我都给我评分。该课程是必需的。
Mike Dunlavey 2012年

1
@MikeDunlavey学生总是有可以编程的朋友,可以很容易地欺骗家庭作业。
苏珊(Sulthan)2012年

2
@Sulthan:不在我班上,他们没有。一些尝试。一些人在测试中尝试从其他人那里复制。很明显-代码太像别人的代码了,同时也包含明显的错误。对于项目而言,没有两个人是一样的,没有什么比在测验和家庭作业中做得平庸但上交一个漂亮项目的人举起了红旗。我只是再做一个测试,然后交给他们。如果他们显然不知道前进的方向,则我没有义务给他们打好分数。或者,我可以请另一位教授。
Mike Dunlavey 2012年

7

当我刚开始时,通常在进行编程工作之前先进行“能力测试”。计算机科学专业的毕业生人数不多,因此从其他学科招聘人才是很普遍的。

这些测试与您在IQ测试中看到的类似(序列中的下一个数字是什么,等等)。

轶事证据表明,虽然并非所有通过测试的人都成为一名优秀的程序员,但没有一个人通过测试而失败,但由于其他原因而被录用,就成为了一名优秀的程序员。

可悲的是,HR无人机不了解这些测试(并在接受测试时失败!),因此,如今的招聘取决于HR无人机所了解的东西-良好的大学,沟通能力和穿西装的技能。

这完全是大型IT部门有很多人都擅长PowerPoint演示而很少有优秀程序员的原因。


1
+我如此感激,我从来没有(几乎)都必须经过HR。
Mike Dunlavey 2012年

4

对于那些引用Dehnadi和Bornat的双峰或山羊对羊的研究的人来说,值得去研究一下Caspersen等人(2007年)的心理模型和编程能力,他们试图复制这种思想:

预测参加入门编程课程的学生的成功已超过25年,是一个活跃的研究领域。直到最近,还没有变量或检验具有显着的预测能力。但是,Dehnadi和Bornat声称找到了一种简单的编程能力测试,可以将编程绵羊与非编程山羊完全分开。我们简要介绍他们的理论和测试仪器。

我们已经在本地环境中重复了他们的测试,以验证和概括他们的发现,但是我们无法证明该测试可以预测学生在入门编程课程中的成功。

基于测试仪器的这种故障,我们讨论了针对不同结果的各种解释,并提出了一种研究方法,从中可以概括该领域的局部结果。此外,我们讨论和批评Dehnadi和Bornat的编程能力测试,并设计替代测试工具。


4

可以对抽象能力或其他有用的知识进行研究,但是编程的定义尚不清楚,而且我认为引用是无关紧要的,因为有相反的方式可以查看编程:

第一类:编程语言是(或应该是)某种人类语言,用来描述计算机要执行的任务,因此,每个说话的人都应该能够编程。它被称为脚本,BASIC,排版系统TeX等...语言或系统无关紧要,这是他们的创建者和人们看待它的方式:“亲爱的程序/计算机,请打印我的名字”,而不是“为我提供11个字符大小的空间,然后给我这个空间的地址,然后让我存储它,然后在该内存中输入11个字符,您可以从键盘缓冲区中取出该字符(但不要忘记清理它)等等。”

在这种情况下,很明显该研究宁愿是“不是所有语言都可以很快被吸收吗?”。

另一方面,编程语言只是描述计算机的工作方式或工作方式,以及1950年代的计算机应如何“连接”的一种方式。因此,即使程序员的智能不能达到这个抽象级别,即您看到字节beeing存储在内存中,字符串作为指针等,然后即使他或她的“智能”说得很好,程序员也不会做任何事情。回到地球,将其与问题联系起来。因此,并非每个人都可以编程(使用汇编语言...)。

除此之外,您将需要工作和产生某种东西所需的所有素质:非常了解您想要的东西,使其他人易于理解/完成/审查,专注于您的目标等。但是就像建筑师一样,作家,音乐家,妓女..aehh义肢等。

但是大多数人,特别是儿童,具有良好的抽象能力。一些德国学校正在向未成年的孩子教授Haskell(每所德国学校都在教诸如PascalDelphi之类的编程语言)。

因此,我想说这个问题很难回答,任何答案(或研究)都可能无关紧要。

您将 Peter Norvig的《十年内自学编程》一文中找到有关人们如何学习编程的非常简短的分析。他似乎认为没有天生的程序员。


3
你好,欢迎光临!我对您的答案如何回答这个问题感到有些困惑,这实际上与是否已对此进行了研究……
yannis 2012年

抱歉,我搞砸了“发送”按钮...我希望这更有意义
Yves 2012年

您走在正确的道路上,但是将编程语言与硬件(计算机)紧密地联系在一起。编程不仅是与计算机对话的能力。编程是关于以一致的方式描述过程。将过程描述给其他人类似于使用高级编程语言对其进行编码。最大的不同是人类对歧义的容忍度更高。
Orionii皇帝'12

我不捍卫这种观点,而是试图指出一个事实,人们倾向于看到编程语言及其应作为任务描述的用途(这对高级编程和脚本编制很重要),或者作为“计算机过程”的描述(例如,即使是编程语言,低级语言似乎也更接近VHDL建模语言而不是VB.NET)。这两种方法非常不同,但是同一枚硬币的两个方面。他们坚持人类智力的不同方面,这些方面很难量化。因此很难研究它们。
伊夫2012年

3

许多年前,我做了几门课程,其中包括军事领导理论。该理论的一部分是,存在着一个领导力连续体,从那些天生的领导者到那些不能用皮带牵引狗的人。这个想法是,人们按照钟形曲线分布在这个领导连续体上,大多数人处于两个极端之间。除了极少数“不能带领狗”的极端情况外,几乎每个人都可以学会领导艺术。使某人成为领导者所需的工作量取决于他们坐在连续体上的位置。

我怀疑编程具有相似的连续性和相似的分布。有些人会毫不费力地获得它,而如果他们的生活依赖它,那将永远无法获得它。但它们是钟形曲线末端的少数几个。大多数人坐在连续体的极端之间。他们可以学习编程,但是教他们所需的精力将取决于他们坐在连续的地方。


我看到许多人没有正确地用皮带牵引狗。我曾经能够在没有皮带的情况下walk狗,即使在城镇也是如此。我一直想知道为什么人们不介意狗。

2

我不确定这只是编程。在人们只是学习使用计算机的情况下,我看到了相同的现象。回到大学时,我曾是一家实验室的实验室助理,负责为高年级学生提供计算机知识。

在两周之内,我就可以确定那些将要得到它的人和那些根本不能100%准确地找到它们的人。您要么承认这是计算机的工作方式,要么在整个课程中都为之奋斗。没有中间立场。(事实上​​,这是一个高年级课程,这意味着我们有很多反对者,这使得这种模式更加明显。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.