找回密码
 入驻
搜索
查看: 582|回复: 16

终于有人说出来了——Java不适合于作为主要编程教学语言(转孟岩)

[复制链接]
发表于 2008-1-13 22:30:51 | 显示全部楼层 |阅读模式
CSDN首页推荐了一篇文章,说两位退休的美国大学教授上书反对将Java作为编程教学语言,对此我表示高度认同。对于Java,我
并不反感,而且相信它在工业应用中的地位不可取代,但是,我一直反对将Java作为主要的编程教学语言,因为教学语言承担着
与生产语言不同的任务,它必须能够帮助学生奠定坚实的技术基础,塑造核心技术能力。在这方面,Java不能够胜任。
1990年代中期以前,美国的计算机编程入门教育以Pascal为主。我的一位美国程序员朋友至今还怀念他与Pascal为伴的高中年代
。到了1990年代中后期,由于ANSI C语言“纠正”了早期C语言的一些不适合编程教学的问题,因此成为很多美国高中和大学编程
入门课的教学语言。1998年,美国指导编程教学的一个协会推荐将C++作为入门教学语言,在当时引起很大的反响,认为是编程教
育方面的一个重要进步。但遗憾的是,C++非常复杂,而当时C++语言的教育体系又非常不成熟,因此很多地方的教学方法不得当
,把学生迅速拖入无边无际的语言细节当中,引起了学生痛苦的抱怨。大约经过两三年不成功的实践之后,在本世纪初,美国计
算机教育界普遍接受Java作为编程入门语言。此后在很短的时间里,Java迅速成为美国高中和大学里的首选编程教学语言,老师
教得轻松,学生学得甜蜜,所以这个局面一直持续到现在。
      而在中国,BASIC语言及其变体一直到1990年代中期都还是“算法语言”课程的主要教学内容,充分折射出当时中国计算机教学与
工业应用之间的脱节。只是到了1990年代后期,C语言才确立了在中国工科计算机编程入门教育中的主流地位。到现在为止,大部
分工科学生都“必修”“C程序设计语言”这门课程。不过事实上,根据我的了解,这门课程的总体教学质量相当糟糕,大部分学
生可以说是满怀希望而来,两手空空而去。在这种情况下,中国高校计算机编程入门教育已经开始悄悄向Java过渡了。据我所知
,有一些名校已经开始将Java设为编程入门课程,并且认为这是与国际接轨进步标志。
在我的朋友圈子里,大多数真正的一线开发者和技术领导者,对于将Java作为入门教学语言的“发展方向”都持质疑态度。他们
中很多人目前主要的工作都集中在Java上,因此这种态度并非来自所谓语言宗教情绪,而是来自他们招聘和实际工作中的感受。
他们发现,只学习Java、C#、VB等“现代”编程语言的学生,精于拿来主义,长于整合和快速开发,思维活跃,生产效率高,让
他们来做直截了当的、有章可循的、非研究性和非创新性的工作比较合适,但是基础不扎实,对计算机系统的理解薄弱,处理细
节和矛盾的能力不足,一旦他们熟悉的套路用不上,则缺少自主分析问题、解决问题的知识、能力和经验。
今天看到两位教授的“上书”,才知道原来他们也有同感。只不过这两位教授说的更直白,直接反对将Java作为入门编程语言,
而是冒天下之大不韪,公然号召开历史倒车,要求退回到C、C++、Lisp和Ada去。
我是支持两位教授的。我认为,Java、C#、VB和其它虚拟机之上的语言都不适合作为专业程序员的入门教学语言。在中国还非常
缺乏具有创新和独立解决问题的高水平程序员的局面下,我们应该认真做好的事情是努力提高C/C++的教学质量,而不是图快活转
向Java。
      教学语言的选择是至关重要的事情。作为大多数学生第一种需要认真学习理解的编程语言,教学语言将会成为他们中间很多人的
