找回密码
 申请新用户
搜索
热搜: 活动 交友 discuz
查看: 7261|回复: 2

初学编程,从什么语言开始?

[复制链接]
发表于 2008-3-10 13:19:41 | 显示全部楼层 |阅读模式
转载说明:我想这个问题,困扰着大多数的初学者,我也曾经为这个问题困扰过,当初干这行,就是半路出家,根本没有先学哪门语言的概念,当时记得vb入门比较简单,拖一拖控件,写几句代码就开始,还自以为编程不过如此。现在回头看看,发现这样的入门打下了一个不好基础,给以后学习类面向对象的语言比如c++,c#都带来不少的困难。我想下面的文章会让那些对如何开始学编程的初学者有所启发。

我自己想法是从:c/c++ 开始

---------------------------------------------------------

转自:http://bbs.csai.cn/bbs/view.asp?id={382AA873-7EF0-4E95-B227-379B1D268535}
这是一个争论不休的话题,不同人总会有不同的见解。传统的说法是从Pascal开始,而较为新点的是C开始,这几年以来,也有提出直接从C++或者C#/Java开始学起。

本人是本科出身的,对于专科或者不读书的初学者来说,他们的环境也许跟我的不同,不过我的观点可以作为参考。

首先,我先来介绍一下各种编程语言的来源、特点。

Pascal语言:

Pascal是一种计算机通用的高级程序设计语言,由瑞士Niklaus Wirth教授六十年代末设计并创立的。

Pascal的主要特点有:严格的结构化形式、丰富完备的数据类型、运行效率高、查错能力强等特点。

由于上述特点,Pascal可以方便用于描述各种算法和数据结构。对于程序设计的初学者,Pascal语言有益于培养良好的程序设计风格和习惯。IOI(国际奥林匹克信息学竞赛)把Pascal语言作为三种程序设计语言之一。NOI(全国奥林匹克信息学竞赛)把Pascal语言定为唯一提倡的程序设计语言,在大学中Pascal语言也常常被用作学习数据结构与算法的数学语言。

C语言:

C语言是介于汇编语言和高级语言之间的语言,属于高级语言,也称为中级语言,是集汇编和高级语言优点于一身的程序设计语言。于1972年在美国贝尔实验室里问世。早期的C语言主要用于UNIX系统。由于C语言的强大功能和各方面的优点逐渐为人们认识,到了九十年代,C语言开始进入其他操作系统,并很快在各类大、中、小和微型计算机上得到广泛的应用。成为当代最优秀的程序设计语言之一。

C的特点

1. 是一种结构化语言。层次清晰,便于按模块化方式组织程序,易于调试和维护。

2. C语言的表现能力和处理能力极强。不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构,它还可以直接访问内存的物理地址,进行位级别的操作。

3. 由于C语言实现对硬件的编程操作,所以既可用于系统软件的开发,也适合于应用软件的开发。C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类计算机上,从而形成了多种版本的C语言。

4. 由于C语言允许直接对位、字节和地址进行操作,能实现汇编语言的大部分功能。

5. 目标代码质量高,程序执行效率高。

总体上来说,C语言的优点是简洁、紧凑、使用方便、灵活、易于学习和应用。仅有32个关键字。9种控制语句,程序的书写形式也很自由。

C语言的弱点:非强类型;语法限制不严格,使得编程者无法过多地依赖C编译程序去查错;缺少实时检查,如数组越界等。

从严格上来说,C语言是块结构语言,这是因为它在结构上类似于ALGOL、Pascal和Modula-2。从技术上讲,块结构语言允许在过程和函数中定义过程和函数。因为C语言不允许在函数中定义函数,所以不能称为通常意义上的块结构语言。

C语言作为一门面向过程的计算机语言,至今已有三十多年历史,应用广泛,无论是Windows还是Linux,你所看到的底层都是用C写的。大部分的网络协议也都是用C实现的。你看到的最漂亮的游戏画面也是用C实现的,工业控制程序也是用C实现的。不过C不是万能,只是某些方面它适用而已。

C++语言

C++是于1986年由AT&T贝尔实验室开发的,语言开发的目的在于通过数据封装减少程序变量的副作用,从而降低程序的复杂性并提高程序的可靠性。(笔者曾经听到的开发C++的目的是由于懂得C语言的人越来越多,所以需要再出一门更难的、比C语言强大的语言,才能保住饭碗,so。C++出世啦)C++是C语言的直接扩展,C++的多继承机制能更好地描述对象的属性和行为。

