程序设计课程的教学理念与实践

2022-03-23 09:05:19 | 浏览次数:

摘要:从计算科学的角度出发,对程序设计课程的教学方法进行探索与思考,介绍东南大学计算机科学与工程学院在改进教学理念及教学方法方面所做的尝试。文章对教学理念的现状及发展进行了分析,提出在教学中引入以数据意识和算法可行性为切入点的教学方法,运用推动思维、注重风格的教学理念来提高教学效率,从而促进教学质量的提高。

关键词:程序设计;基础教学;教学理念;形象思维;抽象思维

在计算机应用教学领域,程序设计课程是普遍开设的公共课程,历经数十年的发展,人们认识到,学习程序设计已不只是学习一种软件开发工具,更有意义的是学习和掌握一种适用于面向计算机及其计算环境的新型思维方法、特殊的逻辑表达和具有计算机应用特点的哲学理念。在最新的教育部高等学校计算机科学与技术教学指导委员会发布的《程序设计基础课程教学实施方案》中提出,“在课程涉及的能力培养目标上,从提出问题、设计算法、选定数据表示方式,到编写代码、测试和调试程序,以及分析结果的整个程序设计过程中,培养学生抽象问题、设计与选择解决方案的能力,以及用程序设计语言实现方案并进行测试和评价的能力[1]”。其中的能力培养目标是教学的核心目标,而在这门学科中,能力的培养实质上是一种脑力的培养。

对于初次学习计算机程序设计的学生来说,很多概念和术语都是陌生的,有些甚至感觉不易理解。在学习过程中,从外在的形象到内部的抽象,都需要逐步理解,学生的学习效率在很大程度上取决于是否感受到或掌握了计算科学的思维方法和理念。因此,在学生和教师这两方面,都需要一些从计算科学的角度出发的观察与思考。在课堂上,教学过程的主体是对学生讲授知识,而在知识的表达上贯穿着老师自己的教学理念和基本思想的发挥。因此,树立什么样的教学理念是一个很值得思考的问题。

1引导学生重新认识数据

数据是程序工作的对象,开始学习时,学生都能理解可计算的数和文字、图表等数据,然而很多情况下数据不是单一出现的,一个问题中涉及的数据是否存在内在关系,这种关系如何用程序设计语言描述或表达,往往是初学者忽视的。我们在教学中较早地引入数据观点,对提高程序设计能力有着较好的基础作用。所谓数据观点,主要指数据的定义、数据关系、数据类型、数据存储、数据访问、访问异常等一些在程序中与数据相关的问题,对这些问题应有明确的认识,了解解决这些问题的方法。

数据是程序运行时的核心。对问题进行分析后建立数据模型,是应用程序设计的主要基础工作,特别是在面向对象程序设计的过程中,自定义数据类型成为主导,教学中应更加注重提高学生的数据抽象能力,学会数据模型的构造方法。由于数据所面对的是操作(方法),数据模型的结构关系到操作代码和程序流程的质量,对程序的执行效率也有较大影响,在教学中可以通过实例做一些分析对比,使学生对此问题有足够的认识。

数据是信息的载体,在信息处理系统中,计算和信息组成了一个不可分割的概念对[2]。在程序设计教学中,需要讲解的另一个问题是如何利用数据来承载信息或表达信息。例如,程序状态信息和程序环境的数据化表示方法以及这种表示对算法实现的作用和影响。在教学中使用的一个较为简单的例子是说,二进制数运用自然界中具有二元状态的物体来表示,与之相反,我们可以设定一些数来表示事物的不同状态,或者说是把某种状态或状态符号称为数据。例如,在冒泡排序程序中,使用一个取值为0或1的状态变量标记在本趟扫描中是否发生了交换,以便提前结束循环从而节省程序运行时间。在算法的程序实现中较常用的非原始数据有些是逻辑数据,而何时需要使用逻辑数据,怎样使用等都是学生面临的新问题。数据与信息的关系、数据的合理组织是程序设计中的基础技术,也是提高程序质量的重要技术,需要使学生认识到这一点。

