Java语言学校的危险性( The Perils of JavaSchools )

上传人:ji****72 文档编号:37518586 上传时间:2018-04-17 格式:DOC 页数:7 大小:44.50KB
返回 下载 相关 举报
Java语言学校的危险性( The Perils of JavaSchools )_第1页
第1页 / 共7页
Java语言学校的危险性( The Perils of JavaSchools )_第2页
第2页 / 共7页
Java语言学校的危险性( The Perils of JavaSchools )_第3页
第3页 / 共7页
Java语言学校的危险性( The Perils of JavaSchools )_第4页
第4页 / 共7页
Java语言学校的危险性( The Perils of JavaSchools )_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《Java语言学校的危险性( The Perils of JavaSchools )》由会员分享,可在线阅读,更多相关《Java语言学校的危险性( The Perils of JavaSchools )(7页珍藏版)》请在金锄头文库上搜索。

1、1Java 语言学校的危险性语言学校的危险性( The Perils of JavaSchools ) 2009-01-12 23:33 | (分类:默认分类) 【作者】Joel Spolsky【英文原文】http:/ 多吃一点苦,又会怎么样呢?我一定是变老了,才会这样喋喋不休地抱怨和感叹“如今的孩子”。为什么他们不再愿意、 或者说不再能够做艰苦的工作呢。 当我还是孩子的时候,学习编程需要用到穿孔卡片(punched cards)。那时可没有任何 类 似“退格”键(Backspace key)这样的现代化功能,如果你出错了,就没有办法更正,只 好扔掉出错的卡片,从头再来。回想 1991 年,我

2、开始面试程序员的时候。我一般会出一些编程题,允许用任何编程语言 解题 。在 99%的情况下,面试者选择 C 语言。如今,面试者一般会选择 Java 语言。说到这里,不要误会我的意思。Java 语言本身作为一种开发工具,并没有什么错。、等一等,我要做个更正。我只是在本篇特定的文章中,不会提到 Java 语言作为一种开发工 具 ,有什么不好的地方。事实上,它有许许多多不好的地方,不过这些只有另找时间来谈了 。我在这篇文章中,真正想要说的是,总的来看,Java 不是一种非常难的编程语言,无法用 来 区分优秀程序员和普通程序员。它可能很适合用来完成工作,但是这个不是今天的主题。2我 甚至想说,Java

3、 语言不够难,其实是它的特色,不能算缺点。但是不管怎样,它就是有这 个 问题。如果我听上去像是妄下论断,那么我想说一点我自己的微不足道的经历。大学计算机系的 课 程里,传统上有两个知识点,许多人从来都没有真正搞懂过的,那就是指针(pointers)和 递归(recursion)。你进大学后,一开始总要上一门“数据结构”课(data structure), 然后会有线性链表( linkedlist)、哈希表(hashtable),以及其他诸如此类的课程。这些课会大量使用“指 针”。它们经常起到一种优胜劣汰的作用。因为这些课程非常难,那些学不会的人,就表明 他们的能力不足以达到计算机科学学士学位的

4、要求,只能选择放弃这个专业。这是一件好 事 ,因为如果你连指针很觉得很难,那么等学到后面,要你证明不动点定理(fixed point theory)的时候,你该怎么办呢?有些孩子读高中的时候,就能用 BASIC 语言在 AppleII 型个人电脑上,写出漂亮的乒乓球 游戏 。等他们进了大学,都会去选修计算机科学 101 课程,那门课讲的就是数据结构。当他们 接 触到指针那些玩意以后,就一下子完全傻眼了,后面的事情你都可以想像,他们就去改学 政 治学,因为看上去法学院是一个更好的出路1。关于计算机系的淘汰率,我见过各式各样 的数字,通常在 40%到 70%之间。校方一般会觉得,学生拿不到学位很可

5、惜,我则视其 为必要 的筛选,淘汰那些没有兴趣编程或者没有能力编程的人。对于许多计算机系的青年学生来说,另一门有难度的课程是有关函数式编程( functionalprogramming)的课程,其中就包括递归程序设计(recursiveprogramming)。 MIT 将这些课程的标准提得很高,还专门设立了一门必修课(课程代号 6.0012),它的 教 材(Structureand Interpretation of Computer Programs,作者为 Harold Abelson 和 Gerald JaySussmanAbelson,MIT 出版社 1996 年版)被几十所、甚至几

