你是否是程序员这块料?


很多人推荐了这么一篇学术论文,题为“The Camel Has Two Humps”(骆驼有双峰)。它提出了下面的方法,能在计算机科学专业的学生接触到一个程序或者一门编程语言之前,判断出他们当中哪些人适合学习编程,哪些人不适合。

所有教授编程的老师都发现,他们的教学结果呈现出“双峰”现象。似乎他们的学生中有两类人:一类是会编程的;另一类是不会编程的。这两类人有着各自独立的贝尔曲线。对于编程的教学,基本上所有的研究都集中在“教”上:变换语言,变换应用领域,使用一个IDE,引入激励机制,等等。但这些统统都不奏效,“双峰”现象依然存在。于是,我们发明了一种测试,通过它可以在授课之前把这两类人区别开来。我们挑选“双峰”中会编程的那些人。可能你现在还无法相信,但是在你看完之后,一定会相信的。我们还没完全搞明白为什么这种方法奏效,但我们有一些不错的理论支持。

我不曾想到,一个擅长编程的人和不擅长的人在这么早就可以被分辨出来。Dan Bricklin曾经在他的文章中提到过这个话题,文章的名字是“Why Johnny Can’t Program”(为什么Johnny不会编程)。但是,对于那些教授计算机科学的人来说,这些显然已不是秘密。

自20世纪50年代电子计算机被发明以来,尽管世界已经发生了翻天覆地的变化,但有些东西却始终没变。特别是,大部分人学不会编程:每所大学的计算机学院都有30%~60%的新生在第一门编程课程上不及格。有经验的教师很清楚这种情况,但都已经心力憔悴了。一些聪明的年轻教师坚信过去的做法一定有问题,于是苦苦地探索着真相。自20世纪60年代这个课题被提出以来,已经差不多有两代人为此付出了努力。

你也许觉得,他们提出的用于鉴定编程天赋的测试会很复杂。其实不然。请看下面,第一道题是这样的:

请看清下面的语句,并在正确答案的旁边做上标记。

int a = 10;

int b = 20;

a = b;

a和b现在的值应该是:

[ ] a = 20 b = 0

[ ] a = 20 b = 20

[ ] a = 0 b = 10

[ ] a = 10 b = 10

[ ] a = 30 b = 20

[ ] a = 30 b = 0

[ ] a = 10 b = 30

[ ] a = 0 b = 30

[ ] a = 10 b = 20

[ ] a = 20 b = 10

可以想见,专业程序员对此会不屑一顾。但是,别忘了,这个测试是给那些生平从未接触过代码的学生设计的。另外的12道题与上面这道题的风格一样。

这个试卷的作者们认为,学习计算机科学的最主要障碍是:

1.赋值和序列

2.递归、迭代

3.并发

按照这样的顺序,我们首先测试初学者最先会遇到的障碍:赋值。测试的结果把学生清楚地分成3组:

· 44%的学生对赋值的原理形成了一个稳定的思维模型(即使是错的)。

· 39%的学生一头雾水,对于赋值的原理仍然琢磨不透。

· 8%的学生交了白卷。

这个测试做了两次。第一次是在学习之前,第二次是在开课三周之后。比较两次测试的结果,最让人吃惊的是:这3组学生的格局几乎没有发生任何变化。要么你在第一次碰到赋值(编程中的第一个障碍)的时候就在心中立即形成了一个模型,要么你永远学不会。

作者们发现,学习编程能否成功与是否形成了稳定的思维模型有着莫大的关联。

很显然,Dehnahdi的测试并不能完美区分出会编程和不会编程的人。然而,如果存在这样一个招生测试,让那些有稳定分数的人才会被录取,这样的话,两极分化的现象就会发生改变。在所有的61人中有32人(52%)不及格;而如果只在那个形成了稳定思维模型的组里计算,27人中只有6人(22%)不及格。我们可以自信满满地说,我们有一个能在上课前就可以预测哪些学生会成功的测试方法,并且这种方法具有很高的准确性。据我们所知,这是到目前为止第一个能够预测成功的测试方法。

我强烈建议大家把这篇文章完整地读一遍。我曾经认为这会是一篇晦涩难懂的学院派论文,其实不然,它更像是一篇博文,充满了有趣的观点,就像下面这两段:

我们确实经历了一段时间,才有勇气相信我们自己的结论。尽管意识到目前的数据还不充分,我们的结论还只能算是一种推测,但在我们看来,第一次测试就区分出来了3个组,其中的决定因素是他们对无意义事物的态度。

形式逻辑证明,进而用一种叫编程语言的形式系统来表达,通过执行某种特别的计算得出结果,这其实是完全没有意义的。为了编写一个计算机程序,你必须做出妥协,赋予程序某种意义。但不管你想要这个程序做什么,计算机都会按照这些没有意义的规则运行,并且得到一些没有意义的结果。在测试中,那些有稳定思维模型的人都体现出了在这方面的先天接受能力,他们都有能力看见规则背后的数学计算问题,并且无论怎样都能够遵循那些规则。另一方面,那些没有稳定思维模型的人总是找不到头绪。而那些交白卷的人知道这是一件无意义的事,所以他们拒绝去做。

每个人都应该知道怎样使用计算机,但并不是每个人都需要成为一名程序员。然而,对于相当多的计算机科学的学生来说,似乎怎么也教不会他们编程,这还是有些令人担忧的。很显然,不是所有人都像我们这样痴迷于没有意义的规则和结论。但对我而言,有何不可呢?



回到

顶部