对于高校计算机专业程序设计课程教学的一些认识
刘晓光 发表日期:2006年7月13日
作为一门专业基础课程,程序设计是我国大部分高等学校信息科学领域相关专业(例如计算机、电子、通讯和自动化等)本科学生在跨入大学校门的第一年中必须要完成的基础课程。与我国的情况类似,在国外的大学教育中,程序设计课程也是电子与电气(E&E)相关专业本科新生的必修基础课。
以 计算机专业为例:高校计算机专业本科教育的目标是培养高素质的程序设计、开发人员。基于这一总体目标,程序设计课程不但需要培养学生严密的逻辑思维能力, 而且更需要培养学生开阔的视野和丰富的想象力和创造力。国内外无数的实践表明,能否不断涌现“灵感”是区别程序员和程序设计大师的最重要标准之一。这也是 某些国外一流大学(如斯坦福大学)把程序设计课程划归为人文艺术类课程的原因所在。总而言之,程序设计是一门需要对学生的理性思维能力和感性思维能力进行 综合培养的基础课程。
目前,国内大部分高校都将程序设计课程放在大学一年级。但作为一门专业基础课程,许多高校在程序设计课程的教学上还存在一些认识上的误区,表现为: 过 分强调对学生理性思维能力的培养,忽视感性思维能力的培养;注重程序设计技巧的讲授,忽视培养学生对于计算机科学的兴趣;注重课堂讲授,忽视学生实际动手 能力的培养;课程目标定位过高,超出了学生的实际程序设计能力,造成很大一部分学生不能独立完成教师要求的作业和任务,挫伤了学生的自信心。
下面,本文将着重从课程定位、课程目标、课程设计和教学方法等几个方面出发,阐述笔者对于高等学校计算机专业程序设计课程教学的一些认识。
一、 课程在计算机科学教育中的总体定位
计 算机科学的教育是一个具有延续性和整体性的系统工程。具体到课程的设计中,这一特点表现为两个方面:首先,课程的安排应该是一个循序渐进、由浅入深的过 程。其次,各门主干课程例,例如程序设计、数据结构、操作系统、编译原理、计算机原理和软件工程等是一个相互关联的有机整体,在讲授上述这些课程的时候, 应该以一种或者几种接近的编程语言来讲授课程内容、例题以及上机实习,促进学生在本科学习过程中不断熟悉和深化对编程语言的掌握程度。
具体到学生程序设计能力的培养方面,笔者认为计算机科学专业的本科学生在经过四年的大学教育后应该至少具备下列两项能力:第一,熟练掌握一门编程语言,并熟悉1-2门其其它程序设计语言(在这里,熟练掌握是指不需要查阅手册就可以直接编程,熟悉是指借助简单的手册可以顺利编程);第二,可以独立完成中等规模的程序,并且通过与其它同学的分工合作可以完成较大规模的系统软件。
为 了达到上述目标,作为学生进入大学后接触到的第一门计算机专业课,程序设计课程应该定位在培养学生良好的程序设计素养和对计算机科学的浓厚兴趣上,为后续 的专业课程奠定良好的基础。课程的内容应该以程序设计的基本方法和程序设计思想为主,而不是各种复杂的程序设计技巧和细节。
二、 课程的目标
在 承担程序设计课程的教学任务之前,笔者也曾经设想通过为期一年的程序设计课程的教学,让学生在大学一年级就能够独立完成一个大型的应用程序的设计开发。但 是经过几年的教学实践以后,笔者发现这一目标定得过高,是不符合目前我国高校的实际情况的。这主要是由下列几个方面的原因决定的:
第一,计算机专业大学一年级的课程比较重,学生需要学习数学、英语、物理和程序设计等多门基础课程,分配到某一门具体课程上的时间和精力必然是有限的。
第 二,理解并且掌握面向对象的概念,对于大多数学生而言还是一项比较艰巨的任务。对于面向一年级新生的程序设计课程来说,很多时候,教师可能必须在让学生更 好地理解基本概念和掌握更多的程序设计技巧之间做出一个取舍。笔者认为,程序设计课程应该定位在为学生打好计算机科学的基础上,技巧性的东西可以在本科学 习的高年级阶段讲授,这样效果可能更好。
第三,由于我国现实存在的“城乡差距和东西部差距”,新生入学的时候在计算机素质方面的起点差异性非常大,很难按照统一的标准要求。在每一届的学生中都会出现有的学生在中学阶段已经接受过结构化程序设计教育,而有的学生还从未摸过计算机的情况。
第四,如果目标定得太高,超过了学生的实际能力所能达到的范围的话,将会在学生的心理上产生强烈的挫败感,进而挫伤学生对于计算机科学的兴趣。而培养学生对于计算机科学的浓厚兴趣恰恰是本科计算机教育的最重要目标。
事实上,近年来,通过与国内外相关领域的专家的交流,笔者发现即便是在美国,也只有排名在前几位的有限几所大学能够用一个高标准来讲授新生的程序设计课程。这只是因为它们招收的基本上是顶尖的学生。对于大部分学校而言,不能好高骛远,而要脚踏实地从基础素质的培养做起。
笔者认为,面向新生的程序设计课程的目标应该包括下列几个方面内容:
第一,程序设计课程是计算机科学教育的基础课,应该着眼于培养学生良好的程序设计基础和对计算机科学的兴趣上。
第二,要求大部分学生能够掌握基本的程序设计方法,介绍但不要求学生掌握各种复杂的程序设计技巧和方法。
第三,要求大部分学生能够编写简单的应用程序,介绍但是不要求学生掌握大型应用程序的开发,而是留待后续的专门课程讲授。
第四,课程讲授的重点应该是程序设计方法和面向对象的思想,避免将重点放在C/C++语言的类库、函数等细节方面。
第五,课程的内容应该以大多数学生的能力为基准,尽量兼顾少部分能力突出的学生,但要注意避免陷入“精英教育”的误区。
三、 课程的设计
笔者认为,作为一项系统工程,计算机科学的本科教育应该确定一门主干程序设计语言。这一程序设计语言不但是程序设计课程的教学语言,而且也应是所有相关课程,例如数据结构、算法、操作系统和编译原理等的教学和实践用的主干程序语言。
目前,在国内外高校的计算机教学中,这种主干程序设计语言主要有三类:Pascal语言、C/C++语言和Java语言。其中,Pascal语言作为一种教学语言已经很少被采用。而由于在商业领域应用的日益广泛,为了适应企业实际工作的需要,目前在美国许多大学(特别是一些二、三流大学)中,JAVA语言已经或正在成为计算机科学教育的主干程序设计语言,而以C/C++为辅助编程语言。
但是,笔者个人认为,对于计算机专业的本科教育来说,在课程设计上仍然应该以C/C++语言作为主干程序设计语言。这是因为:
第一,JAVA语言虽然是一种非常优秀的商用应用软件开发语言,但是与C/C++语言相比,它的灵活度要差了许多。在一些专业性要求比较高的应用领域,例如,系统软件开发,设备驱动开发等,JAVA语言并不适合。而计算机专业的毕业生在今后的实际工作中很可能会涉及到这些专业性很强的软件开发工作。在这种情况下,熟练掌握C/C++的优势就会等到体现。
第二,JAVA语言作为一种严格的面向对象语言,在很多方面与C++语言是相同或类似的。笔者对高年级学生的调查也表明,学生在熟练掌握C/C++语言之后,基本上只需要数周的时间就可以熟练掌握JAVA 语言的开发技巧。而反过来,要求一个只熟悉JAVA语言而没有任何C/C++知识的学生掌握C++语言往往要耗费数月时间。
第三,计算机科学的教育是一个系统工程,各个课程之间是密切相关的。如果以JAVA语言作为本科计算机教育的主干程序设计语言的话,那么相关的其它课程,例如数据结构、算法、操作系统等都需要转变为JAVA语言讲授。就国内目前的情况而言,在教材、师资等配套措施的准备和积累还是远远不够的。
第四,程序设计课程最好直接讲授C++语言,时间以一年为宜。目前,国内很多高校在程序设计这门课程上,仍然处在将C和C++割裂成为两门课程的阶段,即第一学期开设C语言,第二学期开设C++。这两门课程的内容很多重复,并且每门课程的教学时间都不充分,导致的直接后果是学生经过一年的学习,对于结构化程序设计和面向对象程序设计仍然没有形成概念,也没有很好掌握基本程序设计方法。很多高校已经认识到了这一问题,直接讲授C++语言已经成为很多高校的共识。
此 外,国内高校在程序设计课程中普遍存在的另一个不足之处是对实践课程的重视程度不够。大部分学校仍然采用以教师课堂讲授为主,上机实践课程以研究生助教为 主的模式。这种模式的缺点是:老师课堂讲授是一种“广播式”信息传递方式,很难掌握学生的实际领会程度;上机辅导虽然是一对一的方式,但是以研究生为主的 形式使得效果大打折扣。此外,最近几年的扩招,使得各高校的程序设计课程中,教师与学生的比例迅速升高,有的甚至达到了1:400,这又进一步弱化的教学效果。
程序设计是一门实践性很强的课程,仅仅满足“老师讲清、学生听懂”是不够的,学生的实际编程能力是更重要的培养目标。2004年,南开大学信息学院开始对计算机科学的本科教育卓有成效的教学改革。教学改革的重点是培养学生对计算机科学的兴趣,强调实践课程的重要性,着重培养学生的实际动手能力和协作开发能力。具体到程序设计这门课程上,教学改革的要求主要包括下列几个方面:
第一,每堂课程学生人数不能超过150人,保证课堂讲授的授课质量。
第二,加强实验课内容,由具有丰富实际软件开发经验的青年教师担任实践课程辅导教师,并且每堂实践课程教师与学生的比例不超过1:20,确保每个学生都可以得到一对一的实践指导。
第三,在课程设计上,直接讲授面向对象程序设计语言。从新生入学就开始接触C++和面向对象编程思想,课程的内容具有连贯性和延续性,节省了学生的时间、精力,也有利于后续课程的开展。
四、 课程的教学方法
程序设计课程的基本目标是培养学生对于计算机科学的浓厚兴趣。因此,程序设计课程的教学方法也应该围绕这一目标展开。
目前,国内外程序设计课程的教学思路主要有三种:
第一, 图形优先(Graphics First)的教学方法
图形优先教学方法以讲解各种图形界面应用程序为主线,向学生讲授面向对象程序设计的各项内容。图形优先教学方法具有明显的优点:课程内容形象直观、学生比较感兴趣, 容易接受。但是,这种教学方法存在着一个显著的缺点:它需要首先讲授图形对象和事件驱动。学生对此虽然兴趣很浓,但是在还没有掌握基本程序设计方法的前提下,实质上学生并不能真正理解并掌握图形化程序背后的东西。
第二, 对象优先(ObjectFirst)的教学方法
在面向对象程序设计课程中,采用对象优先的教学方法在逻辑上是一种很自然的选择。事实上,在前些年中,对象优先的教学方法曾经是国内外程序设计课程教学的热点和主流教学方法。但经过多年的教学实践,实际情况表明,对象优先的教学方法并未取得预期中的教学效果。
对 象优先的教学方法的在实践中表现出的主要不足之处在于:首先,对象优先的教学方法跳过了编程的基本技术和方法,直接讲解面向对象技术,学生接受起来很困 难,有畏难情绪和挫折感。可以说在某种程度上打击了学生进一步深入学习计算机科学的兴趣。其次,程序设计的基本技术和方法是任何编程语言(不论是高级或者 低级编程语言)都需要的,学生应该全面掌握这些基本方法以适应今后工作中的不同需要。
第三, 基础优先(FundementalFirst)的教学方法
基础优先的教学方法遵循“由浅到深,从简单到复杂”的原则讲授程序设计课程。这也是最传统的程序设计教学方法。经过对图形优先和对象优先教学方法的实践和深刻反思,目前国外很多高校又重新回到了这条教育路线上来。
但是这种回归并不是简单的重复原来的老路,而是吸收了图形优先和对象优先教学方法的优点的一种升华。具体来说,基础优先的教学方法包括如下内容:首先讲授基本程序设计方法,然后由浅入深逐步讲解面向对象程序设计方法,最后结合面向对象方法讲解图形界面、I/O处理和异常处理等编程方法,同时课程还要辅助以1.5到3倍课堂教学时间的上机实践练习。
五、 结论
笔者认为,计算机科学本科教育至少应该包括两个目标:一是培养合格的软件开发人才,二是培养学生对于计算机科学的兴趣,为计算机科学研究的发展准备研究型人才。无疑,要达到这些目标是一项复杂的系统工程。
首 先,在课程的设计上应该有一个清晰的总体思路,明确本科学习的各个阶段应该达到的目标。例如,在本科一、二年级的学习中,以打好基础为教学的首要目标,包 括系统介绍各领域的知识和讲授基本计算机科学方法为主,着重培养学生基本的程序设计能力和对计算机科学的兴趣。而在二、三年级的课程中,则可以强调学生的 实际设计开发能力,提高学生参与社会竞争的能力。在这一阶段,应该适当增加应用型课程,强调实践教学的重要性。
其次,各门专业课程之间应该是前后衔接、相互关联的。课程的安排应该遵循“由浅入深、循序渐进”的规则。
最后,注重培养学生对于计算机科学的兴趣。只有对计算机科学拥有浓厚的兴趣人,才会在日新月日的IT领域始终保持优势的地位。
作 为本科教学中的第一门计算机专业课程,程序设计课程担负着更为重要的职责:课程不但要教会学生程序设计方法,而且要从一开始就培养学生对于计算机科学的兴 趣。这要求教师除了在教学方法上要做到形式灵活多样以外,还要注意培养学生的实际动手能力,同时要树立学生的自信心,避免使学生产生挫折感。
(作者系南开大学信息学院教师,天津,300071)
参考文献
[1] 冯继宣,国外计算机伦理学教育的启示,中国大学教育,2004(6)
[2] 齐治昌, 从“计算机”到“计算”:计算机教育的发展与思考,中国大学教育,2004(11)
[3] Y. Daniel Liang, Introduction to JAVA Programming,PrenHall Press,2004