您好,感谢您一直对少儿编程、对“与非学堂”的关注。为了更好地为大家服务,诚邀您填写一份《关于少儿编程教与学的课件资源素材需求调查》,https://www.wjx.cn/jq/82398684.aspx。
问卷二维码
遥想当年第一次知道Scratch,还是在CS50课程的视频中。
当时只是觉得,这也叫编程?
先是满脸惊讶,同时略有一丝不屑,继而是有一点好奇,慢慢地又多了一些着迷与佩服……
然而它的是非功过,不是我们这回要讨论的主题。
如果你承认,信息时代的孩子需要从小学习编程,并且你也承认,不能把让孩子接触编程等同于成人学习的程序设计,那么往下翻看无妨。反之,则可能不会受益。
笔者既不打算去“说服”,也不打算去“论证”,而只打算通过简单的例子稍作“总结”。
================
向从未有过编程经验的孩子介绍编程,是Scratch的主要目标。
这一目标要怎么实现呢?
这个问题Scratch的设计者们想了很多。
有一些设计理念是非常显而易见的,比如说使用可视化模块作为编程语言,采用单窗口的用户界面布局,随时可点击一个代码块查看运行效果,以及设计最小化的指令集等。
除此之外,还有一些不为人知的努力,比如数据类型的简化,以及异常处理的方式等。
================
下面我们就来细说一下,蕴藏于Scratch编程环境和语言中的设计理念。
1. 单窗口的用户界面
用户界面当然是越简单方便越好。因此,Scratch的界面是单窗口、多窗格的。这样一来,重要的地方就会一直显示。
绝不存在其他程序里随处可见的那些浮动面板。就连只在某个命令下才显示的窗格,也尽量克制。
整个界面主要有四个窗格:积木工具箱、积木工作台、舞台、角色区。
为了方便学生编写代码脚本,积木工具箱里的代码块按功能进行了分门别类放置,每个类别有唯一的色彩标识。
可选用的代码块一直显示在左侧并不刻意隐藏,因为默认隐藏会增加学生的操作难度,像有的设计必须先点类别才能看到该类别下面的代码,对初学者而言无形中会造成一种与代码块的疏远感。
现在最左侧的类别分组,既可以直接点击充当导航,又可以在只使用滚动条找代码块时充当提示。
2. 实时反馈、鼓励鼓捣尝试
Scratch的整个编程环境是实时的,看不到大叔辈的程序员们编写完代码后再编译/运行的按钮,编辑和运行状态没有根本区别。
不区分编辑模式、运行模式,少一个编译的步骤,孩子们就可以随意尝试,直接debug。
这个都是为了方便孩子们鼓捣啊!从“熊孩子”变成“能孩子”,就是要会鼓捣。
他们可以随便从积木工具箱拎起来一个代码块,或从工作台上找一个代码片段,轻轻一点,就能在舞台上(对操作角色的代码而言)或是代码旁边(对有返回值的代码而言)看到效果了!
还可以在代码运行过程中,改变一下参数,增减一下代码块。
这在严格的程序员们看来,是不可想象的!
但是有了这种设计,就能更方便地掌握所选择的代码块或代码片段的功能,便于组装出更大的程序。
为了方便孩子看一眼代码块就知道怎么用,代码块都默默带上了需要的参数。有一些参数值还会随时变化,比如说“运动”中好多跟坐标有关的函数参数,角色在舞台上位置一变,它就变了。
暂时不用的代码,或为了debug而拆分出来一段一段的代码,都可以保留在空白的工作台上,不会影响程序的运行。放在工作台上而不拼接在事件下面,相当于注释掉了。
3. 代码运行过程的可视化
代码在运行时,正在执行的代码旁边会有一圈淡黄色的光边,这是为了给孩子增加视觉提示。
一段代码有没有在运行,运行了多长时间,都能有一个直观的感受了。
4. 隐藏错误信息
Scratch的代码块以形状提示了拼接的可能性,这样语法不正确的自然不能拼接到一起,拼到一起了自然差不多就没语法毛病了。
有的地方参数输入超出合理范围,Scratch也会尽量给出一个有意义的反馈。
比如“将大小设为……”,孩子们一兴奋容易过头,输入一个10000000是常有的事儿,但是Scratch只是将大小设为了几百而已,不可能是超级大。
这种处理,比起弹出一个烦人的错误提示,实在是高明得多!
当然,代码有错误,就是有错误。不显示错误信息,错误仍然存在。
Scratch的哲学是,有错误的代码只是不能完成预定目标的代码,但它仍然要能工作;让这样的“错误”代码正常运行,显示它运行的效果,也比只出一个生硬的错误信息,什么效果都不出来,来得体贴周到。
5. 让数据也可视化
Scratch中的变量是可以看得见,甚至是可以摸得着的——只要我们在代码工具箱里的复选框里,打上了勾。
变量可以在舞台上显示,这样就相当于有了一个变量监视器。这对帮助初学者理解变量,建立变量如何工作的心理图示,简直不要太方便。
变量可以有正常、大字、滑杆三种显示方式。
大字模式一般用于将它拖动程序中适当的位置,与程序融为一体。
而滑杆模式,还可以在程序运行时,直接改变它的大小,实时与程序互动。
Scratch对列表也能可视化,这样很多基于列表的操作,像增加删除元素、排序什么的,也就马上可以看到效果了。
6. 最小化指令集
由于Scratch中每一个代码块都要占据一定的屏幕空间,如果指令集太大,就会显得非常臃肿,增加通过滚动条寻找一个代码块的使用难度。
因此,使用最小化的指令集比起其他需求显得更为迫切。
对一些初学者不会常用的代码块,采用下拉菜单的方式进行了合并。
比如“运算”里的“绝对值”下面,就包含了许多数学运算,“外观”里的“特效”下拉菜单里,也有7种特效。
相反,对一些初学者会经常使用的类似操作,却又采用了“分”的办法,列为单独的代码块。
比如“左转……度”和“右转……度”、“换成……造型”和“下一个造型”等。
对一些只在某些特定场合才会用到的代码指令,则隐藏到了最下面的“添加扩展”里,比如“音乐”、“画笔”、“翻译”这些。
7. 代码语法图形化
在Scratch语言设计上,语法通过代码块形状的方式解决了。
总共只有四种类型的代码块:
指令代码块、函数代码块、事件触发代码块、控制结构代码块。
指令代码块,可以从上到下拼接,而函数代码块提供返回值,只能作为参数放到其他代码块里。
事件触发代码块将鼠标键盘事件与相应的代码片段连接起来。
控制结构代码块一般有一个大开口,可以嵌套使用。
8. 数据类型图形化
Scratch里只有两类三种数据类型:一类是数字和字符串,二类是布尔值。数字和字符串不单独区分。
在代码块中需要参数的地方,也会用不同的形状表示不同的数字类型。需要数字和字符串的地方,是圆角矩形框,而需要“是/否”布尔值的地方,是尖角框。
圆角矩形带向下的小三角表示可以下拉选择用作输入值,矩形带向下的小三角表示可以下拉选择操作对象。前者也可以用函数代码块的返回值作为输入。这样就灵活多了。
9. 作为对象模型的角色
Scratch中的角色怎么看怎么像我们OOP中的对象。确实,它是封装了变量和行为的对象模型,但是Scratch并没有类和继承的概念。
一段代码在哪个角色里,就只对这个角色起作用,这就是Scratch“基于对象”而不是“面向对象”的编程模式,没有相互之间的指令调用。
有点类似继承的方法,便是克隆。Scratch对一次运行里角色克隆的总数作了限制,大概是300来个,这样可以保证基本需要又不会卡死电脑。
在角色之间传递消息,需要用到专门的一对多不定向的“广播”机制。一个广播一个名字,不同名字就是不同的广播,响应不同的操作。这种机制以一种简化的方式解决了数据共享的问题。
广播可以实现角色之间的松散耦合,信息的发出者不必关心信息的接收者。同时分异步的广播,不必等收到消息的角色执行完操作,和同步的“广播并等待”。
有了这种松散的机制,角色还可以单独导出,这样就可以在不同项目中共享代码了,从而就可以支持代码复用和团队协作了。
================
的确,所有的设计都是“戴着镣铐跳舞”。
在各种权衡之中,Scratch作为计算机教育领域软件的佼佼者,名副其实!
再看我们国内的自主研发,也应该更多考虑一下教学过程中的学习者的心理了。
资料来源:
Maloney, J., Resnick, M., Rusk, N., Silverman, B., and Eastmond, E. 2010. The scratch programming language and environment. ACM Trans. Comput. Educ. 10, 4, Article 16 (November 2010),
15 pages. DOI = 10.1145/1868358.1868363. http://doi.acm.org/10.1145/1868358.1868363.
与非学堂(codingclassonline)
一个专注青少年信息技术教育,探讨少儿编程的教与学,交流技巧、分享资源的公众号。
--------------------------------------
与非学堂小程序
蓝桥杯测试、Bebras测试、文化测试……
进入公众号菜单,更多精彩……