大学以Java为教学语言所带来的危害

原文:The Perils of JavaSchools

 

大学以Java为教学语言所带来的危害

 

Joel Spolsky

20051229,星期四

 

懒惰的年轻人。

 

为什么工作变得困难了?

 

一个让我明显变得工作效能下降的原因是“现在的年轻人”不愿意或没能力把工作做得更好或者更快。

 

当我还是个年轻人的时候,我是使用打孔机来学习编程的。如果输入错误了,没有任何现代功能(像是退格键)去修改错误。只能扔掉现在的卡,重新开始。

 

1991年起,我开始做面试程序员的工作,我会让他们选择熟悉的语言来解决我提出的问题,通常他们当中99%会选择C

 

而现在,他们通常会选择Java

 

好了,不要误会:作为工具语言,Java没有任何问题。

 

等等,我需要改下刚才的话。我不是想说,在特殊的情况下,Java作为一种工具语言没有任何错误。事实上它存在大量的错误,但这要等到另一篇文章再讨论。

 

我是想说,Java没有足够难到可以用来区分出伟大的程序员和普通的程序员。它可以在实际工作中表现良好,但这不是今天要讨论的话题。Java不够难是它的特色而不是它的缺陷,但是它还是有着1个问题。

 

在这里我可能要表现得傲慢,但根据我的经验,在传统的大学计算机科学课程中有2样东西不是所有人都能完全理解的,他们就是:指针和递归。

 

在你以往开始学习数据结构、链表和哈希表等类似的东西时,指针是广泛应用到的。这些课程是用来淘汰那些没法适应脑力挑战的学生,让他们放弃计算机科学学位,因为如果现在就觉得指针很难,那到了学习定点学时才知道什么是真正的难。

 

所有在高中时能用BASICApple II中写乒乓游戏的年轻人,到了大学接触CompSci 101一个数据结构课程时,指针可以让他们的脑袋爆炸,你猜之后会怎样么?他们会去改修政治学了,并表示法律学院更有前途。以各种理由退出计算机学院的大概占新生人数的40%70%。学校认为这是一种浪费。我认为,这是用来淘汰那些在编程生涯中无法得到快乐和成功的人所必须做的事情。

 

对年轻的计算机科学系学生来说,另一种困难的课程就是函数式编程,其中包括使用递归编程。麻省理工学院对这些课程要求非常高,创立了必修的课程(6.001)和课本(《计算机程序设计与解释》被数十到数百间一流的计算机科学系大学,作为计算机科学系入门教材)。

 

那些课程难得令人吃惊,在第一堂课上就需要完成Scheme的所有学习,并且介绍了一个函数作为输入的制点函数。当我在宾夕法尼亚大学与CSE121课程搏斗的时候,我发现大部分(差不多是所有)的学生不能完成课程,我写了一篇抱怨的email给教授,表示这是不公平的,宾夕法尼亚大学里的某些家伙一定是听取了我的抱怨(或者是其他人的),因为他们把课程的教学语言换成了Java

 

我倒希望他们没有听到这些抱怨。

 

这就是争议所在,像我这样多年来抱怨懒惰的计算机科学系大学生,以及美国大学计算机科学系学位毕业生少的情况,已经让业界受到巨大的伤害,在10年间大量好学校都使用100%Java教学。太好了,现在可以用"grep"unix下的一个软件)去寻找到合适的人才啦。Java没有足够难到能淘汰那些脑袋不能容纳指针和递归的人,这样就使到退学的人少了,获得计算机科学系学位的人增多了,政府预算也增加了,一切都太好了。

 

那些本校以Java为教学语言的幸运孩子永远不需要用指针来连哈希表,因此从没试过可怕的segfaults错误。他们永远不需要战战栗栗、发了疯似的在有限位中塞进东西。他们也永远不用去想,为什么在函数式编程中一个值是永远不变的,但有时候又随时都会变!真是矛盾啊!

 

他们永远不用在脑中存放一个能拿4个学分的科目。

 

难道我就只是一个像Four Yorkshiremen这样的老顽固,吹嘘自己是如何艰难的完成课程的吗?

 

1900年,拉丁文和希腊语是大学的必修课,不是因为它们多有用,而是因为学会它们被认为是成为受过高等教育的人的必要条件。在某些意识形态下我的观点和那些坚持使用拉丁文教学的人没什么不同(主要在4个方面)。“【拉丁文】锻炼了你的思想。锻炼了你的记忆力。拼写一句拉丁文句子是很好的思考训练,一个真正的智力游戏,同时要很好的使用逻辑思考能力,”Scott Barker著。但我找不到一所大学是必须修拉丁文的。指针和递归是计算机科学中的拉丁文和希腊语吗?

 

现在,我承认90%的程序是不需要用指针编写的,同时事实上,在大规模的项目中使用它是相当危险的。好的,这很好。同样,函数式编程在实际开发中也不常用。

 

但是它仍然在大多数另人兴奋的编程工作中是重要的。举个列子,如果你不会使用指针,就永远不可能参加Linux核心的编写。你无法理解任何一行Linux代码,或者说,确实为所有操作系统的代码,因为你没有真正理解指针。

 

没有弄懂函数式编程,你是没可能发明MapReduce,这个由Google发明的强大算法,它是来源于Lisp与函数式编程。回顾以往,修过6.001课程或者相等质量的课程的人都了解到在函数式编程在实际的编程上没有作用,其是用在平行优化上面。所以是Google发明了MapReduce而非微软,这就说明了为什么微软仍在尝试做基本的搜索业务,而与此同时Google已经进入下一阶段:构建Skynet(指云计算)这个全球最大的超级电脑。我不认为微软了解他们到底落后了多少。

 