直观地看,能够输入计算机的信息都是数据。而实际上,要想在程序运行时把数据输入计算机,需要做不少的准备工作,如数据的存储方式、数据的类型声明、数据的合法性检验、输入/输出界面的设计等。数据还是对算法和程序进行正确性检验所必需的依赖对象。学生如果能够对数据问题有更多的理解和思考,则会在学习效率上有事半功倍的效果。

2从算法可行性的角度认识计算机

无论计算机的用途有何千差万别,本质上它都是一种操作、处理符号的物理系统。对于计算机程序而言,计算就是对符号的操作,无论抽象度多么高的算法都要转变为对应的程序代码,最终都要被转换为可执行的机器代码。因此,算法的可行性总是老师对初学程序设计的学生所强调的要点。而要理解可行性,学生首先需要理解计算机的内部工作原理。

在计算机内的世界,将机器的行为和方法与现实世界中人的行为和方法相比较,既存在着一种固有的映射关系,更具有一些超越人的能力和表现。人们通常对计算机的描述是计算机以CPU为核心,这一点是确定的。虽然CPU是计算机的心脏,程序是在CPU中执行的,但冯•诺依曼体系结构的工作原理却是以内存为中心,或者说从数据的角度看,内存中的数据是稳定状态,数据在CPU中只停留瞬间,这一瞬间用来改变或转移数据。再从算法的角度看,算法的流程控制依赖变量,而变量代表了某一存储单元,程序流程的执行就是各个变量的内容和状态的变迁序列。对于初学者而言,算法是否具有可行性,主要看它的计算方法是否能转换为可用变量表达的表达式,或者是可由变量控制的基本工作流程。

例如,C/C++语言程序中的函数调用机制以及递归程序都是由基于内存中的栈区来实现的,学生只有理解了栈的机制和运用方法才能较快地理解递归算法和程序。按理说,用高级语言编程就是为了屏蔽底层的硬件,但是对于初学者来说,计算机的硬件工作环境应该了解清楚,甚至需要感觉拥有一种“内视力”,似乎看到程序的工作过程。可以说要做到心中有一个计算机。

数据结构的定义也需考虑内存的特点和局限来设计,即数据存储表示的可行性。例如,学生对链表概念感觉很抽象,其问题实质在于如何抽象地描述数据的非连续存储的物理实现。链表概念可以分为2层逻辑结构,一层是结点结构,另一层是链结构(主要成员是头指针)。单是结点结构就要表述为把一个基本类型的变量(如整型变量a)和一个指针p整合在一起定义为结构变量Node,那么指针p就像变量a伸出的一个钩子,这个钩子可以用来拉住另一个结点(其实质是存储了后继结点的地址)。多个结点一个连一个地钩住就形成了一条链,我们就称p为链指针。而如果要使它能够钩住另一个结点,就必须规定该指针的类型,使它具有与自己所在结点相同的类型,从而使程序在编译和执行时能够限定它只能指向与本结点具有相同类型的其他结点。但在定义链指针类型时,定义本结点的描述还未结束,为什么又能使用这个未完成的类型名?可以解释为由于指针的值只能存储地址,编译系统为指针类型规定了占用4个字节的空间长度,因此可以先对其进行声明,等指针被使用时,前面的结点结构定义已经完成并生效,这是编译系统为实现链表而特别采取的措施。对于链结构,需要强调表中的结点是动态生成的,没有变量名,要想访问一个结点只能先找到其前驱结点,从中取出它后继结点的地址。由于第一个结点没有前驱结点,因此必须安排一个表头指针来存储头结点地址。在课堂上,随时在黑板上画出相应的示意图,可以使学生更加直观地理解所学习的概念。

可行性的考量基础在于计算机工作原理对抽象高度的限制。例如书写一个多分支的逻辑表达式,需要在其简洁性和充分性之间做出平衡。因此,还是需要学生对计算机原理和工作方式有准确的理解。

3思维深度的推动

