陈宁宇,王智群
(湖州师范学院 信息与工程学院,浙江 湖州313000)
Association for Computing Machinery(简称ACM,美国计算机协会)是一家具有科教性质的协会.协会通过广泛开展行业交流活动,以聚集全球计算机领域的专家、学者、教授等,共同解决计算机领域存在的难题.ACM International Collegiate Programming Contest(简称ACM/ICPC,ACM国际大学生程序设计竞赛)由ACM主办,是世界上公认的参赛规模最大、参赛水平最高的一项极具影响力的赛事[1].
ACM/ICPC竞赛要求学生以组队形式参加,每队不超过3人,比赛时间一般为5个小时,参赛选手可以选择很多的计算机语言,如Pascal、Java、C、C++等等,最后成绩和排名一律由电脑根据在线解决的题目数和总的递交情况自动评判和给出.ACM/ICPC在中国影响不断扩大,赛事不断增多,就在今年4月,浙江省举办了“浙江省第九届ACM大学生程序设计竞赛”.
近年来,各高等学校越来越重视各类学科和专业的实践性教学环节,强调实践性教学对培养应用型创新型人才的作用,并进行了很多的实践性教学改革和创新活动.但就程序设计类课程而言,由于实验手段和实验条件没有得到多大的实质性改变,这些改革和创新并没有在实践教学环节取得很大的实质性成绩,也往往没有达到理想的教学效果.传统的程序设计教学方法依然存在这样或那样的缺陷,主要表现在以下几个方面.
目前,大部分程序设计类课程依然采用传统的灌输式教学方式.这种教学方式的最大问题在于学生完全是被动地接受知识,课堂中师生互动有限.因此,学生往往缺乏思维与想象力、创造力,以及自主学习意识[2].而程序设计课程本身就比较枯燥,越上到后面内容就越难,且由于程序设计课程内容的前后关联性较紧,若前面没学到位后面就很难跟进,这就造成了学生接受知识的能力受到限制,学生很难完全掌握好这些课程.
传统教学对实践环节重视程度还不够,很多程序设计类课程只要求学生从理论上掌握相应的知识点,对实践则要求较低,从而造成有相当一部分学生的实际编程水平较低,程序设计和调试能力很差3.很多考试成绩很好的学生并不是真正地理解和学好了课程知识,而是靠笨拙方法——死背课本上的程序.同时,在考核方式上,传统的教学方法也总是重结果轻过程,整个教学活动没能真正完成当初教学目标所制定的任务.
传统的程序设计类课程在进行实践教学时,往往都是按课本章节内容的先后顺序,独章或独节的独立设计出一个个实验.如《C语言程序设计》课程,往往会依据各个语法知识点来设计一个个实验.再如《数据结构》课程,则会依据不同类型的数据组织方式设计一个个实验.这样,学生通常把注意力只集中在每个单独语法或数据组织方式中,忽略了对课程概念的整体性把握,忽略了在解决较大规模问题时对课程知识综合运用能力的把握[4].
传统程序设计课程在进行实验时,往往是老师在讲台上布置实验任务,学生在各自电脑上完成相应的编程任务.这其中一个比较大的工作量就是老师对学生实验结果的检测以及其后的实验报告的批改.试想,如果一个班级有45个学生,每个学生都要老师一个个地去读他们的程序(有可能还要帮调试),一个个地去批改他们的实验报告,有时还可能要防止同学间的抄袭,这个工作量非常大[5].更为重要的一点是:实验过程太枯燥,很多学生不想或不愿意主动地去认真完成作业,敷衍了事,相互间抄袭现象特别严重.这样造成的后果是实验效果较差,学生在实验课上偷偷玩游戏、看电影、上QQ的事情时有发生.
ACM/ICPC极大地开阔了学生的眼界,对学生实践能力、团队合作、创新意识,甚至英语水平等均起到了非常好的促进作用.ACM/ICPC模式对程序设计课程教学具有很好的促进作用.将ACM/ICPC模式融入到程序设计课程的教学之中可以进行如下方面的教学改革.
ACM/ICPC比赛是组队赛,要求每队的学生不超过3人,比赛时间长达5个小时,所以比赛比的不仅仅是队员的知识和智力,更多的可能是他们的心理、意志和体力.同时,比赛中更为重要的一点是3人之间的合作,这种合作也是现在社会普遍所需要的一种优良品质.在《C语言程序设计》课程教学中,结合ACM/ICPC的这种组队方式,培养他们的合作意识,同时通过引入积分机制,培养他们的学习兴趣.
在教学过程中,将班上同学分组,每组设立组长,和ACM/ICPC模式一样,三人一个小组(主要是学生相互之间自由组合,必要时老师协调),每个小组都会为自己起一个独特而有意义的名字,像“孤独的根号3”、“打酱油的”、“三个火枪手”、“听说队长也找不到”等等.每个小组最初的分数都为0,在整个课程当中他们会通过很多途径获得分数.分数总共分为5个等级,分别是幼儿园(0~20分)、小学(21~40分)、中学(41~60分)、大学(61~80分)、研究生(81~100分)等.学生获取分数的途径如下:
(1)课堂主动回答老师的问题获得1~2分.回答问题时,如果同组其它同学觉得问题回答得不够完善可以进行补充,这会增强小组的凝聚力.
(2)课堂上提出一些有新意的问题也可获得一定的分数,这主要是为了培养学生的创造性思维.
(3)主动在校ACM网站上做题也可获得相应分数.
(4)学生有问题也可在C语言教学网站上提出问题并获得1分.
(5)有课间问题讨论的学生也可获得分数.同时,像很多游戏一样,各组之间还可以相互赠一定数量的分数.这些做法要求每组成员间要充分合作,充分交流.
结合ACM/ICPC积分制的方法在积分时的工作量很大.但事实上,老师只要把握好课堂上的积分,其它的积分可以交给ACM校队成员来帮忙完成.ACM校队成员帮助学生回答网上“网上互动”板块提出的问题并帮忙计算积分,也帮忙解决了“课间讨论”板块的问题并帮忙计算积分.事实上,由ACM校队成员替老师回答学生的问题有很大的优势,因为他们也是刚刚学完这门课,知道学习中会遇到哪些问题,知道哪些问题该如何回答,而且学生也乐意和这些学长打交道.
为了增加学生对积分的重视程度,学期结束时将小组积分以很大的比例计算在学生的平时成绩中.小组积分特别高的还可以免期末考试.每学期每班都有1~2个学生获得免考的资格.
ACM形式的C语言程序设计教学在获得学生的认可中,可以进一步举办相应的比赛来引导学生学习.在这些赛事里面,最重要的是新生联赛.《C语言程序设计》是大学第一学期的课程,在上完《数组》这一章时,就在自己的ACM网站举办ACM新生联赛,一般放在周末,并在下周三组织进行题目讲解.这种新生联赛一般要举行4~5次.当然这个工作量很大,所有出题和讲解都由校ACM队员完成.为了充分调动学生的学习激情,新生联赛的题目往往都偏简单,为的是让学生充分感受到AC(accepted,答案正确的意思)的快乐.
另一个比较重要的赛事是月赛,全校有兴趣的学生都可参与.月赛题目也比较规范,由老师和极个别的学生来共同完成,一般都是原创题目.月赛的整个操作流程也比较正式,像省赛一样,每人分配比赛账号,现场有志愿者发气球,按比赛成绩给予奖励.
还可以设ACM女生联赛专场和ACM圣诞节专场等等.为了更好地促进这些赛事的实施,可以将这些赛事成绩直接反应到学生相应课程的个人平时成绩中,成绩特别优异的学生同样也可申请期末考试免考.学生们都很积极地参与到这些赛事中去,这一系列的赛事也反过来提升了学生学习程序设计的热情.
ACM后台测试数据严谨,学生不但要找到解决问题的思路,同时还要有缜密周详的思维,更不能忽略掉任何一种可能情况,否则递交的答案就不会被通过.另外,ACM竞赛涉及的知识面很广,有数据结构、组合数学、图论、数论、离散数学、算法设计等等.
在《C语言程序设计》课程即将结束的最后两周,可以让学生以小组为单位,相互出题给对方做.在大部分ACM赛事中,题目基本上是高年级学生出的.学生们往往会从自己的周边环境或学校环境出发,构造相应意境的题目,这些题目会吸引另外的学生去做.让学生参与ACM命题,会培养学生细密谨慎的思维,拓宽学生的知识结构.学生出好题目,相互间交换反复看题目,改掉最基本题目描述中的语言表达错误.学生在出题的同时要把握好题目的知识结构,要主动去阅读一些知识.在写题目的后台测试数据时,必须要有慎密的思维,不能漏掉任何一种情况,当然更不能出错.同时,出题的过程也进一步培养了学生的学习兴趣与编程能力.
实践教学是程序设计课程教学中非常重要的一环.在进行实践教学时,为了提高学生对实践教学的热情,增加综合性和设计性实验,达到更好的实验教学目的,也可采取全程ACM/ICPC形式.
ACM/ICPC将题目趣味化,它往往将一个题目设计成故事形式,从而引起学生的兴趣.递交的答案可在线即时判别正确与否,这也是ACM/ICPC吸引学生的第二个原因.利用这些原因我们可将程序设计的实践教学改成ACM/ICPC性质.例如,在《C语言程序设计》课程的课内实验中,在前面一些基础知识讲述完后,后面的实验就采用ACM形式,每次实验放以相关知识点为主的4~6个题目,同时放开时间,如学生课堂上没有做完,则课后还可以接着做,而绝大部分学生都是在课堂或课后主动完成的.在《C语言程序设计》课程的前期,因为学生学习的知识有限,实验一般采用程序设计填空或改错的形式,由学生来完成以得到完整正确的程序,在后期则完全是由学生编写程序.
在实践课程《程序设计基本训练》中,我们也采用了ACM形式,每次实验课在校ACM网站上做综合知识点的6~8题(系统一般开放一个星期,课堂做不完的话可以用一个星期的时间去完成).《算法设计与分析》课程的实践教学也可采取这样的形式.
考试是对学生课程学习情况的一个检阅,但就这些对实践要求很高的程序设计课程而言,如果主要用考试来衡量学生学习的好坏是不对的.在对学生进行课程成绩的总评时,可将原来的考试成绩/总评成绩的比例由改革前的70%降低到的50%,另外的50%是平时成绩、实践成绩,以较大比例反映在平时成绩中,这样可以较好的避免学生靠死记硬背来获取高分.
ACM/ICPC比赛形式新颖独特,有趣味性、专业性、对抗性、团队协作性,将ACM/ICPC融入到程序设计的教学当中,收获效果明显.
ACM/ICPC的趣味性和即时判题性极大地调动了学生学习程序设计的兴趣和热情,使原本枯燥的学习变成了趣味学习,学生学习程序设计的热情大大提升,很多学生由被动学习变为主动学习,学生们自觉建立了学习QQ群、ACM论坛、ACM社团,也会主动找老师、学长或同学交流,或者自己在网上寻求问题答案,也使学生的编程兴趣和编程能力得到了很好的提高.
湖州师范学院在2007年建立了自己的ACM 题目评判系统(内部网址:http://172.20.137.106/JudgeOnline),到2011年底的访问量已高达810000多次,C语言教学网在不到两年时间的访问量也达到89000多次,也经常看到学生在QQ群里交流编程算法问题.事实上,引入ACM/ICPC形式的程序设计教学后,很多任课老师都觉得学生的编程兴趣和编程能力有明显提高.如08级学生已经有相当一部分学生在从事自己感兴趣的编程工作.当然,在浙江省ACM程序设计竞赛取得的优异成绩也和此教学改革是密不可分的.
ACM判题系统即时检测实验结果,实践形式非常好,获得了老师和学生的一致好评.对老师而言,这种实践形式简单、方便,实践结果检查容易,可以直接在网上看到学生每一题做对与否,每次实践以及总的实践成绩也自动由电脑记录下来.对学生而言,每AC一道题的成就感是巨大的,就如同玩游戏过了一关一样,这种实践形式明显增加了学生的学习激情,不再枯燥乏味,且实验课也可以大大增加综合性和设计性实验的比例.
在教学改革过程中,因为综合性实验比例的增加,无疑会提高学生的综合设计能力.同时也带来了一些很好的“副产品”:① 提高了学生的英文水平.因为ACM/ICPC题目都是英文的,在长期的英文题目阅读中,学生的英文水平在不知不觉中有了很大的进步.更有很多学生出于对ACM/ICPC的强烈兴趣,但又受制于英语水平的影响,从而决定好好学习英语.② 在ACM/ICPC形式的教学中,学生经常参与ACM/ICPC竞赛,这种以小组形式参与的竞争会促使学生形成一些好的品质,如良好的协作精神、稳定的心理素质、快速的临场应变能力等.
ACM/ICPC教学模式将课堂理论学习和实践学习有机结合起来,促使学生由被动的学习转化为主动的探究,从而充分调动了学生的学习积极性.ACM/ICPC教学模式有助于培养学生的逻辑思维、抽象思维,提高编程能力、学生的心理素质、团队合作能力,这种探索能够推动计算机程序设计课程的建设,当然,这个探索仅仅是初步的,程序设计类教学改革还需继续深入,以期培养更多高素质、高水平的计算机专业人才.
[1]王宏,吴文虎.清华实践教学“赛课结合”新思路[J].计算机教育,2006(7):10~12.
[2]徐小青,李晓东.“高级语言程序设计”课程教学改革与实践[J].计算机教育,2009(13):46~48.
[3]杨松涛,王斌.从 ACM/ICPC竞赛探讨大学生的能力培养[J].计算机教育,2010(24):16~18.
[4]武建华.基于ACM模式的数据结构实践教学改革与探索[J].计算机教育,2009(13):114~116.
[5]于世华.基于ACM竞赛模式的程序设计教学改革研究[J].呼伦贝尔学院学报,2011,19(4):113~116.