C++是C的扩展,但C++可以作为一种全新的语言来看。

C++的特点:面向对象、继承、封装、多态性。

由于C++是C的扩展,所以也具有C的特点。

C++在C的基础上,加入了面向对象编程思想,也就决定了C++的效率在某一方面是不如C的。比如定义一种类型,C++用类(Class)来封装,而C可能就直接几个变量的组合就成了一个结构体(Struct),类不仅具有成员变量,还具有成员函数等,在精细的比较其效率时,C会比C++的效率要高。但由于时代的发展,项目或工程的庞大化,基于面向对象的思想显然更能适应。即C++在这方面能比C要做得更漂亮。现在不少系统级编程都是用C++实现,许多应用级别的软件也是用C++实现。

这里要注意一点,就是C++并不是完全的面向对象语言。它是提供了面向对象的模型以及思路,但是同时兼容了面向过程的模型。

Java语言

Java语言来自于Sun公司的一个叫Green的项目,其原先的目的是为家用消费电子产品开发一个分布式代码系统,这样我们就可以把email发给电冰箱、电视机等家用电器。对他们进行控制和信息交流。开始,准备用C++,但C++太复杂,安全性差,最后用一种新的语言Oak(Java的前身),Oak是一种用于网络的精巧而安全的语言,Sun公司曾依此投标一个交互式电视项目,但被SGI打败。可怜的Oak几乎无家可归,恰巧这时Mark Ardreesen开发的Mosaic和Netscape启发了Oak项目组成员,他们用(Java)编制了HotJava浏览器,得到了Sun首席执行官Scott McNealy的支持,触发了Java进军Internet。Java的取名有一段趣闻:有一天,几位Java成员组的会员正在讨论给这个新的语言取什么名字,当时他们正在咖啡馆喝着Java(爪哇)咖啡,有一个人灵机一动说就叫Java怎样,得到了其他人的赞赏,于是,Java这个名字就这样传开了。

Java的特点:

1. 简单性:风格类似于C++,Java摒弃了C++中容易引发程序错误的地方,如指针和内存管理。

2. 面向对象:Java是一种完全面向对象语言。从这点来看,Java类似于SmallTalk,但其特性、尤其是适用于分布式计算环境的特性远远超越了SmallTalk。

3. 分布式:Java包括一个支持HTTP和FTP等基于TCP/IP协议的子库。因此,Java应用程序可凭借URL打开并访问网络上的对象,其访问方式与访问本地文件系统几乎完全相同。

4. 健壮:Java致力于检查程序在编译和运行时的错误。类型检查帮助检查出许多开发早期出现的错误。Java自己操纵内存减少了内存出错的可能性。

5. 结构中立:Java将程序编译成一种结构中立的中间文件格式。只要有Java运行系统的机器都执行这种中间代码。这种中间语言被设计在虚拟机上运行,由机器相关的运行调试器实现执行。

6. 安全:
1)删除了香指针和手动释放内存等功能,避免了非法内存操作。
2)当Java用来创建浏览器时,语言功能和浏览器本身提供的功能结合起来。
Java在机器上执行前,要经过很多测试,它经过代码校验,检查代码段的格式,检测指针操作,对象操作是否过分以及试图改变一个对象的类型。

7. 可移植的:同体系结构无关的特性使得Java应用程序可以在配备Java解释器和运行环境的任何计算机系统上运行。任何Java代码会被解释成一种中间语言,然后通过不同机子的特定环境(如机器指令)运行程序。实现方便移植的特点。

8. 解释性。Java解释器能直接运行目标代码指令。链接程序通常比编译程序所需资源少。

9. 高性能。如果解释器速度不慢,Java可以在运行时直接将目标代码翻译成机器指令。Sun用直接解释器一秒钟内可调用300,000个过程。

10. 多线程:Java提供的多线程功能使得在一个程序里可同时执行多个小任务。多线程带来的更大好处是更好的交互性能和实时控制性能。

11. 动态:动态特性允许程序动态地装入运行过程中所需要的类。在运行时确定引用的好处是可以使用已被更新的类,而不必担心会影响原有的代码。如果程序连接了网络中另一系统中的某一类,该类的所有者也可以自由地对该类进行更新,而不会使任何引用该类的程序崩溃。

