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

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开发,都会心领神会,势如破竹。

评论

#  cber 发表于2008-01-10 11:55:32  IP: 57.73.18.*
这都老调重弹了N次了
对于此类话题,我都没有兴趣参与了,爱谁谁去

 

#  gl1981cn 发表于2008-01-10 13:16:45  IP: 218.206.99.*
如果说,我们的大学计算机专业就是培养软件工人的。
那学java就可以了

 

#  danjiewu 发表于2008-01-10 13:21:43  IP: 221.224.33.*
顶一个
现在有这个感觉了,国内做软件的大多是拖拖控件之类的,对软件开发的理解和创新能力真的很浅薄。

 

#  Solstice 发表于2008-01-10 13:27:59  IP: 202.77.190.*
《黑客帝国(一)》里,孟菲斯问尼奥要吃红色药丸还是蓝色药丸,尼奥选择了红色,回到荒蛮的真实世界。同样的问题,高司令的回答是——蓝色药丸,一辈子在虚拟世界中生存下去。

 

#  wishfly 发表于2008-01-10 13:40:11  IP: 61.149.144.*
说得非常正确!
但是,现实是--c/c++的真正用武之地--通用产品开发,没有任何发展机会--在中国!

只能java,c#了!!

 

#  littlehedgehog 发表于2008-01-10 14:11:39  IP: 218.75.123.*
选择语言也就是选择道路,一个做表层快速开发的有必要去把底层搞的那么透彻么?看看现在的IT教育,大部分学生这四年都是混过去的,与其苦口婆心告诉他们底层多么重要,还不如让他们做做快速开发,至少保一碗饭吃。
语言的选择其实就是一个在学校究竟是学好基础打好地基重要还是去做快速开发积累经验重要。我们学校是以C做入门,java/c#作为选修,真正想要学的学生自己知道自己究竟喜欢什么。不过也像孟老师所说,现在的C/c++教育很令人担忧,其实哪只c/c++,看看数据结构、操作系统,哪一个不是相当糟糕,我们就要考数据结构了,这才知道原来考数据结构是背出来的,而不是写程序写出来的。这样的基础打下又如何?还不如一个培训班出来的。
经常听人感慨中国一年几十万的IT本科毕业生,咋就不能像linus写一个操作系统出来,这样的应试教育方式,别说写一个操作系统,就是毕业混口饭吃都成问题。

 

#  fenglingcompany 发表于2008-01-10 14:25:49  IP: 221.8.35.*
说的对,我同意上面的观点,拖拖控件之类的软件开发,虽然简单但对我们来真的开发来说真的太浅薄了!

 

#  fenglingcompany 发表于2008-01-10 14:29:08  IP: 221.8.35.*
对于littlehedgehog我不同意你的看法,人是要吃饭,但一定要吃的稳,那表面就不太行了吧

 

#  lovec 发表于2008-01-10 14:30:12  IP: 61.152.127.*
返璞才能归真,要打好基础,还是要C,C++我觉得也不适合
但如果讲OOP,我觉得Java,C++,C#等都可以,当然Java和C#更简单

 

#  kevinncut 发表于2008-01-10 14:45:17  IP: 123.112.18.*
一点都不实际,上大学是为了什么!?当科学家吗?为了就业!学什么容易就业就该学什么,我大学学的大部分都一点用都没有。什么操作系统,编译原理,你说说有几个人用得上!!!?!?

 

#  ronaldoliubing 发表于2008-01-10 14:55:11  IP: 124.42.70.*
非常赞同孟老师说法,我也是做互联网的,个人感觉互联网越做越没有意思(当然可能自己知识太少了,没有认清互联网行业!),感觉自己对计算机系统知道的少之又少!感觉远离了底层知识,我记的一次面试,
面试官对我说底层是最值钱的,前几天突然对C语言感兴趣,索性看了些C语言书,还真没有想到C语言竟然有四本经典书籍:C陷阱和缺陷
C语言接口与实现,C和指针,C程序设计语言(第2版·新版),在这里并不是说C有多好,大家都去学,感觉现在的大学讲的C知识太肤浅了!所以学生感觉学了没有意思!还有就是环境问题!感觉从事开发人员应该抽时间看看底层知识!!!

 

#  farce 发表于2008-01-10 15:18:22  IP: 123.8.19.*
为什么不说说Pascal了?现在说C还是有问题,为什么不做Pascal?Pascal落后还是技术不行?那Delphi呢?

 

