谢春丽,高宇翔,吴昊聪,赵向军
(江苏师范大学 计算机科学与技术学院,江苏 徐州 221116)
程序设计课程不仅是计算机类各专业的重要基础课程,同时也是理工类各专业大学生的核心素养课程,在学科课程体系中具有奠基作用,会直接影响后续课程的学习和掌握,但计算机程序语法规则严格、语句逻辑严密、代码高度程式化,与人类固有思维模式差异明显。面对复杂问题既需要有灵活应变、不拘常规地解决问题的创新思路和高屋建瓴的宏观思维,又需要具备庖丁解牛般、以无缝入有间的精细技巧,还需要将匠心机巧的问题解决方法转换为依序执行、细致入微、近乎僵化的机械步骤。掌握这些差异性极大的思维模式对大部分学生来说是个严峻挑战。因此,该课程学习起步困难、提升缓慢,常常成为计算机类大学生入学以来经受的最为严峻的考验。
计算思维与程序设计是软件能力的关键核心,它与宏观大软件的分析结构相结合,衍生出软件架构设计能力,这些能力与工程化软件开发能力一起,从属计算机软件开发能力的主要构成。在宽进严出的学业管理机制未能完全形成的情况下,很多学生在程序设计课程学习中出现了严重不适应,并且这种不适应贯穿整个大学生涯。这些问题严重影响了大学毕业生的质量,也制约了国家信息产业的发展。
综上所述可知,一方面国家信息化发展战略在向纵深推进,互联网与各行各业的深度融合催生了对信息技术人才的巨大需求;另一方面,计算思维和程序设计的欠缺导致繁荣专业发展的背后,是人才的严重不足。在师资储备不够充足、学生主动性不够强的情况下,谋求程序设计课程教学模式之变迫在眉睫。
CDIO工程教育模式以项目驱动为教学方法[1],对学生的学习进行兴趣引领,借助简单易用的图形化实训教学平台进行辅助建构,并对课程知识点进行精细管理,同时根据学生的学习记录推荐学习资源,如图1所示。这5个方面的紧密结合不仅能促进学生学习知识,同时也能引导学生将知识转变为应用,拉近教育教学和社会需求的间隙,这对改善课程教学质量、提高应用型创新人才培养质量具有重要意义。
图1 课程教学整体设计
项目驱动化课程教学以完整的项目为教学案例,选择合适的项目组织相关教学内容[2-3]。和传统的课程教学相比有明显的优势。首先,项目任务明确,在项目构思和设计过程中,需要用专业理论知识去指导项目、解决问题,学生可以在完成项目的过程中,深入学习并掌握具体理论知识,将理论和实践紧密结合,从而完善所学专业知识,提高解决实际问题的应用能力。其次,CDIO工程教育模式强调学生的主体地位,教师引导学生进行自主探究、合作学习,形成正确的情感、态度与价值观[4]。该理念所倡导的教学更注重培养学生在教学活动中掌握提出问题、分析问题和解决问题的能力。而将学科知识融合到游戏中,为学生提供问题化学习情境平台的游戏化学习模式正好适应CDIO的教学理念。它作为一种新型的学习方式已经得到了广大教育工作者的认可和支持,满足了个体独特的学习兴趣和需求,让学生在不同的复杂程度下学习,将知识转化为解决现实问题的技术和能力,把书本学习的经验用于实践活动中,使学生学有所成,学有所用。最后,项目完成需要学生之间相互合作,既能取优补短,又能相互学习,既锻炼了个人能力,也提高了成员的团队意识和沟通能力。
大量研究表明,兴趣是推动人们求知的一种内在力量[5]。乌申斯基曾指出:“没有丝毫兴趣的强制性学习,将会扼杀学生探求真理的欲望。”据此,“游戏化教学”强调将教学目标隐藏于课堂游戏环节中,通过丰富多样的游戏活动激发学生的学习兴趣,调动自主学习的积极性。面对程序设计里严格的语法规范,枯燥的算法逻辑,保持高度的兴趣才有可能继续深度挖掘知识。如果只是一味严谨、枯燥地进行语法教学和程序讲解,学生很难长期保持高度的兴趣。根据布卢姆的教育目标分类,情感领域的教学目标、认知领域的教学目标和技能领域的教学目标并列为高校三大教学目标[6]。随着程序设计的难度增加,为避免学生对枯燥的程序设计产生厌倦情绪,教学过程必须采用独特的教学方案,融入良好的情感教育,吸引学生的注意力,使学生对所学知识产生浓厚的兴趣,并带动学生参加游戏类项目,对所学的知识具有事实性了解,通过有趣的游戏化项目开发提高学生的技术水平,调动学生的积极性,开发学生的想象力。
程序设计类课程不仅是学生后续专业学习的引领,同时也是激发学习兴趣的关键,而低年级学生需要快速对本专业的应用场景、市场前景有直观、具体的认识。在不借助任何教学平台的条件下,C、C++课程教学一直以来都很难突破界面设计,学生只能开发一些小型的控制台应用程序,例如工资管理系统、学生管理系统,这种类似MS-DOS的命令型操作界面很难让学生有成就感和专业认知感。为了激发学生的学习兴趣,程序设计教学融入游戏化元素,以轻松、直观、富有乐趣的方式激励学生将理论知识应用到项目开发过程中,做到“玩中学”,以玩的动力驱动知识学习。目前市场存在的程序设计教学软件和实训平台,例如Scratch、Unity3D、Funcode等,崇尚以游戏化的方式进行实验教学。他们将任务处理流程和图形化界面设计的Windows API函数进行封装,提供了一个开发Windows应用程序的整体逻辑框架。学生无需进行繁琐、复杂的底层细节设计,只需要关注功能设计,大大简化了应用程序的开发,尤其对低年级的学生更加适用,摆脱了以往“黑底白字”的运行界面,在生动有趣的游戏设计中学习程序设计知识,将枯燥繁琐的程序代码和生动的程序运行效果结合起来,激发学生为了得到更好的效果进而精益求精,研究代码、改进代码的目的。
按照系统论的观点,对课程教学全面采用精细化管理,对课程内容设计和训练实施全过程、无缝隙的管理,形成一环扣一环的知识点划分,项目的选择要对知识点全面覆盖。针对CDIO不同能力培养的要求,我们将课程内容进行精细化设计和提取,按照由浅入深、由简单到复杂细分为一系列知识点,根据类型、难度,把课程教学分成三个阶段,包括基础知识、综合程序实践和实训项目实践,旨在从基础知识的掌握、个人能力的培养、团队能力的建设和工程应用能力的强化4方面逐步将CDIO 的教育理念贯穿至整个教学过程,见表1。对基础知识主要以简单有趣的实验为主,如电灯开关游戏,纸牌排序游戏,重在激发学习兴趣;综合性项目旨在培养学生的团队协作能力、系统实现和维护能力,例如海底世界、贪吃鱼、黄金矿工等项目;实训项目重在培养学生从系统构思到系统运行维护的能力。综合项目和实训项目需要多人合作,在项目开发过程中同时培养了学生的沟通能力,自我管理能力等基本素养。
表1 C语言目标实施矩阵
程序设计类课程的知识点异常丰富、程序语法规则严格、语句逻辑严密,要想真正熟练地掌握程序设计,仅仅依赖项目还是不够的,同时还需要对基础知识点的掌握。本项目拟根据每个学生学习的过程数据、考核数据,将未熟练掌握的知识点推荐给每个学生,提高学习者获得课程教学资源的效率以实现精准化教学。利用词袋模型对教学资源文档进行表示,有效利用文本内部的情境信息,构造CNN(卷积神经网络)的多层卷积操作,抓住文本中词语之间的相互关联,帮助学习用户和资源的隐表示。首先对文档中的每个词做嵌入式表示,然后将所有嵌入式向量拼接成一个矩阵,每个资源文档都可用一个二维矩阵表示,然后在这个二维矩阵上进行卷积、池化以及映射,从而获取学习资源的隐向量,并根据隐向量进行资源推荐。
按照CDIO工程教育的理念,程序设计教学内容要保证理论知识和实践应用并驾齐驱,以层层递进的方式逐步加大、加深知识点的学习。教师作为教学活动的组织者和引领者,全面掌控教学过程。把理论学习融入到实践教学中,符合学生的认知规律,提高学生学习该课程的兴趣[7-8]。教学实施过程如图2所示。该图主要包括两个组成部分:①借助OJ平台,进行基础知识的规范化编程;②借助Funcode平台完成实训项目的设计与开发。
程序设计的编写有非常严格的语法规范,良好的编程习惯和风格是程序设计的基础,它的形成不是一朝一夕,而需要长期坚持不懈的练习。Online Judge系统(简称OJ)是一个在线的判题系统,可以协助学生程序编写练习。用户可以在线提交程序多种程序(如C、C++)源代码,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性。一个用户提交的程序在Online Judge系统执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等。用户程序执行的结果将被Online Judge系统捕捉并保存,然后再转交给一个裁判程序。该裁判程序或者比较用户程序的输出数据和标准输出样例的差别,或者检验用户程序的输出数据是否满足一定的逻辑条件。教师也可以查看学生提交的代码以及代码错误记录。根据错误记录,及时补充、指正学生代码中出现的问题。
Funcode平台是一款游戏化的实验教学平台,支持C、C++和Java语言的开发和设计,封装了处理流程和图形化界面设计的Windows API函数,提供了一个开发Windows应用程序的整体逻辑框架[9-10]。图3给出了Funcode平台的框架,基于Funcode开发项目有两大优势。
图2 教学实施过程
图3 Funcode 实训平台框架
(1)界面设计简单、直观。Funcode包含界面设计和项目开发两大模块。学生在编辑器中通过拖拉资源、设置资源属性等方式可以轻松设计游戏界面、特效、各种精灵(动态精灵和静态精灵)。
(2)处理流程清晰。完成界面设计之后,可以用 VC++,CodeBlocks或其他IDE环境编写代码,完成各种定制功能。Funcode平台对涉及处理流程的细节进行了封装,将游戏运行过程划分为游戏初始化、游戏运行和游戏结束3个函数。用户无需了解图形化窗口操作的具体细节,只要关注项目的具体功能和对应的实现函数,重载并实现Funcode类库中具有相应功能的接口函数,大大简化了用户的使用。
为了让学生理解分支程序设计,传统的实验教学往往用文字叙述任务,用文字输出结果,用DOS界面输出电灯开关信息,代码如下:
借助Funcode平台就可以设计类似电灯开关的小游戏,Funcode对这个游戏提供了程序框架,学生只需要在Play(int i)函数中填写代码。其中,i=0时,表示关闭电灯开关;i=1时,表示打开电灯开关; 然后调用函数TurnOn(),TurnOff()可将电灯点亮和熄灭,程序运行可观察到电灯点亮和熄灭。
在CDIO工程教育理念的指导下,以项目化的方法、游戏化的界面设计为兴趣点,借助辅助平台的便捷,外加精细化的知识点管理,让程序设计教学过程变得趣味横生,学生在游戏中除了掌握知识点之外,对实际环境下的使用多了一份体会和认识。对培养学生的程序设计能力起到巨大的促进作用,是培养学生的工程应用能力的良好开端。