Java在诞生之后不久,便受到广大群众的欢迎,甚至有人说出有了Java,可以不要C/C++了。一度把Java提到了很高的地位。这当然是对Java的一种赞赏,只是有点过了。到今天,Java依然不能取代C,C++,而且还出现了新的对手――.Net(后面将会介绍)。

Java目前主要应用:Web浏览器、网络应用系统。

C#语言。

C#是一种精确、简单、类型安全、面向对象的语言。说到C#,就不得不先简单介绍一下.net。到底什么是.net呢,按照微软总裁兼首席执行官Steve Ballrner把它定义为:.Net代表一个集合,一个环境,它可以作为平台支持下一代Internet的可编程结构。C#是.net的代表语言。

C#的特点:

1. 完全面向对象。

2. 支持分布式,之所以有C#,是因为微软相信分布式应用程序是未来的趋势,即处理过程分布在客户机和服务器上。所以C#一出生就注定了能很好解决分布式问题。

3. 跟Java类似,C#代码经过编译后,成为了一种IL(中间语言)。在运行时,再把IL编译为平台专用的代码。

4. 健壮,C#在检查程序错误和编译与运行时错误一点也不逊于Java,C#也用了自动管理内存机制。

5. C#不像Java那样完全摒弃了指针和手动内存管理。C#默认情况下是不能使用指针的,程序员在有必要时可以打开指针来使用。这样可以保证编程的灵活性。

6. 安全性:C#的安全性是有.net平台来提供的。C#代码编译后成为IL语言。是一种受控代码,.net提供类型安全检查等机制保证代码是安全的。

7. 可移植性:由于C#使用类似Java的中间语言机制。使得C#也跟Java类似,可以很方便的移植到其他系统。在运行时,再把中间代码编译为适合特定机器的代码。

8. 解释性:C#也是一种特殊的解释性语言。

9. 高性能:C#把代码编译成中间语言后,可以高效的执行程序。

10. 多线程:与Java类似,可以由一个主进程分出多个执行小任务的多线程。

11. 组件模式:C#很适合组件开发。各个组件可以由其他语言实现的,然后集成在.net中。

C#是在Java流行起来后所诞生的一种新的语言。由于微软在操作系统上占有很大的优势。在以往的开发中累积了不少经验,所形成的.net平台,所以C#在Windows方面可以说比Java具有更大的优势。如果单纯从技术上来讲,C#在网络编程上可以与Java匹敌。C#还在Windows Forms也有一定的优势。

C#是一种非常类似于C++的语言,风格是更接近于Java,不管是C++程序员还是Java程序员,都可以很方便的转到C#上来。

C#的强大是依赖于.net的发展,而.net的发展是看微软在.net上的决心和投入有多少。从Windows 2003和Vista系统可以看出(前者内置.net1.1,后者内置.net2.0。).Net在Windows编程中具有重要的战略意义。

C#目前主要是应用在网络编程上,其他领域比如数据库、窗体编程,都逐渐在增大。

终于写完了各种语言的特点。如果读者对以上观点不同意,请留言。别BS我就对了。好了。继续,我该讲主题了!

其次,我们现在假定一个初学者没有任何程序设计语言的基础。先来比较一下各种语言:

Pascal PK C

现在,看我们学习Pascal和C的过程:学Hello world,然后知道怎么编译,运行。然后学习基本数据类型,然后输入输出。不管学校希望学生能学多好,实际来看,学生学Pascal跟学C是没什么区别的。不同的只是语言风格。有人也许会说,学C的精华在于指针。学C的人会比Pascal强很多。没错,指针是学C的一个重点。但是就按我学C的课本来看,用到的指针只是很简单的。理解了*p和p有什么不同,就够了。然后会编个简单的几行代码,就自认为会C了。C库中有很多函数,教师在课堂上几乎没讲。比如memset,qsort等,少了这些。你学Pascal和C没什么不同,只是作为了学习其他语言的铺垫而已。而新生由于没有语言根基,有不少好学生由于教师在课堂上没讲,就以为学完教师所教的了。这正是好学生的弱点所在。如果是“坏”学生,不听课堂的。倒还可能发现课堂所学的C是多么肤浅。还有,我至今没见过有学校会教C的图形开发的。虽然图形开发不是语言基础。不过对于扩展新生的编程视野是一个不错的选择。现代程序软件支持图形窗口的太丰富了,几乎不会太多的学生去在意窗体的设置,定位等功能。图形编程还能激起学生的编程欲望。笔者曾经实现过C的动画演示,当里面的所有图形都按预期的运动起来的时候,那种兴奋感犹如你在冰天雪地的情况下忽然淋你一盘冰水所感到的那种感觉。