#  yyquick 发表于2008-01-10 15:18:26  IP: 124.42.17.*
事实上我觉得C/C++都有很多缺陷。
比如说,在大型程序中,头文件、宏这种概念并没有简化了编程,反而使得编程变得复杂了。而且c/c++的多线程模型还存在很多问题。
在这些方面,Java提供了一些很好的解决方案,但是,Java作为一种依靠虚拟机来运行的语言,相比直接的编译型语言来讲,性能不够高是一方面,另一方面还有不能直接操作硬件底层的问题。
我觉得如果Java能够同时提供一个直接编译成本地代码的编译器会更受欢迎。
D语言我觉得就是跟Java非常类似的语言,可以看作是Java的编译版本。

 

#  mcs51a 发表于2008-01-10 16:58:36  IP: 58.32.189.*

"多研究些问题,少谈些主义"

 

#  oDon 发表于2008-01-10 17:33:20  IP: 221.0.97.*
人不能一概而论,个人能力不同,人的路不能让教育部的几个老头定乾坤,路上人自己摸索出来的,没有任何谈论的必要,谁都会写Linux也是个灾难。
所以lz也没必要

 

#  hotstong 发表于2008-01-10 17:38:56  IP: 192.168.100.*
孟岩大哥又开始攒口水了。
学以致用,要怎么学得看你怎么用,IT做久了自然明白软件的复杂性在哪里,算法,架构而矣,其它的都是唯手熟尔的东西。
就像以前的一位做汇编的师兄,老把C当垃圾看,现在你又跳出来做救世主了。

 

#  nevergone 发表于2008-01-10 18:03:38  IP: 210.34.129.*
中国高校教C语言都还用古董软件Turbo c
严重与现在的工业界脱节
TURBO C会让学生写出古怪的代码.

 

#  liskolnikov 发表于2008-01-10 18:36:15  IP: 116.76.7.*
现在的大学主要编程教学语言本来就不是JAVA,是C。你这篇文章针对的是哪所大学?国外的?

 

#  zeuux 发表于2008-01-10 18:49:20  IP: 61.135.152.*
一语中的。

计算机科学的教育应该关注计算的本质,应该回到C/Lisp。

 

#  zjh222 发表于2008-01-10 20:32:42  IP: 222.212.157.*
C#,Java,C++是外国的给中国的雅片,吸了的人个个执迷不悟

 

#  guokw 发表于2008-01-10 20:43:24  IP: 222.222.124.*
我买了好多的C++(几乎全是候捷译的),DELPHI,JAVA的书都送人了

最后找来找去,用mingw在windows下编程,那个TC不好

还是学C有兴趣,我付出了好大的代价呀,要是学生,估计没钱买这么多书吧,我是学编程玩的

 

#  guokw 发表于2008-01-10 20:45:34  IP: 222.222.124.*
那些说找不到好的编程工具的,你找过没有??

我就在windows下开个dos窗口,用mingw编写C
用vim当编辑器

装mingw的时候要设置一下path

 

#  guokw 发表于2008-01-10 20:47:47  IP: 222.222.124.*
看看中国的等级考试,好似现在用vc6.0了,好进步呀

进步的都帮着微软当婊子啦

那一帮拿着纳税人的钱混白食的管计算机的人

 

#  chen77716 发表于2008-01-10 20:56:02  IP: 202.96.19.*
我不同意老孟的意见,因为
1.老孟自己喜欢c/c++所以心理上排斥Java
2.在学校学习什么语言都无所谓,重要的是学习思想

 

#  sunnyawake 发表于2008-01-10 21:01:19  IP: 58.215.40.*
根本问题不在教什么语言,而是教解决问题的思路和独立解决问题的能力。软件应用范围非常广阔,解决不同的问题需要不同的工具。不同的兴趣爱好,不同的研究方向,不同的学习阶段,侧重点不一样,要分别对待,不能一刀切。

 

#  guokw 发表于2008-01-10 21:05:33  IP: 222.222.124.*
那些读金庸读成傻B的人,就不读读古代人的书???

工欲善其事必先利其器。

你真正会武术吗??让学武术的揍你顿你就不会这样说了

 

#  guokw 发表于2008-01-10 21:08:50  IP: 222.222.124.*
我不信你要从根本不去了解计算机,学java不学C 汇编你就了解了

看看perl之父是不是也是lisp高手

还有Gosling........


中国就是出了这么多读金庸书的傻B才成这样的。

 

#  down0011 发表于2008-01-10 21:13:27  IP: 117.8.169.*
对于还没做过应用的学生而言,操作系统,数据结构太枯燥了。只有当他们对目前的语言实现不满意时,或者高级语言水平到了一定程度时,才会有兴趣学这些。我就现在才对操作系统,汇编有兴趣。我都毕业3年了。

 

