王树梅,杜 明
(江苏师范大学 计算机科学与技术学院,江苏 徐州 221116)
2020年初,突如其来的疫情改变了学校课程的教学方式,江苏师范大学积极响应教育部“停课不停学”的号召,全面部署2020年春季学期的课程实施方案.数据结构作为计算机专业的核心课程,需重新设计其教学过程才能不影响学生学习效果.尤其是对于教学起到重要作用的课程实验,如何保质保量地完成实验教学是任课教师必须思考的重要问题.
数据结构实验是锻炼学生运用数据结构基本理论知识解决实际问题能力的重要手段,也是验证算法正确性和复杂度的主要教学组成部分.诸多一线任课教师在数据结构实验教学的改革方面进行了探究[1~4],总结了一些适合于各校具体情况的改革方案.陶影[5]认为数据结构实验教学应重视算法设计和实践动手能力的培养,针对大部分学生的弱项进行编程强化训练,适当增加学生的实践机会.柳欣[6]提出了一种基于BOPPPS 模式的实验教学设计方案,将实验内容分为由易到难三个层次,通过设置“陷阱”达到体验式教学的效果.武建华[7]则将ACM竞赛模式引入到数据结构实验教学中来,为学生营造一种自主学习氛围.张桂芬[8]将实验课分为三个环节:课堂展示环节、基础实验环节和综合实验环节,注重培养学生动手和创新能力.张兆维[9]提出了“立足理论、弱化代码、鼓励创新”的实验教学设计方法,将实验与理论知识紧密联系起来.
本文根据疫情背景下的实际情况,对数据结构实验教学进行了改革.教学实施借助云班课和CSTLAB两个平台,对课前、课中和课后三个学习环节进行了详细安排.以“顺序表实验”为例,从基本理论知识的理解到实验内容的安排递进式推进,并说明各个步骤具体完成的任务和达到的教学效果.
(1) 实验教学课时偏少
数据结构实验教学课时在整个数据结构课程教学中所占课时相对较少,以江苏师范大学计算机科学与技术学院19Z计科班的数据结构课程为例,总课时102,实验课时32.十个章节的内容,每章至少两个实验,树、图、查找和排序四章的实验比较多[10],仅靠实验课堂上的学时远远不能满足教学的需要.如果需要现场调试代码,根据要求修改代码,一节课可能只能完成一个实验的程序编写.因此,实验教学必须改革,要在有限的课时内完成满足专业要求的实验.
(2) 实验题目类型单一
一般情况下,数据结构实验题目有三种类型,分别是验证型、设计型和综合型[11].实际上,由于实验课时的限制,之前的实验题目类型大都为验证型,即学生在实验课上验证教师课堂上讲过的程序.比如,教材上的例题已经给出核心函数代码,学生只需添加一些导入函数语句、变量定义和基本运算定义,主函数就可以运行了.也有直接给学生布置某一种数据结构基本运算作为实验作业的,学生基本不用思考,照着书输入代码就可以完成实验.这种实验教学虽然可以与理论知识紧密联系,但是不能够锻炼学生思考问题和解决问题的能力.
(3) 过于弱化代码编写
学习数据结构的前提是具有扎实的编程基础,掌握C/C++编程方法,能够根据题目内容找出需要定义的函数.由于学生的编程基础参差不齐,只有少部分学生能够独立编写出程序代码,大部分学生还是需要教师提供大量的参考代码.比如,一个关于顺序表的题目,教师会将顺序表所有基本运算函数代码和主函数都提供给学生,学生只需写出算法函数.这样做虽然也能够锻炼学生的算法设计能力,但是对于学生编写整个程序锻炼不够.
(4) 忽略算法性能分析
算法性能分析一般是在数据结构第一章中讲述的.时间复杂度和空间复杂度是衡量算法性能的主要指标[12].在进行算法设计时,算法性能是必须要考虑的问题.从近年数据结构课程实验教学情况来看,课程开始时比较重视算法时间复杂度分析,但到后来就基本上忽略了算法时间复杂度.这种情况的出现和学生自身的编程基础有关,也和教师放松要求有关.学生只要完成了实验作业的代码编写并且编译没有错误,结果正确即可完成实验.这种情况会误导学生在设计算法时只追求结果的正确性,而忽视了算法性能的优劣.
(5) 教学评估方式简单
数据结构实验的评估方式大多数情况下采用实验报告或电子邮件附件,实验报告中包括实验目的、实验内容、程序源码和运行结果等.从提交的实验报告中并不能看出学生真实的实验过程,甚至存在抄袭现象.有的学生实验报告写得很整洁、结果也正确,实际上却不会编写程序.这种评估方式过于简单,需要多元化和过程化,需要数据支撑说明学生真实的实验情况.这种评估方式会让学生以为只要实验报告交了,实验就完成了.事实上,这样的方式只会造成“眼高手低”的现象,不能够达到实验教学的目标.
由于疫情的原因,学生无法到校上课,所有的教学过程需要在线上实现.数据结构课程教学分为两大部分,分别是理论教学和实验教学.理论教学一方面借助SPOC教学资源实现,一方面利用腾讯会议直播平台对课程难点和重点进行详细讲解.数据结构课程共有102课时,其中理论学时70,实验学时32.理论知识的教学方式与原来教学方式差别不是太大,主要还是采用翻转课堂方式教学[13],只是这种翻转课堂全部在线上完成.实验部分的教学则需要进行大幅度改革,将全部的线上教学分为课前、课中和课后三个阶段,改革方案如图1所示.表1是以顺序表实验为例的教学设计案例.
图1 数据结构实验教学改革方案
表1 顺序表实验教学设计
(1) 课前:理论准备,实验布置,发现问题
相对于疫情前的教学,疫情后的教学更加注重对学生的学习监控、监督和评价.学生自身的学习有线上线下之分,但是教师对学生学习情况的了解全部依赖于学生在各个学习平台上的表现.每位学生的实验作业的完成情况、算法理论思想的掌握情况以及重点难点的分析情况,教师都是从学习平台上的学习数据得到的.利用好每个学习工具和平台是疫情时期实验教学的必要条件,也是学生完成实验教学目标的重要抓手.
数据结构实验培养学生利用数据结构理论解决实际问题的实践能力,通过实验可以检查学生理论知识的掌握情况,也可以检查学生的编程能力.理论和实践在实验课这个环节上进行紧密结合,两者缺一不可.比如顺序表实验,不但要求学生对线性表的逻辑结构特点和顺序存储结构特点掌握熟练,面对实际问题时能利用顺序表解决问题,还要求学生具有熟练的编程技能,可将算法思想在计算机上运行出结果,验证算法的性能.
CSTLAB平台对实验作业有自动打分的功能,可根据学生提交的源码对给定的数据进行测试,如果测试通过就是满分,否则就是零分.其实,这种评判方式对学生是不公平的,有的学生实验源码思想是正确的,代码上也只是个别地方出现格式错误,但测试没有通过就无法得分.为此,我们组织助教对学生每一次提交的实验源码和实验成绩进行重新审核和修订,并将修订记录保存在每个学生的作业中作为加分或者扣分的依据.这种批阅实验作业的方式比较适合于学生不能提交书面作业的情况,而且这种方式比较及时公平地对每一位学生的实验作业进行了审阅.
每次实验作业题目难度不同分值不同,一般来讲,难度大的分值也大.比如顺序表实验的3个不同难度不同分值的题目,理论和编程都学得比较好的学生会选综合性比较强的“多项式相加”(30分),而学习稍弱的学生会选“顺序表基本运算”(10分)和“集合运算”(20分).“多项式相加”实验不但要求学生掌握顺序存储结构特点,还要设计出3个基本运算:创建多项式顺序表CreateListR函数、输出多项式顺序表DispPoly函数和多项式顺序表按指数域递减排序的Sort函数,还有一个实现多项式相加的函数Add.而“顺序表基本运算”实验主要函数代码课本上都已给出,再补充一些语句后主函数即可运行,相对容易实现.“集合运算”实验包括集合的并、交和差三个运算,相对于多项式,集合在存储上比较容易实现.一般来讲,存储结构上简单的数据结构在算法设计上也会相对简单.通过学生课后的反馈,教师可有针对性地因材施教,对不同的学生进行不同的指导和答疑.
(2) 课中:知识梳理,实验展示,总结问题
课上环节,教师先对课前的学习情况和发现的问题进行总结和梳理.主要就本次实验题目在CSTLAB平台上的完成情况,包括提交率和平均成绩等,进行简单概括.若遇到特殊情况,比如测试数据中的空格问题,以及实验题目的输入输出内容不全问题,要向学生进行统一说明.
学生完成了课前的实验理论知识准备和实验作业的提交后,课上利用腾讯会议平台对已完成的实验进行展示.由于时间关系,每次课只能随机抽取5位学生共享屏幕展示实验程序运行情况.具体过程:第一步,讲述题目内容和需要解决的问题;第二步,以流程图的形式讲述解决问题的算法思想;第三步,按照算法思想讲述程序结构、定义的函数和结构体等,最后运行程序.
这个过程中,教师根据实验内容和相应的程序代码,对某一部分提出即时问题并要求学生现场修改.同时,也要求其他学生对在展示实验提出问题,可以是算法思想的问题也可以是代码本身的问题.每位学生的展示过程不仅仅是保证自己的程序运行通过,还要正确回答各种问题和根据问题修改代码.如果学生正确回答问题并成功修改代码,就增加5个课堂表现经验值.如果部分问题没有回答出来,那么加分依次递减.
学生展示结束,教师对每个实验作业的程序以及学生展示过程中提出的各种问题进行讲解.这个过程中需要和学生进行互动,鼓励学生提出新的问题和算法设计思想.教师不是对每一道实验题目都进行详细讲解,那些比较简单的、学生疑问较少的实验运行一下程序代码即可,难度较大的实验则需要按照题目分析、算法设计和程序编写三个步骤详细讲解,让学生学会如何解决一个复杂的问题,应该使用哪一种数据结构,采用哪一种存储结构进行数据组织.
(3) 课后:实验反思,实验考核,目标达成
对每一次实验,教师会在云班课上提醒大家写出收获和感想,这个环节不但可以让教师清楚学生问题的解决情况,还可以培养学生总结分析问题的能力.对于反映比较集中的问题,教师再以腾讯会议方式集中答疑一次,个别问题鼓励学生通过查询网络学习资源自行解决.
每次实验成绩递减排序后在课程学习群里公布,排名前十的学生每人加5个经验值,每周公布一次经验值.这样可以激励学生更加积极地完成实验作业,为了获得更好的名次,有的学生完成了2个题目,有的学生甚至完成了3个题目.为了让学习好的学生带动其他学生一起进步,每次实验课上除了抽取5名学生展示作业以外,也会让上次实验成绩排名第一的学生在腾讯会议上共享屏幕,分享自己的算法设计和编程实践的经验.对每次排名末尾的十名学生进行跟踪辅导,辅导方式有3种:学生自主组合,助教一对一帮带,教师个别辅导.经过一学期(2020春)的实验课,19Z计科整个班级数据结构的平均实验成绩是68.12,而18计71班(2019秋)的平均实验成绩是53.26,上升了27.9%.由此看出,改革后的实验教学方案大大提高了学生的算法设计能力和实践能力.
18计71和19Z计科两个班级采用的实验考试方式相同,题目难易度类似,均是通过CSTLAB上的考试功能实现.考试试卷有ABCD四卷,根据每人的IP随机分配.试题类型有编程题、片段题和接口题,分值分别为60、20、20.实验考试成绩占总成绩的30%,其余70%是期末考试成绩和平时成绩(作业、课堂、云班课、CSTLAB).
从表2可以看出,两个班的实验成绩符合预期,19Z计科的不及格率比18计71低3个百分点,处于中间分数段(60~90之间)的百分比19Z计科比18计71 高出5个百分点.以上数据说明,在疫情背景下,本实验教学改革方案提高了教学质量,且有利于培养学生的实践动手能力和算法设计能力.
表2 两个班成绩各分数段百分比比较
数据结构实验教学是数据结构课程教学的重要组成部分.本文提出疫情背景下的数据结构实验教学的改革方案,本方案将整个线上教学过程分为课前、课中和课后三个阶段.整个教学过程重点强调了教师对学生学习的关注和监督,培养了学生的实践动手能力和解决实际问题的能力,达到了本课程的教学目标.教学实例证明了这种实验教学改革方案效果良好,提高了学生学习数据结构的兴趣,也为后续课程的学习打下了扎实的基础.疫情结束后,学生回校上课,还需根据实际教学情况对这种方案进行适当调整,以满足实际教学的需要.