C PK C++

C++是在C的基础上发展起来的。看起来似乎这两个pk,赢者肯定C++。其实未必。C至今还有生存的空间,而没有被C++全盘代替。说明了C还是具有不可替代的作用。C目前主要应用在于硬件底层的部分,以及对于性能要求较高的应用程序中。但是对于复杂的系统级的开发,显然C++显得从容自在。联系实际,不少人学C++的时候,就已经有C 的基础了。有C的基础,学C++的基本类型的时候可以快速渡过,然后学类,继承,多态等概念。还是从我的经历说起,我选了C++,然后几乎没怎上课,因为实在听了想睡觉,期末前用C++做了一个大作业后,就叫懂C++了哈,然后考试当然轻松过了。其实我那时还是没学到C++,本质点说,我只是还是在会点C的基础上。多了一个结构类型:类,而已。后来使用了1年的C++后,才恍然察觉到当年的无知。才明白C++是什么。我相信已经学过C++的同学估计现在连IO流的概念还没搞清楚的人很多。造成这种现象的原因在于:1. 学生本身没有认真去编程实现。2. 教师只是重复的讲课本而已。最终判定学生是否会C++的标准也只是考试为主。关于高校的考试制度在计算机系中的效用,笔者将在未来几天内出一篇个人观点文章。

Java PK C#

目前不少人对这两种语言议论纷纷。笔者在开始学C#的时候,曾经看过Java程序员对于C#的观点。把C#贬得一文不值。忽然发现,似乎很多Java的程序员对C#怀有天生的敌意。笔者目前自认为精通的是C#(别BS我)。以往学过Java,在此我写一下我所感触到的。虽然微软一直称C#是继承于C/C++,但是不论从代码结构,还是内置的支持类,都跟Java有惊人的相似之处。我感觉C#就是在Java之上,针对Java的优点和缺点来设计的。我用过C、C++、Java,感觉还是C#最好,这只是笔者的个人感受。由于C#还保留着指针,当要实现一下比较底层的,性能要求高的时候,解决办法之一是C#可以打开指针,而Java是做不到的,Java只能通过其他途径,比如优化算法来解决。

Java在非windows下获得了很大的成功:某调查公司曾经使用Google搜索引擎来统计以下指标:熟练使用某种语言的工程师数量、某种语言课程教学的可用性、有多少公司在出售用某种语言编写的软件。最后综合得分情况是:Java以45.2分排名第一;第二名是C,得分是32.2;C++是以24.6分排名第三;C#远远落后在第九位,得分为4.6。这些数据是几年前的数据。在这次测试中还发现,C#的受欢迎程度正在急剧上升;而Java相对稳定。这其中一个原因是.net允许许多种编程语言,而不像Java那样,限制人们只能使用一种语言。开发者能够使用包括C、C++、C#甚至Java在内的几乎任何语言来编写代码,然后把这些代码翻译成机器看得懂的CLR代码(公共语言运行时代码)。这样.net可以让开发者保护自己的“代码投资”,换句话说,过去人们用C、C++编写的代码都能再次被利用。而Java只能重新写代码。

