程序设计课程教学改革的反思
张标汉
我们学院的程序设计课程的教学改革从2010年开始已经走过4个年头,今年也有了第一届毕业生,从毕业生的就业情况看效果还不错。这4年来,我们C语言程序设计的教学依据理论和实践一体化的方式进行课堂教学,依托OJ平台训练学生的程序设计能力,也有了一定的成效,切实提高了部分同学的程序设计能力,为他们后续的课程学习打下了较好的基础。但在我们最近两年的C程序设计教学过程中也发现了一些问题,这些问题影响着我们教学改革的继续推进,是我们当下需要加以思考和解决的。
今年暑期我参加了在贵阳举行的培训班的学习,其间聆听了一些专家学者的科学办学的报告,也参加了院校间的教学改革经验交流座谈会,向一些院校的同行讨教了一些程序设计课程教学方面的问题,对照我们自身正在进行的教学改革,也有些体会和想法,在这里写出来与各位同仁做一次汇报和交流,希望能够起到抛砖引玉的效果,带动大家踊跃发表自己的意见,共同为我们的程序设计教学改革尽力。
我先谈谈暑期参加的研讨班的学习情况。这次参加贵阳的培训班、研讨会和座谈会的院校中,教学改革最为成功的当属石家庄经济学院的信息工程学院。他们的教学改革采用的是试点班的形式,从一个年级中选择30几人组成试点班(采用的是自愿报名的方式),从新生入学时即开始试点班的教学,试点班实行淘汰制,学不下去可以自行退出转回普通班学习。试点班的教学是个独立的系统,有自己特制的教学计划,配备最强的师资,院长亲自讲授1-2门专业课。学时上面也有充足的保证,比如程序设计课程是120学时,理论和实验分开授课,且是不同教师授课。他们的实验课是安排在周六上午,从8点到12点,由老师辅导,学生完成实验,教师逐个验收。据介绍,他们试点班学生的程序设计能力相比普通班学生有很大的提高,这直接反映在后续的数据结构课程中线性表的教学他们只安排2次课,而且他们的数据结构课程是所有内容均加以介绍,没有删减。他们也是今年有第一届毕业生,试点班30几个毕业生中考研的有10几个,且大部分是较好的科研院所。他们的教学改革经验受到教育部的关注,教学改革项目获得了教育部的经费支持。
对比我们自己正在进行的教学改革,我想从以下几个方面谈谈自己的看法:
一、 教学改革需要强有力的支持
教学改革的目标是为了培养出质量更好的学生,这是个系统工程,需要各方面的共同努力才有可能顺利达成这一目标。教学改革绝不能只改一两门课程,而应该从整个专业课程体系的层面来开展和实施。学生程序设计能力的培养绝不是一两门课程就可以做到的,它需要包括程序设计、数据结构与算法及其后一系列课程的学习逐步获得和提高的。因此,教学改革需要顶层设计,需要包括学院领导在内的专家们进行教改方案的精心设计,任课教师只是教学改革的实施者,教学改革需要领导亲自挂帅主抓,而不能只由任课教师们在那里摸索。理由有二,一是教学改革要着眼于全局,着眼于整个学生的培养,在这方面,更加具有全局观念的无疑非领导莫属;二是教学改革需要多方的协作,而在现实情况下有能量完成各方协调工作的还是非领导莫属。
二、 如何保证有足够的学时完成教学任务
我们目前处于一个非常不利的局面,就是专业培养方案的总学时数在不断减少,虽然经过尽力争取暂时保住了程序设计课程的课时数没有被进一步的压缩,但我们还是可以在教学过程中感受到学时不够的压力。那么,我们要如何解决学时数不够的问题呢?考虑到我们目前的理论和实践一体化的教学模式中,课堂教学中留了很大一部分时间给学生完成教师布置的练习题和作业,教师也花费了不少时间讲评这样的习题。其他课程的任课教师曾经质疑过我们这种教学方式,认为我们一个简单的问题都要花费一整节课来讲。
对于这个问题我觉得我们应该反思一下,我们花费这样的时间让学生在课堂上完成练习是否真的适当?我认为我们也许可以改变一下这种方式,因为原来这种方式确实存在着不小的弊端。首先,在课堂上留出较多的时间给学生练习确实能够起到帮助学生理解教师所授内容,但也无疑消减了教师讲授更多内容的时间,这对于我们在有限的学时内完成教学任务是有影响的。其次,这样的方式会造成学生课后的懈怠,课后不会进一步花时间复习和巩固上课所学的知识,客观上会造成学生自学能力得不到很好的培养。
因此,我觉得在今后的教学中应该改变一下方式,逐步压缩留给学生练习的课堂时间,尽量将作业留在课后完成。初期入门是可以多留些课堂时间给学生练习,以便所有学生都能够初步掌握程序设计的基本方法,但后面章节的教学中课堂练习的时间应该要减少一些,以确保教学任务的完成。学生课堂练习的时间减少了应该要补回来,从哪里补呢?当然是从课后补,应该督促学生利用课后的时间复习、完成练习和实验。当然,现在的学生自控能力差,在宿舍中完成练习、复习和预习的学生是很少的,因此,最好的办法是集中自习,在教室或实验室中集中自习,学院应该创造这样一个条件来满足这一需要。
三、 作业形式的多样化
我们目前的教学改革所获得的成绩在一定程度上得益于OJ平台,但我们也应当看到,OJ平台也有其局限性。首先,OJ平台上的题目形式单一,其往往是一个具体而细的问题,解决这类问题都是一个模式,学生依据题目的要求编写出一段程序,根据系统提供的多组输入数据输出结果,由OJ去判断代码是否能被AC。在这样一种模式的训练下,学生容易产生一种思维定式,对于系统级开发能力的培养可能会有不利的影响。此外,OJ平台在面向对象程序设计的教学过程中也是有不少缺陷的,至少我们目前无法做到判断学生提交的代码是否采用了面向对象的方法。
有鉴于此,我觉得我们除了布置OJ平台上面的题目作为习题和作业以外,我们还需要有另外的作业方式作为补充。课程设计也许是个不错的选择,依据石家庄经济学院信息工程学院的做法,他们是在讲授完循环依据后布置第一个课程设计任务——一个学生成绩管理系统,以加深学生对程序设计结构的理解;在讲授完数组后布置第二个课程设计任务,用数组的方式修改完成第一个任务;在讲授完指针和文件后要求学生用链表和文件的方式修改完成前述任务。据他们的介绍,学生经过这三个课程设计的训练后,学习效果是很好的。
四、 考核方式的讨论
考核是个指挥棒,学生的学习很大程度上是围绕课程的考核展开的。我们现有的考核是几次考试和平时成绩的综合。在2012级上我们曾经进行过多次的考试,一次又一次,考得有些学生说考得都想吐了。这样多次的考试出发点是好的,也是出于为学生着想,希望学生能够通过多次考试获得较好的分数,但是学生不理解、不领情。结果造成教师很累、在院里也有不少不同的声音,吃力不讨好,累了都不值。另外,这样反复的考试给学生一个错觉,以为这次考试没考好还有下一次,一次又一次,使得学生对待考试变得不严肃,失去了考试应有的威严。因此,我觉得我们的考试应该控制在一学期3次以内为宜,且不举办什么“补考”以加强考试的严肃性。
另外一个需要直面的问题就是期末总评成绩时补考率的问题,我觉得我们教学改革的成功与否与多少学生补考是没有关系的,我们成功的标志应该是学生编程能力的提高。因此,我们应当严肃考核,该补考的就是要补考,该重修的就是要重修,绝对不能放水,这一点应该全年级统一标准,这个标准要从严。考前不做模拟,不透露考题,使得学生从一年级考试就断绝各种不该有的念头,切实维护考试的严肃性,这也能在一定程度上促进考风进而促进学风的改善。
五、 加强学生管理
我们现在的学生基本上90后,其中多数是独生子女,再加上我们是二本院校,所招收的生源质量也不是太好,学生的自控能力差,脱离了教师和父母的监管和约束很容易放纵自己,沉湎于网络和游戏之中。教学改革所服务的主体就是学生,没有学生的参与教学改革难以成功。因此,加强学生管理,做好学生工作是教学改革不可或缺的。
我认为学生的管理工作主要还是要由辅导员来承担,而不能把这个工作压在任课教师身上。辅导员应当切实承担起学生管理的工作来,随时掌握学生的思想动态,及时的做好学生的思想工作。记得我上大学时的辅导员是与我们住在同一层的,每天早晚必定巡查所有宿舍一遍,早上检查谁睡懒觉,晚上检查谁晚归,晚归者第二天必定被全年级通报批评;每天上课必定执行上下午和晚自习三次巡查,逐个班级清点出勤情况,第一时间掌握谁旷课、谁迟到。另外,每周日完成必定实行晚点名,开年级大会总结一周的情况。可以说,我的辅导员在做好学生工作方面是兢兢业业的,包括向学生的英语四、六级考试他也是操心的,组织全年级暑期补习英语。此外,辅导员应该能够在专业学习上帮助学生,能够指导学生如何学习好专业课程,这一点对于学生认识自己所学专业是很重要的。
辅导员应当帮助学生确立以学为主的大学生活观,要让学生认识到大学生活是学习而不是参加社会活动,学生的身份是学生而不是社会活动家。这就需要学院和辅导员在政策等方面做引导,比如班干部的选拔和任命应当坚持学习成绩优秀这一基本条件,但我们的现实是往往班干部都是学习不怎么样的,这样的班干部怎么可能带领全班同学在专业学习上前进,怎么可能带出好的班风和学风?
再一个是要加强宿舍管理,要经常性的检查宿舍,出台切实可行的措施加强宿舍学风的培养,绝对杜绝同宿舍不学习的同学嘲笑学习的同学。是否可以考虑上课时间宿舍不留人,将学生都赶到图书馆和实验室去?
六、 课堂教学的注意事项
在教学过程中我们应当注意几个问题。
一是培养学生阅读源代码的能力,这是被我们当前的教学所忽视的一项重要能力。我们知道,程序设计其实是从模仿开始的,要模仿就离不开阅读别人的源代码,包括后面的操作系统课程也是需要阅读源代码的。因此,教学过程中我们布置一定的源代码阅读任务应该是必要的。此外,对于编程能力确实不行的同学,是否可以考虑考核他们的源代码阅读能力,尤其是数据结构与算法课程中,能否以这样一种考核方式代替编程考核?
二是培养学生程序调试的能力,程序调试能力是程序设计中重要的一项技能,这项技能掌握得是否好将直接影响学生学习程序设计的兴趣。试想如果学生编了一段错误的程序但是却不知从何处入手出错,这将是一件多么沮丧的事情,这无疑将极大的打击他的自信心,降低他对程序设计的兴趣。
三是给学生一定的压力,在教学过程中给学生布置有一定难度的题目,鼓励学生课后自学,自己通过网络搜索等方式去解决,进而培养学生的自学能力。
七、 辅导答疑
学生在学习程序设计的过程中难免会遇到各种问题,碰到各种困难,此时教师的辅导和答疑将把他们从泥泞中拯救出来,引导他们踏上程序设计的大道。我们应当通过各种方式对学生进行辅导,解答他们的疑惑,我目前采用的主要有课堂辅导,课后通过QQ群的方式进行,在QQ群上发布作业,对共性的问题在群论坛中解答。但我觉得对于刚接触程序设计的一年级新生来说,集中的辅导是必要的,是否可以在每天晚上和周末开放实验室供学生完成练习、作业和实验,开放时段的实验室的管理是否可以探索由学生来承担?
此外,学生作业的批改也是甚为重要的,我们目前的方式是OJ系统自动判断,但必要的人工阅读学生代码也是必需的,这有助于我们发现学生程序中的问题,尽管他的程序被AC了。
八、 师资培训问题
虽然我们目前所进行的程序设计教学改革针对的是C语言程序设计和数据结构与算法分析课程,这样的两门基础课程似乎不会太难,我们的教师也似乎都能在一定程度上承担这样的教学任务。但是真正要把这两门课程上好,上的有艺术,能够从专业全局的角度来上,我觉得我还远远不够。因此,适时的派出任课教师外出培训学习是必要的,一来可以和同行交流吸取他们的先进做法,二来也能够让任课教师拓展知识面,深化对课程的认识从而更好地为教学改革服务。这次历时21天的贵阳暑期培训我们学院就我一人参加,而其他院校基本都是在5人以上,尤其是石家庄经济学院信息工程学院更是派出了多达17人的队伍参加。这次参加暑期的培训,我觉得还是收获很多,尤其是对程序的调试技术及其在程序设计课程中的重要作用有了很深的认识。