• 你是程序猿这块料吗?


    非常多人推荐了这么一篇学术论文,题为“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个组,当中的决定因素是他们对无意义事物的态度。

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

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

    本文摘自《程序猿的修炼》




  • 相关阅读:
    HTTP协议 (二) 基本认证
    HTTP协议详解
    Wireshark基本介绍和学习TCP三次握手
    Fiddler 教程
    UNIX网络编程——线程池模式比较(ICE线程池模型和L/F领导者跟随者模式)
    修改一行SQL代码 性能提升了100倍
    修改一行SQL代码 性能提升了100倍
    vector map 多层嵌套使用
    vector map 多层嵌套使用
    应该记住的话
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4353098.html
Copyright © 2020-2023  润新知