#  guokw 发表于2008-01-10 21:24:18  IP: 222.222.124.*
兴趣是培养出来的,不过学生时代的兴趣都让老师扼杀了

 

#  flushtime 发表于2008-01-10 21:28:07  IP: 221.238.245.*
还是学汇编好啊,机器语言更好.

 

#  guokw 发表于2008-01-10 21:30:19  IP: 222.222.124.*
不用,你去学核物理去吧,按照你的推理最后你应该什么也不学,等死算了

凡事都有个最好的折中方案

老子曰,大成若缺

用简体字用的,读点古书好不好,

 

#  lilawrence 发表于2008-01-10 21:36:41  IP: 116.28.119.*
唉!说来说去有何用呢?世界上没有对与错,只有自己觉得对就对!对于我自己来说,我才不管学什么技术,有点子,赚到钱,50岁退休,喜欢搞什么就搞什么,有空就做的实际的东西吧,搞舆论是有钱人的业余活动!

 

#  chengg0769 发表于2008-01-10 21:50:28  IP: 121.13.12.*
我认为:
人在上大学前应该学会用一门可视语言编程,积累一些认识。这是最好。
我前阵就是用pb,vb,delphi,c#也摆弄过一下。现在还是回到c/c++上来。因为用java入门的话,真就不晓得内存是啥玩意了,内存是不是线性的可能都不晓得了。java的程序员永远也无法写一个独立于java的稍微底层的东西。
编程中,变量,循环,判断语句,结构,函数,类,重载,派生都是c++有的。语言差异我想不是太大。孙鑫老师讲课时边讲边看帮助也一样编程。学好c++再学其他应该非常容易。
myan说,c/c++让我们破除了对计算机硬件和软件的神秘感,的确是这样。java不够底层。而c/c++我们能联系到机器本身。java这样的语言只适合自学或者社会机构来教。

 

#  guokw 发表于2008-01-10 22:00:05  IP: 222.222.124.*
孟岩这次说了句人话,不过也是照着别人话的,


以前当托的时候多

 

#  guokw 发表于2008-01-10 22:05:00  IP: 222.222.124.*
根基不牢,地动山摇

 

#  codeloveforever 发表于2008-01-10 22:05:28  IP: 124.229.40.*
現在大三,開始學習時還是C語言,可是慢慢地,雖然學校沒有教JAVA,但不怎麽什麽時候自己又開始自己學JAVA了

瘋啊!~~~~~

 

#  lihuisk 发表于2008-01-10 22:22:14  IP: 218.58.59.*
我还是学语言的初级阶段..
那我就想问问 发帖的牛人..
什么叫真实?
什么是真正的编程?
什么是真实的硬件什么是虚拟的硬件?
说白了全部是都是函数调用而已 !
全部都是端口和字节位而已 !
前辈..您学过硬件嵌入式单片机之类的编程吗 ?
他们和C# 以及JAva根本区别在哪里?
不要老是拿一个虚拟机说事!
要明白程序根本不知道什么是虚拟和真实的分别 !
难道你用C 操作端口就是真正硬件了?
和你用java封装一个类库调用函数由什么区别?
恕我无礼...........
你还是回去好好看看形式语言与自动机!
看看风诺依曼体系再回来说事!

 

#  lihuisk 发表于2008-01-10 22:25:11  IP: 218.58.59.*
话又说回来了.......
国内 学C C++
在牛逼..
我们没看国产操作系统占领市场呢?
我们从来没见过红旗linux 在周围电脑使用呢 ?
吹牛逼有用吗?
中科院 搞龙芯的也就是那近百人而已 !
大多数人还是要解决吃饭问题的!
你的 观点我暂时不反对..
但是你的理由我反对..........
希望你能明白这两者的区别........

 

#  wishfly 发表于2008-01-10 22:45:28  IP: 61.149.144.*
难道你用C 操作端口就是真正硬件了?
和你用java封装一个类库调用函数由什么区别?

 

#  djsl6071 发表于2008-01-10 22:48:51  IP: 220.161.16.*
从首页的两个教授的文章,到myan的文章,吸引我的都是“主要编程语言”这个词,我想学计算机科学,知识的体系结构是复杂的层次化的,单靠一门语言并无法始终带领我们。汇编或者c语言是基础,它们涵盖了内存管理,机器内部对问题的处理、对性能的把握,让每个学生都真真切切地了解基础的原理,掌握细节的实现,这对今后学习任何语言都是有益的,是一定要知根知底的东西,其他包括数据结构,算法,操作系统,网络等等这些基础课程都很重要,也都要精通。

