最近有一篇文章,说两位退休的美国大学教授上书反对将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开发,都会心领神会,势如破竹。
分享到:
相关推荐
Java编程语言自诞生以来,因其独特的特性和强大的技术支撑,成为了计算机软件开发领域里应用广泛的编程语言。本文将详细探讨Java语言的主要特点,以及它在实际计算机软件开发中的应用。 首先,Java编程语言的特点是...
学习前,最好有一定的网络基础知识和至少一种编程语言的实践经验。 理论教学内容包括Java语言的起源、特点、开发环境的使用,数据类型及其运算,程序控制结构,以及面向对象编程基础。这些章节旨在为后续的网络编程...
随着互联网技术的发展,Java语言作为一门跨平台、面向对象的编程语言,在网络编程领域拥有广泛应用,因此,强化对学生在这两方面的教学显得尤为重要。 面向对象程序设计是现代软件开发的核心,Java语言因其跨平台...
Java作为一门应用广泛、特性鲜明的编程语言,其教学方法的探索和实践有着特殊的意义。 首先,我们要理解Java语言的基本特点。Java语言以其简单、高效、面向对象、平台无关、交互式特性、多线程机制以及动态内存管理...
实训与常规教学相结合的Java编程语言教学 Java 编程语言教学是计算机专业的必修课程之一,也是数据结构和数据库这两门课的重要先行课。然而,Java 语言的难以理解和掌握导致初学者对 Java 语言学习不感兴趣,或者...
本文将深入探讨“Java语言与网络编程”的教学方法、重要概念以及实际应用,旨在为学习者提供一个全面的理解框架。 首先,理解Java语言的基础至关重要。Java是一种面向对象的语言,它的核心特性包括封装、继承和多态...
总的来说,VB.NET转JAVA工具是编程语言迁移中的一个重要工具,它降低了不同语言之间代码重用的门槛,促进了技术栈的平滑过渡。但需要注意的是,自动转换工具只能处理大部分基础语法,复杂的业务逻辑和特定库的使用...
java网络编程的PPT文件,包含网络基础、IO、线程、套接字、UDP、TCP、Java安全等编程学习。
《Java编程语言英文第四版》是由Java之父James Gosling与Ken Arnold和David Holmes共同编写的权威教程,针对中高级开发者,旨在深入介绍Java SE7语言及其核心库。这本书是全球开发者快速掌握Java编程语言、理解其...
学习Java编程语言需要有系统的学习计划和大量的实践经验,通过学习这些常用的Java学习资料,初学者可以更好地理解Java编程语言,提高自己的编程技能。但是,学习Java编程语言需要不斷实践和总结,初学者需要不断地...
完整版 Java编程基础入门教程 Java语言程序设计 第10章_网络编程(共68页).ppt 完整版 Java编程基础入门教程 Java语言程序设计 第11章_数据库的连接(共36页).ppt 完整版 Java编程基础入门教程 Java语言程序设计 ...
java语言课程设计,GUI编程练习——基于Java实现的打地鼠小游戏 java语言课程设计,GUI编程练习——基于Java实现的打地鼠小游戏 java语言课程设计,GUI编程练习——基于Java实现的打地鼠小游戏 java语言课程设计...
在当今信息高速发展的社会,掌握一门编程语言,尤其是Java语言,对于计算机专业的学生来说至关重要。《Java语言程序设计》作为一门专业基础课程,其教学设计方案对于学生系统学习Java编程具有指导性作用。本文将以...
教学的方法,使学生熟悉编程语言和编程结构,主要是培养学生的编程思想。 锻炼学生得动手能力。对于Java 的面向对象的编程可使用项目教学法,使学 生了解项目的设计方式和编程方式,通过对项目的完成锻炼学生对社会...
从提供的文件内容中,我们可以提炼出与编程语言JAVA相关的教学大纲知识点。以下是详细的知识点描述: 1. Java基础语法 Java的基础语法是学习该编程语言的第一步,其中包括关键字(如class, public, static等)、...
《Java高手真经(编程基础卷):Java核心编程技术》详细讲解了Java语言基础开发中的各种技术,主要内容包括如下。Java开发入门:JDK、JVM、Eclipse、Linux。Java语法基础:类、抽象类、接口、内部类、匿名类、异常、...
《Java网络编程(第四版)》是一本深入探讨Java在互联网环境下的编程技术的经典书籍。本书旨在帮助读者理解和掌握如何利用Java语言进行高效、安全的网络通信。书中内容覆盖了从基本的网络概念到复杂的多线程编程,是...
Java语言SQL编程接口
Java编程语言是面向对象的、跨平台的编程语言,由Sun Microsystems公司于1995年推出,目前广泛应用于各种领域,如Web开发、移动应用、企业级应用、大数据处理等。"Java编程200例(附:JAVA文档完全解读中文版)"是一...
Java到JavaScript转换工具有助于开发者将已有的Java代码库移植到JavaScript环境中,这在Web开发中尤其有用,因为JavaScript是浏览器端的主要脚本语言。这样的工具能够帮助开发者利用Java的强大功能来构建前端应用,...