前言
某天,上小学二年级的儿子突然对我说: “爸爸,我想学编程。”其实更早时候我就在网上看到过有关儿童学习编程的一篇文章,其中提到了几个软件,都是充满游戏风格,着重设计与规划,以完成特定任务为目的的模式。这些软件并没有涉及指令或语句的概念,所传授和培养的是一种更广义的“编程”(也许翻译为“规划”或“设计”更合适)思维和能力。文章指出几岁孩子就可以通过这些软件学习编程。
儿子还在上幼儿园时就在手机上玩过LightBot游戏。当时给他玩的是初级版本,但已经有循环、函数调用等功能,比起网上那篇文章所介绍的软件,更像计算机编程。LightBot游戏中的小机器人能够按照玩家编写的指令序列执行动作,对玩家的编程成果给予直接且明确的反馈,因此即使我没有给儿子讲过任何编程概念,他也完全能够在游戏软件中学习、理解和掌握那些编程元素,通过不断尝试来修正自己的程序,完成游戏中的所有关卡任务。可见,一个吸引人的有趣平台加上直观的反馈,完全能够让孩子在玩中学习编程,而且是学习相对抽象的计算机指令的编程。
我在清华大学计算机系取得本科、硕士和博士学位,在计算机系教程序设计课程,而且负责程序设计竞赛,自然早想过什么时候让孩子学编程、学什么程序设计语言、怎么学这类问题。虽然还没有明确的答案和计划,但可以肯定的是——小学阶段就可以学编程,因为很多编程的概念并不高深。更小年龄的孩子虽然也可以学一些编程,但受认知能力所限,学不了太多,不得不浅尝辄止。而对于小学生,特别是小学中高年级学生来说,完全能够在相当长的一段时间内有计划地学习一定量的内容,而且所学内容足以用来进行丰富的创作或解决一些实际问题。同时,正因为学习者是小学生,往往教与学双方都更关注基础和必要的编程元素,不易受细枝末节的干扰而偏离“大道”。
我相信和追求“快乐学习”,希望学习路径方向正确,不走弯路。我认为C/C++语言、Java语言用作学习编程的入门语言并不理想,因为初学者难以用所学的内容编写出有趣的程序,即使最简单的“Hello world!”程序也会留给初学者一大堆问题,而且这些问题的答案不是初学者适合去了解的。如果未来想在程序设计方面往更专业一些的方向发展,我认为不宜在学习C/C++语言、Java语言之前就接触Python语言。我曾考虑过让儿子学习Logo语言,我初中时就学过它,有一定了解,但Logo语言除了画简单图形外好像也没有其他直观有趣的功能。“你想学编程,很好呀!但是你具体想学些什么呢?”我问儿子。
“我想学Scratch。”儿子毫不犹豫地回答。我听说过Scratch,但没有专门了解过。儿子想学Scratch,是因为学校高年级学生在风采展示的活动中展示了一些用Scratch编写的程序,引起了他的兴趣。我告诉儿子: “没问题。爸爸可以帮你了解一下,看看怎么来学。”
零基础学Scratch编程前言我从MIT的Scratch网站上下载了Scratch 2离线编辑器,从软件自带的教程开始了解。教程由若干很小的编程任务组成,各个任务大体上按照从最简单到略复杂的顺序排列。我一步一步照着做,完成前几个小任务就已经熟悉了Scratch的常用积木语句。我认为这些小的编程任务非常适合用来进行Scratch入门教学,对儿子来说,只需要帮他克服语言上的障碍——将英文翻译成中文。很自然地,我将教程内容展开并翻译做成PowerPoint幻灯片,同时把自己实践时所想的一些问题,也总结并在幻灯片中提出来,鼓励儿子通过动手尝试来找到答案。一些我认为基础和重要的程序设计概念和思想,在编程任务涉及时,及时在幻灯片中提出来。
我将笔记本电脑与家里的电视机连接,教儿子用双屏模式来学习,一个屏幕播放PPT幻灯片,另一个屏幕进行Scratch编程操作。PPT幻灯片的动画控制与页面切换,既避免了书本内容的一览无余,又能形成一种有控制的交流,还能让孩子自己来主导学习的进度。儿子对Scratch的学习就这样开始了,基本上是一种自学的模式,当他实践遇到困难时才找我帮忙解决。
儿子学Scratch学得很快乐。教学实验室的同事知道后,向我要了幻灯片给自己儿子学。他儿子也学得很快乐,而且会主动与老爸讨论“什么是变量”之类的问题。同事建议:可以开个班,让系里老师们的孩子一起来学Scratch。清华大学计算机系教职工孩子们的第一期编程学习班就这样开始了,每周五晚上一次课,持续大半个秋季学期。在学习内容上,除了更新最初的PPT幻灯片以外,我认真地规划了各次课的内容,一是考虑新知识循序渐进地分布在各次课程中,二是考虑后面的课程内容能够起到复习巩固前面课程内容的作用。课程内容前期主要来自于Scratch教程,后期来自于自己的设计安排。教学方式同样采取双屏自学模式,孩子们利用机房的计算机播放PPT幻灯片,同时在自带的笔记本电脑上进行Scratch编程操作。这个编程学习班的助教队伍超级豪华,因为孩子们的家长,即清华大学计算机系的老师们,可以陪着孩子一起参加这个编程学习班辅导自己孩子,因此这个编程学习班也是一个亲子活动班。系里老师们都没有用过Scratch,对这种编程语言也很感兴趣,有时两位大牌教授会丢下孩子,相互讨论眼前的Scratch编程任务。这并不奇怪,我在学习了解Scratch的过程中,同样很快就喜欢上了它。每次课程中,我会在机房走动,了解各个孩子的自学进展,解答他们的问题,帮他们排除一些困难,不过更多时候是引导他们自己来排查问题解决困难。一些共性的问题,我会总结并在下一次课程时讲解。这样的编程学习班得到了孩子和家长们广泛的好评,有两次我出差无法上课,还有家长主动代课,并且提前与我讨论并准备PPT幻灯片。同样的课程内容,后来又开了一期编程学习班,为了达到更好的教学效果,还专门为每次课程设计了课后练习。本书的第一部分就来自于这一期编程学习班的内容。
在第一期编程学习班孩子与家长们的要求下,我开设了后续的Scratch编程学习班。在这后续的“提高组”(第一期相应称为“入门组”)编程学习班上,我主要让孩子们体验编程与数学的关系,了解计算机解决问题的方式方法,普及一些基础而重要的程序设计算法思想,为进一步深入学习程序设计甚至是信息学竞赛打基础。提高组编程学习班仍然采用PPT幻灯片自学的方式,教学内容形成了本书的第二部分。
在组织孩子们学习Scratch编程的过程中,我看到了孩子们的学习能力和创新能力,多次从心底为他们的优异表现喝彩。这两种能力也是我采用这种教学模式所希望激发和培养的能力,相信对孩子们的一生都有裨益。言归正传,该系统地介绍一下本书的内容了。本书共20章,分为三个部分。第1章~第10章为第一部分“基础技能”,主要介绍Scratch中角色、造型等基础概念,由浅入深地引入各类积木语句的实践应用;第11章~第16章为第二部分“思维训练”,从绘制图形入手,强化数学思维,介绍递归、递推、枚举、筛法、二分法等算法思想;第17章~第20章为第三部分“应用实践”,是Scratch编程实践的综合与提高。
本书的前两个部分分别来源于前文提到的“入门组”和“提高组”编程学习班的课程内容,没有任何编程经验的孩子也能够轻松地从第1章开始学习。在写作本书过程中,官网的Scratch 2离线编辑器改版升级为Scratch 3桌面编辑器,在界面上有较大改动,在功能上也有变化,经过考虑将章节内容都更新为与新版编辑器一致。第三部分的内容来源于孩子们学习Scratch过程中实际编写的游戏项目,以及我本人特别想用Scratch实现的功能(我实在太喜欢Scratch这一编程语言了)。与PPT幻灯片相比,书本缺少了逐步呈现的控制,但可以用更详细的文字进行解释说明,算是各有优劣。此外,在写作过程中,产生了一些新的想法和更深入的思考,也融入到本书的内容中。如何学习本书呢?不建议小学低年级甚至更小的孩子学习本书。虽然他们也能够完成前几章的学习,但后续的章节对他们来说挑战太大,而学得太少的话,意味着掌握的工具少,实践与创新的空间小,得到的锻炼与相应收获少,乐趣也少。另外,因学习内容太难导致半途而废并不是好的体验,没必要给孩子留下编程很难学的印象。
建议孩子自学。家长可以给一些基础的帮助,例如,安装Scratch桌面编辑器,教孩子基本的计算机操作,例如登入系统、运行程序、输入汉字等,但学习Scratch编程还是让孩子按自己的节奏来。自学能力是个人不断成长的必备能力,培养锻炼孩子的自学能力,是本书的重要目的之一。
学习编程的方法与学习语文、数学、英语都不一样。编程是一种思维与实践紧密结合的创造性活动。书上的内容都理解了,并不意味着就会编程。我敬爱的导师吴文虎教授给学生们上课时,就多次强调: “编程不是学会的,是练会的。”本书建议的自学方法是: 逐段地阅读理解→实践探索→思考总结→实践应用。
阅读本书时,身边应该有一台已经打开的计算机。书中讲到了什么操作,读者就应该同步地在计算机上进行相应的操作;书中提出一个问题,读者就应该暂停住,先思考自己的想法和答案,再往下阅读;书中提出要自己尝试,读者就应该自觉地想办法去探索和尝试;书中有时只提出问题,并不给出答案,但读者真正实践了就会得到正确的答案。我希望给予孩子探索与收获的学习乐趣。
本书并没有采用讲解展示语句功能的方式介绍Scratch语言,而是从要完成的任务、要实现的功能或效果出发,即从需求出发引入可用的语句,把语句、编程语言视为解决问题的工具。与编程语言相比,分析问题→设计方案→规划程序→具体实现→修正调优这种以程序设计为手段解决问题改变世界的方法,才是更重要的。这种方法,以及在方法运用的过程中涉及的思想和技术,与具体编程语言无关,才是学习编程所真正要学的东西。我相信,这样的编程学习才能够更好地培养孩子解决问题的能力,才能更好地支持孩子将心中的创意展示出来,将创新的想法具象化,敢想敢干,能想能干。
本书刚开始的几章内容简单,学起来较快,后续章节会不断用到前面已学的内容,越来越复杂,对思维能力和动手能力的要求也越来越高,学习进度自然会慢下来。而且,随着综合的编程能力提升,孩子会想要实现自己设计的动画和游戏,这是应该鼓励的事情。家长最好能够给孩子一些命题编程任务,即给出一个主题,让孩子想办法编程来表现,例如,让孩子实现一个堆雪人的场景或游戏。这些书本外的编程活动,是孩子学习编程最好的练习,比每章后面的练习题好百倍。能够多做这些自由的编程练习的话,完全不必着急学后续章节。毕竟学完一本书并不是真正的目的,打下坚实基础,熟能生巧,让孩子将来学得更好才是目的。另外,本书第二部分、第三部分靠后的章节难度很大,对初中生来说也是不小的挑战,因此建议孩子按自己舒适的进度去学习,花两年、三年甚至更长时间也可以。
编程学习遇到的最大困难可能就是查错调试了。初学者可能犯任何错误,而且自己完全找不出问题来。虽然编程调试有利于培养孩子的耐心和细致,但最好能够有懂程序设计的人提供“保底”的帮助,避免孩子长时间无法解决问题,学习热情受到打击。如果有同样在学Scratch的小伙伴一起讨论查错,也是非常好的。本书附录D专门介绍了一些调试的方法和技巧,但对初学者的帮助有限。有条件的家长,可以考虑和孩子一起来学Scratch,这样与孩子有共同的语言,一起学习、一起讨论、一起成长,也是珍贵和难得的体验。饮水思源,感谢促使本书成文的所有人!首先感谢以吴文虎教授为首的师尊前辈,本书一脉相承了他们关于程序设计教学的理念。感谢教学实验室和系里的同事们对编程学习班的支持,感谢孩子们、家长们对编程学习班的学习方式和学习内容的肯定。感谢系里的喻文健老师,本书中基础弹球游戏的若干项扩展来自他的创意。特别感谢金山西山居的唐一鸣先生,本书第20章来源于特邀他给提高组编程学习班带来的一次课程。当然,也要感谢儿子促成我进入了Scratch的奇妙世界。孩子是我们未来的希望,愿本书的小读者们永保学习的愿望与乐趣!
邬晓钧2020年5月新冠肺炎疫情期间于清华园