但是,除此之外,计算机学科为面向将来的就业,为面向将来的科研课题,需要好的通用的编程观,毕竟绝大多数走上社会的毕业生,面临的,是一份真正对提高自己,对提升自身职业追求有益的事业。当我第一天来到大学,第一天接触计算机科学导论的课程时,和其他大多数同学一样,我对这个专业没有丝毫兴趣,对将来没有丝毫憧憬,造成这一点的原因大家心里都清楚,就不多说了,只是,我心里问自己的第一个问题,第一个希望真正去面对的问题,是我的一生,是不是要因为学习计算机,从事计算机,而变得枯燥,乏味,毫无生机,我的一生,难道要绕着计算机而活吗?现在,有多少的朋友能够扪心自问,你的生活,是否是这样的呢?我从来都不担心钱,也不害怕刻苦,更相信自己绝对的聪明;兴趣和欲望,才是我从现在到将来无时无刻不反复敲打自己内心的问题。

所以,尽管第一段说了那么多需要学习的,需要了解的,但什么才是最暗合你性格,暗合大多数普通人(更加是那些谙熟如何作一个聪明人)的思维习惯,适合在不仅仅当我们面对计算机,更是面对社会,面对人生,面对需要制定战略,作出决策的时候都可以始终思考、运算在头脑中的语言呢?——高级语言,没错,是相当高层次的语言,是抛开具体细节而注重全局观的语言,是处理信息计算方略的语言,在语言思潮早已彭湃的今天,我相信绝大多数人和我的选择都一样,那就是面向对象,主流而且成熟,我也听说过其他函数式,当然还有其他一些不知名的,但无论如何,它们好也罢,不好也罢,不是主流,欠缺成熟。

面向对象很简单啊,就是继承和封装,就是抽象和泛化,就是尽量忽略底层的实现细节而追求宏观布局和协调,效率的把握更合理,更有的放矢,它能获得的优化是符合2/8原则的,它关心的是2的那部分需要优化的地方,因为那能让我们获得8的效果。我相信无论项目是大是小,编程工作量是多是少,专注于业务逻辑的合理实现,而不是细枝末节的过多过早修饰,甚至为它们花费过多的时间。这确实是暗合我们做人的道理,处事的道理,管理的道理,而简单纯粹的好的面向对象语言,是Java。

myan在第二段谈到了美国主要编程语言教学的历史,从Pascal到C,再到Java,美国计算机教育界关注的并不是语言本身的强大,而是一门语言是否能够给学生一个最清晰的,处理计算机问题最直观的感觉和印象,它直接决定的学生能否马上获得对编程的兴趣并深入钻研下去,直接决定了学生在今后的学习中能否不偏离轨道,专注到最核心的问题的解决之中。它不要求学生在毕业走上工作岗位的时候,能够牢牢记住编程过程中需要注意的每一个细节,每一个机器或平台相关的特点,无论是汇编语言的硬件专有性,还是C/C++的类库封闭性,那些很局限地把编程者牵制在固有的平台上的固有特性,那是没有必要的,也是记不住的,更是在今后的工作和科研中不一定会用到的。确实,Java不需要作为编程教学的第一门语言来掌握,那是教授指针和内存的汇编或c的事情,但Java绝对有必要作为面向对象和高级编程语言的入门语言来掌握,作为设计模式乃至软件体

 

#  djsl6071 发表于2008-01-10 22:49:28  IP: 220.161.16.*
myan在第二段谈到了美国主要编程语言教学的历史,从Pascal到C,再到Java,美国计算机教育界关注的并不是语言本身的强大,而是一门语言是否能够给学生一个最清晰的,处理计算机问题最直观的感觉和印象,它直接决定的学生能否马上获得对编程的兴趣并深入钻研下去,直接决定了学生在今后的学习中能否不偏离轨道,专注到最核心的问题的解决之中。它不要求学生在毕业走上工作岗位的时候,能够牢牢记住编程过程中需要注意的每一个细节,每一个机器或平台相关的特点,无论是汇编语言的硬件专有性,还是C/C++的类库封闭性,那些很局限地把编程者牵制在固有的平台上的固有特性,那是没有必要的,也是记不住的,更是在今后的工作和科研中不一定会用到的。确实,Java不需要作为编程教学的第一门语言来掌握,那是教授指针和内存的汇编或c的事情,但Java绝对有必要作为面向对象和高级编程语言的入门语言来掌握,作为设计模式乃至软件体系结构课程的基础语言来掌握,这些难道不是大学教学的目的吗?

