上周和一位语文教学大师一边赏景、一边闲聊,聊着聊着聊到了编程教育话题,突然勾起了三十年前的记忆,回家翻箱倒柜,翻出了当时几个人一起合写的儿童编程教材。没想到教育也和衣着时尚一样,隔一段时间便要将过去的流行重新拿回来,再创造一次复古的流行。
现今的编程教育流行风是2010年奥巴马总统将科学、科技、工程与数学等STEM教育,定调为美国基础教育的发展方向之后开始盛行起来。但其实早在半个世纪前,美国麻省理工学院(MIT)人工智能实验室共同创办人西摩尔‧派普特(Seymour Papert)教授(2016年以88岁高龄去世)就已鼓吹,应该让每一个孩子都学习编程,他并带领团队在1968年以人工智能程序语言LISP为基础,开发出世界上第一个儿童专用编程语言Logo。
派普特在1985年接受纽约时报专访时曾说:「Logo是一个编程语言,它让计算机照着你希望它怎么做的方式去完成工作。」他认为「使计算机做事,需要在一定程度上描述基本的流程,并具有足够的精度来由机器执行。」因此在个人计算机上学习Logo编程,「给了孩童探索计算机潜能的机会,并让他们能够精熟地操控它。」
半世纪以来,Logo所带动的儿童编程创新研发从来没有停过,除了下指令式的各种版本Logo之外,近几年大受欢迎的Scratch也是MIT基于Logo所开发的高亲和性且功能更多的儿童编程语言;LEGO TC Logo则是玩具商乐高结合Logo编程所推出的可操控性积木玩具组,后来进化为可编程机器人玩具Mindstorms(这个游戏商品是乐高玩具以派普特1980年的大作Mindstorms: Children, Computers and Powerful Ideas命名)。
既然儿童编程是STEM教育的核心,Logo做为最早的儿童专用编程语言,其开发者派普特曾与皮亚杰共事,自然深受皮亚杰认知发展论(请参阅「融合反馈系统的发现式学习法」一文)的影响而成为一名建构主义者。针对儿童学习编程,他曾说:「孩童在计算机上编写程序时,不仅可以获得精熟最新与最强大科技的感受,还能与某些来自科学、数学及智力模式建构的最深层意识建立亲密的接触。」由此不难看出,透过编程儿童能够在讯息的产出、核对与处理过程中,组织与适应自己的认知结构。实施儿童编程教学是基于项目式学习法(Project-based Learning),让学生设定与建立项目,并在完成项目的过程中,锻炼逻辑思维能力及培养问题解决能力。
我们就以Logo为例来看看儿童编程在学些什么,建议有兴趣的人可以去下载FMSLogo一起跟着做做看。
1. 角色扮演,融入情境
Logo又被称为海龟语言(turtle language),因为它的主角是一只小海龟,儿童在学习编程时就是扮演小海龟的角色,当他想前进100步时,只需要下指令Forward 100(也可以简写为FD 100),就会看到海龟前进100;而当他想向右转90度时,则下指令Right 90(也可以简写为RT 90)。在初期学习阶段,教师甚至可以不需使用计算机,仍然能够进行编程教学(有人称为”不插电的编程教学”),透过让儿童融入故事情境,并以日常使用的单字和词组来指挥主角,大幅降低学习的难度。
2. 实时获知学习结果
儿童几乎在学习任何学科知识时,大多要在一段时间之后,透过测验、作业、练习或发表等方式,以分数或作品来得知学习的成果。而计算机最大特性就是人和机器间的高互动性,只要对计算机下指令(command),立刻就能在画面上看到执行结果。例如执行4次Forward 100和Right 90指令,就会看到屏幕上画出一个边长100的正方形。经由画面的立即回馈,马上就能知道自己的学习正确与否。
3. 规划与执行一个项目
项目(project)的产生可以是老师指定,也可以由学生自己发想。有了项目之后,学生必须构思完成它的方法,并且需要将它拆解为一个个基本的可执行单位,这些可执行单位就像积木块一样,经过适当组合就能产出想要的结果。例如想要画出下面这个由正方形组成的花朵(当然正式项目可能要远比这个例子复杂多了,在此为了便于说明,采用比较简单的范例),看起来相当复杂,要完成它有不同的解决方法,但仔细分析后会发现,它可以是由12个正方形组成,每画完一个正方形就转30度,再画下一个。至于为什么要转30度再画,这便牵涉到数学,因为图中有12个角,表示有12个正方形,而转一圈是360度,两者相除就得到30。所以基于前面画出正方形的经验,只要每次画完一个正方形之后让小海龟转30度,再接着画下一个,连续做12次就能得到正确的结果。
但是想想每画一个正方形需要4次的[Forward 100 Right 90],一共有12个正方形,表示需要有48个[Forward 100 Right 90]才能完成图形,太麻烦了!我们可以试着把正方形变成一个积木块,让它像指令一般能够直接使用,这就要让Logo认识”新指令”,也就是要建立自己的程序(procedure)。在Logo建立新指令时要使用TO...END来命名和定义指令内容,以后就可以直接使用这个Logo学会的新指令。
To SQUARE
Repeat 4 [Forward 100 Right 90]
END
SQUARE这个新指令是让Logo重复(Repeat)4次向前100再右转90度,这样可以画出一个边长100的正方形。因此要画出这个由正方形组合而成的花朵就变得非常简单,只要每画完1个正方形后转30度,重复12次即可,指令变成:
Repeat 12 [SQUARE Right 30]
执行后果然得到预期的图案。
当Logo学会新指令后,未来的编程都可以直接使用这些指令,例如稍微修改上面的程序,只重复4次,但每次转90度角,可以画出一个「田」字,程序就像下面这样:
Repeat 4 [SQUARE Right 90]
规划与执行项目时可以训练学生找出项目中的特定模式(pattern),以及分割大项目成为一个个较小的工作,执行时再分别解决每一个模式或是小的工作,最后完成整个项目。例如上面例子中,画出这个花朵的最基础模式是一个正方形。
在碰到较大型项目的时候,可以画流程图(flow chart)来表示项目执行的完整过程,流程图中除了线性的顺序之外,也可能需要进行条件判断,例如「当距离抵达目的地时间少于6小时,搭高铁前往,否则搭巴士」,这就是一种条件判断。加入条件判断的程序就不再是死板板的一条线直直走下去,而是会有一些变化的可能性,让程序看起来有一点点”聪明”,能视情况调整。
4. 问题解决
编程时难免会碰到执行结果和预期不同的情形,编程发生错误被称为程序中有臭虫(bug),必须进行除虫(debug)工作,这可以培养学生问题解决的能力。例如想要画出一根旗杆上有一面旗子,但下面这段程序却画出一个梯子!
Forward 50
Right 90
Forward 50
Left 90
Forward 50
Right 90
Forward 50
Left 90
Forward 50
找得到臭虫在哪里吗?原来虫子躲在程序的第6行,转错方向了!只要把右转Right改成左转Left,画出来就是一面旗子了。
解决问题总是无法一步到位,常需经过不断测试与修改的过程,也正因为这样的特性,使学生可以透过编程来提升自己,拥有更好的问题解决能力。
综合来说,编程教育是希望培养学生拥有运算思维(computational thinking)。运算思维并不是让人像计算机一样的”思考”,而是透过分解复杂问题、辨识与发现模式、将模式一般化,以及发展问题解决流程等一系列工作,达到养成学生高阶思维以解决问题能力的目标。至于教育政策上是不是应该像芬兰、爱沙尼亚、英国等许多欧洲国家一样,将编程纳入正式课程,主要牵涉到师资是否充足的问题,担任这方面课程的教师本身必须也有相当好的运算思维,以及编程的专业背景,但答案显然再清楚不过了!
注:若有兴趣使用Logo但不想记忆指令,也可以发邮件到contact@turtleart.org,索取新版的TurtleArt软件,它是正宗派普特所开发的Logo编程环境,由派普特的子女(Artemis and Brian Papert)管理。TurtleArt采用鼠标拖拉指令的方式撰写Logo程序,而且画面上真的有一只小海龟喔。