但在指针和递归的重要性上,它们真正的价值在于构建大型系统所需要用到的脑力使你需要学习他们,同时该脑力是在课程中锻炼出来的。了解指针和递归就等于有能力成为伟大的程序员。

 

纯属Java的计算机科学系学位没有什么能把那些头脑不灵活的学生淘汰。作为一个雇主,我发现使用100%Java教学的学校,其相当多毕业生可以完成那些经过简化的课程,却不能应付一个比Java管理程序更加复杂的工作。这些学生永远也无法通过麻省理工学院的6.001课程或者耶鲁大学大学的CS 323课程,坦白的说,这就是为什么,雇主更愿意请麻省理工学院和耶鲁大学的计算机科学系毕业生而非最近完全转向用Java教学的杜克大学的计算机科学系毕业生。宾夕法尼亚大学把原来那些差点杀死我和我朋友的CSE121课程的教学语言由SchemeML改为Java。这不表示我不会雇用那些来自杜克大学和宾夕法尼亚大学的聪明的年青人,只是我会更加谨慎的检查他们是否是真正的黑客。那些聪明的年轻人能在短时间内看清一个递归的结构,或者用指针写一个链表操作比得上在白板上写的速度。但对于本校以Java为教学语言的毕业生,我不能分清楚他们写程序艰难是因为他们受教育不足还是因为他们缺乏成为伟大的程序员的特殊的天赋。Paul Graham称他们为“悲哀的程序员”。

 

这情况坏到学校有理由说没有把那里不能成为伟大的程序员的人淘汰,不是他们的问题。但至少那些用grep过滤简历的人会大呼使用Java教学。

 

但是使用Java作为教学语言的学校都未能让锻炼学生的头脑,使他们能做出灵活的软件设计(在你花费大量时间更改你的代码而重新编写对象,或者你在写伪代码,像has-a is-a时,面向对象可不像是“设计”)。你想设计出伟大的程序架构的话,就需要训练在思想中作多重等级的提取和思想的严谨。

 

如果你觉得教授面向对象编程和教授指针和递归一样,是个淘汰学生的好方法。那答案是:不是的。除了讨论面向对象编程的价值,它没有难到足以淘汰那些普通的程序员。面向对象编程在学校教学中,学生只需要记住几个专业术语就可以了,如“封装”和“继承”,又或者内容再深入点的多态和重写。不比记住历史课程中的著名时间和名字难多少,面向对象编程只能吓怕那些没有信心的一年级学生。当你使用面向对象编程的时候,你的程序仍然能运行,只是没那么健壮。就像我说的那样。但如果要你编写要使用到指针的程序,你会搞不清楚为什么程序会产生出线程错误,直到你停下来并深思程序的多个方面。

 

那些使用grep的招聘人员有很好的理由去嘲笑。我从未见过哪个会使用SchemeHaskellC指针的人不能在2天内学会使用Java,并其写出来的Java代码比一个有5Java经验的程序员还要好,但这个事实很难对一般的人力资源部门的懒人解释清楚。

 

但对于计算机科学系的学校呢?他们不是职业学院啊!他们不应该量产一批用于工业上的人。这是社区学院和政府再培训局的事。他们应该教会学生最基本的知识,而不是教会在怎样应付他们工作生涯中的第一个星期,对吧?

 

虽然如此,计算机科学是证明(递归),算法(递归),语言(lambda calculus),操作系统(指针),编译器(lambda calculus)组成的——与此同时那些用Java为教学语言的学校不教CScheme就不算是真正的计算机科学。不管怎样,函数的概念充斥着这个真正的世界,它显然是计算机科学系的预修课程。我不能理解的是为什么那些计算机科学系课程委员会的教授能允许他们的学生在没成为合格的程序员前写不用指针的程序,没有让学生拥有能够争夺他们教职的能力。哦,等等,没关系,我也许弄懂了。

 

事实上当你回想并研究到探讨Java最激烈的时候,你会注意到最大的问题是Java是否足够简单得能成为一种教学语言。

 

我的天啊,我明白了,他们尝试进一步的降低课程的难度!那为什么不直接用勺子喂学生吃饭呢?让我们帮他们直接完成试卷吧,这样就没人会去读美国文化研究了。为什么要让那些必须学的东西为了某些人而简化呢?这里有一个进行中的计划,目标是做出一个简单的Java子集,用来作为学生的教学语言,其产出的文档小心的隐藏了关于EJB/J2EE的内容以保护学生脆弱的脑瓜,因此学生们不需担心他们的小脑瓜在课程中会碰到任何容易的计算机科学问题。

 

最能让人理解的是为什么计算机科学系如此热心于不去教导实质的计算机科学概念以降低课程难度,因为他们不用花费2节课的时间去为那些奇怪的学生去讲解Java中的int类型和Integer类型的不同。好了,如果情况就是这样,6.001课程为你提供了一个完美的答案:Scheme,一种能让聪明的学生在10分钟学会的简单教学语言;于是你能把学期剩下的时间花在定点学上。

 

我将返回10

 

你获取了1?幸运的混蛋,我们所有人都只得到了0

你可能感兴趣的:(业界八卦,java,语言,编程,scheme,mapreduce,工作)