“编程母语”,深深地烙印在学生的思维方式中。这个编程母语要帮助学生破除计算机和软件的神秘感,建立对于程序的基本认
识和对计算机模型的最初理解。在后续专业基础课和专业课程的学习中,这门编程语言应该作为主要工具贯穿始终,帮助学生认
识计算机系统,掌握算法与数据结构技能,熟悉操作系统概念,理解编译原理知识,理解软件抽象及软件设计的基本思想,完成
一定量的课程及课外项目实践,建立正确的软件开发实践习惯。不但如此,这种教学语言必须是工业界的主流语言,否则学生学
非所用,学习动力无法保证。
      按照这个标准来衡量,Java适合于作为主要的编程教学语言吗?我不这么认为。首先,我承认Java在教学上有一些优势,比如其
开发环境和工具支持非常成熟,有助于培养学生正确的编程习惯;Java是当今第一工业主流语言,标准类库非常全面,可以迅速
地开发具有实际用途的程序,有助于激发和保持学生的兴趣;而在数据结构、算法、编译原理的教学方面,Java也毫不落于下风
,在软件抽象设计(面向对象)方面,Java还有着明显的优势;特别是在并行编程的教学方面,Java 1.5 concurrency包提供的
优势是压倒性的。尽管有如上这些优势,但Java作为教学语言存在着一个致命的缺陷,即它是一个虚拟机语言,这一点就足以把
它从教学语言的名单上去掉。作为一个虚拟机语言,Java对开发者隔绝了下层的真实系统,从而构造了一个近乎完美的环境,在
这个环境里,世界上只有一种机器,一个操作系统,内存是无限的,所有的机器都具有相同的字节顺序和一致的类型约定,为了
设计的优美而牺牲速度永远是正义行为,从反射到运行时自动加载,从完备的容器类到统一字符编码,一大堆漂亮的功能都可以
不费吹灰之力唾手而得。要是这个世界上每台计算机都是一个Java机器,每项编程任务都可以在这样一个近乎完美的环境中开发
,那毫无以为,Java是最合适的编程教学语言。但是事实上呢?这样一个完美的环境是Java力量的源泉,但这却不是真实的世界
。在真实世界里,我们可能面对非常原始的环境,苛刻的运行时限制,复杂多变的系统环境,令人窒息的细节魔鬼,要对付这些
东西,需要开发者具有在应对复杂性,自己构造环境,在诸多限制条件下寻找解决方案的能力。而这种能力,被无数人无数次地
证明是软件开发、特别是软件创新的核心能力。把Java作为教学语言,恰恰会导致这种核心能力的缺失。除此之外,如果耐心观
察的话,不难发现,几乎在任何软件领域里的创新性成果都首先是由C/C++语言实现的,原因很简单,Java是站在C/C++基础之上
的,只有C/C++先把大路趟开,Java才能够顺势而上。
      相反,尽管C/C++语言作为教学语言有很多的不足,比如不同环境下开发模式差异大,细节繁多,开发效率低,容易犯错,测试和
调试困难,学习者难以保持动力,等等,但是这些问题都可以解决。而C/C++的关键优点,是能够让学习者在真实的计算机抽象上
、在大量的细节和矛盾中学会思考,学会解决问题,学会了解真实的系统,知轻重,明生死,从而建立核心能力。掌握了C/C++语
言,再去学习和理解Java、C#、Python、Ruby和其它语言,就比较容易达到更高的境界。反之,如果习惯了舒舒服服躺在完美世
界里当阔少,那就很难有勇气面对真实的世界。当然,很多开发者认为,现在更重要的能力是理解业务、整合现有资源的能力,
而不是处理底层细节的技术。这种说法放在个人身上没有问题,但是不能成为整个编程教育的指导思想。我们需要各个层面上的
人才,精通业务和设计的架构师固然很重要,但能够在底层作出创新成果的编程高手实际上更为稀缺和珍贵,很多时候也能够创
造更大的价值。而且,更重要的是,一个精通系统知识的开发者在往上走的时候不会遇到大的障碍,而一个只知道拼装组合的“
高级设计师”,往往连往下看的勇气都没有。
      Java的另外一个问题,是其所倡导的繁琐设计风格,一个对象套一个对象,一个对象叠一个对象,概念之间彼此横七竖八地互相
