丁海燕
(云南大学 信息学院, 云南 昆明 650091)
计算机程序设计课程中计算思维的培养
丁海燕
(云南大学 信息学院, 云南 昆明 650091)
计算机程序设计课程是许多高校理工科专业的公共必修课程之一,通常采用C语言作为编程语言。针对传统程序设计课程的教学不足,如概念抽象学生理解困难,学生缺乏程序设计的逻辑思维等问题,该文介绍了计算思维的概念,分析了如何将计算思维融入程序设计课程教学内容,并对翻转课堂教学法进行了探讨,教学实践证明取得了良好的教学效果。
程序设计; 教学设计; 计算思维; 翻转课堂
程序设计既是高校计算机和通信等专业的必修课程,也是理工科非计算机专业的计算机基础课程之一,通常采用C语言作为计算机编程的入门语言,目前高校程序设计课程的教学普遍存在一些不足:
(1) 教师在授课过程中容易注重语法的细节而忽视算法和计算思维的培养,即基本问题求解方法的讲解。
(2) 教学方式通常是教师讲学生听,学生在整个学习过程中参与度不高,处于被动学习;先讲理论后上机实验,学生听课后按部就班完成上机实验,动手能力和解决问题的思考能力不强[1]。
(3) 教学偏重于知识的学习,忽视计算思维的培养与训练。由于计算思维能力的养成没有得到专门的训练,导致思路狭窄,缺乏学习的兴趣和动力,学生在学完课程后常常会感到迷茫,不知道如何用程序设计方法解决自己的专业问题。
这些问题是导致学生编程能力不强的主要原因,是传统课堂注重知识的传授、忽视思维的培养和训练的结果。学生缺乏将数学模型映射为计算机模型的能力,即计算思维薄弱,算法灵活应用能力不足。解决以上问题的根本方法是将计算思维引入“程序设计”课程教学[2]。
《中国高等院校计算机基础教育课程体系(2008)》对“程序设计基础”课程提出的培养目标:一是学习问题求解的思路和方法;二是理解在计算机上算法的具体实现。因此程序设计课程不仅是学习编程语言的知识,更重要的是逻辑思维的培养,学习算法思想与用问题求解的方法,即计算思维的培养。
在利用计算机求解问题的一系列过程中,包括了思维过程、设计过程和计算过程。对于给定的问题,首先必须对提出的问题进行分析思考,即为思维过程;其次用规范的形式对算法进行描述,即设计过程;最终通过计算机程序实现算法,使问题得到解决,即为计算过程。显然,计算性的思维已贯穿于计算机求解问题的全过程,无论是形成解题思路还是编写程序,其思维的目标都是围绕可计算性或可操作性,即计算思维[3]。
2006年3月,美国卡内基·梅隆大学的周以真教授在美国计算机权威期刊《Communications of ACM》撰文提出计算思维(Computational Thinking)的概念和详细定义。所谓计算思维,就是运用计算的基础概念去求解问题、设计系统、理解人类行为。它是涵盖了计算机科学之广泛性的一系列思维活动[4]。计算思维是“每个人都渴望具有的、能够学习和实际运用的具有普适性的思维方式和应用技巧。计算思维的本质是抽象(Abstraction)和自动化(Automation)[5]。同济大学的龚沛曾教授等将计算思维培养进一步细分为计算思维意识、计算思维方法和计算思维能力3个维度培养,为程序设计课程教学提供了更为明确的指导[6]。
在程序设计课程中,各种问题的求解方法和算法,如排序法、递归法、遍历法、二分查找法等,都是计算思维方法在程序设计课程中很好应用的体现[7],与计算思维能力培养的主要内容相吻合。当然一门课程并不能包含计算思维的所有内容,需要一系列计算机应用课程共同完成计算思维能力的培养。因此,在程序设计课程中注重对计算思维能力的培养,对学生后续专业方面的学习和实践能力的提高具有重要意义。
计算思维涵盖了计算机科学的各个核心思想,不可能在程序设计一门课程中把计算思维全部体现出来,那么程序设计课程重点应该着重讲述哪些内容以培养计算思维呢?结合程序设计课程的特点,笔者认为有3个最基本的计算思维,即抽象、递归和模块化。
抽象是从事物中抽取出的共同的、本质性的特征,而舍弃其非本质的特征[8]。例如实数、整数、字符、字符串是不同的数据,得出数据类型的概念,不同数据在计算机内存中的存放形式也不一样,就是一个抽象的过程。计算思维中的抽象是指用这种抽象的方法表达实际的问题。
递归是指函数在运行过程中直接或间接调用自身而产生的重入现象。递归是计算机科学的一个重要概念,采用递归编写程序能使程序变得简洁和清晰,是解决问题的一个有效的程序设计方法[8]。
模块化教会学生如何把复杂的问题分解成若干个小问题,即使用分而治之的方法解决实际的问题。
计算思维是信息思维,它不同于传统的数学思维,不关注逻辑关系、推理演算的严谨程度,而是强调问题解决的操作过程和应用实践。因此在理论知识的讲解上要注重教学方式和方法,将复杂的概念简单化描述,让学生理解概念的来龙去脉,理解如数据存储、数据类型、函数等重要的概念,为后期讲授程序设计中比较难的部分如数组、指针、数据结构埋下伏笔。另一方面,还要注重培养学生解决科学问题能力,以及将这种思维和模型转换为程序的实践能力。
(1) 如何讲授数据类型。数据类型是一个抽象的概念,学生在无法看到“内存”的实体时,要理解数据类型是很困难的。这时可以先借助图片、音乐、视频文件的容量大小对字节的概念进行阐述,再引入不同基本类型的数据在内存中的存放方式,使学生建立完整的计算机数据存储的概念,才能牢靠掌握不同数据类型的存储特点。使学生在后续的数据类型的转换及构造数据类型的学习过程中可以较为平滑地过渡。
(2) 如何讲授递归。在讲解递归函数时,首先“n!=n*(n-1)!”为例介绍递归的概念,并以“老和尚讲故事的‘无穷故事’”为例说明什么是无穷递归,如何让递归在有限次数内终止。以计算Fibonacci数列和实现十进制与其他进制的转换为例,说明编写数值与非数值问题的递归程序,最后以汉诺塔的例子介绍递归的实现[5]。
(3) 如何讲授函数。要理解函数的作用,首先要理解函数出现的意义,函数可以将一些重复出现的计算逻辑独立出来,从而增强程序的合理性和健壮性,实现程序的模块化。这时可以举一个例子,如生活中我们在享受别人提供的服务,但是我们并不关心是谁提供的这种服务,来让学生明白函数的独立性以及封装性。只有函数和模块在程序设计中的重要性解释清楚以后,学生才有兴趣和愿意去进一步了解如何定义和使用函数,以及如何调试程序。
函数的另外一个重要的概念是C语言的函数参数传递机制是单向值传递,很多书上认为指针作为参数时,传递的是地址,从而独立出地址传递这个概念。由于地址也是一类特殊的值,这样的传递方式并没有破坏C语言参数单向传递机制,因此地址传递本质上也是一种值传递,当学生对函数参数传递机制建立起一种统一的概念以后,就很容易理解指针作为函数参数时是如何运作的[3]。
(4) 如何形成知识脉络。围绕内存的变化,使学生理解用指针作函数参数传递地址,实参与形参本质上占据同一内存空间,通过形参的改变来改变实参,达到带回多个不同类型的函数返回值的目的。从而把数组、指针、函数、结构体这些知识脉络形成了一条清晰的教学主线,帮助学生突破C语言的教学难点与重点[3]。
学习金字塔理论表明,被动听讲的教学方法学习效果最低,在“做中学”知识吸收能达到75%,而“马上应用或者教别人”学到的知识能达到90%。爱德加·戴尔提出,学习效果在30%以下的几种传统方式都是个人学习或被动学习,而学习效果在50%以上的,都是团队学习、主动学习和参与式学习。由此看出,学习方法不同,学习效果大不一样。因此教师要学会调整甚至改变教学方法,学生要努力转变学习方法,要由被动听转到主动学。在教学中,要大力提倡小组合作学习,在参与中掌握知识,生成能力,从而真正实现从知识到能力的转化。
教师应当充分尊重学生在学习中的主体地位,在程序设计课程中可以引入翻转教学法,颠倒课堂上的学习流程,化被动学习为主动学习,提高课堂教学的有效性。所谓的翻转课堂,就是教师创建视频,学生在家中或课外观看视频中教师的讲解,回到课堂上师生面对面交流和完成作业的这样一种教学形态[9]。“翻转课堂”特点有:
(1) 教学视频短小精悍,通过网络发布的视频,具有暂停、回放等多种功能,可以自我控制,有利于学生的自主学习。
(2) 教学信息清晰明确,把内容集中在屏幕上,配合讲解的画外音。每一个视频都针对一个特定的问题,有较强的针对性;视频的长度控制在在学生注意力能比较集中的时间范围内(10 min内),符合学生身心发展特征。
(3) 重新建构学习流程。教师提供了视频,在课前对学生进行“信息传递”,在课堂上通过互动来完成“吸收内化”,教师在课堂上给予有效的辅导,教师更多的责任是去理解学生的问题和引导学生去运用知识,学生之间的相互交流更有助于促进学生知识的吸收内化过程。
(4) 复习检测方便快捷,学生观看了教学视频之后,是否理解了学习的内容,视频后面紧跟着的4~5个小问题,可以帮助学生及时进行检测,并对自己的学习情况做出判断[10]。
程序设计知识点繁杂、概念抽象,因此视频教学和翻转教学也非常适合程序设计的教学。有效实施翻转教学法的前提是根据教学内容和教学大纲,划分出各个章节的知识点,如if语句、switch语句、for循环语句、while循环语句、数组、函数、指针等,将每个知识及其典型案例用屏幕录像软件录制成10 min左右的微视频,上课前提前发布给学生在课外观看,上课时通过师生互动辅导学生完成上机编程作业,解答学生在编程中遇到的问题。先看录像后讲课,这是“翻转课堂”的教学视频与传统的教学录像最大的不同之处。一个最显著的变化将是,翻转课堂从以教师为中心真正转变为以学生为中心,这实际上是一种传统与现代的结合体,但其效果远好于传统教学,并且翻转教学这种主动学习的方式有利于计算思维的训练与形成,是培养计算思维很好的一种教学方式。
培养学生的计算思维能力,除了把程序设计的重点放在讲解思路、问题分析和对问题进行抽象以外,在教学过程中还要注意4个原则:
(1) 采用案例法和任务驱动。选择计算学科中的一些趣味性强的典型实例引导学生进行程序阅读和思考,体会其中解决问题的思想和方法。相关知识点在案例中一并讲解,激发学生的学习兴趣和求知欲,避免学生因枯燥的程序语言语法规则而失去学习兴趣;以项目为驱动组织实施程序设计的教学,这样有利于学生计算思维能力和自学能力的培养[11]。
(2) 注重学生的自主学习。将课堂教学、上机实验、翻转教学、慕课、教材及其他资源相结合,创设线上与线下立体学习环境使学生成为学习活动的主体,让学得好的学生上机辅导差一些的学生,充分训练学生的思维与语言表达能力。
(3) 以实践教学促进理论教学。通过上机实践环节加强和训练程序设计的计算思维模式,学生在对程序进行不断调试的过程中,理解和领悟程序设计问题求解的思想方法和思维模式[12]。
(4) 引导学生参加合作学习。采用的方式是上机实验时将3~4个学生作为一组进行考核。每个人在解决问题中所能贡献的能力是不一样的,合作方式可以很快提高自身所缺乏的能力;其次,小组之间形成竞争关系,小组成员会尽力提高自己小组的竞争力,这种竞争机制能够激发学生的积极性,在提高学生解决问题的能力的同时也培养了团队合作精神。
计算机技术更新极快,在程序设计的教学中不能只满足于教会学生编程技能,还要注重学生的自学能力、思维能力和创新能力的培养。教师还要教给学生归纳总结、触类旁通的学习方法,教会学生归纳和总结,在多门编程课程中触类旁通,将会使学生在将来的工作中立于不败之地。
References)
[1] 张莉,金莹.大学程序设计课程中的计算思维培养[J].中国电力教育,2013(16):94-95.
[2] 杨俊生,张润.基于计算思维的“C程序设计”案例设计初探[J].工业和信息化教育,2013(6):65-70.
[3] 刘渝妍,丁海燕,何红玲.C语言程序设计[M].北京:科学出版社,2015.
[4] Wing J M. Computational thinking[J].Communications of the ACM,2006,49(3): 33-35.
[5] 顾荣杰,范剑波.基于计算思维的C 语言计算机公共课程的改革[J].宁波工程学院学报,2012,24(4):92-94.
[6] 龚沛曾,杨志强.大学计算机基础教学中的计算思维培养[J].中国大学教学,2012(5): 51-54.
[7] 黄静,高延英,杨宇姝.基于计算思维的程序设计课程教学模式研究[J].计算机教育,2013(5):51-54.
[8] 苏小红,车万翔,王甜甜,等.如何在程序设计课程中培养计算思维能力[J].工业和信息化教育,2013(6):32-36.
[9] 殷丙山,李玉.慕课发展及其对开放大学的启示[J].北京广播电视大学学报,2013(5):29-34.
[10] 赵兴龙.翻转教学的先进性与局限性[J].中国教育学刊,2013(4):65-68.
[11] 王先超,王春生,胡业刚,等. 以培养计算思维为核心的C程序设计探讨[J].计算机教育,2013(13):44-47.
[12] 潘亚平,徐燕.基于计算思维的计算机程序设计课程的教学改革与实践[J].淮海工学院学报:人文社会科学版,2012,10(23):76-78.
Cultivation of computational thinking in Computer Pogramming Design course
Ding Haiyan
(School of Information Science and Engineering, Yunnan University, Kunming 650091,China)
The Computer Programming Design is one of the compulsory courses in many universities of science and engineering, and the C language is usually adopted as a programming language. In view of teaching problems of traditional programming design courses, for example, the concepts are abstract and difficult to understand for the students , lack of logical thinking of programming design, etc. This paper introduces the concept of computational thinking, and analysis of how to integrate computational thinking into the teaching contents of Computer Programming Design course, and the flipped classroom teaching method is discussed too. The teaching practice shows that good teaching effects are achieved.
programming design; teaching design; computational thinking; flipped classroom
2015- 03- 07 修改日期:2015- 04- 24
2013年度云南省质量工程教学改革研究项目(X3113008); “云南大学第五批中青年骨干教师培养计划”专项经费资助(XT412003); “教育部高等教育司—微软公司”2014校企合作专业综合改革项目(2014MOEMSCT0111)
丁海燕(1974—), 女,云南昆明,硕士,副教授,主要研究领域为计算机应用.
E-mail:teidhy@163.com
G642.0
A
1002-4956(2015)12- 0016- 03