6、百所著名高校的 计算系机采用,充当事实上的计算机科学导论课程。(你能在网上找到这本教材的旧版本 ,应该 读一下。)这些课程难得惊人。在第一堂课,你就要学完 Scheme 语言3的几乎所有内容,你还会遇 到 一个不动点函数(fixed- pointfunction),它的自变量本身就是另一个函数。我读的这门 导论课,是宾夕法尼亚大学的 CSE121 课程,真是读得苦不堪言。我注意到很多学生,也 许是 大部分的学生,都无法完成这门课。课程的内容实在太难了。我给教授写了一封长长的声3泪 俱下的 Email,控诉这门课不是给人学的。宾夕法尼亚大学里一定有人听到了我的呼声( 或 者听到了其他抱怨者的呼声

7、),因为如今这门课讲授的计算机语言是 Java。我现在觉得,他们还不如没有听见呢。这就是争议所在。许多年来,像当年的我一样懒惰的计算机系本科生不停地抱怨,再加上 计 算机业界也在抱怨毕业生不够用,这一切终于造成了重大恶果。过去十年中,大量本来堪 称 完美的好学校,都百分之百转向了 Java 语言的怀抱。这真是好得没话说了,那些用“grep” 命令4过滤简历的企业招聘主管,大概会很喜欢这样。最妙不可言的是,Java 语言中没有 什么太难的地方,不会真的淘汰什么人,你搞不懂指针或者递归也没关系。所以,计算系 的 淘汰率就降低了,学生人数上升了,经费预算变大了,可谓皆大欢喜。学习 Java 语言的孩

8、子是幸运的,因为当他们用到以指针为基础的哈希表时,他们永远也不 会 遇到古怪的“段错误”5 (segfault)。他们永远不会因为无法将数据塞进有限的内存空 间,而急得发疯。他们也永远不用苦苦思索,为什么在一个纯函数的程序中,一个变量的 值 一会保持不变,一会又变个不停!多么自相矛盾啊!他们不需要怎么动脑筋,就可以在专业上得到 4.0 的绩点。我是不是有点太苛刻了?就像电视里的“四个约克郡男人”6(Four Yorkshiremen)那样 ,成了老古板?就在这里吹嘘我是多么刻苦,完成了所有那些高难度的课程?我再告诉你一件事。1900 年的时候,拉丁语和希腊语都是大学里的必修课,原因不是因为 它

9、 们有什么特别的作用,而是因为它们有点被看成是受过高等教育的人士的标志。在某种程 度 上,我的观点同拉丁语支持者的观点没有不同(下面的四点理由都是如此):“(拉丁语) 训练你的思维,锻炼你的记忆。分析拉丁语的句法结构,是思考能力的最佳练习,是真正 对 智力的挑战,能够很好地培养逻辑能力。”以上出自 Scott Barker 之口( http:/www.promotelatin.org/whylatin.htm)。但是,今天我找不到一所大学,还把拉丁 语作为必修课。指针和递归不正像计算机科学中的拉丁语和希腊语吗?说到这里,我坦率地承认,当今的软件代码中 90%都不需要使用指针。事实上,如果在正

10、式 产品中使用指针,这将是十分危险的。好的,这一点没有异议。与此同时,函数式编程在 实 际开发中用到的也不多。这一点我也同意。4但是,对于某些最激动人心的编程任务来说,指针仍然是非常重要的。比如说,如果不用 指 针,你根本没办法开发 Linux 的内核。如果你不是真正地理解了指针,你连一行 Linux 的 代码 也看不懂,说实话,任何操作系统的代码你都看不懂。如果你不懂函数式编程,你就无法创造出 MapReduce7,正是这种算法使得 Google 的可 扩展性(scalable)达到如此巨大的规模。单词“Map”(映射)和“Reduce”(化简)分别来 自 Lisp 语言和函数式编程。回想起

11、来,在类似 6.001 这样的编程课程中,都有提到纯粹的 函 数式编程没有副作用,因此可以直接用于并行计算(parallelizable)。任何人只要还记得 这些内容,那么 MapRuduce 对他来说就是显而易见的。发明 MapReduce 的公司是 Google ,而不是微软,这个简单的事实说出了原因,为什么微软至今还在追赶,还在试图提供最 基本的搜索服务,而 Google 已经转向了下一个阶段,开发世界上最大的并行式超级计算 机 Skynet8的 H 次方的 H 次方的 H 次方的 H 次方的 H 次方的 H 次方。我觉得,微软并没有 完全明白 ,在这一波竞争中它落后多远。除了上面那些直

