曹恒来+陈宏斌+钮洪斌+仇大成
【摘 要】计算思维起源于计算科学,程序设计是理解计算思维的最佳途径。基于计算思维的小学程序设计教学,从学科思维层面重新建构了以Scratch和Logo为基础,以机器人和Free BASIC为拓展的小学程序设计课程体系,归纳和优选了关注点分离、计算参与、案例教学、模式建构等系列化的程序设计教学策略与方法,希望学生能够像计算机科学家一样去思考和解决问题,提高发现和解决问题的能力。
【关键词】计算思维;程序设计;教学研究;教学实践
【中图分类号】G434 【文献标识码】B
【论文编号】1671-7384(2016)12-0039-04
研究缘起
长期以来,我国的中小学程序设计教学更多定位于程序设计语言的学习,学生无法形成计算科学特有的理解问题和分析问题的思维方式,存在问题如下。
1. 乏味的形式化教材体系,泯灭了学习的兴趣
计算机诞生于西方,因此程序设计语言都明显带有西方文化的演绎思维特征,如使用巴科斯范式或语法图等形式化的方式描述语法规则,并影响到了教材的编写。这种抽象的向学生灌输程序设计语言语法知识的教材编写方式,脱离了具体的生活情境,忽视了学生自身的学习特点,容易使他们丧失学习的兴趣。[1]
2. 单一的演绎式教学策略,消磨了学习的能力
受教材的影响,无论是BASIC,还是Logo,中小学程序设计教学都是采用讲授式的教学方式,教师“灌”,学生“听”,学生只能处于被动接受的状态,几乎没有动手实践的机会,课堂上大多数时间都掌控在教师的手中。这种演绎式教学策略,让学生能够在较短的时间内掌握所学的知识,却不能使学生掌握获取知识的方法,以及进一步学习的能力。
3. 文本的专业化编程环境,阻碍了学习的进程
程序设计离不开编程环境的支持,然而,各种专业的编程环境,包括面向儿童的编程语言Logo,都是基于文本和符号的编程方式,学生必须自己输入指令,各种各样的语法错误往往导致学生寸步难行,大大延长了程序设计学习的时间,影响了程序设计能力的提高。
思想的源泉
近年来,从学科思维层面构建课程结构和内容逐渐成为人们的共识[2]。这里所说的思维,是指科学思维,主要分为逻辑思维、实证思维和计算思维三类[3]。计算思维起源于计算科学,2006年,卡内基·梅隆大学周以真教授在计算机科学协会(ACM)年会报告中,首次明确提出计算思维的概念:“计算思维是运用计算机科学的基础概念去求解问题、设计系统和理解人类的行为。它包括了涵盖计算机科学之广度的一系列思维活动。”她认为:“计算思维就是通过约简、嵌入、转化和仿真等方法,把一个看起来困难的问题重新阐释成一个我们知道怎样解决的问题。”[4]
计算思维不是今天才有的,只是计算机出现后,计算思维才逐渐被认识和强化。当前,计算思维已经超越了传统的计算机环境,适用于信息技术渗透的每一个角落,但是程序设计仍然是理解计算思维的最佳途径。在设计问题求解方法时,会用到递推法、迭代法、递归法等;用计算机语言描述求解过程时,会涉及顺序、分支和循环三种基本结构;考虑如何响应和处理各种意外情况时,就要用到冗余、容错、纠错的方法;在维护和修正程序的过程中,要用到测试和调试的技术。这些技术都是计算思维中的核心概念[5]。
实践的历程
1. 建设程序设计教学课程资源
现有的程序设计书籍都是基于演绎思维编写的,更多适用于成人学习。从2008年起,我们着手编写适合青少年需要的《程序设计应用》校本教材,努力使其成为小学生爱看、好读、易懂的程序设计书籍。主要从以下几个方面进行了尝试。
一是从教学出发选择工具,突破复杂编程环境的壁垒。从计算思维的角度看,程序设计语言是描述问题的工具,在设计程序之前,首先要选好工具。通过多年的探索与实践,我们认为BASIC语言仍然是适合小学生学习的程序设计语言。FreeBASIC(简称FB)既保持了BASIC语言简单易学的传统,也提供了程序设计开发工具所应具备的输入、编辑和调试功能,菜单简洁、清晰,可以较好地突破复杂编程环境造成的学习壁垒。
二是将演绎与归纳相结合,促进知识的主动建构。人类的思维方式一般有两种:归纳与演绎。归纳是指从各种特殊事例中抽象概括出一般规律;而演绎则是从一般原理出发,通过推导得出个别结论。演绎法是西方文化的内涵,而归纳法反映了东方文化的内涵。受西方演绎思维框架的影响,目前的程序设计教材都是直接从语句的基本格式出发,展开到各个局部细节知识。这对一直接受东方文化熏陶的中国学生来说,理解上有一定的困难。为此,我们从两个方面采取措施,融合两种文化差异所带来的问题:一是用自然语言的体系结构类比程序设计语言的体系结构,首先让学生从整体上把握程序设计语言的结构,并由此过渡到具体内容的学习[6];二是对于基本语句,先通过一个学生学习和生活中典型问题的程序,归纳出它的基本格式或解决问题的基本规律,再将这些规则或规律应用于相似问题的解决,而不把所有的知识不分巨细都“嚼碎”了“喂”给学生。显然,这是一种基于计算思维的构造性思维方式,更符合中国学生的认知规律。
图1 自然语言的基本体系结构 图2 程序设计语言的基本体系结构
三是强化算法的分析,经历问题解决的全过程。用程序设计解决问题,关键是要找到解决问题的方法——算法。对于初学者来说,往往在看到问题后,粗粗一想就开始动手,很简单的问题却写出一大堆代码,自己也说不清解决问题的方法和过程。所以,对于每一个编程问题,我们都会从问题的分析和分解开始,首先找出解决问题的算法,再用FB语言编写程序、实现算法。[7]
程序设计具有很强的实践性,学习者只有通过大量的编程实践,才能比较牢固地掌握基本的编程知识和技能,进而编写出具有“实用”价值的程序。因此,我们为每章都配置了习题,并专门编写了配套的习题解析,对教材中的习题进行详细的分析和解答。同时,进一步补充了改错题、读程序题、程序填空题等。多数习题创设了贴近学生学习和生活的应用情境,以激发学习者在真实的情境中寻找解决问题的方法。为了检测学生编程解决问题的能力,我们还使用HUSTOJ系统架设了在线程序评测系统。学生提交的程序在服务器端运行,会有正确、答案错误、编译错误、格式错误等反馈信息,可以很好地指导学生调试程序。教师亦可很好地检查学生作业完成情况,并就存在的问题进行解答。
2. 创新程序设计教学策略与方法
融入计算思维,不仅是内容和工具的改变,更应是教学方法、教学方式的改变。近年来,我们总结和归纳了系列的程序设计教学策略与方法。
一是采用案例教学,自主建构程序设计指令集。程序设计的学习主要围绕环境、语言和应用三个方面的知识和内容展开,语言的学习,其核心主要在于语言规则本身。传统的程序设计教学主要使用规例法介绍语言规则,即从语句的基本格式出发,详细讲解语句的各个要素,最后举例说明。我们则在程序设计教学中运用案例教学法,首先对典型程序进行模仿,归纳出语句基本格式或解决问题的基本规律,再将这些规则或规律应用于类似问题的解决。
案例1:定义过程
1.提出问题,呈现任务。分析“俄罗斯方块”游戏,发现共有七种基本方块,本节课的任务是学习用Logo语言绘制七种基本方块。
2.运行程序,分析过程。用定义好的“ZFX”过程示范绘制一个基本方块,对“过程”作初步讲解。
3.范例研习,提取指令。出示“ZFX”过程,为学生揭开教师演示的秘密。再出示“SJX”“WJX”两个过程,归纳出过程的一般格式。
4.定义过程,尝试使用。学生尝试定义绘制正方形的过程,调用过程绘制一种自己喜欢的基本俄罗斯方块。
5.创意设计,再用过程。从“多层柜”“幸运草”和“好运星”中选择自己喜欢的图形进行分析,并完成图形的绘制。也可以自己定义一个或者多个绘制基本图形的过程,设计出新的图形。
在程序设计学习伊始,为学生提供一个需要解决的生活中的具体任务,分析解决这个问题的“程序”,引导学生提取其中的指令,得到一组“指令集”,再将这组“指令集”应用于类似问题的解决,逐渐提高个人“指令集”的复杂程度,最终得到功能强大的指令集。显然,这种例规法教学更符合中国学生的认知规律。
二是面向计算参与,在创意和计算中学习编程。Scratch是一个可视化编程工具,学生只需要拖动图形就可以轻松创作出蕴涵着故事情节的游戏和故事等编程制品。然而,许多教师仍然采用传统的“编写代码”的教学思路,并没有充分发挥Scratch在创意计算上的优势。2012年,美国宾夕法尼亚大学教育研究生院的YasminB.Kafai教授提出了以“社会化转向”为特征的培养计算思维的新范式——计算参与,并从三个维度进行了描述:(1)从编写代码到创建应用;(2)从设计工具到促进社区;(3)从“白手起家”到再创作他人成果。传统的程序设计学习总是通过解决一些看似趣味、其实枯燥的数学题(如农夫过河等)来学习编程。基于“创建应用”的编程教学方式,学生不再只是编写代码,设计功能完整的应用程序成为学习编程的重要任务[8]。“我的Scratch画图程序”这节课就采用了“创建应用”程序设计教学方式。
案例2:我的Scratch画图程序
教师出示学生Scratch作品范例——“画一画”程序。(1)体验操作,并思考程序中有哪些角色,它们在程序中分别有什么功能。(2)观察“画笔工具”角色的主要动作,分析角色的脚本,完成“连一连”,将动作和对应脚本模块用直线相连。(3)两人一组,一人负责现有范例程序不变,另一人逐条删除“画笔”工具中的相应指令,比较、分析每一个指令的作用。
学生在创作我的“画图”程序的过程中,需要“仔细思考用户与应用程序互动的方式,以及根据意图实现功能的方式”,知识与技能的学习有机地融入到了设计有意义的“画图”程序中来。学生不再只是技术“消费者”,更多的是技术的“生产者”。此外,在他人的基础上学习编程,一个人也可以编写相对“复杂”的程序。使用——修改——创作是这种教学策略的基本思路,范例研习引领学生发现别人解决问题的方法,通过修改参数进行模仿设计,进一步理解技术的关键要点。在此基础上,尝试为游戏添加更多的功能,从而将学到的知识与技能应用到解决实际问题的过程中,使学习变得更加有趣。
三是运用关注点分离,降低问题解决的复杂度。在教学中采用关注点分离方法,就是将复杂问题进行合理的分解,控制问题的复杂性,提高可理解性,再分别仔细研究问题的不同侧面(关注点),最后综合各方面的结果,合成整体的解决方案[9]。“画组合图形”就采用了关注点分离的方法。
案例3:画组合图形
你会画组合图形吗?这个图形由哪几个图形组成?你准备先画哪个图形?小海龟出发时的角度是多少?绘制这个图形的命令是什么?画好该图形后,小海龟的位置在哪个点?你准备把第二个图形的起始位置确定在哪个点?小海龟出发时的角度是多少?绘制这个图形的命令是什么?
通过把复杂的组合图形拆分成两个简单图形——等边三角形和正方形,实现关注点的分离,也降低了绘制组合图形的难度,更易于学生理解。
四是基于模式建构,培养正确的程序设计思维方法。现代大型软件系统的开发中,工程化的开发控制是软件系统成功的保证。在我们程序设计教学中,“个性化”方法比较严重,同一个算法在不同问题中的描述往往是不同的,学生即使编写了“大量”的程序,也无法迁移到相似问题的解决过程之中。所谓模式,是指一种经验和规律,是对相似问题的一种通用解决方案,它是经过充分考验并证明是行之有效的,能够迁移并推广到更广泛的问题解决与应用中去[10]。以下就是基于模式建构的循环语句教学案例。
案例4:循环语句
循环是程序设计最困难的部分之一,学生往往在这里开始出现分化。主要是由于在使用DO-LOOP语句时,必须自己实现循环的四个部分,这时经常会遗漏修正部分或修正不正确,或者检查条件设置不正确,造成死循环。应用模式进行循环语句的教学,则可以帮助学生建立起循环结构解决问题的基本模式:初始条件、检查条件、循环体、检查条件,学生在解决其他相似问题时,只需要根据具体问题,修改这个基本模式的相应部分即可。应用是无限的,但方法、原理、思想却是相对固定的,基于模式建构的程序设计学习,有助于学生建立良好的程序设计思维和方法。
3. 探索基于机器人平台的程序设计教学
虽然Scratch采用了图形化的编程界面,但是编程的结果也只能呈现在屏幕上,基于机器人平台,学生则可以把程序下载到机器人里,即时看到编程的“物化”效果,再根据这些反馈修改程序,使程序设计的学习更具有知识性、实践性、趣味性和直观性。
例如,在机器人沿线(如黑线)行走的运动中,机器人是根据灰度传感器测得的黑白色灰度值来判断是否在线上。理论上来说,在机器人行走的过程中,灰度传感器测得的灰度值等于黑色灰度值,说明机器人在轨迹线上,测得的灰度值等于白色的灰度值,说明机器人在线下。然而,黑色轨迹线的颜色并不是绝对均匀的,可能也有小块的白色区域没涂上白色。因此,为了使机器人能够比较稳定地行走,应该允许识别黑白色的临界值有一定的差值。这样,学生在经历“思考—实践—再思考—再实践”的反复人机交互过程中,体验了在解决工程问题过程中,为满足系统的可实施性,而对系统设计中的技术、方案做出合理取舍的一种折衷思维[11]。
实践成果
至此,我们逐步建立了小学程序设计教学的课程体系。该体系主要由四个模块组成:把Scratch作为小学生首门程序设计课,学生在制作富有个性的互动媒体作品的过程中,形成信息化情境下解决问题的方法与策略;在用Logo指令控制计算机完成动作的过程中,理解人是如何通过程序指挥计算机解决问题的;通过机器人模块的学习,理解基于“工程-设计-管理”框架下的模块化、结构化、逐步求精、测试与调试等软件工程设计方法。通过FB程序设计课程的学习,学会从问题出发设计算法并编程实现,理解算法和程序设计在解决问题过程中的地位和作用。
作为最重要的计算思维原则之一,关注点分离法是处理复杂问题的一种普适系统方法和原则,在不同模块教学中都要运用这种思想方法。在基于计算参与的程序设计教学中,学生从使用、“摆弄”他人的编程制品开始学习编程,理解程序设计的基本思想。案例教学指向的思维品质正是计算思维的本质——抽象,用这种方法学习到的“程序设计”,不是陷在陌生的人工语言环境之中,依赖记指令、背结构的程序设计,而是面向贴近生活经验的、解决现实问题的程序设计。应用模式进行问题的分析与设计,有助于我们运用别人的经验,特别是专家的经验来分析、设计和描述问题,并最终解决问题。在实际的教学情境中,这几种教学方法之间是一种相互支持、互为补充的关系,我们应充分利用它们的优势,以促进学生的发展为原则来寻求一种最佳的搭配。
参考文献
[7]曹恒来,沈军.《程序设计与应用》校本课程开发的实践与思考[J].教育研究与评论,2015(3).
李艺,钟柏昌.谈“核心素养”[J].教育研究,2015(9).
[5]李廉.计算思维——概念与挑战[J].中国大学教学,2012(1).
Jeannette M. Wing. Computational Thinking[J]. Communications of the ACM, 2006(3).
[10]沈军.大学程序设计基础——系统化方法解析&Java描述[M].南京:东南大学出版社,2015.
王旭卿.从计算思维到计算参与:美国中小学程序设计教学的社会化转向与启示[J].中国电化教育,2014(3).
何明昕.关注点分离在计算思维和软件工程中的方法论意义[J].计算机科学,2009(4).
钟柏昌,李艺.计算思维的科学涵义与社会价值解析[J].江汉学术,2016(2).
(作者单位:江苏盐城市教育科学研究院 江苏盐城市第一小学教育集团 江苏大丰区幸福路小学 江苏滨海县教师发展中心)