c语言或汇编,它们任一种可以带我们进入充斥指针跳转调用的过程式的世界里,但凭什么认为只有那里才能有所谓的“创新和独立解决问题的能力”,凭什么认为只有那里才能打破计算机和软件的神秘,计算机是什么样的在每个人的心中都有自己的答案。指针和内存管理,机器指令乃至平台特性的运用,在大学里不可能,也没有必要作相当具体的深入研究,那是依赖于软硬件平台差异性的,而且就像上面说到的,在今后的工作中,完全会更深刻更专注地认识到。真的很奇怪为什么那么多人把Java和C#、VB等联系起来,认为托拽和搭积木是属于Java做的事情,在我使用Java开发了这么久,无论桌面编程还是web,从来都知道依赖现成的只能束手束脚,Sun JFC实现的类库从来都不是最高效的,最合适于我们的项目的,又有多少人只知道使用现成的类,而不去想想那其实是一些示范,而Java编写自己的类效率又能提升多少又是如何的容易。Java的面向对象接口编程思想很灵活,很好,Java的引用即固定指针,创建即占用内存,继承即默认一致,很清楚,很直接,相比c++包罗万象,变化万千,风格炯异的编程手段,竟然有人会发出“一个对象套一个对象,一个对象叠一个对象”或者“为什么老是要new”这种门外汉的抱怨,我真不知道他们是怎么学面向对象的,是否是在C++中写对象的时候习惯了把对象放在对象里就以为Java中对象里会还存在对象。

很奇怪为什么只把苛刻的环境看成软件开发中通常面临的问题,而把在面向对象语言中同样优雅地解决了的多变的系统环境和细节上的复杂当作专属于基础语言的能力范围,明知道细节中的bug难以察觉又难以兼顾,为什么让开发者一次又一次地面对这些毫无意义的细节上的修改和反复调试,并美其名曰这才是独特的创新能力,难道良好的复用,以不变应万变,懂得踩着巨人的肩膀,就不是创新的核心能力了吗?

Java是一个虚拟机语言,.Net里面的语言也是,但正因为如此,它们才比其他语言有更好的可扩展性和灵活性,当其它语言还躺在上个世纪的旧语法之上的时候,.Net Framework已经出到3.5并且向下兼容了,Java程序员也已习惯泛型和新的for循环并叫嚣Swing可以多少接近SWT,JIT的发展使曾经本就比编译型语言拥有绝对优势的调试和开发效率的解释型语言跑的更欢快。当一门语言属于昨天和今天却有着不可预知的明天,而另一门语言属于今天和确定灿烂的明天的时候,你会作何选择?

 

#  Zhang_yalin 发表于2008-01-10 23:17:50  IP: 222.90.133.*
把计算机编程看做终身的兴趣的人,是肯定要去了解低层东西的
而如果想把钱来的快,来的及时的话,就去搞搞流行语言吧,但后劲不足。没什么发展。

 

#  photoplan 发表于2008-01-10 23:55:07  IP: 122.142.173.*
挖哈哈,俺,灌水王,来灌水了

 

#  lyazure 发表于2008-01-11 00:09:16  IP: 121.32.187.*
哎,想不到孟岩果然没什么真才实学,只会做个吸引口水和眼球的小丑。从头到尾都没领会原作者说的java不适合作教学语言的原意,单纯以自己的兴趣为中心去看待别的语言,歪曲地以美为丑,以丑为美,以错为对。甚至为了达到目的进行无中生有的恶意中伤。

 

#  lihuisk 发表于2008-01-11 07:57:28  IP: 218.58.59.*
=====================
把计算机编程看做终身的兴趣的人,是肯定要去了解低层东西的
而如果想把钱来的快,来的及时的话,就去搞搞流行语言吧,但后劲不足。没什么发展。Zhang_yalin
--------------------------------------
这位牛人 我到想请问了..
中国搞计算机教育最终有多少人进入了绝对的国家科研 ?
如果你说所谓的汉语编程叫做国内科研的 话我无语加鄙视!
又有多少人最终进入了实际的工程开发 ?
龙芯最真是底层了..研发团队才多少人 ?
和Intel.和AMD相比什么水平?还好意思标榜自己所谓的终身性趣?
如果说兴趣.那更是个人自由问题!
他人无权干涉和将自己的价值观强加!
如果真正了解计算机硬件..我想帖主以及您应该去学机器语言..
那个才是真实的 !