依赖,人为制造出一大堆貌似精美、实则累赘的所谓设计。这个问题我已经批评过多次,并且相信这股歪风一定会最终被人们抛
弃,Java最终会归于质朴。但是在这一天到来之前,Java对于初学者来说,很可能蒙住他们的双眼,使他们看不到软件设计中最
可贵的简单性和优美的统一,体会不到数据和程序的统一。在这一点上,C表现的非常好,而C++如果教学得体,可以做的更好。
当然,这并不是为现在的C/C++教学辩护。恰恰相反,从我了解的情况来看,目前普通高校的C/C++教学质量非常令人担忧。学生
学不会,而且越学越没有兴趣,老师则感到教起来很棘手,迫于现实情况往往选择敷衍了事。反而是教Java,无论如何学生还能
学到一点东西,对就业也有直接的帮助。至于学生的核心能力确实,发展后劲不足等问题,就让他们在现实工作中自己解决吧。
坦率地说,这种想法也很有道理。不过,从教学角度来说,我认为老师们还是应该积极考虑如何提高C/C++的教学质量。毕竟学生
阶段是十分宝贵的,基础不在这个时期夯实,将来想弥补,就算不是完全不可能,也将付出十倍的代价。本着对学生职业生涯的
负责态度,还是应该帮助学生达到这个阶段应该达到的目标。在两位教授的公开信里,也充分表达出这个意思。
      我赞成的编程教育过程,应当是以C/C++(基本上是C)为主线,贯穿起算法、数据结构、系统原理、编译和数据处理、软件设计
和组件技术等关键知识领域,让学生能够从根本上理解现代软件系统的原理和构造,并通过有效的练习建立正确的软件设计观念
和良好的工程实践习惯。在这个基础上,无论将来是深入学习C++,还是进入Java的繁荣世界,或者拥抱Python、Ruby,甚至于走
向Web开发,都会心领神会,势如破竹。

[ 本帖最后由 zkkpkk 于 2008-1-13 23:06 编辑 ]
发表于 2008-1-13 22:39:42 | 显示全部楼层
时代总是要向前发展哒:mad1
回复

使用道具 举报

 楼主| 发表于 2008-1-13 22:41:18 | 显示全部楼层
非常支持这种说法,C/C++再难也要作为“母语”,再难教也得教,如何教好才是关键,回想起自己走过的路,算法、数据结构、系统原理、数据库技术、软件工程,C++无不是动力,C++帮助了我很多:不费吹灰之力拿下C#,组织数据结构和设计算法......每每遇到问题首先出现在脑海里的无不是C++,不经历char*的辛苦,怎么能安然享受string的舒适?

PS:其实我们系把软件基础教学语言由C++改为C,是比较正确的,C++这种BT,一不小心就走火入魔,陷入无休止的语法陷阱,1学期、2学期+1暑假,我就这样才入门啊,但千万不要改JAVA,再怎么要就业率这点都不能退让

[ 本帖最后由 zkkpkk 于 2008-1-13 22:46 编辑 ]
回复

使用道具 举报

发表于 2008-1-13 22:44:42 | 显示全部楼层
辜负楼主了   我看不下去   :titter1
回复

使用道具 举报

发表于 2008-1-13 22:44:48 | 显示全部楼层
自学啊.....................:lol1
回复

使用道具 举报

发表于 2008-1-13 22:45:38 | 显示全部楼层
这是什么跟什么啊

有很多程序员都说
Java是一门最优秀的编程语言来着

而且事实证明
Java 是目前 最流行的
20071030_123025_760.jpg

[ 本帖最后由 火花 于 2008-1-13 22:47 编辑 ]
fb68b9c0-8c96-4398-9d55-51e5b76ef136.jpg
回复

使用道具 举报

 楼主| 发表于 2008-1-13 23:00:16 | 显示全部楼层
原帖由 火花 于 2008-1-13 22:45 发表
这是什么跟什么啊

