徐晶+周彩英+卢雪松+楚红
摘要:培养计算思维是培养复合型创新人才的重要内容之一。该文结合我校非计算机专业程序设计课程教学的实际,以C语言程序设计课程为例,整合教学内容,对基本语法的问题式教学、基本控制结构的案例教学及模块化设计的任务驱动教学等研究性教学法进行探讨,旨在培养学生的计算思维能力,进一步提高学生的创新能力。
关键词:计算思维;程序设计;研究性教学
中图分类号:G424 文献标识码:A 文章编号:1009-3044(2016)28-0150-03
1 背景
1.1 计算思维
“计算思维”一词早在2006年美国卡内基梅隆(CMU)的周以真教授就给出了定义,其本质是抽象和自动化。周教授强调计算思维不仅属于计算机科学家,而应是每一个人的基本技能。[1]2010年我国九校联盟会议也发表声明指出,培养复合型创新人才的一个重要内容就是要潜移默化地培养学生养成一种新的思维方式——计算思维。[2]
1.2 研究性教学
高等教育的任务是培养具有创新精神创新能力的高级专门人才。研究性教学作为一种开放式教学模式,是本科院校培养人才的重要途径。2000年以来,教育部先后出台“关于加强高等学校本科教学工作提高教学质量的若干意见”等文件,都明确提出积极推动研究性教学,提高大学生的创新能力。[3]各高校积极将研究性教学理念融入到教学改革中,积极探讨研究性教学的理论与实践模式。
由此可见,在当今信息技术时代,培养学生的计算思维能力是培养具有创新能力的人才的必要条件。在积极实践研究性教学改革过程中,不断渗透计算思维的思想,培养学生计算思维能力,是一项非常有意义的重要任务。
2 我校计算机基础教学的现状
为应对高校计算机基础的教学改革,我校对计算机基础课程的教学做了改动,非计算机专业学生第1学期先行开设大学计算机基础课程,第2学期开设程序设计课程。这样使新生在了解计算思维的概念后,能有意识地使用计算思维去思考问题、去解决一些基本问题,同时对后续开设的程序设计课程有一定的铺垫作用。
我校在研究性教学初步实践的基础上,现已在18个专业全面开展研究性教学改革,计算机公共课教学也在此列中。将研究性教学改革应用于程序设计课程,正好解决了目前非计算机专业程序设计课程教学过程中尴尬局面,其一是教学过程中偏重语法讲解,内容多、晦涩难懂;其二实验课时少,学生编程能力和调试能力差等。
程序设计课程正好也是训练学生计算思维能力的一个重要平台。因而,如何在程序设计课程的研究性教学中训练学生的计算思维能力,又如何利用学生的计算思维能力促进程序设计课程的教学改革,则是我们计算机公共课教学工作者要积极思考并付诸实践的重要课题。
3 注重计算思维的程序设计课程研究性教学探讨
我们在非计算机专业开展注重计算思维的程序设计课程(以《C语言程序设计》课程为例)研究性教学,是以培养创新人才为目标,激励和引导学生主动发现问题、分析问题和解决问题,在以教师为主导、学生为主体的探究过程中运用计算思维的方法获取知识、训练思维、培养能力。
根据计算思维和研究性教学的特点,我们从本校实际情况出发,实施C语言程序设计课程研究性教学以课堂研究性教学为主,且又不仅仅局限于课堂中,辅以学生自主探究、合作学习、网络自测、观看视频。对教学内容进行整合,将课程内容分为几个阶梯式的程序设计阶段,依次是语法基础、基本控制结构、模块化程序设计等。教学过程中,根据具体教学内容灵活运用适合于研究性教学的方法和手段,如问题式教学法、案例教学法、任务驱动教学法等,激发学生的学习兴趣,注重解决实际问题的程序设计思想与方法,注重计算思维能力的培养。
3.1 基本语法的问题式教学,培养计算思维能力
问题式教学通过提出一系列问题来组织教学内容,把问题贯穿于教学过程的始终。古人云“学起于思,思源于疑”,问题、疑问是思维的“启发剂”。我们首先要创设问题情境,激活学生思维;交流讨论,启发学生反向思维;解决疑问,学会计算思维的方法。
C语言的基本语法、基本控制结构本身就蕴含着重要的计算思维。[4]我们通过不断设问、反问,来逐步分析、挖掘、探索C语言语法的知识内涵,让学生领悟语法定义的目的、形式和使用方式。这样让学生既学到了C语言基本语法,又有利于在使用过程中少犯错误,即使出现语法错误也能快速找出症结所在。
示例问题:将华氏温度转换成摄氏温度。转换公式:C=5.0/9*(F-32),其中F为华氏温度。
讲解示例,首先设问“如何告诉计算机所要完成任务?”,当然用符号表示(即符号化),这是一次抽象的过程。再问“直接输入转换公式,计算机能识别公式中的符号吗?”,演示发现系统会报错,无法识别F和C。接着问“怎样让系统接受未知的数据?”及“在C语言中如何“介绍”新数据?”,此时让学生去自学、讨论数据对象的命名规则及基本数据类型,并带着问题“为何不能将形如int、1st、W.Join作为对象名(用户标识符)?int和Int在有何区别?”去思考。通过讨论最终确认,使用“float F,C;”来声明两个实型变量F和C。这又一次的抽象使学生不仅学到了知识,而且还体会计算思维的确定性和形式化。
声明变量后,设问“能运行并得到正确结果吗?答案是多少?”,此时让学生手算或心算,有人发现F的值未知,无法计算。但教师演示系统却未报错,提问“为什么?”学生带着好奇,教师道出原因,让其进一步了解变量的含义。为得到正确结果,需要先为F赋值,设问“怎么赋值?”,学生回答“F=50”,教师给予肯定的同时反问,这样系统每次运行得到的结果会怎样?让学生发现这样的程序不具备通用性,由此引出C语言的输入输出库函数。
以问题为中心的教学示例中,将学生思考、讨论和教师讲解、点评有机地结合起来,师生在互动中学习、探究,教师引导学生积极主动地获取知识,学生通过基本语法的学习也培养了计算思维能力。
3.2 三种控制结构的案例教学,强化计算思维能力
案例的选取是案例教学中的关键因素,[5]选取的案例所反应的知识点要丰富,具有针对性、启发性和扩展性,应由简单到复杂。针对结构化程序设计思想中的顺序、选择和循环三种结构,通过抽象问题、分组讨论、集中讨论和总结反思等环节,使学生在案例分析的过程中体会计算思维的特征,强化计算思维能力。
案例1,已知三条边长,求三角形面积。[6]
学生课前准备案例时,收集或查找各种计算三角形面积的方法。在小组讨论时每位学生给出不同的解题思路,相互间指出问题,比较哪种算法描述更简洁。课堂教学时采用集中讨论,每组推选代表简述讨论结果,由教师和其他组学生给予评价。教师在教学过程中不断启发学生、鼓励学生,同时给出总结,比如该案例使用海伦公式计算是较方便的方法,使用语言描述算法时注意的语法规则。如果有小组提出“三边能否构成三角形”问题,则应大力表扬,促使学生提高思维的缜密性和严谨性,同时顺理成章地引入分支结构。
案例2,比较两位学生的成绩,输出最高分。如果人数扩展到3人、N人,如何找出最高分?
案例第1问解决思路非常清晰简洁,使用1次双分支结构即可,至少两种描述方法:if-else和switch-case结构。当比较人数扩展到3人时,和学生探讨出多种描述算法,既可以使用嵌套的分支结构,也可两次使用分支结构。通过讨论可以开阔学生的思路,又促使学生主动思考,鼓励思维的多样性。案例的最后一问是难点,教师应给予指点,让学生带着问题“N个成绩如何存储?使用N个简单变量可行吗?N个成绩需要比较多少次?”去查资料、思考,有思路也有困惑。“N个成绩比较N-1次找出最高分”答案是肯定的,但数据存储是难点。一种思路是用数组,引入数组的概念,为下一章做好铺垫;另一种思路依旧用简单变量,但用N个简单变量是不现实的,引导学生纵向思考,每次存放一个成绩,重复N次即可,引入循环结构。解决方案是用两个变量,擂台思想,循环N-1次就能找出N个中的最高分。
通常我们设计的教学案例都不是很复杂,让学生努力一下能解决,但是要具备多样性和扩展性,让学生从不同角度认识问题,用不同方式描述算法,用不同方法实现问题求解。用程序设计语言描述、解决问题,正是将人的日常思维转换到计算机思维的过程。
3.3 模块化设计的任务驱动教学,提高计算思维层次
任务驱动教学是一种建立在建构主义学习理论基础上的教学模式,[7]它以教师为主导、学生为主体,教、学双方都围绕若干项任务展开,在求知欲的驱动下,学生采用自主探究和协作学习方式,根据对任务的理解,运用共有知识和已有经验提出解决方案、完成特定任务。
将任务驱动教学法应用于程序设计课程教学的后半期,此时学生已具备一定的程序设计基础知识和计算思维能力,教师把精心准备的小系统(如一元多项式运算系统、基本算术运算测试系统、矩阵运算系统及小规模信息处理系统)的开发任务,分配给每个协作小组,也可让小组(或组长)从若干任务中挑选。
每个小组接到不同任务后,结合系统设计要求,采用自顶向下、逐步细化、模块化的方法,设计系统的总体结构,包括系统的基本处理流程、组织结构、模块划分、功能分配、接口设计和数据结构设计等。比如一元多项式运算系统,其设计要求是实现一元多项式的加、减、乘、除运算。从表面上看系统应由1个主模块和4个子模块组成,起主导作用的教师要引导学生运用计算思维的关注点分离、抽象和分解的方法进行分析。为了能进行运算,首先要输入一元多项式,运算结束后要输出一元多项式,增加输入、输出两个子模块。在实现四种运算时,引导学生使用计算思维的约简、嵌入、转化等方法,将其转化成合并同类项、降幂排列、删除系数为0项等问题,又需增加4~5个功能模块。在任务驱动下,协作小组成员通过参考书、网络等自主检索、探究、思考、讨论,对每个模块进一步细化,确定每个模块的具体功能,画出系统的组织结构图和基本处理流程。在设计数据结构时,小组成员讨论是从已会的一维、二维数组中选择,还是从未学的结构数组、链表中选择,既要考虑能便于数据的处理,又要考虑组内成员的水平,因为每个系统需组内成员分工协作才能完成。组长此时可以协调,先用一维数组实现,后期也可在素质较高的学生带领下使用链表等实现,这样小组成员相互协作、相互启发、共同提高,体现团队合作的理念。
每位成员领取分解的任务后,根据共同确定的数据结构和模块接口的描述,对具体子模块进行详细设计,给出详细的算法描述。然后,分组讨论每位成员的算法可行性,以及与其他子模块之间的调用关系,如遇到解决不了的问题,教师可参与讨论,给予一定指导,调动大家的积极性。算法确定后,每位学员根据算法编写代码并写出设计报告。协作小组成员再集中交流各自完成的情况,由组长集成系统代码,组员一起参与调试过程,发现问题解决问题,共同进步。每位学员按照报告模板提交各自的设计成果,采用答辩的形式在班级讨论课上进行汇报。答辩过程中,教师和其他学生可以提出看法和观点,教师应对答辩学生的讲述和提出异议的观点进行正误的分析,因为学生为了完成这项任务都是深思熟虑的,教师及时地分析总结归纳,不仅使学生对所学知识的巩固,而且进一步扩展学生的计算思维能力。
采用任务驱动教学法不再强调系统开发的成功与否,而是强调学生在系统设计过程中的收获。每位学生通过对具体问题分析、讨论、解决,不断训练自己的计算思维能力,通过以小组方式进行一个小规模系统的设计,将学生的计算思维能力提高了一个层次。
4 结语
在程序设计课程研究性教学过程中不断渗透计算思维的思想,更加利于学生对知识的掌握,同时利于提高计算思维能力,推动学生创新能力的进一步发展。我们从学校实际出发,提出整合教学内容,对基本语法的问题式教学、基本控制结构的案例教学及模块化设计的任务驱动教学等研究性教学法进行探讨,以期使教师能够摆脱教材束缚,将理论与实验课时、课内和课外充分利用,更好地发挥教学的自主性,促进学生的计算思维能力的提高。
参考文献:
[1] Jeannette M.Wing.Computational Thinking[J].Communications of the ACM,2006,49(3):33-35.
[2] 何钦铭,陆汉权,冯博琴. 计算机基础教学的核心任务是计算思维能力的培养[J]. 中国大学教学,2010( 9):5-9.
[3] 徐风生. 研究性教学的理论探讨与实践[J]. 高等理科教育,2012(6):44-48.
[4] 徐新海,林宇斐. 注重计算机思维的启发式C语言语法教学[J]. 计算机教育,2014(9):1-4.
[5] 唐芳. 案例教学法与任务驱动教学法的比较[J]. 顺德职业技术学院学报,2011(10):36-37
[6] 周彩英. C语言程序设计[M]. 北京:清华大学出版社,2011.
[7] 牟琴,谭良,周雄峻. 基于计算思维的任务驱动式教学模式的研究[J]. 现代教育技术,2011(6): 44-49.