恕我直言.........你们一帮人对计算机理解的水平还没我这个学生来的深入.........

你们以为操作一大堆的链表和指针和内存就是真正计算机编程了?

 

#  lihuisk 发表于2008-01-11 08:04:52  IP: 218.58.59.*
=================
顶一个
现在有这个感觉了,国内做软件的大多是拖拖控件之类的,对软件开发的理解和创新能力真的很浅薄。
======================
我就鄙视的问一下了 你写了多少行代码?
你拖了多少个控件了 ?
要不你拿出你的代码来大家学习一下?

你已经肤浅到认为写程序就是托代码.......
我感觉没必要和你浪费口舌 !
PS: 希望你有自知之明....

 

#  lihuisk 发表于2008-01-11 08:08:10  IP: 218.58.59.*
============= zjh222 发表于2008-01-10 20:32:42 IP: 222.212.157.*
C#,Java,C++是外国的给中国的雅片,吸了的人个个执迷不悟
==================
这位同学说的更TMD混蛋了!
==============
现在IT什么不是国外的 !
C中国原创的 ?
CPU 中国原厂的 ?
操作系统 OS Linux Unix 中国原创的 ?
和你这种人根本没话说!
回去学你的计算机文化基础去吧 !

 

#  open_sky 发表于2008-01-11 08:46:27  IP: 192.168.117.*
回帖这都是什么人?中国人!

 

#  sukyboor 发表于2008-01-11 08:54:09  IP: 61.144.176.*
lihuisk


: : :
| | |
[______]


拜一下

 

#  hbjzdsy 发表于2008-01-11 09:00:20  IP: 124.42.18.*
........................................
孟老师说的对。但楼上的好多人不知道干什么吵?
想学什么,想干什么还是看自己
但是C做为教学还是比JAVA好点

 

#  skys712 发表于2008-01-11 09:40:36  IP: 219.131.196.*
其实这也是中国大部分程序员说35岁以后做不动的根本原因。

学java吃的是青春饭。时间过的越久发觉东西越难学。

 

#  zhujian888 发表于2008-01-11 10:04:53  IP: 124.147.157.*
我非常赞成孟大哥的观点。
现在市场需求确实让java c#火起来了,企业级开发需要大量的代码工人。做为企业要开发周期短成本低,肯定就需要java .c# 加上大量的人,需要的这些人不一定要高手,只要能增 删 查 改就可以,不需要他们了解底层。甚至如果公司把代码封装成组件后,所有都自动生成,只要他们填空,只要会打字就可以。这写人只能是吃青春饭而已。学一辈子程序可能不懂知道pe格式,elf格式是什么,不会写makefile,连 系统调用(system call机制)什么什么都不知道,天天在说调用API。
" 中国高校教C语言都还用古董软件Turbo c",我不古董很经典。我觉得该用gcc + VI 来写。然后,自己写makefile来组织程序。最近在写一个小小的操作系统,主要目的是学习。是在linux环境做为开发环境,汇编和c混合编程,c语言调用汇编的函数的时候,真的需要你对链接器以及coff格式很了解,在脑子里真的需要知道代码和数据在内存中的位置 。基础很重要,虽然市场大量初级写代码的应用级程序员,不可能所有个人都成为宗师基人物.但大学期间学学还是有必要的。

 

#  zhujian888 发表于2008-01-11 10:06:34  IP: 124.147.157.*
打得太快写错很多字,请谅解!

 

#  horn2005 发表于2008-01-11 10:18:40  IP: 222.35.87.*
我觉得还是中国的计算机教育的一个定位的问题。我大学读的系叫“计算机科学与技术”也就表明教学中有两个目标,一个是计算机科学,还有就是计算机技术。记得在学微机原理的时候老师用二极管和三级管利用数字电子的知识给我们建立了一个cpu的逻辑模型,我当时非常的震撼,我明白了为什么1946年就可以生产出实用的电子计算机了,一个科学理论不一定要依赖技术而存在,但技术要依赖科学而存在,我们明白了cpu和计算机系统的原理,我们既可以使用数字电子的D触发器来搭建cpu,也可以用初中物理的电子继电器来实现时序.所以我觉得理论是基础。技术是人创造出来的工具.我还记得我学微机原理的时候用中断向总线上输出数据,当我看到总线上的数据的时候,我感觉我能控制一切了。但后来学的C语言就做不到这一点了。高级语言会封装一些东西,但也会丢掉一些东西。C语言就不能设置FLAG标志.但C语言也不用自己管理堆栈来实现递归程序.我在学汇编的时候写过一个双递归的程序,当时就体会到什么叫扁平的内存模型,每进入一个递归层次,你都要自己保存寄存器和标志位,然后好要想办法返回值。但在C语言里一个递归语句就结了。但我觉得要是递归太深应该会内存溢出。用汇编就不会,因为那是你自己在管理内存。高级语言就是一个封装,有简化的功能,有屏蔽的效果。技术应该建立在坚实的理论基础上,在做任何事情的时候都要回望数学逻辑,那样我们才不至于迷失自己的技术方向。任何图灵机可计算的都是计算机可计算的,反之则否。

 

