高校“计算机高级语言”教学的深入研究
李祎
(合肥学院 电子电气工程系,合肥中国 230061)
In-depth Study on the University Teaching Methods of Computer Advanced Language
LI Yi
Hefei University ,Dept. of Electrical Engineering &Electronics , Hefei, China, 230601
摘要:从客观和主观上深入分析了目前高级语言程序设计课程教学中存在的问题,指出规则的明晰,工程实践应用,编程能力内涵扩展,变式训练,教材结构的调整,教学内容的扩展,课堂结构的改变,教学方法的提升,反馈机制的建立是提升教学质量的九大关键所在,并结合实践提出了实际的操作方案。
关键词:高级语言;课程改革;规则训练;工程实践
Abstract: From both the objective and subjective aspects, this paper analyzed some issues in the teaching process of the Computer Advanced Language Course. It is addressed that it is the nine following aspects, that is to say, the clear rules, the application of the engineering practice, the improving of the competence of programming, the variant training, the adjustment of the teaching contents, the changing of the class structure, the improvement of the teaching methods and the establishment of a feedback mechanism, are the key elements to improve the teaching quality. In the conclusion part, the paper proposed the practicable operation scheme.
Keywords: computer advanced language; course reformation; rules Training; engineering practice
1当前教学现状
“高级语言程序设计”是各高校理工科专业学习必修课程,由于C/C++语言性能优越,应用广泛,常作为首选学习的计算机语言。通过对多家高校该课程教学的调研,我们得出一个大致的结论:教学秩序混乱,教学质量低下,教学目标流失,普遍存在的情况是:
(1)学生学完这门课程后,根本编写不好程序。
(2)考试通过了,还不知道这门课程有什么用。
(3)学生的兴趣从刚开始的热情到最后无任何热情。
(4)作业和上机形同虚设,抄袭现象严重。
(5)教学管理基本失效,无快速反应调整机制。
调研中,接触到的教师大多教学经验丰富,教学态度认真,有责任心,这些现象严重的挫伤了教师教学的积极性。造成这门课程的教学努力与收获严重失衡的原因是多方面的,有客观的因素也有主观的因素。
2深层原因分析
2.1客观因素
2.1.1学生思维的转变困难[1]
课程性质决定此课程以解决实际问题为核心的课程,需用计算机语言去描述现实世界、解决问题,多数院校在大一开设,由于在高中阶段并没有针对认识世界、解决问题的方法进行有效思维训练,直接用计算机语言来表述问题乃至解决问题在思维上产生了很大的跳跃,客观上造成学生学习的难度。
2.1.2学生学习资源短缺
由于各专业发展,课程计划安排饱满,大一新生的课一般排到30节,按照每门课程的要求,学生要完成大量的作业、实验报告、考核。学生的自主时间少,给学生思考的时间少。另外,高校的办学条件虽然有已经很大程度改善,但仍然不能够提供足够的机房资源,且存在学生独立支配的时间资源和实际的上机时间资源相互冲突情况,这些都严重地阻碍本课程的学习。
2.2主观因素
2.2.1课程本源认识不清
单独以理论课或者实践课来描述此课程性质不全面,以理论和实践相结合反映这门课的特征也不够准确。它是一门智力技能的训练课,理论依据是:计算机语言的本质是“如果…,那么…”这样的产生式,即如果条件满足,则会执行某个行动,而这种产生式在现代认知心理学上被认为是智力技能的基本组成单元。
智力技能的形成要求在长时记忆中形成一个解决问题的产生式系统规则[2],遇到同样类型问题,据此按照一系列规定步骤自动化快速完成。智力技能的核心是规则,因此,从某种程度说,本课程教学就是规则教学。
由于本源没有认清,所以无论是提供的教学内容(教材),还是教师的教学方法都很难注意到规则,没有向学生提供规则的方法步骤。
2.2.2目标中“应用”得不到体现
“高级语言程序设计”的教学目标是掌握程序设计的基本方法、基本思想,培养学生编程能力进而解决实际问题。这一切的落脚点是“应用”,如果没有“应用”这个本,不能有效地解决需求应用,这门课程就失去了存在的价值;高级语言的语法、结构是末。学语法不是求应用,应该为应用求语法,教学中如果用已知的语法、结构去套算法、编应用、堆案例是本末倒置。
2.2.3能力培养因素内涵狭小
初步的编程能力并不能适应现代编程需求,表现在:学生不会利用已经编写过的代码;对于稍大程序不知道协作;代码出错只能反复检查原代码而无相应的处理办法;程序代码不通用,只有自己能够看懂。而调研结果表明教材、教学内容对这些方面涉及较少甚至无涉及。
2.2.4能力培养途径不清晰
主观认为在教学过程中讲清概念,学生会做课后习题,考试通过了,学生的编程能力就培养起来了,但事实结果是学生对教学概念并不清晰,也没有形成编程能力。由于对课程本源规则认识模糊,导致对于规则上升为智力技能没有概念,更加无法确定上升途径。
2.2.5 教材结构不合理
目前国内该课程教材,按照“简介->数据类型->结构化程序设计的三种结构->数组->指针->函数->文件”顺序展开。事实上,这种结构有问题,表面上看按先易后难的顺序展开,但没有考虑到编程核心思想、知识的内在联系、应用开发、学生认知同化知识等角度,缺乏整体性,重点不突出。
比如,教材中“数组”在前,“指针”在后,但“数组”这一章肯定要用到数组作为函数参数,这里存在着严重问题,学生对数组的本质(连续的内存存贮单元的首地址)认识不清,对数组作为函数参数进行传递的实质不敢揭示也无法提示,导致认识思维混乱,混乱1:数组名常量可作形参;混乱2:一个模块可以随心所欲地修改另一个模块里的数据。这种混乱颠覆了学生对函数的认识(函数的独立性,函数形参与实参关系),有效学习被延误。事实上,正是知识编排体系的错乱、内容呈现的错位,导致认识偏颇,错误无法避免。
另外,函数思想是编程最重要思想,教材安排却放在最后,失去了使用函数的大量时机,导致学生对函数的认识不够,教学失败不可避免。
2.2.6教学内容不全面
内容的不全面体现在三个方面:①轻文档。现代编程要求程序的可读性、健壮性、可维护性比程序代码优美更加重要,需要设计大量文档辅以说明,但平时教学中被忽视。拿到一个问题就直接写代码,表面上是直入主题、节约时间,实际上是对教学内容理解片面。②轻调试。教学中只教授编写正确的程序,没有告诉学生出现错误怎么处理,实际上,我们并不能保证程序的正确性,代码出错后学生束手无策。③轻实用技术。动态单元分配、引用这些技术、概念不仅在实际编程中大量使用,而且对于理解变量、对象的概念和存贮模式都有很大帮助;另外,充分利用底层库和扩展库代码才有实用价值,但这些内容都是现行的教材、教学中尽量回避的,甚至由于课时不够而忽略。
2.2.7教学结构不科学
课程规划中理论课时远大于实验课时,典型比例是2:1,即2次理论教学对应1次实验,学生很难将理论课上学到知识全面消化,更无法在实验中表达清楚,很多学生连程序代码都无法正确输入实验课就结束了,更不用说去调试、收获。
2.2.8教学方法单一化
理论课多采用引入多媒体的的讲授法教学,过多地强调了教师的作用,没有把学生作为思维主体身份真正地落实到位,学生只是作为客体在被动地接受,无法展开自己的思维和投入自己的主观能动性。
2.2.9教学反馈机制不健全
没有教学过程管理机制和反馈机制,或者有但未能准确及时地执行。很多的问题已经暴露在教学过程中,比如学生感觉到循环学的不好,但教师并没有关注到,问题积累过多,导致了最后课程教学失败。
3改革思路
3.1对客观不利因素的解决
3.1.1解决思维转变困难的思路
精心编写案例,创设丰富的问题情境;细致分解问题,逐步降低难度,可有效地解决思维跳跃程度。另外,还可找出学生原有知识结构与新知识的共同点,用建构主义教学理论完成知识的同化迁移,比如,根据中学阶段学习的函数概念和C/C++里函数概念的都具备的共同特征:函数名、函数参数、函数体,合理地展开知识和结构的过渡。
3.1.2解决学习资源匮乏的思路
时间、上机资源在相当长时间内充足供给不可能,解决思路是:提升课堂效率,调整课堂教学模式,创设稳定的练习交流教学环节,完成实验前完成代码预演,提高上机的成功率。
3.2对主观不利因素的解决
3.2.1设计课程教学规则
如前所述,形成智力技能前提是建立一套规则,规则的制订依赖对概念的准确把握,体现步骤、环境[3],具体到高级语言课程的教学,这套规则的设计要求能够完整地体现解决问题(模块)的一般过程及特定环境下使用的规则步骤。比如,指针作为函数参数的特殊规则可确定为三步:①实参传地址②形参用同类型指针变量设置接收③用指针运算符操作内容。
3.2.2体现教学目标中“应用”
“应用”的体现一者在于精心的策划教学案例,尽可能体现现实问题场景和工程背景,如出租车价格计算、天气情况分析、单片机信号控制、声音的处理等;二者体现在解决实际问题的方法上要严格遵循“应用”规则,按规则步骤确定各组成要素;三者体现在满足“应用”不断增长的需求,如“成绩管理系统”的案例设计根据需求不断地增加分数数组、姓名列表、结构体数组、文件保存等。
3.2.3扩展能力培养因素
需要扩展的能力内涵包括:建模能力、规范编程能力、合作编程能力、代码复用能力、代码调试能力。其中,问题域的认识、分析能力及稳定的建模能力是能力建设之根本;合作编程能力和代码复用能力是现代编程能力的重要要求;规范编程能力是良好编程习惯和编程能力的直接体现;代码调试能力是学生自我学习、解惑、进步的重要保证。需要说明,建模规则和建模能力是各种扩展能力的基础。
3.2.4明晰能力培养途径
智力技能的基础是规则,只记住其含义,规则的学习还处在陈述性知识阶段,并没有转化成解决问题的智力技能。必须明确,只有通过反复练习才能达到目标,这是能力培养的唯一途径。这种练习不仅强调练习的同一性,还着重强调变式性,随着知识的稳定和巩固,问题类型和场景要改变,称为变式。比如,练习题“根据学生的成绩返回其等级字符”,其同型题可设计“根据血糖值判断是否是糖尿病”等;其变式题可设计“根据等级字符返回其成绩范围”等。
3.2.5以函数为主线调整教材结构
调整教材结构为:以函数作为主线,以文件作为单元贯彻教材始终。函数的概念要从第一节课引入,后续章节反复加深、扩展、应用。指针提前,在基本的数据类型后展开指针教学,这样构想立足于数据和数据的存贮方式是一个问题的两个方面事实,不应隔离,这样做还有一个好处是结构化编程的三种结构中体现指针的大量应用,使学生对原教学难点指针的认识更加深入,也解决了前述数组讲解中的尴尬。
3.2.6扩充教学内容
1)编程文档内容的扩充[4]:增加对变量、函数、文件定义方式的描述说明。
2)调试环境内容的扩充:增加文件的保存,编辑,调入内容;增加调试断点设置、查看变量/表达式的值、查看过程/函数调用栈、单步(Step Into)和跨步(Step Over)跟踪。
3)动态申请、回收空间扩充和实用库的介绍:增加动态空间相关案例,适当引入CRT/API/MFC等实用库的介绍。
3.2.7确定科学的教学模式
课程教学结构调整为1:1:1,即1次教学理论课,1次思维训练课,一次实践训练课。这是“学思行”三位一本的语言教学模式,其中思维训练课是联系理论教学和上机实践的桥梁,通过预先布置、课后准备、引导交流、分组汇报、答辩解疑等教学手段,调动学生的主观能动性,让实验的内容在头脑中预演,即缓解学生资源不够现实,同时又解决了理论和实践脱节的矛盾。
3.2.8探讨新的教学方法
在稳定的教学模式下,根据不同教学阶段、不同教学内容、不同学生合理地使用各种不同的教学方法。“理论课”教学阶段,可使用基于认知理论的讲授教学法和发现教学法,这两种方法强调创设问题情境,合理利用上下位知识,完成学生自行发现答案和知识顺利迁移至大脑中的命题网络,是积极有效地教学方法。比如,案例教学-图书馆书籍存储,可借助于数组概念,字符串概念的回忆,引导学生发现指针数组,学生的发现得到了验证,学习的兴趣会空前高涨。“思维训练课”教学阶段,可使用基于情感主义的研讨式教学法,这种方法强调个人参与,每个人(包括情感和认知)都积极地投入到学习活动中,学生是发起活动者,同时也是自我评价人,为此学生会做充分准备。
3.2.9加强对高级语言程序教学管理机制的监控
首先建立一套教学管理监控体制,这个制度能够对教师和学生都能起到管理、约束、监控的作用,教师在教学、管理出现异常能够及时地发现并纠正[5],学生在学习过程中遇到问题有合适的途径去解决,管理者也有恰当的方法评价教学过程的有效度。
4改革方案
4.1一般规则设计方案
特殊规则的设计依赖具体的概念,而一般规则的设计必须遵循面向过程/对象编程的“自顶而下”核心思想,做到将分析问题、化解问题、层次管理落实到具体可操作的执行步骤。这个一般规则,我们称为模型模块设计规则。模块指具体的解决单元,需考虑细节;模型指解决单元在整个系统中的位置,需考虑模块的有机组合。
模块与模型设计相互融合,包括以下四步:①明确问题域(模块功能) ②明确模块输入、输出及模块归属关系,即模型③明确模块的解决思路④明确模块的算法步骤。其中,“③模块的解决思路”并不涉及到语言,较复杂的问题可以主动地提供假设数据,手动演算直到问题解决。“④模块的算法步骤”也不涉及到语言,可用自然语言、流程图、伪代码表述步骤。
确定模块、模型的设计规则后,通过反复引申、变式等手段来训练、巩固、转化成智力技能,进而上升到认知策略,可自动有效地监控学生自我学习,培养编程能力水道渠成,模型模块规则。四步规则需让学生充分掌握并不断训练,训练的次数越多、越标准,那么每步之间间隙就会越来越小,以致于最后达到自动化程度。
4.2教材结构、内容调整方案
以函数、文件为主线,从应用出发,增加设计规则,精选教学内容,调整的教材结构、内容如下:①解决问题的思路与最基本的程序设计(函数的使用环境,结构化编程思想)②程序调试技术(函数的调用关系)③数据保存方式、基本数据类型、高级指针类型(函数的使用,指针的概念与定义)④结构化程序设计的三种结构(函数的较熟练使用)⑤构造的数据类型(一维数组、字符串)(函数的高级使用,动态指针)⑥构造的数据类型(结构体)(函数的高级使用,指针的联用)⑦文件及文件的使用(函数的高级使用,指针的联用)⑧构造的数据类型(类)和对象(函数的高级使用,动态对象指针)⑨继承、多态(函数的高级使用,动态转型对象指针)。
说明,函数不单列章节,而是不断地包容在其他知识中,其主要目的就是为了应用、深入、强化;另外,案例的呈现要遵循模块模型设计的4个步骤。
4.3思维训练课的设计方案
教学思维训练课预先成立3人研究小组,教学过程首先针对预先布置的同型题,公布答案并展开讨论;其次指定小组成员对典型变式案例集体答辩汇报,其他小组展开提问;最后由教师总结,并与学生对上机实验方案进行讨论。变式题答辩需注意:案例选择准确,难度梯度恰当,由浅入深,不能拔高,题数不宜太多(3-5题),预选准备,随机抽取小组。
4.4上机实验课调整方案
实验分实验前、实验中、实验后三个阶段。实验前提交实验预习报告,包括详细地模型模块设计和规范的程序代码,要求做到文档整齐充分;实验中坚持团队精神,坚持分工合作,重视调试过程和数据记录;实验后要求梳理心得,归纳小结。
4.5教学管理机制的监控方案
目前,我们采用“N+2”过程监督和考核考核方案(N是指多次过程考核成绩,2是指期末考试和学习读书笔记)。根据此方案,制定过程考核表、实验成绩表,考勤表,笔记成绩表等记录教学过程表格,定期数据分析,得到教学状态的折线图,及时调整教学。另外,每周确定固定时间与有学习有困难学生进行当面交流。
5结束语
从09年开始,我们针对“计算机高级语言程序设计”进行课改,至今已经进行4轮对比实验,教学效果显著,学生编程能力得到很大提高,但同时也暴露一些问题,如变式练习梯度过大导致学习困难、调试习惯没有养成等,今后教学中亟待改进。
从国际上看,我国学生的计算机编程能力相对较弱,在大型软件的开发上更是相形见绌,这与我们的培养方案及对课程的理解是有关系的,应当深入思考我们的教学内容、教学策略,目标定位。以规范为前提,以应用为导向,以合作为凭借,以先进的教学理念来完成这门课程的教学,作为高校教师,有义务、有责任为我们国家培养出合格的计算机人才。
参考文献:
[1]刘晓锋,吴亚娟.计算机专业《c语言程序设计》教学与教学改革 [J]. 四川师范学院学报(自然科学版),2003(3).
[2]皮连生.学与教的心理学(第五版) [M].上海:华东大学出版社,2009(144).
[3]张大均.教育心理学(第二版) [M].北京:人民教育出版社,2011(129-150).
[4] 王新光,万定生,张希伟.浅谈程序设计语言教学中工程能力的培养 [J]. 吉林大学学报(信息科学版)2005(8).
[5]侯进军.计算机高级语言的课程改革的目标与方法研究 [J]. 湘潭师范学院学报(自然科学版)2005(9).
作者:李祎