时间:2024-08-31
张鸣华
要从事计算机专业,程序设计是必不可少的一门课程。程序是计算机可以懂的一系列指令,是计算机的灵魂。程序设计就是设计出能在计算机上运行的、符合人们意志的代码。程序设计教学就是教会学生编出能解决问题的、使计算机运行的代码。然而,我们的教学结果有太多的失败和困惑。计算机专家们在呼吁:我国的程序设计不如人,一些硕士生导师及博士生导师们在呼喊:竟然有研究生不能调试代码!尴尬现状让我们思考,程序设计的实质究竟是什么?程序设计的教学之路在何方?笔者通过向清华大学的吴文虎老师、上海交通大学的俞勇老师、北京工业大学的蒋宗礼老师等贤人的学习,以及与同行计算机老师的交流与探讨,对程序设计的实质有了更深的理解,程序设计的教学应该从本学科的特点出发,让学生遵循认知规律学习。
在C语言中,最简单的一个程序的结构要有头文件(由编译预处理指令#include把头文件信息调入)和主函数(main)部分,要使用一个变量,必须先定义这个变量再使用,要使用一个函数,声明后还要定义才可以使用。程序运行时要先把代码编译成.obj文件,再把.obj文件连接成可执行的目标程序.exe。程序是可运行的、完整的代码,任何一个语句,一条规则都只是其中的一部分。当我们离开开发环境,用PPT肢解出一条条规则时,学生就不能完整地写出一段能解决问题的代码。
一个众所周知的公式是:程序=数据结构+算法+代码。不知道用什么算法让计算机进行运算,设计程序无从下手;不知道如何用变量表达问题中的参数,就不能把问题转化成代码的模型;不会用语句表达算法,就写不出完整的代码。因此,学习程序语言就应该结合问题,先分析用什么算法、然后确定用什么数据结构表达问题中的量、再用代码把思路表达出来。
我国成功的程序设计教师都得出同样的结论:编程不是教会的,而是练会的[1]。即使把语法背得滚瓜烂熟也不能写出完整的代码,要把教学重点放在解题的思路上。北京工业大学蒋宗礼老师统计得出:一个成功的软件方向的大学生在校的编程量要有4万行代码,最低也不能少于2万行代码[2]。学有成就的学生也得出这样的结论:眼过千行不如手敲一行。看人家的代码不如自己写代码;看人家的算法不如自己想算法。
程序设计的教学就是让学生从动手敲代码开始。比如第一课就让学生编程输出“Hello”,让学生感知程序设计的完整过程,认知开发环境,学习实践的方法。程序设计入门的重点是培养学生的兴趣和建立编程思维,要由简到繁、由浅入深。开始用简单的公式、计算、简单判断等单一的问题引导学生,然后再不断综合练习要解决的问题。教学是不断示范、指导、纠错的过程,开始的算法是求和、求最值(比较)、求公式的值、系统函数、求数列的和等。开始的数据类型先用int、float、double,以各个知识点引导学生看书。带学生处理好数据结构,教会他们如何选择数据类型和设计数据的个数及处理方法,有限个(若干个)怎么处理;不定的怎么处理;有T种案例,每一种案例又有若干个数据的怎么处理。开始要鼓励学生多做题,培养学生解决问题的勇气。入门成功就相当于培养了学生良好的学习习惯,营造了良好的学习风气,接下来分析、引导,让学生举一反三;最后引导他们独立思考,实现自主学习。
程序是人们驾驭计算机的通用智力工具[5]。工具的价值在于使用,不只是学习。使用就是不断从问题出发,用这个工具去解决问题,而把需要解决的问题转化或抽象成数学模型是解决问题的途径,如解决数学问题,无论多简单或多复杂的问题都要形式化为数学式子或相应的操作步骤。因而,学生要顺利使用程序这一工具去解决问题,必须具备较强的数学基础、训练独特的编程思维方式,以及学习计算机能够“懂”的语言。
学生要提高应用程序工具解决问题的水平,是在不断使用的过程中实现的。因此程序设计的学习,就从写代码解决问题开始,而不是从背变量类型等开始。写代码从简单问题开始,循序渐进,让思维螺旋式上升。如循环语句,先简单使用,让学生认识;再解剖应用,让学生会用;再三种循环对比,让学生灵活应用;再嵌套使用,让学生能综合应用。程序这个工具中极其重要的部分是调试,不会调试就是不会编程。不经历数十次甚至数百次的调试挫折,便不能完成一个项目的调试工作。程序有很多不同功能,更有很多创造性的使用方法,教学不可能穷尽所有的细节,因此,必须教学生科学的学法,让学生自己去学,而不是让学生背标准答案,即教师授之以鱼不如授之以渔。
可见,程序设计是运用综合能力和知识去解决问题的过程,解决问题是根本的和最终的目标。要以问题驱动的模式进行教学,让程序这个工具的使用越来越灵活,让学生不断提升解决问题的能力。
思维活动是人们自觉的、独立的行为,是对问题进行内化的过程。程序设计的思维包含计算思维、逻辑思维、抽象思维等,是一个高级思维活动[4]。
计算思维是人类借助通用智力工具求解问题的一条途径,涉及理解和运用计算机科学的基本概念、递归思想、抽象化、形式化、枚举、搜索、启发推理等。逻辑思维是将问题转化为逻辑表达式,而把问题转化成数学模型是抽象思维。程序设计要综合应用这些思维方式,比如算法中的递归、枚举、搜索、动态规划等就是这些思维方式的应用。
思维具有广阔性、敏锐性、灵活性、深刻性和创造性。要提高学生程序设计能力,必须在课堂教学中有计划地进行思维训练,如:联想、推理、对比、归纳、反思等。如果一堂课只是罗列知识、内容简介,学生就会开小差或离开课堂。思维是拥有自主能力、有完美人格人的脑力劳动过程,一个沉迷于网络游戏不能自控的人无法进行这样的思维活动。提高学生的思维水平先要培养学生的人格品质,培养自主性、自觉性。兴趣是思维的动力,要深化思维的训练就要先培养学生对要思考问题的兴趣,枯燥、死板、无逻辑性的方式无法激发学生的思维。我们程序设计教学要充分利用程序设计在线测试平台来提升学生的编程兴趣,学生一旦提交解决问题的代码可以马上知道是否正确,可以与其他同学进行比较和交流,可以一次次尝试解决问题带来的挑战和挫折,学习的过程是充满兴趣的、有深层思考的、自觉的过程。
科学院院士李未说:“在不远的将来,程序设计和数学建模与微积分、高等代数、大学物理一样,成为所有大学的核心基础课程。”吴文虎老师指出程序设计课程目标[5]是:第一,借助程序设计的知识载体,学习和掌握基本问题的求解过程和基本思路;第二,建立算法意识,培养良好的思维习惯;第三,从学科方法论上打基础,培养计算思维能力和分析问题解决问题的能力。程序设计课程承担着知识的传承、能力的培养和良好习惯的养成的任务。一些有识之士指出,目前中国的教育是隐含着功利的教育,失败的教育。俞勇老师在介绍ACM队优异成绩时特别指出:要反思中国的教育、转变教学理念、改变教学方法。培养一个优秀的ACM选手,不仅是要培养技能,还要考虑非技术的实力:动力、习惯、能力和心理。上海交大ACM班的理念是先做人,后做学问,在做学问中学会做人[3]。
吴文虎老师说:“课堂教学重要的是要唤醒学生的力量,培养其自我性、主动性、抽象的归纳力和理解力”。学生学会的东西不是我们教会的,而是通过他们自己内化的。我们的教学是用微笑呼唤学生、用情感去感染学生、用认真与执着去规范学生、用知识的魅力去启迪学生、用思维去带动学生、用示范去引领学生。程序设计的教学本质是人的教育。我们的课堂就是要从细节处,引导学生面对问题,学会思考并解决问题。
考试是教学的指挥棒,怎样考,教师就怎样教,学生就怎样学,离开了开发环境去考学生的填空、选择,必然会产生死记硬背及投机取巧的学习方式。清华大学博士生导师吴文虎说:“传统的教学方式是:好教、好学、好背、好考,但不好用;不能激发兴趣;编不出程序,影响到后续课,影响研究生的水平;学了许多语言,学得快,忘得更快;考核方式不对”。他还指出:训练与考核方式要一致,动手编程才是正确的学习方法[5]。程序设计的考试应该在真正的开发平台进行,给出问题,由学生完成代码,机器过了才算,如果不过,多练几次就过;如果学生基础差,可以适当简化问题、降低要求。只要有正确的考试方法引导,学生就会学到真本事,做到可持续学习。ACM队的一位选手、小老师说:“不能用选择、填空题来衡量一次程序设计考试,程序设计考试离开开发平台将变得乏味,例如:一个题考有符号int的最大值(VC+环境下),如果用手计算你得求:2^0+2^1+2^2+…+2^30的值,这是一个痛苦的计算,为了得分考生只能选择死记硬背,然而在开发平台,你只要输出0x7fffffff的值即可得到答案。”
考题不仅体现内容的特征,还是教学的体现。教学中的重要细节,知识脉络中的重要节点都要以有意义的方式出现,不要去出偏的、做作的问题,特别不要把知识点打散了让学生背,这样不仅不能培养学生的创新能力、解决问题的能力等,还会泯灭了学生的学习热情。
严明的考风是教学的保证。如果考试中有投机的成分,就会有学生平时敷衍对付,影响自觉学习。我们要不断改进考试的控制方式,让学生独立完成,如:采用IP限定等手段,还可让不同层次的学生选择不同分值的问题,让考试能反映学生真实的水平。
考试是平时教学的缩影。只有一次期末考试,便会出现随机性,有些学生会出现平时不学,临考试再来加班的现象。我们实行分阶段考试,各阶段的测试都占有一定比例,期末占%40。平时有不同方式对应着成绩的一部分,督促学生认真学习。
总之,程序设计的教学是理论与实践一体化的过程。吴文虎老师五十年的教学生涯,十余年的教改之路总结出一个成功的教学模式与思路:问题驱动(引发兴趣)-->理出思路(抽象思维、逻辑思维形式化)-->建立模型(归纳模型化)-->构思算法(算法设计)-->程序实现(程序、结构、编码、调试)。这也是我们程序设计教改的成功之路。
回顾这几年的教改,实施的是让学生动手实践、用问题驱动的方式。现在我们的学生能够在省ACM编程竞赛中获得名次、搭建程序设计在线测试平台、完成三钢生产线上的钢包跟踪项目。数学与信息工程学院以C语言硬过的方式全面进行教改,大批学生会编程、爱编程,学生的专业学习有了基础,学院有了好的学风。
参考资料:
[1]吴文虎.信息科技教育与培养创新型人才[R].湖南长沙:清华大学,2011.
[2]蒋宗礼.明确定位,构建科学有效的课程体系;瞄准目标,提高课程建设与教学水平[R].湖南长沙:北京工业大学,2011.
[3]俞勇.竞赛与人才培养[R].湖南长沙:上海交通大学,2011.
[4]吴文虎.论拼搏精神与良好心态[R].湖南长沙:清华大学,2011.
[5]吴文虎.程序设计基础的改革思路[R].湖南长沙:清华大学,2011.
[6]常子楠.基于ACM模式的程序类课程实践教学探索[J].计算机教育,2010(16):144-146.
[7]邱钦伦.CDIO与软件人才培养[J].计算机教育,2010(11):14-17.
[8]刘志宏,刘舟荷,张雯晖,段需勤,孔丽.项目教学法在C语言教学中的实践与研究[J].中国成人教育,2010(4):139-140.
[9]夏承遗,李文杰,孙世温.问题驱动的“C++程序设计”教学方法研究[J].计算机教育,2010(1):122-125.
[10]卢昌荆,王红雨,林克明等.新建本科院校IT类应用型人才培养新模式的探索与实践[J].计算机教育,2009(4).
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!