#  sss_free 发表于2008-01-11 10:43:03  IP: 10.128.45.*
C语言一样可以教授面向对象的精髓部分,我在工作中主要使用C语言,但是设计上采用面向对象的方法,有其实动态绑定,屡试不爽
java把面向对象搞得太神秘了,这是愚民政策

 

#  user2008 发表于2008-01-11 10:47:15  IP: 222.66.166.*
连弱智都知道,学习武功要从马步开始,没有上来就学七十二绝技的。编程也一样,开始要以Basic,C等语言打基础,上来就接触高级概念不好。

 

#  user2008 发表于2008-01-11 10:49:01  IP: 222.66.166.*
不过看起来也搞笑,对计算机一点贡献都没有国家,竟然争论人家那个好,难道你们都不自卑吗?

 

#  sss_free 发表于2008-01-11 10:50:27  IP: 10.128.45.*
hor2005,“任何图灵机可计算得都是计算机可计算得,反之则否”,不是这样的吧,所有严肃意义上的可计算模型的计算能力都是相同的,这就是著名的图灵-丘奇假说。图灵机可以模拟计算机,并且计算步骤是计算机的某个多项式系数倍。你可以看看计算导论这本书

 

#  CAYU 发表于2008-01-11 11:51:36  IP: 58.16.7.*
我认为java语言教学是很好的。能深能浅,关键是老师如何教的问题。很多老师是毕业后就当老师的更本没什么项目经历。
自然教的东西比较书本化了。算法这些用这几个语言都一样可以实现。
java也有很深层次的东西,为什么不教这些呢?
在软件工程上java的表现也不错能让学生把握一个软件的设计和层次。

c也不错,但基本的string类型都没有,c++的类型又太多,自己随便就可以定义一个,随便找一个开源的c++构架,里边一大堆自定义的类型。对于学生在将来的应用上并不好。因为不标准。

 

#  rainv 发表于2008-01-11 12:37:25  IP: 121.35.128.*
Java有很多东西学的。比如要用JNI就需要会c/c++.
最好列一个
语言/职位的列表清单,让学生自己选。

学校学的c学的又不深,做应用又小,学c的应该看看Java的语言功能,或许就是你一直想找到东西。

 

#  rainv 发表于2008-01-11 12:41:56  IP: 121.35.128.*
要是我选语言,也会选Java,它和操作系统无关的,不会有分支版本。Java还开源,自己改JVM实现特定的功能也可以的。

 

#  luozhuang 发表于2008-01-11 12:44:05  IP: 222.221.213.*
http://blog.csdn.net/luozhuang/archive/2008/01/11/2037127.aspx
这是我对各位网友评论 的看法
发表过评论的网友去看看我对你们评论的看法

 

#  liboqun 发表于2008-01-11 13:13:24  IP: 219.239.44.*
我今年大四
专业不是计算机
但我很喜欢编程
入门是应该学C/C++,相比JAVA,VB
C/C++,更能让人理解计算机

 

#  taroplum 发表于2008-01-11 13:42:21  IP: 119.4.23.*
wishfly 说的有道理呀。现状,中国基础研究过不了关。哈哈,自然做产品的外围的东西就多了。反倒是基础研究的专业软件、通用软件就做的少了,做出来也卖不出去。^_^。人、钱、物、组织。哈哈。

 

