李淑琴 ,丁 濛 ,孟 坤
(1.北京信息科技大学 计算机学院,北京100101;2.感知与计算智能联合实验室,北京 100101)
程序设计能力是当代大学生计算机方面的基础和核心能力,更是计算机专业学生最重要的职业能力[1]。如何提高计算机专业学生的程序设计能力,一直是各高校研究的热点。如果只是对计算机程序设计的知识理论进行了解以及掌握是远远不够的,只有不断地对其进行实践,强化其应用的体验过程,注重理论和实践的结合,学生才能得到更加全面的发展[2]。
高校程序设计课程集中在一至二年级的4个学期,主要包括程序设计基础(C语言)、面向对象技术、数据结构等,这些课程一般由基础教学和综合实践教学组成。基础教学注重课程知识的讲解,并配有课内实践;综合实践教学被定位为课程知识的运用,一般由课堂教学案例和综合实践两部分构成。
虽然学校和学生都很重视这些课程,但是学生学习完这些课程后,甚至已到做毕业设计还是不会调试和编程序,拿到题目没有头绪,感到无从下手,编程错误百出,更有甚者还产生编程恐惧或厌倦情绪。分析其原因主要有以下几点。
虽然教学计划中程序设计课程群的设置是分层次、递进式教学体系,但是综合实践教学存在一定的孤立性,各门课程之间知识点联结程度较低,特别是不同课程综合实践教学案例的设计没有任何的联系,缺乏一定的整体感和连续性,这种隐形的切割导致学生对所学知识融会贯通性差,使得其思路无法进行拓宽。
综合实验基本上是围绕教学内容展开的,实验的内容多是为了验证语法或课堂讲的知识,使得编程变得枯燥乏味,提不起学生学习的兴趣,学生为完成作业而上机,长此以往,就会对编程失去兴趣。
编程是一个枯燥的过程,目前我国计算机程序设计课堂中缺乏一定的应用体验,使得学生无法感受到自身所学的知识在生活以及工作中应用的重要性,直接降低了学生学习相关知识内容的积极性,从而降低了整体的学习质量以及效果。
程序设计能力的培养是计算机教学的核心所在。在培养学生能力的过程中,课程改革势在必行。要树立以学生为主体、教师为主导的教学模式,让学生成为学习活动中的主体,激发学生的自主学习能力和创造力。课程组、课程群要真正发挥“群”的作用,在制度上保障教学师资、教学内容等资源的整合,实现教学方式的多样化。
对学生,在入学教育上就强调程序设计能力对他们的重要性,让学生尽早能够从整体上了解培养计划中离散数学、程序设计语言、数据结构等系列课程在整个培养体系中所处的位置,这些课程构成了一个有机的体系,使其懂得计算机编程能力并不是学习一门或几门课程能够培养出来的。在学习过程中,需要学生具有一定的逻辑思维能力,勤于动手。能力的培养需要循序渐进,要做好长期作战的思想准备。
程序设计系列课程的目的除了教给学生基本的程序设计理论外,更重要的是培养学生的程序设计开发能力、逻辑推理能力,使学生最终应用所学知识构建出各种层次的计算环境,并在这些计算环境下解决实际问题。基于这个目标,笔者认为整个综合实验教学应该站在顶层系统设计,宏观把握,从课程到课堂、到内容再到评价,环环相扣。覆盖程序设计类课程的综合大题目应该具有如下特征。
(1)知识点覆盖面广。设计的题目尽量能覆盖到程序设计系列课程中的知识点,设计自上而下,实施自下而上。
(2)趣味性强。设计的题目既容易激发学生的学习兴趣,又要使学生感到实现有一定的压力和挑战性,有利于学生个性化的发挥。
(3)内容有层次。综合实验课程内容的设置上,应该尽可能地分层次、分阶段,培养学生的能力,突出重难点,关注每门课程的核心内容。
(4)评判标准明确。系列化课程中的每门课程都有其核心知识、能力目标的要求。课程考核中就重点考核学生能力目标所要求的能力达成度是否在程序中有所体现。在课程的评价方面,可以运用质性评价和量性评价的综合评价标准。
在确定总目标的前提下,将总目标分解到各个课程的实践任务中,采用任务驱动的方法实施。学生在课程的学习中,通过层次、递进式地完成具体任务,认识不同课程的性质,不断体会各个课程之间的不同,并随着所编程序质量的提升,喜欢上编程,达到培养编程能力的目的。学生在教师帮助下,围绕一个共同的任务活动中心完成既定任务的同时,在问题的驱动下进行自主探索和互动协作的学习,使其价值、潜能、个性得到充分发挥。
为了整体构想的实现,特别是为了能采用任务驱动的方式进行实践教学,笔者所在学校选择了计算机棋类博弈作为一个具体的、现实的,且能够贯穿于本科一二年级程序设计类基础课的主题。首先,下棋是大家喜闻乐见的娱乐活动,趣味性强,学生不会觉得陌生。其次,棋类博弈算法原理简单、内涵丰富,是变化无穷的思维逻辑的研究载体[3]。计算机博弈在国际上作为一个学科领域,已经开展了半个多世纪的研究与竞赛活动。第三,棋类博弈一直是人工智能领域理论和技术突破的展示平台,如1997年的深蓝和2016年的AlphaGo,可以让学生近距离感受最前沿的技术成果。最后,棋类博弈完美地将各门基础课程有机地结合在一起。一个完整的机器博弈系统主要包括棋局表示、走法生成、局面评估以及搜索引擎。棋局表示是对比赛过程中形成的棋局的描述,内容包括棋子、障碍、空格、走棋的表示,用到学习过的数据结构;走法生成器是在已形成的棋局下生成可行的走法,涉及对下棋规则的描述并根据规则生成所有可行走法,是搜索对象的产生器;评估函数是用来对棋局进行评估的,是搜索算法的前提;搜索引擎是如何找到最优走法,这是计算机博弈的核心部分,是对人类思维模拟的最佳体现[4-5]。可见,一个人机对战博弈程序的实现,涉及数据结构、算法、编程能力等综合知识。
综上是将计算机棋类博弈作为整体程序设计综合实践课程的一个重要主题。具体操作如下:在第一次上程序设计类课程程序设计基础时就告知学生,第4学期前实现一个人机对战的AI智能计算机博弈系统,作为提升编程能力的总目标。在第一门综合实践课上,可以让学生根据自己的兴趣和能力选取中国计算机博弈大赛中的任何一个棋种作为综合实验题目,并告知学生这个任务贯穿面向程序设计语言、数据结构、算法设计与分析等专业课实践教学,每学完一门课有不同的课程验收标准,最终的验收标准是独立实现一个人机对战博弈系统,并参加每年学校组织的计算机博弈比赛。比赛成绩作为课程成绩的一部分,优异者被选拔出参加全国计算机博弈大赛,获得全国奖项还可以算作学校创新实践课学分。
目标分解针对C++、Java编程基础类实践课程,设计有开发游戏界面等题目。对于数据结构和算法设计与分析专业课实践模块,学生在实现游戏界面的基础上,继续开发能实现人人或人机对战的小程序。针对科研项目类开发实践课,学生在实现人机对战程序的基础上,继续进行AI算法研究,最终实现具有AI智能的计算机博弈程序。具体教学方案见表1。
表1 基于计算机博弈程序设计的整体综合实践教学方案
将能力的培育融入课程变革中,以程序设计能力培养为导向的实践教学改革方案应自上而下,整体、系统地设计综合实践教学方案,利用任务驱动实践法,层次、递进式地完成具体任务,自下而上将总目标分解到各个课程的实践任务中,以提高学生编程能力,从而达到培养学习者计算思维和程序设计能力的目的。将学生喜闻乐见的、高对抗性的棋牌游戏作为综合实践教育载体案例,可以将枯燥乏味的语法规则利用电脑游戏的形式展现在学生面前,将游戏娱乐融合进程序设计类实验课程的教学实践中,在激发学生学习兴趣和学习动机的同时,使其形成自主学习的习惯,主动进入知识学习的情境中,取得较好的效果。