冯 筠,吴 桐,卢 鑫,冯宏伟,孙 霞
(西北大学 信息科学与技术学院,陕西 西安 710127)
程序设计基础是计算机科学类专业最重要的平台课程之一,主要面向基本没有编程经验的大一新生,旨在引入计算思维、培养程序设计思想和编程技能[1]。然而,对大部分学生来说,在短短一个学期内熟练掌握编程技能有一定的挑战性。惯于接受应试教育的学生会发现将知识和技术应用到实际问题的解决中不太容易,尤其是用计算思维来思考解决问题难以适应[2]。同时,程序设计基础也是能力需求密集型课程,部分学生可能会在学习中感到挫败;或者是能听懂和理解课程,但却在实际编程时无法完成任务[3]。
众所周知,工科课程以理论知识讲授和实际应用能力培养为主,具有很强的实用性和综合性。因此教师在教授这类课程时不但要构建合理的知识结构,还需设计阶段化的能力目标,培养学生在未来的学习和工作中都能良久受益的可持续竞争力。知识通常是显性的、容易传授的,学生对知识的掌握程度容易通过填空题、选择题等概念性评测表现出来;而能力往往是隐含的,需要更加综合的题型来尝试评估。在程序设计基础课程中,常用编程题、程序填空题等间接测试。由于知识和能力的综合性,学生的学习程度往往参差不齐,照本宣科、千人一面的教学方案显然是不可取的。然而,如何将培养能力融入知识化的大学课程中至今还是一个开放问题。
传统的教学方法类似软件开发中的“瀑布模型”,一般需要经过立项、设计、建设、实施、调优等几个阶段,是按照教师事先设计好的教案按部就班的教学过程,很少考虑学生的个体性和差异性[4]。敏捷教学强调以学生为中心,注重学生的个人志趣与学校培养目标相结合,定制适应个体的培养方案;是理论、知识、能力和素质多方位融合的教学体系,是激发学生潜能、培养学生可持续竞争力的教学过程[5]。敏捷理念最早源于制造领域,从20世纪90年代开始受到软件开发领域的关注。21世纪初期,敏捷理念拓展到项目管理领域,并逐步扩大到教育领域[6]。因为敏捷教学过程较为快速、轻量化,而且学习任务安排合理、可交付,这使得那些渴望成功但缺乏基础和经验的学生能够得到教师的及时指导,一步一步实现能力达成的终极目标。
显而易见,教学效果的迅速反馈是敏捷教学的基础[7]。与传统教学方法相比,在敏捷教学过程中需要辅以更多的测试和评估,使教师迅速了解学生学习状况,对下一轮迭代教学过程做出及时调整;同时,也使学生可以快速了解知识漏洞、自我反思、积极调整学习态度和方法。此外,敏捷教学注重培养学生与教师之间的沟通和互动,鼓励学生积极地参与学习过程,充分发挥主观能动性。对于工科课程,教师在教学的前期阶段突出“教练”的角色;在后期随着学生自信心和自学能力增强,教师从“教练”退出为“观察者”,让学生自己学习、互相学习、从经验和失败中学习,切实提高未来的“可持续竞争力”。
以“拼题”为代表的程序设计在线测试平台目前国内已有不少,并在程序设计基础的敏捷教学中扮演了重要角色;缺点是只有二级知识点,评估结果反馈不够全面,只有知识点掌握情况分析,没有能力达成分析。笔者团队在编程教育相关领域进行了多年的研究,利用层次化的知识点树研究开发了个性化习题推荐系统[8],该系统重点分析了学生在编程课程中对知识点掌握情况,从而进一步推荐适合学生的习题来提高学习成绩。也有学者研究基于评估结果的学生分组[9],但是目前还没有发现能够满足敏捷教学各项需求的完善在线评估平台。
敏捷教学中的授课元素和评估过程可抽象如图1所示。
(1)知识:主要是概念性的,可采用学生自学、MOOC微视频、教师讲授等方法进行学习,通过选择、填空、判断等题型进行测试。
(2)能力:只能通过培养和练习达成,教师可通过实例、实训、示范等方法进行传授,通过编程、函数编写、程序填空等题型进行测试。
教师通过多种教学手段进行知识传授和能力培养,通过在线评估系统迅速得到教学效果反馈,实时修正教学内容和策略。
根据课程的目标,教师首先把需要达成的能力描述为多个等级。表1列出了程序设计基础的能力层级和先序关系描述。
图1 程序设计基础敏捷教学过程
表1 程序设计基础能力层级描述
为了涵盖所有的概念性内容,将课程大纲细化为4层知识粒度,称为不同层次的知识点。通过梳理知识点之间的关系,最终组织成为知识图谱。知识点的上层和下层之间是包含关系,同级别知识点之间可能是递进、并列关系。程序设计基础的课程包括237个知识点、231个包含关系、125个递进关系。知识图谱的构建为将来的知识追踪做好了铺垫,为学生动态分组和知识漏洞的最终溯源提供了基础。表2列出了程序设计基础的部分知识点定义。
为保证在线测试的评价准确,约定概念性的知识通过选择题、判断题和填空题测试。为这些习题标注已有知识图谱的1~3个知识点(见表3)。
能力性的测试则通过程序填空题、函数题和编程题完成。这些题型由于涉及知识点比较多,需显示学生的综合能力,因此标注能力层级即可。注意能力层级和第一层知识点之间并非唯一的对应关系。表4显示了编程题的能力层级标注示例。
表2 程序设计基础知识点定义列表(部分)
表3 选择题、判断题、填空题的知识点标注
表4 程序填空题、函数题、编程题的能力层级标注
为了达到敏捷教学的目标,通过评估迅速了解学生的学习状况至关重要。通过教学实践,面向敏捷教学的在线评测系统需具有如下功能。
2016年4月,“华山-五院(上海市第五人民医院,以下简称“五院”)-闵行(闵行社区)”医联体签约建设。在此框架下,华山医院在医疗服务、学科建设、教学科研等方面与五院逐步深入融合。从2016年初,华山医院、五院和相关企业开展了医联体及脑卒中单病种业务合作,努力在筛查预警、卒中急救、远程卒中、卒中商保、诊断治疗、随访评估、康复干预等方面创新探索。
(1)测试部署。教师能够利用标注好的习题库,方便地组织和部署考试;系统最好能够自动检测测试内容的完备性,并对测试难度给出估计。
(2)在线答题。评估学习效果的基本方法有课堂提问、注意观察学生课堂反应等,但这些方式都不够全面,难以量化。我们认为最有效的方法是全体学生周期性在教学时间轴的关键点进行在线测试。因此,方便的在线答题功能至关重要。对于程序设计基础课程来说,主要用到的题型有:用于知识概念测试的选择、判断、填空题,用于能力水平检测的程序填空、函数和编程题。此外,由于教师时间有限,测试结果的自动评判非常重要。程序设计基础课程用到的所有题型目前各大平台均能自动评判,问答题在该次课程教改中暂时没有涉及。
(3)评估结果反馈。基于大数据量答题记录的各类统计、可视化模块可使教师迅速及时了解整体学生对知识掌握情况和能力的达成情况,对敏捷教学的下一个周期迭代非常关键。
(4)教学及学习策略建议。根据学生的评估情况,建议教师进行动态学生分组,对学生进行知识漏洞提醒、掉队学生预警等,促使教学过程的闭环尽快形成。
图2展示了面向敏捷教学的在线评测系统的用例图,并描述了系统的主要功能模块。
下面简述在敏捷教学过程中的一些关键内容。
(1)测试部署的时间节点规范化、周期化。在能力层级提升的每个关键时间点,必须进行在线测试,以即时获得学生的学习状态反馈。图3显示了本文描述的敏捷教学改革学期进行的15次测试和能力层级之间的关系。
(3)评估结果的可视化。如果班级人数多,大量测试结果和表格式的答题记录很难让教师迅速了解学生掌握情况。系统需要有多种分析和可视化的能力,可将答题记录呈现在教师面前,一目了然。评估结果主要包括3个类别:班级整体情况、学生个体情况及教学策略建议。
图2 面向敏捷教学的在线评测系统用例图
图3 本学期进行的15次测试和能力层级示意图
班级整体情况包括能力达成情况、知识点得分率分布情况、知识点掌握情况等,如图5所示。根据班级整体分析和知识点掌握情况等,教师很容易得出教学内容调整的策略。
学生个体情况分析用于学生对于知识点漏洞的自查,教师对个别学生的跟踪等,可以展示任意层级知识点的掌握情况表及本人目前的能力层级、在班级的排位(图6所示)等。
(4)基于数据挖掘的教学策略建议。在大数据支持的基础上,基于答题记录分析的教学策略建议,需要用到数据挖掘(无监督)或机器学习技术(监督)。例如基于答题记录的学生动态分组,可采用知识图谱的相似度匹配和K近邻技术完成[9];基于知识追踪的个性化学习资源推荐可采用协同过滤算法完成[10]等。
图4 答题记录表(自动生成)
授课班级为2018级信息学科学生,采用敏捷教学改革的班级称为教改班级42人,采用传统方法进行教学的对比班级38人,两个班级入校高考成绩分布基本相同。两个班级使用相同的教学大纲和教材。2018年秋季学期程序设计基础课程设定为54理论课时+36上机机时,由于是新生,减去军训、国庆假期,期中期末考试周,剩余共计12个教学周。教改班级按照第2节设定的11个能力层级,每周完成一个能力层级,周一开始,周五检验,周末留给学生查遗补缺,留一周时间根据学生情况动态调整。
图5 班级整体情况可视化模块
图6 学生个体情况分析模块
理论教学主要是知识的传授过程,采用混合式教学模式。已在爱课程上线程序设计基础实例与案例SPOC课程,只用于预习、复习和查遗补缺,不作为主要的教学手段,也未采用翻转课堂形式。能力培养采用实例示范+程序训练模式。针对每个能力层级编制了实验手册,引导学生从理论知识点出发,从实例中思考,摸索和扩展。上机时学生跟着实验手册边做边练,然后布置作业在课后完成。
教学改革中每周实施:2学时在教室理论讲授,2学时在机房练习实验手册,2学时在机房在线PTA平台测试。除了统一的课时和机时外,每周留课外上机作业,根据调查学生大约会花每周4~10学时完成作业。整体的教学过程按照能力层级设定逐步展开,大部分学生基本上每周登上一个能力层级。图7展示了一个周期的教学及自学安排。
图7 程序设计基础敏捷教学的一个周期
周五授课结束后,通过平台进行在线测试,可以得到学生的整体学习情况:包括(1)能力层级达成度分析;(2)知识点掌握情况分析。确定下周课程是否重新强调某些知识点或安排更多实例练习。发现知识有漏洞的学生,进行(1)个性化教学资源推荐,包括教学视频(SPOC),或推送更多的参考练习题;(2)组成动态讨论小组,由助教组织进行再讲解和分享。
课程教学一学期结束后闭卷期末考试,传统班级和教改班级题目相同。传统班级采用纸质考试(编程题有过程分),教改班级在线考试(编程题没有过程分,但有多个测试得分点)。两个班级期末考试分数对比如图8所示。
图8 教改班级和传统班级期末考试成绩对比
可以看出,敏捷教学模式大大地提高了学生能力水平及知识点的掌握程度。教改班级期末考试90分以上的学生占45%以上。传统方式培养的学生分数段集中在60~80分左右。值得注意的是,由于教改班级判分严格,不及格人数占比4%,而传统教学班级纸质考试判分较灵活,无不及格。还有一种可能是强节奏的能力冲击是使个别学生跟不上,最终掉队。
图9显示了教改班级期末考试知识点掌握情况柱状图,大部分学生掌握情况良好。但发现学生对指针、变量作用域等知识点掌握得不尽如人意,分析是因为临近期末教学比较匆忙,指针内容灵活难以消化;而变量作用域则是因为没有专门进行测试和布置作业,造成知识消化不够完全。令人惊奇的是,第一能力层级的输入输出语句得分率偏低,查阅下一层知识点掌握情况发现,由于“格式化输入输出”记忆性和技巧性较强,并学过的时间较长,很多学生已经忘记或者忽略,提示下一轮教学中,考试前需要给学生强调记忆并加强练习。
图9 教改班级期末考试知识点掌握情况
我们提出对程序设计基础课程进行知识图谱及能力层次构建,利用在线考试平台的不同平台进行概念测试和能力评估。进而提出适合程序设计基础课程的一种混合敏捷教学模式,在教学实践中取得了较好的效果,有积极的推广意义,并为其他工科课程改革提供了有益的参考。