#  lf426 发表于2008-01-11 15:37:52  IP: 221.10.89.*
我支持两位美国教授和孟老师的观点。
我发现很多人没有把计算机教育的本质搞清楚。
CS包含的东西很多,但是,我觉得有些问题虽然是紧密联系,但是也是相对独立的:了解计算机、语言语法、思想、算法(与数据结构)。
正方观点一个最重要的强调重点,就是类似Java这样的语言无法让学生真正了解计算机。只知其然,不知其所以然。语言本身考虑到的问题,你不用去考虑了;语言本身没考虑到的问题,你也没办法去考虑。所以,WoW不可能用Java写出来,因为在同等的硬件下,你永远无法解决Java比C/C++慢的问题。
语言语法,在实践中被证明是相对次要的问题,因为程序员实际上对于不同语法的适应力都很强。
思想和算法本身是可以脱离特定的计算机语言而存在的。从学术角度来说,只具备OO特性的Java显然在目前来说,包含的思想是不全面的。面向过程和基于对象,C已经很成熟了;面向对象,不可否认Java很强;但是泛编程GP呢?Java没有。纵贯所有思想,只有C++在目前来说是最全面的,这也正是C++总带有试验性和不成熟性的原因,但这也正是学院派认为最有价值研究的对象。
事实证明,数年前被看好的OOP在今天并没有出现一统江山的局面,简洁的C被众多牛人推崇,除了Linus大大,Carmack写的QuakeIII也依然是简洁清晰的C。在另外一个领域,GP更是受到极大的关注。这说明,任何一种思想都不比另外一种思想很先进,优劣仅仅在于领域或者程序员自身的差异。所以,在这个时代,强调OOP的Java多么不得了就真显得坐井观天了。
综上,具有连续性的,保持多风格的语言体系,目前只有C/C++系列,即使也许还有其他语言更好,但无论怎么样也轮不到目前的Java。

 

#  hanzhuang639 发表于2008-01-11 15:55:02  IP: 218.13.77.*
说的好!我支持C和C++作为一个想成为programmer的基础,这个基础很重要。

 

#  1073X 发表于2008-01-11 15:57:18  IP: 222.209.223.*
Java的另外一个问题,是其所倡导的繁琐设计风格,一个对象套一个对象,一个对象叠一个对象,概念之间彼此横七竖八地互相依赖,人为制造出一大堆貌似精美、实则累赘的所谓设计。这个问题我已经批评过多次,并且相信这股歪风一定会最终被人们抛弃,Java最终会归于质朴。
--------------------------------------------------------
孟老大写着写着就跑题了,开始的时候是支持两个老教授,后面就开发自己乱发感想,数落起JAVA了,晕死。一个原本就复杂的功能,其实现自然是相对复杂的,即使用C也不会比JAVA好多少,倒是有可能更复杂。
horn2005的评论才是一个热爱计算机的人该说的话,sss_free的话"图灵机可以模拟计算机,并且计算步骤是计算机的某个多项式系数倍。"貌似计算机是图灵机理论的应用吧,我不晓得哦,胡说的,我也在看《计算方法导引》。
乱文加乱评,一塌糊涂,鉴定完毕。

 

#  sss_free 发表于2008-01-11 16:18:14  IP: 10.128.45.*
1073X
不是计算方法,是计算导论。
我不知道冯诺依曼和图灵是什么关系,图灵确实参与了计算机的制造,图灵说过所有可计算模型正能接受递归可枚举语言,所有计算模型的能力也是相同的,这是因为一阶整数的谓词演算的不可判定性证实了形式本身既不能证明也不能证伪,这就是计算机的能力

 

#  1073X 发表于2008-01-11 16:25:31  IP: 222.209.223.*
sss_free
我看得是《计算理论导引》(Introduction to the theory of Computation),不是《计算方法导引》,刚才写错了,呵呵。你后面的话我一句都看不懂了,等我修炼修炼再与你交流^_^。

 

#  brightnessyan 发表于2008-01-11 17:34:46  IP: 10.122.44.*
不论你说的对错,骗贴也骗的够多了,值了

 

#  fxsjy 发表于2008-01-11 20:05:37  IP: 159.226.43.*
楼主根本不懂Java

 

#  akilee 发表于2008-01-11 20:36:52  IP: 222.69.212.*
国外有个教授出来发牢骚
lz也跟着出来发牢骚
有点新意好不好
java跟c/c++各有优势,别盲目的跟着瞎掰了
真是的

 

#  yuyinghan 发表于2008-01-11 20:43:44  IP: 60.21.184.*
同意笔者的意见,编程教学首要任务是消除“软件指挥硬件工作的神秘感”,建立学生可以用一种语言完成开发工作的信心,然后介绍函数库,类库,OO,模式、框架,协议,数据库.....,其实我认为最好的编程引入应该从单片机编程开始。而这项教学应该从中学物理课就应该引入,而不是大学。

 

#  Motoste 发表于2008-01-11 21:06:32  IP: 222.91.160.*
我们学校大一时上c语言竟然让用tc,dos环境,垃圾。弄得我们都没兴趣了
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值