所有指导者(学校、培训机构、带你的人)在足够的时间内都希望新生能打下编程良好的基础。从Pascal的介绍来看,似乎从它开始是很适合的。但是笔者是从C起步的,没学过Pascal,对程序设计的习惯以及特点一点也不比学Pascal的人差。我觉得这不是语言的异同造成个人水平不同,在于拿了一门语言的书,新生是如何学编程的。不少新生可能会认为好好上课,听老师讲课,然后回来自己的电脑上把老师讲过的内容上机去试一遍,就ok了。估计连不少教师也是这样想的。笔者认为即使真有学生做得到,效果也是不好的。比如C语言把,我看过不少的C的教程的书,内容大同小异。前面几章,也就详细的讲了语言定义的基本类型。然后讲结构体什么的。C++则是讲类,继承等。这些东西,我感觉上课没什么好讲的,要讲最多也就半节课。如果有一定编程基础的人,这些东西学得更快。但是笔者的经历是这些课都上了满满一个学期,还有后面某些章节是来不及讲的。笔者不幸运,在上Java课的时候,没有上机课,前面的基本类型都上了半学期了,不少学生自己连SDK都没装,最终考试就笔试过关罢了。连这种本应动手的课程还是按照传统的考核方法:卷面考试来解决。能通过高考的学生,不管是真的有料还是假的有料,相信都已经是考试能人了,对于计算机系来说,笔者认为不能全按照传统的教学模式来套,这只是闭着眼睛瞎说话而已。程序是具有很强的唯一性的。你行就行,不行就是不行。卷面答得再好也只是吹。我相信不仅我学校,其他各大高校情况也不会差太多。

这里顺便说几句感想:对于新生来说,应该自己能看清进入计算机系跟中学时候的环境不同。中学可以专门应试,不必学一些太实用的东西(除非不读下去了,准备出来工作的)。但是到了本科,如果你也只是应付教学,然后只是争取拿奖学金,最后你不考研或者考不上研,那可以说你在最后一年找工作的时候首先是自己心虚。虽然外面社会对本科要求不会太高,不必学生的技术像外面的技术牛人那么高。但这不代表学生能什么技能都不会。现在恐怕只有国企性质的企业很看重学生的成绩、拿奖学金情况等等。但是不能期望所有同学都能顺利去国企。

选择编程语言也是比较重要的一个环节,这就看新生个人的兴趣在哪。比如有人喜欢黑客,那么它可能就适合学C,以及各种脚本。有人只喜欢网络编程,那么也许他选择Java或C#就比较适合。如果有人想成为很好的windows编程,那么VC++、.Net编程也许是一个不错的选择。语言不在于多,而在于精。如果只学了一点就换语言,那不如不要学了,去打游戏,找人聊天更好。

数据结构:这是编程最基础的课了。可以说能否学好编程的一个原因在于你有没学好数据结构。注意,没学数据结构的,未必编不好程。如果学生只是每节课听老师讲结构。然后理解了就完的话,数据结构是不会学好的,别以为考了个9X分就高兴。说不定比考了60分的学得还差。依照笔者的经历。一个班里不少的人,估计一个学期上完了,连个链表如何用语言实现都不懂。对于数据结构,新生用什么语言来实现,这个无所谓。只要你会用某种语言,就行了。

学编程有一点是很重要的,就是学会看别人代码。从代码中看懂别人的意图。这样,可以快速学到各种技巧,提高自身的编程能力。

不少新生可能会遇到一个比较普遍的问题,就是以前编过的东西会忘记,以后再要写同样的功能代码的时候,就忘了。我以前也经常碰到。我认为应该懂得把你写的代码保存起来或封装起来。以后要用的时候可以直接拿来用,不必重写。如果以后想到了更好的算法,那么再替换掉旧的代码。这里我建议学会创建链接接口,Windows下就是dll或lik,其他系统我没试过,不清楚,不过总会有相应的链接口文件的。这样,把代码测试完毕后,封装到dll中,就可以长久保存。需要用的时候可以调用。这样可以把大部分注意力集中在新的问题上,而不是纠缠于实现过的算法。

学编程最主要的一点,还是要多编程。并且尝试去接触不同方面的问题,并试图去解决它。这样,就能在技术上有很大的提高。本科学校的教育教不出一个程序员的。程序员只有编程、再编程、然后还是编程,这样的历程才能锻炼出来的。

说到最后,我也没正面回答标题的提问。很遗憾,我也没法给你明确的回答,因为各有优势。我的观点是你根据你兴趣选一个你认为有发展的语言,然后闭关修炼去。甭管外面怎么说,学好了才是硬道理。以后不用担心你转不成其他语言。对于学生来说,我建议C/C++作为入门的基础。重点可以放在C++中,学好面向对象的思想。从编程中体会到为什么要用面向对象,而不是单纯的背书。计算机系的课不应该去背的,不懂的就查资料就行了。当学生有了一定编程能力后,就可以选择你以后作为主要的语言。即可以继续研究C++,也可以选择Java或.net中的任何一门语言。如果不浪费太多时间,大学时间内足够造就一个技术根基很好的计算机系学生的。
 楼主| 发表于 2008-3-10 13:32:17 | 显示全部楼层
