林 菲,马 虹,龚晓君
(杭州电子科技大学 计算机学院,浙江 杭州 310018)
“程序设计综合实践”是计算机类专业的实践必修课,通常与“程序设计基础”前后衔接,配套授课,目标是在学生具备一定的语言基础和编程能力后,运用所学知识,设计并实现一个相对复杂的综合性项目,使学生能够深刻理解计算机求解问题的全过程,培养学生的计算思维、分析问题和解决问题的能力,为后续专业课程的学习,打下坚实的基础。然而,这门实践课程的教学普遍存在一些问题。
“程序设计综合实践”重在培养学生的复杂工程问题的求解能力,包括分析和解决问题的能力、系统化的设计能力、使用现代工具的能力、沟通表达能力、团队协作能力、创新能力、自主学习能力等。为达成这些课程目标,各学校做了很多有益的尝试,取得了一定的成效,同时也暴露出一些问题。例如,很多学校在该实践课程的教学中引入了以赛促学[1-2]的机制,但在实施过程中,往往容易模糊理论课课内实验和课程设计综合性实验之间的差异,过度注重 ACM题目的训练而忽视复杂系统综合设计训练,导致虽然通过课程教学,学生具备了一定的计算思维和问题求解能力,但课程目标的达成度却不高,表现在:
(1)用ACM 题目替代综合系统开发,很难使学生建立系统化、模块化的设计思想。
(2)ACM 题目调用的外部资源有限,课程结束后,碰到需要控制硬件、获取资源信息等问题,学生仍不知道该如何处理。
(3)使用现代工具进行程序调试能力得不到有效训练,因为解决 ACM 题目的程序通常代码量较小,语法错误和逻辑错误往往通过肉眼就可以检查,因此忽略了系统调试能力的训练。
(4)对于ACM 题目的求解,网上有许多讨论解决方案的论坛甚至源码,学生遇到困难时,可以很容易找到解决途径,陷入定式思维,在一定程度上制约了学生创新能力的发展。
目前,大多数学校“程序设计综合实践”的教学方式是教师讲解课程的任务要求和开发流程,然后学生自行完成项目开发,遇到问题寻求教师帮助和指导,最后教师进行系统验收并评分。由于这是学生的第一门综合性较强的实践类课程,虽然教师做了简要讲解,但是绝大部分学生并未真正掌握开发方法和开发流程;同时,和理论课程相比,实践类课程的教学资源相对缺乏。因此,学生接到任务后,往往不知道如何下手进行项目开发,造成了部分学生只能上网去找相似的代码,或者抄袭同学代码来应付[3]。另外,课程设计案例多数以管理信息系统为主,难以激发学生的学习兴趣。
虽然现阶段普遍提倡小班化教学,但是由于师资与学生人数之间仍有较大缺口,因此真正的小班化教学还很难实现;同时,在课改的大背景下,几乎所有课程的学时都被压缩,因此教师在学生多、课时紧的情况下,很难详细讲解项目开发的全过程,且学生碰到实验困难和错误时,无法得到及时指导和解答[4]。
这门课程面向大一学生在第1 学期开设,学生还没有完成高中到大学学习状态的调整和学习方法的转换,自觉性和主动性尚需进一步提高,出现问题后,还不习惯于自己思考、寻求解决问题的方法[5]。并且大部分学生没有做好大学期间的学习规划,热衷于参加各类形形色色、丰富多彩的社团活动,大部分课余时间都被社团活动占用,没有很好地利用课余时间来学习,因此部分学生很难在验收前保质保量完成项目开发[6]。
每个教学班的学生均来自全国各地,有的地区的学生,从小学开始就学习了计算机基础课程甚至是程序设计类课程,而有的学生进入大学才开始接触计算机。地区生源质量的差异,使得不同学生有不同层次的学习需求。而现阶段的教学大纲、教学计划、教学资源、教学模式和教学方法都按统一的要求和步调来培养学生,“好的学生吃不饱、差的学生吃不好”的现象仍然非常普遍。
目前,实验成绩通常采用“平时成绩+系统验收+实验报告”方式来进行评定。在总评成绩中平时成绩占比较小,基本由出勤率、上机表现构成,而上机表现的评价缺乏量化评价标准,往往比较主观,使得对于实验过程的考核形同虚设;在系统验收和报告评阅时,由于时间限制,教师只能根据系统运行情况、报告格式及主要内容评分,很难对整个项目全面评价,如代码编写规范、代码复用、代码质量等,而验收时的运行情况和好的实验报告未必能完全与好的项目开发画上等号[7]。
针对“程序设计综合实践”教学中存在的问题,我校计算机学院基于工程认证的理念,以“学生的能力产出”为导向,采用“项目引领—翻转教学—个性培养—任务驱动—结对编程—过程考核”六元融合的方法来设计和实施“程序设计综合实践”教学。
基于OBE 理念,根据该课程对毕业要求的支撑反向明确课程目标,并根据课程目标确定实践教学内容、实践教学方法、学生实践学习考核评价方式和依据,然后按照工程认证标准修订该实践课程教学大纲。
课程教学遵照学生的认知规律,借鉴语文教学中的“范文分析+作文”的方式来设计教学,以“教学项目+实践项目”双项目贯穿实践教学全过程,在“学习知识—运用知识”的鸿沟上搭上跳板和阶梯,使学生能够轻松跨越,完成“博学—审问—慎思—明辨—笃行”(学以致用、用中创新)的蜕变。
2.2.1 教学项目设计
教师采用“自顶向下、逐步求精”的方法讲解教学项目,学生采用“自底向上、逐步完善”的方式完成教学项目中的演练,建立实际问题到计算机程序开发的完整概念,如图1 所示。
第一阶段:学生熟悉解决实际问题的流程。在这一阶段,教师根据教学需要选取典型项目作为教学案例,分步骤来完成教学。选取的教学项目应具有如下特点:
(1)教学案例应来源于生产或生活实际,如“趣味俄罗斯方块”“贪吃蛇”“飞机大战”“学生成绩管理系统”等,对学生而言不陌生、有代入感,能激发学习兴趣;
图1 教学项目讲解和演练过程
(2)教学案例的综合性较强,基本涵盖了“程序设计基础”主要的知识点,如循环、分支、数组、函数、指针、结构体、链表和文件等;
(3)教学案例难度适中,必须通过深入分析才能解决,可拓展性好,同时通过适当引入一些新知识和技能,如外部资源的调用、程序的调试和测试等,使得不同层次的学生都能有所学、有所思、有所得。
具体教学按4 个步骤进行。
步骤 1:教师描述要解决的实际问题,介绍项目的背景、具体内容和要求,组织学生自主思考、讨论问题的解决方案。
步骤 2:教师对项目进行深入分析、解读,将项目任务逐级分解,最终划分成若干功能相对独立、实现难度小的子模块,分析每一子模块的业务流程,引导学生与步骤1 的解决方案做比较。
步骤3:分析每一个子模块对应的知识点、算法,帮助学生构建解决问题的知识图谱。
步骤 4:教学项目的编码实现、调试和运行的完整过程,包括外部资源的调用、全局变量的规划、各功能模块对应函数的实现等,最后将所有功能模块进行组合、运行、调试、测试、优化和改进,从而实现问题求解。
第二阶段:学生完成思维模型搭建。经过第一阶段的教学后,学生对教学项目已经有了整体概念,但是学生要完成整个项目的设计与实现,在“眼、耳→脑、手”之间还有一段距离。因此,第二阶段将为学生提供所有子模块程序段,学生回忆教师解决问题的思路和流程,按照问题求解的要求,对子模块程序段进行排序、组合,拼接成可以运行的完整程序,完成思维模型的搭建。
第三阶段:完成颗粒度编程。为了使学生能够完全掌握解决问题的关键算法,在第三阶段,给学生提供部分程序,要求学生按照任务要求和程序的上下文环境,在适当的地方完成小颗粒度编程,使整个程序变得完整,可以运行。对于编程过程中出现的问题,通过调试的方法解决。
第四阶段:独立完成教学项目。学生经过前3 阶段的训练,已经掌握了开发小型软件解决问题的完整流程,并且具备了一定的程序设计能力。因此,在第四阶段,要求学生独立完成教学项目实现的全过程,检验学生是否已经达到了预期的学习效果。
每一阶段都有相应的目标和能力要求,以任务驱动方式指导整个学习过程。学生可以多次重复上述一个到多个学习阶段,直至完成每一阶段的任务要求。教师关注学生的整个学习过程,必要时给予及时的指导。由于在教学过程中为学生设置了跨越一个个障碍的阶梯,学生每登上一个阶梯,就会获得成就感,从而大大激发学习兴趣。
2.2.2 实践项目设计
通过深度挖掘日常工作生活案例和教师科研项目,设计若干实践拓展项目。实践拓展项目并非实践教学项目的简单翻版,在深度和广度上都进行了延伸和扩展。实践项目以任务书形式由课程组统一下发,在任务书里明确开发要求、设计方法和评分标准(细则)等,将创新性及难度等级要求作为评分项中的一个维度,鼓励学生创新。选定实践项目后,首先对问题进行层层分解,划分功能模块,分析业务流程,再分别对各功能模块进行抽象,建立模型,确定解决问题的算法、编码实现并进行调试,最终完成实践项目的开发。
由于实践项目与教学项目开发过程相似,学生通过实践教学项目,已经掌握了项目开发流程,对理论课所学的知识进行了巩固,具备了一定的分析问题和解决问题的能力。因此,学生拿到项目要求后,就可以快速形成解决思路,不会再像以往那样茫然不知所措,提升了解决问题的信心和决心;同时项目难度又有所增加,学生通过查阅资料,对难点逐个击破,并且在完成项目的过程中不断对学习过程进行总结和反思,从而完成从掌握知识到应用知识、从被动学习到主动学习、从低阶认知到高阶认知的逐步提升,如图2 所示。
图2 双项目驱动教学
2.2.3 构建基于MOOC 的实验教学资源
为配合双项目教学的顺利实施,需要借助先进的信息技术建设数字化实验教学资源。首先,构建教学案例库和实践项目库,并在教学过程中不断丰富和完善;其次,根据教学知识点的安排,有针对性地选择2 个游戏类项目(基于DOS 环境的游戏项目和基于图形化的游戏项目)和2 个信息系统类项目(基于文件管理的信息系统和基于数据库的信息系统);然后,按照MOOC 教学的特点,将这些教学项目拆解为知识点相对独立的部分,如项目背景分析、功能模块划分、业务流程分析、游戏逻辑设计、功能模块1—n 的实现等,录制成教学短视频,每个视频控制在5~10 min;最后,选择一个适合教学的MOOC 平台上传各类实验教学资源,如教学短视频、教学项目配套的程序段、任务书和实验报告模板等,打造移动式的学习环境,为课内学习向课外学习延伸、线下学习向线上学习转移奠定基础。
2.2.4 采用翻转课堂教学模式开展个性化实验教学
开课前,通过MOOC 教学平台发布调查问卷,充分了解学生的基础、兴趣和学习需求,作为制订和实施教学方案的依据。以我校 2018 级计算机类学生为例,77.1%的学生在进入大学前完全没有编程基础,14.3%的学生对软件开发不感兴趣或兴趣较小,97.1%的学生希望本课程提供教学视频及相关线上教学材料。
针对学生的基础、兴趣和学习需求差异较大的情况,结合本课程实践性较强的特点,基于MOOC 平台上建好的实验教学视频,采用翻转课堂教学模式开展个性化实验教学[8]。教师在网络教学平台上提前一周发布教学任务。学生根据自身基础和学习兴趣,自主规划学习时间和在线学习路径。基础好的学生,可以选择较难的案例学习;基础相对薄弱的学生,则可以从简单案例开始,逐步提升难度,从而通过多个教学案例的学习不断巩固和提升,也可以选择一个案例进行反复学习,直到掌握。
课堂上主要进行线上学习效果的检测、讨论以及项目开发。对于检测中普遍存在的问题集中讲解,对于少数学生出现的问题则进行个别指导。在讨论时,鼓励学生各抒己见,引导学生进行深入探讨。在实践项目开发阶段,除了可以选择教师提供的项目库外,也允许学生根据自己的基础和兴趣,自主选择其他有一定创新性的项目。教师在整个过程中把控每个项目的开发进度、提供必要的个性化指导,不做过多干预。
通过这样的方式,改变以往“齐步走”“一刀切”的同步教学模式,使每个学生都能体会进步的感觉,从而不断培养学生的自信心,使其热爱程序开发,体会编程之美。
2.2.5 采用结对编程的敏捷软件开发方法
“程序设计综合实践”重点在于通过综合实践类项目巩固程序设计的知识,培养学生学以致用的能力。考虑到实践项目的复杂性和学生能力的差异性,使用结对编程模式要求学生完成教学项目的学习和实践项目的开发。结对学习的本质是一种协作学习方式,通过小组的形式组织学生开展学习活动[9]。国内外许多学校都进行了相应的实验研究和实践[10-12]。
在课程教学开始时,学生在教师指导下进行分组,每个小组2 人,共同完成课程学习和项目开发。在学习过程中,每个小组需要制定共同的目标、遵循相同的编程规范、保持与团队成员相同的进度。遇到困难时,相互鼓励、相互讨论,共同寻求问题的解决方案,互相配合发现软件中存在的缺陷,增强软件开发的信心。实践表明,在本课程中采用结对编程后,一方面学生克服学习困难,信心大大增强,团队协作能力及沟通交流能力得到很好的训练,项目的完成率和完成质量大大提升;另一方面,也减轻了教师实验指导的负担,教师有更多的时间和精力,去进行个性化指导。
2.2.6 多元化的考核评价方法
依据本课程所需达成的课程目标,采用学习过程评价与目标评价相结合的方法,注重评价的多元性,考核方案的主要内容和权重见表1。
(1)在线学习,占 6%。在线教学平台记录了学生一个完整的课程学习过程,成绩的评定要以课前在线学习情况、在线答题情况、参与讨论的次数、讨论区发帖的数量和质量等环节作为学习态度和学习主动性的评定依据。基于MOOC 平台导出的学习数据,依据计算模型自动产生该项分值。设立该分数的目的是督促学生课前完成在线学习,这是本课程能成功进行翻转或者混合式教学的前提。
表1 课程评价权重和标准
(2)中期检查,占18%。根据学生的选题及方案讨论、是否完成流程设计(流程图)、数据结构定义、函数接口设计、主函数编码等综合评定,目的是检查学生完成进度,帮助学生进一步对项目进行梳理,确保实践项目能够按时保质、保量完成。
(3)团队协作,占 6%。以项目组为单位,强调学生的团队协作能力,注重学生的学习参与性、团体合作性、实践性,培养学生的表达能力、思维能力、团体合作能力。每个小组需要在教师的引导下独立完成一个游戏或者管理信息系统的开发。教师将按照每个小组中表现最差的学生给小组打分,再由组长按照每人工作量的大小分配,避免学生懈怠,促进学生互帮互助,共同进步。
(4)代码规范性,占 5%。良好的编码习惯将有助于程序的开发、后期的维护以及团队之间的协作。在本课程中,对学生编写的代码提出了详细的规范性要求,通过对学生编写代码规范性进行评价,督促每一位学生养成规范编码的好习惯。
(5)基本功能,占20%。要求学生按照题目要求和模块化设计的理念,对实践项目中的实际问题进行深入分析,在此基础上进行合理的模块分解,分解出来的模块功能相对独立、粒度合适,有助于降低整个项目的开发和调试难度,也有利于后期的升级维护。通过对系统的总体功能和每个模块的功能进行检查,评估项目的完成度、学生对问题的分析能力、对模块化设计理念的掌握和应用所学程序设计知识来解决实际问题的能力。
(6)创新性及难度,占10%。根据选择的项目难度区分这一项的评分。鼓励学生在完成项目的过程中深入思考、认真钻研,引导学生不断挑战自我,勇于创新。
(7)验收情况,占15%。项目验收时,安排表达力强的学生陈述项目的设计过程,各项目小组成员陈述自己在开发过程中所完成的工作及收获,教师将根据不同学生的陈述进行提问,并由学生回答。根据学生的回答及项目实现情况给予相应的成绩这种方式,可进一步培养学生的团队精神,防止学生照搬照抄网络资源或其他学生作品。
(8)文档内容,占15%。项目要求最后上交软件和项目设计文档。学生通过撰写设计文档,对自己在项目实践过程中所做的工作进行整理、归纳,可以进一步加深对实践项目的认识。根据学生上交的设计文档内容进行评价,能够更全面了解学生项目的完成情况和质量,使评价更全面、合理。
(9)文档规范性,占 5%。设置此评分环节主要为了引导学生学会规范书写文档,包括文档的格式等。
对于每一评分项,制定若干评分细则和量化标准,确保对学生的评价全面、规范和科学。
六元融合实验教学方案分别在我校计算机学院2017 级和2018 级计算机类的2 个教学班进行了改革试点,并取得了良好的效果。
2016 级、2017 级和2018 级4 个教学班学生“程序设计综合实践”综合成绩统计见表2。
由表2 可见,课程优秀率分别为15.28%、20%、24%,优良率分别为61.1%、68.6%、76%,改革后较改革前有较大提升。
“程序设计基础”和“程序设计综合实践”是配套课程,串行上课,也就是上完“程序设计基础”后,同一学期接着上“程序设计综合实践”。“程序设计基础”是通过闭卷考试方式进行,放在学期结束停课后考试。因此,“程序设计综合实践”的学习效果能帮助
学生巩固“程序设计基础”课程中所学知识。2016 级、2017 级和2018 级4 个教学班学生“程序设计基础”期末考试卷面成绩统计见表3。
表2 2016 级—2018 级4 个班级学生“程序设计综合实践”综合成绩统计表
表3 2016 级—2018 级4 个班级学生“程序设计基础”期末考试卷面成绩统计表
由表3 可见,“程序设计基础”期末考试卷面优秀率分别为1.54%、13.16%、23.38%,逐年提升,且提升幅度较大;优良率分别为18.46%、52.63%、51.95%。2017 级和2018 级的期末考试卷面成绩优良率远高于2016 级,另外不及格率也大幅下降。
课程结束后发放了调查问卷,对课程的教学模式、课程资源、评价方式和教学效果等进行了匿名调查。
(1)教学模式。97.1%的学生对课程采用的翻转教学模式表示认可,认为翻转教学模式符合实践类课程的教学特点,可以边看视频、边操作,有利于由浅入深、循序渐进地掌握教学内容,调动了学习的积极性;94.3%的学生认为这种方式有利于自主安排学习时间和学习进度,满足个性化的学习需求,有利于拓展教学时空,增加课程承载的知识量。
(2)课程资源。94.3%的学生认为本课程的教学资源丰富,能满足学习需求;100%的学生觉得本课程的教学视频较为完整、讲解清楚、有详细的操作步骤演示,有助于掌握该课程的主要内容;82.9%的学生对教学案例的种类、数量非常满意。在“本课程的教学案例最应该改进的方面”的问题上,34.3%的学生认为案例应进一步面向问题和需求及更加有趣和实用;31.4%的学生希望教师能设计更多难度和规模各异的案例,满足个性化学习需求;17.1%的学生认为教学案例应更具有开放性,利于知识点发散。此外,学生希望增加更多函数库和API 的介绍和使用,以及提供配套的纸质教材。这些问卷结果对课程资源的后续改进具有较好的参考价值。
(3)评价方式。97.1%的学生认可课程的多元化评价方式。
(4)教学效果。94.3%的学生认为通过课程学习,达到了学习目标;97.1%的学生觉得课程提高了自己对软件开发的兴趣;94.3%的学生认为初步掌握了软件开发的基本流程和方法;100%的学生觉得该课程提高了自己程序设计的能力,培养了分析和解决实际问题的能力;97.1%的学生认为本课程有助于“程序设计基础”的知识融会贯通,能将知识应用到实际软件开发中,有助于提高“程序设计基础”的成绩;77.1%的学生认为沟通交流能力大大提升;62.9%的学生认为课程培养了自主学习的能力;57.1%的学生认为课程培养了规范文档撰写能力;37.1%的学生认为培养了创新意识。
(5)课程总体评价。71.4%的学生对该课程的总体评价是非常好,28.6%的学生认为良好。
以上多方面的数据表明,本课程的改革成效显著,学生认可度高。
以程序设计的综合实践能力培养为目标,在“程序设计综合实践”课程中实施六元融合实验教学改革。2 轮实施效果证明,该方法能有效解决教学中普遍存在的学时不足、教学方式单一、实验在线教学资源少、学生层次差异和个性化辅导等问题,充分调动了学生的学习积极性,挖掘了学生的潜能,极大地提高了学生的综合实践能力,有效达成课程目标,为后续专业课程的学习夯实了基础。