在我之前的日志《聊聊让孩子学编程的那些事儿》中,我曾经提到一个观点,就是以Scratch为代表的图形化编程软件不是学编程的必经之路,如果有条件的话,最好能尽快进入真正写代码(coding)的阶段,我家Vita哥哥也是跳过了Scratch,直接开始用苹果的Swift Playgrounds学coding了。后来有一些朋友问我类似的问题,包括一位做网络工程师的朋友(网络工程师不是程序员,但他也懂编程),所以我想还是详细整理一下我的观点。
先说说Scratch
Scratch(官方网站)是由MIT(麻省理工学院)开发的一套图形化编程工具,它被看作是用于青少年编程教学的一个标志性案例。Scratch基本上是长这样的:
所以Scratch是个啥呢?它大体上包括一个角色编辑器,一个背景编辑器,还有一个脚本编辑器。其中脚本编辑器就是我们“编程”的地方,里面把各种命令一块块积木一样排列起来,就形成了一个程序。
现在有很多儿童编程班都是用Scratch来上课,Scratch在美国以及其他国家也非常流行,我也用Scratch给别的孩子讲过编程课,感觉也挺好玩的。Scratch主要有这样一些优点:
再看看Swift Playgrounds
Swift Playgrounds是苹果公司官方开发的一款学习编程的App(仅限iPad,不支持iPhone),目的是培养青少年开发者,当然还有一个目的是推广他们新推出的Swift编程语言。和Scratch不同,Swift是一种正经的编程语言,和C++、Java、Python等主流编程语言属于同一级别的,苹果推出Swift的目的是为了替代一直以来用于iOS和Mac软件开发的Objective C语言,如果你要学习在iOS平台上开发App,那么Swift就是首选的编程语言。
Swift Playgrounds是长这样的:
看得出来,Swift Playgrounds是真正在写代码,和真正的程序员写代码的方式是一模一样的,不过跟Scratch相比,Swift Playgrounds显然更多地用到了键盘打字,而且不可能用中文来写程序。
很明显,写代码对孩子来说门槛更高,为啥我还要直接上hard难度呢?
首先,单纯从这两种形式上比较,我不认为Scratch的图形化编程相比直接coding来说有多intuitive,相反,花花绿绿的各种块块让我觉得好乱,抓不到重点。关键是,那些命令只是套了一个图形的框,里面的描述不还是文字么,感觉有点像脱裤子放屁。其实Scratch之所以门槛低,我觉得主要不是在所谓的图形化上,而是在于可以用中文和可以少打字上。既然现在的小朋友都很早就学英文了,我觉得这不算什么问题吧;至于打字,其实Swift Playgrounds有很多快速辅助提示,真正需要用键盘打的东西也并不多。
其次,真正的coding就是学习一门语言(programming language),它也有词汇、语义和语法。语言是编程的一个重要部分,在描述一些复杂逻辑时,编程语言能够比图形具有更强的描述力,特别是对数据结构的描述,以及对于类和对象的描述。我的网络工程师朋友跟我说,他觉得编程就是一种思维方式,用什么形式去编程没有那么重要,我不太赞同。思维方式固然是编程的重要部分,但语言是表达思维的载体,这句话不仅限于编程,我们日常使用的语言,也是表达思维的载体,你说学会好好说话重要不重要?我觉得很重要。
直接用编程语言编程,孩子必须得注意词汇和语法的正确性。下面这张图上,最后一句是有语法错误的(这个函数没定义),编译器给出了一个红点提示。此外,孩子还得注意大括号的左右匹配(特别费神,哈哈),以及在适当的地方加空格和换行。这些东西在图形化编程工具里面是不会遇到的,但我觉得这也是literacy的一个重要能力(不仅限于编程)。
引用著名计算机科学家、技术作家Paul Graham的一个观点:“编程语言是用来思考程序的,而不是用来表达一个你已经想好的程序的。”这句话的意思是说,编程语言是思考的工具,而不是一种单纯的表达形式,你不能指望用中文(或者英文)在脑子里思考一个程序,然后用编程语言把它表达出来。
也正是因为这一点,我认为从学习编程的早期就强调(或者说至少不回避)编程的语言属性是很重要的。各位家长都不排斥让孩子从小学外语,那么也不应该觉得让孩子学编程语言就有多难,因为它们本质上是一回事。
另一个我坚信孩子可以直接coding的原因是,我小时候也是差不多这么大开始接触编程的,那个时候哪里有图形化的编程,连Windows都木有呢,都是Apple II兼容机上用BASIC语言写程序玩。那时候也不会英语,什么if...then...else这种英文单词也不会念的,就硬生生把拼写背下来了,现在想想也是很拼的。其实我家Vita哥哥也没正经学过英文,phonics也不会,也是硬生生把单词背出来了而已,跟我当年是一个套路……
总结一下,我觉得Scratch这种图形化编程,就好像自行车上的辅助轮,辅助轮可以给你一种很快就能上手的感觉(而且多半是假象),但它跟真正骑自行车还是有太多的差别。我不反对用Scratch,我认为它是一种很好的教学工具,但我认为在可能的情况下,让孩子早点接触真正的编程语言,也是非常值得考虑的一种选择。