在教学中,学生往往看例题容易理解,而自己动手却步履维艰,究其原因主要是还没有具备科学抽象能力以及没有掌握将理论应用于实践的方法,对所学知识的认识和思维达到一定程度时就难以深入下去。程序设计是一种高强度的脑力劳动,程序代码是算法的语言实现,而算法是经验和思维的结果。我们人类的思维方式主要分为两类,一是形象思维,二是抽象思维。通常人们总是认为程序设计是基于抽象思维的劳动。然而,越是强调其抽象性,学生越感觉学习困难。实际上,程序在计算机中运行是一个物理的工作过程,而算法又来源于物质的现实世界。在抽象逻辑的背后有着具象的问题和环境,有着容易认识和掌握的形象化技术和方法。如果从形象思维入手,经过一段过渡再到抽象思维,则会有事半功倍之效。

形象思维的运用方式是以具体事例为载体,对事物的属性和活动进程做直观式思考。特别是对于计算机程序,可以设想其执行过程,把它看作具有运动性的事物,这和数学方法解决问题是大不相同的。程序尚未执行时即可形容和感知程序中的每一条指令的执行结果和程序逻辑的运动轨迹,甚至程序还未形成,流程已在脑中,在此基础上再进一步寻找和筛选最合适的条件和算法要素以解决问题。例如程序中处理的数据应具有离散特性,对离散数据的处理有一套基本方法,最初始的例子是采用循环递推的方法计算自然数前n项和或者是n!。在这类算法中,自然是以循环语句为主体,这时,一条循环语句是高度抽象的,但其执行过程必须分解为n次基于存储单元(变量)的运算,这又回归到自然的手工方法且是形象化的。这种基于形象思维的学习方法适合于初学阶段,特别是学习程序样例时帮助理解教材中给出的程序代码。如果学生把自己比做运行程序的计算机,在程序的执行过程中感知其动力、目的和成败,则能进一步理解程序逻辑与执行结果的关系。

度过初级阶段后,设计算法和编写代码描述出算法的内容,是进一步的抽象思维所要解决的问题。抽象思维的主要特征是以概念为载体,对概念进行思考,进行概括、描述、推导等活动。程序设计的思考过程是一个从形象到抽象的转化过程,这一过程应基于科学抽象的基本方法。科学抽象是指在思维中对同类事物去除其现象的、次要的方面,抽取其共同的、主要的方面,从而做到从个别中把握一般,从现象中把握本质的认知过程和思维方法[3]。在递推计算的例子中,数据的表象是自然数,按数学方法抽取其本质则得到递推式f(n)=f(n-1)+n,但从算法的角度来抽象,却要离散化地表示为n从初值开始通过n=n+1逐步演变为终值。可见在不同的领域中,抽象的前提是基于一套相应的理论,例如在程序设计领域,这一理论基础是本课程所学习的一套形式化语言及公理。

感性与理性,形象与抽象都有不同的层次。例如在程序中输入输出是不可或缺的,输入输出也称为人机交互,而人并不出现在程序中,程序只能响应人的操作,这些操作又只能通过外部设备来传达,所以代表人的模型抽象为交互介质,这是第一层抽象。在不同语言中还需要第二层抽象,如C语言中以文件形式表现各种外部设备。在程序设计语言这一层,语言本身的词汇、语法和语句又是一种现象,在这个现象的背后又是一套基于符号、规则和变形理论的形式化方法。

在学习过程中,通过从形象化思维到抽象思维可以完成建立概念、掌握方法和形成理论的学习阶段,进一步再将理论运用到实践,解决多种问题(也称为举一反三)的学习阶段还需要加深思维活动,否则学习将止步不前。那么如何推动第二阶段的思维呢?在本课程的教学中,经验主义会得到部分提倡,具体来说是将属于感觉和直观的内容提升为普遍的观念、命题和规律。但问题的复杂性以及计算机系统和算法语言的局限性使经验性结论也受到限制。可行的方法是提倡思辨的学习态度,具体方法是质疑和推论。一方面对前面的成果提出质疑,找出新的问题,另一方面运用归纳和分离方法找出不同问题和算法的相同点和差别点,经过判断和分析推导出新的结论。例如在面向对象的程序设计中,通讯录的设计和实现是一个常见的作业,学生们第一次设计方案普遍采用定义一个记录类并建立对象数组,这是在记录层次上的一次抽象。这种方案的缺点是将对象数组的元素作为基本访问单位,数组的有效长度没有被封装,数据表的操作也是独立的,这样的程序很难维护。当引导学生们对这一方案进行分析后,许多同学改用符合线性表解决方案的复合类,即记录结点类和表长度变量作为通讯录类的数据成员,使数据表的操作被封装在通讯录类中,这是二次抽象,通过通讯录类的对象间接访问记录类的对象。这样一来,学生在作业中掌握了多层次抽象的基本方法。