延伸阅读:Java不适合于作为主要编程教学语言
http://blog.csdn.net/myan/archive/2008/01/10/2033386.aspx
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开发,都会心领神会,势如破竹。
回复

使用道具 举报

 楼主| 发表于 2008-3-13 17:51:10 | 显示全部楼层

Arrays.sort() and 吾欲仁则斯仁至矣

http://blog.joycode.com/xinz/archive/2008/01/12/113697.aspx
有不少人在争论 Java 对学生有益还是有害(不少网站上的评论有断章取义的嫌疑,不值得多看,建议看这个中文链接)(英文链接)。事实上,这个问题事实上不是最近才提出来,大约6~7 年前,我们的同事在美国的学校招聘的时候,就发现和学生好像谈不到一块儿 -

    面试者:能不能讲讲各种排序 Sorting 的方法?
    学生: 很简单,用 Arrays.sort()  即可,我不关心它具体怎么做的。
    面试者:那你们还学C么?
    学生: C 是过去的语言,我们要面向对象。 (中国的学生可能会再加上 “面向未来”,“面向世界”... )

这样的现象在这几年中越来越普遍了,因为越来越多的同学前来找工作的时候,除了一些抽象的理论和知识,我们并不能看出来他们对计算机这门“科学”,对程序开发这门“应用”有足够深入的了解,这些学生们觉得Java(或C#)已经替他们理解了,他们不必自己再亲自理解一下。面对这样的情况,大家不得不反思一下“他们在学校里到底学了什么?”,“我们应该教什么?”。

但是,在进一步讨论之前,我们要注意到原文并不是作了一刀切的“java 有害”结论。我的理解是:

如果Java 是学生学习计算机编程的第一门语言,会有一些问题。


但是这些“问题(Harm)”,并不是不能解决的。学生以后可以学汇编,C/C++,COM,Lisp,Asp.net,编译,计算机体系结构,等等。通过学习和实践,学生们应该能对计算机这门“科学”,和计算机编程这门“应用”有深入和全面的了解。

Java 挺好的,把很多细节都隐藏在抽象层面之下,我要排序, 则调用Arrays.Sort(),搞定.  我们不用关心这个到底是如何实现的,对不同的数据有什么样的效能 - 直到我在现实的项目中发现几个简单的Sort, for loop 组合在一起,会花非常长的时间。

这个现象和论语中,“吾欲仁,则斯仁至矣” 有异曲同工之妙。

说到“第一门”,其他类别的教育系统都有这样的问题,例如小学语文的第一课如果是“论语”,若干年后,会有教育学家总结“论语作为小孩的第一门语文教材,会对学生有害”,当然,此结论必然会被过度简化为“论语对学生有害!”这样耸人听闻的标题,引起另外一场大水。 (现在有人强迫小儿以"诵经"为入门,他们以后都要还的.)

我们还可以得出一个推论:

对于计算机专业的学生来说,如果Java (或其他一门‘容易’的面向对象的语言) 是学生学习计算机编程的唯一语言,这对学生有害, 那是相~当~有害。


如果有学生学了Java (或其他一门‘容易’的面向对象的语言)之后,就欢呼“技止此耳!” “我精通计算机编程了!”,然后跑到IT求职市场中, 那是当危险的。

从另一个角度讲,有人看到很多职位需要Java(或C#)技术,然后他/她参加了Java 的培训,并以此找到了工作。在这个过程中,每一个方面(求职者/培训机构/公司) 都受益了,何害之有?

随着计算机技术的发展,这个行业在不断扩大,我相信懂得各种sorting 算法细节的同学能找到不错的工作,我希望只懂得Arrays.sort() 的同学也许可以找到不错的工作。关键在于这些同学能各得其所。 当然,如果两样都精通,就更好了,即将出版的《编程之美 - 微软技术面试心得》也许能给大家一些帮助。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 申请新用户

本版积分规则

守望轩 ( 湘ICP备17013730号-2 )|网站地图

GMT+8, 2024-3-29 04:20 , Processed in 0.027889 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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