尹存燕,刘奇志,陈家骏
(南京大学 计算机科学与技术系,江苏 南京 210023)
程序设计基础这门课程主要讲授过程式程序设计的基本思想和方法。在南京大学,这门课目前不仅是计算机类专业的基础平台课,还是面向全校开放的选修课。程序设计基础理论教学环节由于是大班教学,课堂上教学互动时间有限,多数学生是被动学习,被动接受知识的输入,而程序设计本身对实践有较高要求,学生必须通过编程实践,才能真正掌握程序设计的基本思想和方法,因此实验教学环节在程序设计基础这门课中显得尤为重要。实验教学环节的目标是充分激发学生兴趣,以提高实验教学质量和效果。
传统程序设计实验教学的主要形式是教师布置实验内容,学生根据实验要求完成相关编程实践。实验内容主要是教材上的习题。实验课上,教师和学生的互动主要是回答学生编程中遇到的问题。此外,为了检验学生的编程能力,还安排随堂测验,要求学生当堂闭卷完成编程题目。
通过收集学生的反馈信息,可以了解到:有些学生感觉程序设计实验的过程比较枯燥;编程基础薄弱的学生,特别是中学阶段没有接触过编程训练的学生普遍认为程序设计难度大;实验教学课时少,在实验课上教师无法和所有学生互动,有些内向的学生遇到问题时就选择沉默。对于有一定复杂度的编程题,一部分学生在编程中会有挫败感,失去编程的兴趣。
分析学生的反馈信息,不难发现其中的原因,主要有3点:①受到中学教学方式的影响,学生还习惯于被动接受知识输入,学习主动性不够;②教材习题往往是为了配合程序设计基本知识而设计,和实际应用有一定的偏差,实验程序缺乏趣味性;③编程能力本身需要经过一定代码量的实践训练才能提高,不可能一蹴而就。初学者往往会因为编程中遇到的困难而气馁,慢慢失去编程实践的积极性。
以上这些原因归结到一个最根本的因素就是学生缺乏编程的兴趣。做学问的本质是以趣味始,以趣味终[1]。卢梭有句名言“问题不在于教他各种学问,而在于培养他爱好学问的兴趣,而且在这种兴趣充分增长起来的时候,教他以研究学问的方法。”学生如果对编程产生了兴趣,就会主动学习程序中涉及的基本知识和方法,主动分析问题、思考问题和解决问题[2]。
以兴趣为导向的实验教学实践针对实验教学的形式和内容,从编程趣味性的角度出发,充分激发和培养学生的编程兴趣,挖掘学生的潜能,让他们由被动学习变主动学习,充分参与编程实践,最终达到提高编程能力的教学目标。
就实验教学形式而言,首先,借鉴翻转课堂的教学形式[3-5],除了随堂测验的题目外,实验题目及相关知识点一般提前一周在课程网站上公布。学生提前了解实验内容及相关知识点,就会对实验难度做到心中有数,如果有不熟悉的知识点,可以提前在教材上找到相关编程示例学习。有了提前的知识准备,实验课上学生就不会手足无措。
其次,除了传统的学生提问、老师回答之外,实验课上还采用以下几种形式激发学生兴趣。
(1)学生相互批改作业程序。初学者在编程中遇到的问题主要是语法问题和逻辑问题。这些问题涉及的知识点,教师觉得很基本,学生应该会很快掌握,但是实际编程实践中,初学者要经过多次训练才能掌握。如果只是单一地布置编程训练,学生难免会觉得乏味。采用相互批改作业的方式,学生首先要看懂别人的程序,才能判断程序的对错。学生在阅读别人的程序过程中,可以充分体会到良好程序设计风格的重要性,在今后的编程实践中会有意识地形成良好的程序设计风格;在调试别人程序的过程中,根据别人的错误现象,可以加强自身对语法知识点的理解和记忆。
(2)小组讨论。将学生分成若干小组,每个小组的平均编程能力相近,针对某个问题进行讨论。每名学生都要提出对问题的分析思路以及解决方法,小组成员共同探讨哪些思路和方法是可行的。通过小组讨论,学生能够拓展编程思维,看到同一个问题,可以有不同的解决方法,并且经过编程实践可以对比不同方法的优点和缺点。
(3)项目答辩。项目实验考查的是学生综合分析问题和解决问题的能力,项目程序往往具有一定复杂度和难度。程序设计基础实验教学目标是每名学生都积极参与编程,通过项目答辩,可以考查每名学生是否真正参与项目程序的设计。项目评分包括项目报告、项目程序和项目答辩,对于个别编程能力较弱的学生来说,不会因为其无法完整实现项目所有功能,就评分很低。项目评分机制的改变使得这些学生不再畏惧项目实验,而会尽自己的能力完成项目,锻炼自己的编程能力。学生能独立完成项目基本功能,要好于抄袭完成所有功能。
(4)编程小竞赛。编程小竞赛在每年的暑假进行,面向所有学生。编程能力的培养是一个持续的过程,单凭一个学期的实验课训练是远远不够的。实验课上举办编程小竞赛,就是想让已经完成程序设计实验课程的学生再次回顾编程训练,在学生中制造一种人人爱编程的氛围。考虑到参赛者的编程能力差异,竞赛题目难度设计上应既考虑到基础薄弱的学生,又考虑到编程能力强的学生,这样可以吸引更多的学生参加。在竞赛形式上,可以尽量举办得活泼生动,如今年的竞赛名称叫“编程甜品会”,竞赛规则是在规定时间内完成一题就可以获得一个甜点或者饮料,学生以轻松愉快的心情参加竞赛,对竞赛的参与度越来越高。
最后,实验教学如果单单局限于有限的课时,势必会出现部分学生不能及时得到教师帮助的情况。如果学生性格内向,课上不主动和教师交流,课后也不向同学请教,问题越积越多,一个学期过去,其编程能力就会和同班同学存在明显的差距。为了能让所有学生得到及时的帮助,每届实验课班级都建立有QQ群。在QQ群里,不仅学生可以及时和教师交流,而且学生间的交流也有所加强。一个学生提出问题,不仅教师回答,其他学生还会参与回答。课程群里允许匿名提问,这样内向害羞的学生也敢于提出问题,从而获取帮助。QQ群浓厚的学习气氛可以感染所有学生,促进大家共同进步。
除了实验教学形式,实验教学内容的设置也要以激发学生兴趣为导向。实验内容既要保证基础薄弱的学生看得懂、跟得上、积极性不减,又要充分激发学生的创新意识和创新思维。
教材上每章习题的设计出发点是说明语法细节或者基本程序设计思想,因而和实际应用有一定的偏差。这些题目用于编程训练固然没有问题,但是要想提高学生的编程兴趣,就需要引入吸引学生的编程题目。
首先,对于本科一年级的学生来说,还没有深入学习算法、数据结构等相关知识,实验题目如果有较多的算法题,会让学生感觉实验课较为枯燥,此外,算法题目一般具有一定的难度,会让一部分基础薄弱的学生对编程产生畏惧感。在实验内容上舍弃一些需要复杂算法和数据结构的项目实验,引入一些和实际应用相关的题目,如编程实现某个小游戏,将某个应用实例的功能简化到大多数学生可以编程实现的程度。布置项目实验时,明确项目实验的目的是考查学生对基本程序设计思想和方法的综合应用,目标是锻炼学生思考问题、分析问题和解决问题的能力。在项目实验编程规模上,设定是每个学生都能独立完成,不考虑组队完成,每名学生都需要努力训练和提高自己的编程能力。
其次,学生之间的编程能力差异是客观存在的现象,有的学生在中学阶段就已经接触编程知识,而有的学生没有充足的计算机基础知识,在学习程序设计课程时,明显比有基础的学生感觉难度大,因此若要激发学生的学习兴趣,实验内容设置就要考虑到不同层次学生的接受能力。实验课内容划分难度层次,基础薄弱的学生可以选择从基本验证实验开始训练;有一定编程基础的学生可以选择从综合实验题目开始训练。这样,基础薄弱的学生有成功完成实验的经历,就会增强自信心,会有尝试挑战综合实验题目的欲望;而有一定编程基础的学生,通过完成综合实验题目,有了编程的成就感,会更加迫切地想学习后面的编程内容。
最后,鼓励运用多种方法实现程序。现在的高校人才培养提倡加强创新意识和创新思维的培养。在编程实践中,鼓励学生不拘一格,打开思路,学会从不同的角度分析题目,在完成一个题目的编程后,思考是否还有其他方法也可以实现题目要求的功能。教师针对每个实验进行总结,列出学生提交的不同方法,让学生通过比较,学习不同的编程方法,对所学的编程知识点融会贯通。
实验教学实践环节需要不断探索。为了跟踪学生的学习状况,我们在学期初和学期末都会让学生在线填写调查问卷。反馈的问卷信息显示,在学期初一般会有一半甚至一半以上的学生对“你对编程是否有兴趣”的选择是“否”,而到了学期末,选择“否”的比例会明显下降。最近一次调查中,选择“否”的比例下降到15%以下。随着学生的编程积极性逐年提高,后续专业课程的教师对学生编程能力的满意度也在提高。在今后的实验教学环节中,我们还将继续探索更加生动有趣的实验形式,优化实验内容,加深其趣味性,努力使每一名学生都能爱上编程实验课,积极参与编程实践,训练并提高自己的编程能力,为今后的专业学习打下坚实的基础。
参考文献:
[1]梁启超. 饮冰室合集5[M]. 北京: 中华书局, 1989: 15.
[2]朱卫东, 邱振戈, 栾奎峰, 等. 计算机编程促发兴趣的教学模式实践与思考[J]. 电脑知识与技术, 2015(29): 140-141.
[3]屈微, 姚琳, 汪红兵. 程序设计课程中的翻转教学模式[J]. 计算机教育, 2016(1): 142-145.
[4]王世蓉, 高腾刚, 黄政. 程序设计课程混合教学模式改革与实践[J]. 大学教育, 2017(5): 29-30.
[5]李洪建. 基于混合式教学模式的计算机教学改革[J]. 计算机教育, 2015(24): 36-40.