思维是人的主观意识,其正确性是个人无法保证的,对结果的检验显得极为重要。软件开发领域重视的算法验证和程序验证也需要引导学生学习运用。在教学中较为快速有效的方法是课堂上老师对学生的作品进行点评,学生进行讨论并向着深入的方向继续思考,从而认清错误及发生的原因,改进程序质量,同时能够观察到较高质量的作业并得以借鉴。

4外部的学习因素

在本课程中,教学效率与方法的传授有很大关系。由于前后所学的知识点有相互关联和贯穿使用的特点,需要引导学生运用多种方法对所学内容做细致地梳理。例如,运用相似识别法、比较分类法等。对同一个问题,找出不同解法,同一个解法,找出不同的语言描述工具;运用分类法做一个算法集锦,以积累编程经验。虽然这些都是学习的基本方法,但如何运用大有讲究。

学生的心理因素和视觉因素也会影响到学习效果。例如,程序代码的书写风格往往是初学者不重视的,但是按照公认的良好风格书写程序代码,会使程序看上去具有一种美感。程序的美是一种科学美,不易被查觉,特别是程序代码文本,只有喜爱编程的人才会认为它是美的。量子物理学家海森堡(Heisenberg)曾说:“美对于发现真理的重要意义在一切时代都得到承认和重视[4]”。我们通过对学生书写代码提出风格的要求,试图使学生认识到,编写具有美感的程序代码,也是学习程序设计的一个必要条件,当他能够看出程序的美就可以认为自己是入门了,这在他的心理上会产生一定的自信心。其实,良好的程序代码风格只是一种外在美,它其实是程序内在的合理逻辑的体现,合理且通顺的逻辑会自然地具有一种和谐的美,因为它是编程者的成功思维结果,这本身就令人内心感到美好和兴奋。良好风格的程序源代码具有层次性、呈现出一种结构美,具有简洁性、统一性、对称性、协调性以及思辨性。对程序风格的习惯性会提高人的编程直觉能力,这也是从一个角度体现经验提高了能力。

5结语

实施以上教学实践之后,笔者发现近几年能够较快入门的学生比例不断提高,学生对参与讨论和完成作业的积极性也非常高,特别是越来越多的学生热衷于尝试老师增加的具有应用意义的补充题,感觉到了学习本课程的乐趣。在教学的成败问题上,教师的理念至关重要,理念的进步与更新也是一个不断学习的过程。本文只是较为粗浅的探索,今后还需继续努力更新和完善,使本课程的教学工作更上一层楼。

参考文献:

[1] 教育部高等学校计算机科学与技术教学指导委员会. 程序设计基础课程教学实施方案[J/OL]. [2009-10-01]. http:// computer.cncourse.com/computer/html/ejournal/2010_03/Program_wlx/index.html.

[2] 郦全民. 用计算的观点看世界[M]. 中山:中山大学出版社,2009:30.

[3] 董荣胜,古天龙. 计算机科学与技术方法论[M]. 北京:人民邮电出版社,2006:49,109-116.

[4] 徐本顺,殷启正. 数学中的美学方法[M]. 大连:大连理工大学出版社,2008:18.

Teaching Idea and Practice in Programming Course

XU Dongmei

(School of Computer Science & Engineering,Southeast University, Nanjing 210096,China)

Abstract: This paper gives a brief introduction to the improvement on teaching concept and teaching method what author did tryout,and investigates on the teaching method of the program design course from the point of view at calculation science, to the present state and development of teaching principle carried on analysis, put forward a teaching method that is importing the doorstep in the teaching with data consciousness and algorithmic feasibility,usage teaching principle of push thinking, pay attention to the programming style to exaltation teaching efficiency, and promote teaching quality.

Key words: Programming Desing; base teaching; teaching idea; image thinking; abstract thinking

(编辑:姚彦如)

推荐访问: 程序设计 教学理念 实践 课程