12、接就能想到的重要性,指针和递归的真正价值,在于那种你在学习它们的 过 程中,所得到的思维深度,以及你因为害怕在这些课程中被淘汰,所产生的心理抗压能力 , 它们都是在建造大型系统的过程中必不可少的。指针和递归要求一定水平的推理能力、抽 象 思考能力,以及最重要的,在若干个不同的抽象层次上,同时审视同一个问题的能力。因 此 ,是否真正理解指针和递归,与是否是一个优秀程序员直接相关。如果计算机系的课程都与 Java 语言有关,那么对于那些在智力上无法应付复杂概念的学生 , 就没有东西可以真的淘汰他们。作为一个雇主,我发现那些 100%Java 教学的计算机系, 已经 培养出了相当一大批毕业生,这些学

13、生只能勉强完成难度日益降低的课程作业,只会用 Java 语言编写简单的记账程序,如果你让他们编写一个更难的东西,他们就束手无策了。 他 们的智力不足以成为程序员。这些学生永远也通不过 MIT 的 6.001 课程,或者耶鲁大学的 CS323 课程。坦率地说,为什么在一个雇主的心目中,MIT 或者耶鲁大学计算机系的学位 的份 量,要重于杜克大学,这就是原因之一。因为杜克大学最近已经全部转为用 Java 语言教学 。 宾夕法尼亚大学的情况也很类似,当初 CSE121 课程中的 Scheme 语言和 ML 语言,几乎 将我和我的同学折磨至死,如今已经全部被 Java 语言替代。我的意思不是说,我不想

14、雇佣 来自杜克大 学或者宾夕法尼亚大学的聪明学生,我真的愿意雇佣他们,只是对于我来说,确定他们是5否 真的聪明,如今变得难多了。以前,我能够分辨出谁是聪明学生,因为他们可以在一分钟 内 看懂一个递归算法,或者可以迅速在计算机上实现一个线性链表操作函数,所用的时间同 黑 板上写一遍差不多。但是对于 Java 语言学校的毕业生,看着他们面对上述问题苦苦思索、 做 不出来的样子,我分辨不出这到底是因为学校里没教,还是因为他们不具备编写优秀软件 作 品的素质。PaulGraham 将这一类程序员称为“Blub 程序员”9( 语言学校无法淘汰那些永远也成不了优秀程序员的学生,这已经是很糟糕的事情了。

15、但 是,学校可以无可厚非地辩解,这不是校方的错。整个软件行业,或者说至少是其中那些 使 用 grep 命令过滤简历的招聘经理,确实是在一直叫嚷,要求学校使用 Java 语言教学。但是,即使如此,Java 语言学校的教学也还是失败的,因为学校没有成功训练好学生的头 脑 ,没有使他们变得足够熟练、敏捷、灵活,能够做出高质量的软件设计(我不是指面向对 象 式的“设计”,那种编程只不过是要求你花上无数个小时,重写你的代码,使它们能够满足 面向对象编程的等级制继承式结构,或者说要求你思考到底对象之间是“has-a”从属关系 ,还是“is-a”继承关系,这种“伪问题”将你搞得烦躁不安)。你需要的是那种能够

16、在多 个抽象层次上,同时思考问题的训练。这种思考能力正是设计出优秀软件架构所必需的。你也许想知道,在教学中,面向对象编程(object-orientedprogramming,缩写 OOP)是 否是指针和递归的优质替代品,是不是也能起到淘汰作用。简单的回答是:“不”。我在这 里 不讨论 OOP 的优点,我只指出 OOP 不够难,无法淘汰平庸的程序员。大多数时候,OOP 教学的 主要内容就是记住一堆专有名词,比如“封装”(encapsulation)和“继承”( inheritance)”,然后再做一堆多选题小测验,考你是不是明白“多态”(polymorphism )和“重载”(overloading)的区别。这同历史课上,要求你记住重要的日期和人名,难 度差不多。OOP 不构成对智力的太大挑战,吓不跑一年级新生。据说,如果你没学好 OOP ,你

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号