有很多程序员都说
Java是一门最优秀的编程语言来着

而且事实证明
Java 是目前 最流行的

JAVA优秀就能胜任软件的基础教育了吗?更和流行无关啊!
你看我现在我就算是用C#来做ring3层的应用,但是如果谁说要用C#当基础我第一个反对,而文中反对JAVA做基础的也都是用JAVA的,出外面流行什么就用什么,但是学生时代是可贵的,在这之间一定要理解该理解的东西。

胜任软件工业基础教育的语言一定要是一门既顾全原理性,又尽量贴近工业时效性的语言,正因为这样,先人放弃了纯算法的pascal、ABA,改成了C、C++,也是因为这样,绝对要保住这最后的底线。

如果不是软件专业,怎么搞不要紧,但要是软件专业,想要学JAVA,先把C/C++基础打好,根本不费吹灰之力。

[ 本帖最后由 zkkpkk 于 2008-1-13 23:08 编辑 ]
回复

使用道具 举报

发表于 2008-1-13 23:22:25 | 显示全部楼层
:titter1 不同阵营相互攻击~貌似我是DELPHI阵营滴~不过我保持中立~
回复

使用道具 举报

 楼主| 发表于 2008-1-13 23:25:41 | 显示全部楼层
原帖由 彪血 于 2008-1-13 23:22 发表
:titter1 不同阵营相互攻击~貌似我是DELPHI阵营滴~不过我保持中立~

这话是用JAVA的人说的......
你没理解语言分层,和软件基础语言的重要性......这文章决不是语言阵营的对峙!
你不知道现在的软件工业多么浮躁,“算法不重要”、“数据结构不重要”......见鬼!
JAVA和C#这种虚拟机语言决不能做基础语言!
PS:你那DELPHI就是PASCAL变身而来的

[ 本帖最后由 zkkpkk 于 2008-1-13 23:27 编辑 ]
回复

使用道具 举报

发表于 2008-1-15 21:50:59 | 显示全部楼层

回复 #1 zkkpkk 的帖子

还是满喜欢JAVA的,,,不知道自己以后是不是有所学成1!
回复

使用道具 举报

发表于 2008-3-10 14:53:26 | 显示全部楼层
老是用C/C++那是顽固不化 对与我们学生很难掌握的 就像3#说的一样“C++这种BT,一不小心就走火入魔,陷入无休止的语法陷阱”
回复

使用道具 举报

发表于 2008-3-10 14:53:48 | 显示全部楼层
:sweat1 :sweat1 :sweat1
回复

使用道具 举报

发表于 2008-3-20 18:38:46 | 显示全部楼层
我们编程的目的是什么,不就是为各种电脑问题提供解决方案么?JAVA,目前已经成为工业的主流编程语言了,这说明JAVA能够胜任解决问题的任务,那么为什么不能一开始就学习JAVA呢?
上文反对的观点:是因为JAVA是虚拟机语言,学习它不能了解电脑系统,数据结构,算法,编译或解释原理,但我们真的需要了解这些吗,在真正用到的时候,我们会用到这些知识吗?不会,因为我们有JAVA虚拟机,不管是什么系统,只要有JAVA虚拟机,我们编出来的程序就可以运行,就可以解决问题,而这正是我们学编程的目的.而实际上JAVA虚拟机已经为我们解决了系统问题.
回复

使用道具 举报

发表于 2008-4-7 08:36:04 | 显示全部楼层
不管怎么样,还是支持C++,我是从c++开始,然后在看到其他语言的时候都会觉得亲切简单
集成太多东西的语言,蒙蔽了我们的双眼,限制了我们的发挥,让我们按照了它预定的模式去做,忽略了为什么这么做、还可以怎么做
回复

使用道具 举报

发表于 2008-4-7 08:37:37 | 显示全部楼层
这是什么东西!那么长!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 入驻

本版积分规则

QQ|Archiver|手机版|小黑屋|思明论坛

GMT+8, 2024-9-28 01:26 , Processed in 0.150393 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表