学习编程能帮你组织、表达和分享你的想法,就像学习写作一样。这对于所有人来说都很重要

前言

人海擦肩

说起Scratch,很早就有注意到它,它时常以不同方式出现在视野里,从知乎编程入门类问题的回答,到树莓派里自带的教育软件,以及各种玩具的操作界面,都有它的身影。

Scratch的反复刷脸成功引起了我的注意,曾经试着用过一段时间,对其的理解却一致停留在"图形化编程,拖拖拽拽,可以做游戏和动画,更像玩具,而不是严肃的编程"。(从编程语言的历史来看,每当有新的编程语言/范式出现,“更像玩具,而不是严肃的编程"这句话以各种表述形式伴随着出现:)

当你谈及Scratch,我脑子里浮现出基于Scratch的学生作品,如果要对它们做个贴便签式的群嘲,我大概会选"画风简陋而随意”

于是对于它的流行(已翻译成 40 种以上的语言,在超过 150 个国家上被使用,在过去的一年里,平均每月新增人数为 53 万,平台已经发布的共享程序超过 2233 万个),我更多抱着一种"时无英雄使竖子成名“的态度

路转粉

我从路人转为Scratch粉丝,主要因为伊藤穰一(Joi Ito)的《爆裂》(Whiplash:How to Survive Our Faster Future) 一书(ps:近期在Cozmo Code Lab中的编程体验也让我对Scratch好感倍增)

伊藤穰一现任MIT Media Lab(麻省理工媒体实验室)主管,而Scratch诞生自MIT Media Lab “终生幼儿园”(Lifelong Kindergarten)小组,《爆裂》一书以一种内部视角,向我们揭示了Scratch的诞生过程、初心和设计原则。

从4P(Projects, Passion, Peers, and Play)到"低门槛,高天花板,宽围墙"的设计理念,以及Scratch对这些理念的实践,无不令我震惊和心动.

历史沿革

台上台下

1982年春天,偶然的机会,有一位青年记者听了Logo编程语言发明者西摩·派珀特(Seymour Papert)的一次主题演讲。这次演讲完全改变了他对计算机的认知。

大部分人谈论计算机的方式都是将计算机当成工具,一种完成任务的方法,但在派珀特眼中,计算机能帮助我们用全新的方式认识世界,它将成为儿童表达想法的媒介

故事听起来颇有武侠小说开篇的味道。台上道骨仙风的开山鼻祖,台下骨骼清秀的求知青年,一段演讲中完成了衣钵传承

次年,这位青年拿到MIT一年期的奖学金,于是他报名参加了派珀特的研讨班,并被深深吸引。在这里一待就是三十寒暑。

当时台下的那个青年记者,便是后来的"Scratch之父" – 米奇·雷斯尼克(Mitchel Resnick)

派珀特与Logo语言

雷斯尼克创造的Scratch受派珀特和他的Logo语言影响至深,派珀特对计算机的看法对他的影响则更为深刻。这些我们放在后边再说,现在来说说派珀特和他的传承。

派珀特是近代人工智能领域的先驱者之一,20世纪60年代初,他与马文·明斯基在MIT创办了人工智能实验室(Artificial Intelligence Laboratory),他们还合著过 Perceptrons 一书,,当今深度学习三大权威之一Yann LeCun在读大学的时候因为听说了「perceptron」的概念,激发了对学习型机器的热情,派珀特可算他的启蒙老师。

派珀特也是前边提到的MIT Media Lab创建者之一,且一直在该实验室工作

他曾师从瑞士哲学家、心理学家让·皮亚杰,皮亚杰曾说

从来没有人能够象西摩·派珀特那样理解我的思想

1958——1963年,派珀特和皮亚杰在日内瓦大学共事。皮亚杰将84年人生中的大部分时间和精力都花在了研究儿童或者进一步说成年人是如何形成对世界的认识上面。人类从幼年开始构建不同的心智模式(mental model)解释自己周围的现象,比如加速的汽车、猫粗糙的舌头。随着逐渐长大,我们的经验和这些模式产生碰撞,迫使我们调整模式以适应不断变化的现实。如此说来,儿童玩耍就是不断创建和再创建自己心智模式的行为,以此更好地认识世界

对于派珀特来说,计算机可以对照这些模式和经验,是兼顾玩耍和学习的完美载体。派珀特将皮亚杰的这些理念融入Logo语言(他在1968年从LISP语言的基础里创立Logo编程语言):比如,孩子认识到通过几行简单的代码可以让屏幕上的光标画出一个正方形,甚至是一朵花。如果这样做,就会出现那样的画面。最有价值的是,他们也会认识到,有时这样做可能不会出现那样的画面,这时他便主动寻求身旁的程序员的帮助。这个过程就是提出一种假设,然后去验证,再去修正得到新的假设。通过Logo语言,每个孩子都可以变成经验主义者。

他在其著作《头脑风暴:儿童、计算机及充满活力的创意》(Mindstorms:Children, Computers, and PowerfulIdeas)中,系统阐述了自己的建构主义观: “在制作中学习”(Learning by making),在他看来,好的教育不是如何让老师教得更好,而是如何提供充分的空间和机会让学习者去构建自己的知识体系(伊藤穰一也提到: 学习而不是教育)。当孩子们在制作一些对自己有意义的作品时,如编故事、编程序、或是音乐创作时,孩子们正处于学习知识的最佳状态。他被自己的热情所驱动,主动地去获取知识而不是痛苦地被填鸭。关于这点雷斯尼克在他的一个TED演讲中有动人的例子: Let’s teach kids to code

米奇·雷斯尼克后来成了派珀特的学生,他评价说:“派珀特是第一个预见计算机可以用来帮助孩子们学习的人,他相信计算机可以让孩子们主动构建知识”

让·皮亚杰与儿童心理学

前头说到Scratch之父雷斯尼克 对计算机和编程教育的理解 受派珀特和他的Logo语言的影响很深,而派珀特在创造Logo语言的时候,则主要是受皮亚杰的启发,并将他的思想融入到Logo语言中。那么我们自然追溯到让·皮亚杰

让·皮亚杰自1921年开始从事儿童心理学的研究,从智能的早期形态入手,目的在于由此探讨认知论的问题。

我最近在读他的《发生认识论原理》,这本书论述了认识是怎样形成的,智力是怎么发展、构建的。于我而言,这本书内容十分新颖(不过阅读体验并不好,作者对一些哲学内容的表述,远没有罗素式的清晰和友好),在认识论方面,我之前受洛克、休谟(经验论者)影响较多,而皮亚杰在这本书的英译本序言里说

我不是经验论者

但他认同洛克、休谟、斯宾诺莎这些经验论者创立的"伟大传统",即把对认识的分析放在研究认识的心理发展这个基础之上。令皮亚杰遗憾的是经验论者竟然没有进行详细的实验,而这个正是皮亚杰的前进的方向。

之后皮亚杰在丰富的实验基础上,阐释他的认识论,他把结构主义与建构主义紧密地结合起来。

认知的结构既不是在客体中预先形成了的,因为这些客体总是被同化到那些超越了客体之上的逻辑数学框架中去,也不是在必须不断地进行重新组织的主体中预先形成了的。因此,认识的获得必须用一个将结构主义和建构主义紧密的结合起来的理论来说明,也就是说,每一个结构都是心理发生的结果,而心理发生就是从一个较初级的结构过渡到一个较复杂的结构。

皮亚杰把适应看作智力的本质,他把儿童看成建造自己的个人知识理论的小哲学家和科学家。他认为活动即是感知的源泉,又是思维发展的基础。

从皮亚杰的理论里,我们可以看到Logo和Scratch的世界观和灵魂所在:对活动/交互的重视、让孩子在玩耍中不断创建和调整心智模式。

尽管Logo有各种分支和方言,尽管Scratch经历了几次技术变革(即将迎来3.0版本),也许在将来,从外表上你甚至不能一眼认出他们。但他们内核的东西一直如初:对皮亚杰认知理论的实践,将计算机作为一种理想的媒介,让孩子们在活动中去构建和调整心智模型。以理解和适应外部环境

皮亚杰对计算机的影响远不只在编程教育这个领域。除了派普特根据皮亚杰的理论开发了Logo编程语言之外。Alan Kay以皮亚杰的理论为基础,开发了Dynabook编程概念。以上这两项技术,都是现今我们日常使用的图形使用者界面(GUI)的基础技术,使电脑从文字界面过渡至图形界面,改写了电脑技术的发展路向。

青出于蓝

前边我们沿着理念传承这条线,一路从雷斯尼克的Scratch追溯到派珀特的Logo语言,之后抵达皮亚杰的认知论(再往前甚至将追溯到洛克的经验论)

接着我们横向来看看Scratch对他同一谱系的前辈LOGO语言做了那些改进

雷斯尼克认为Scratch从Logo语言止步的地方继续前进,将Logo语言带入未来,他们的传承关系可想而知,相似之处且多于不同。

Scratch对Logo的改进

更加直观

Scratch基于图形化的编程方式,通过拖拽、拼搭积木的方式,让整个编程过程十分直观,很像在玩乐高积木。这并不是偶然,雷斯尼克一直与乐高公司保持密切合作,乐高机器人便是他与导师派珀特密切合作研发的。乐高积木对Scratch的影响很深,或者说它们彼此影响很深

关于这一点在Scratch诞生之前给国家科学基金会提交了一份提案里可以看出。其中提到他们在乐高机器人这块的研究工作将帮助他们构建Scratch

这份提案里还指出

This approach eliminates the possibility of syntax errors (which have proven to be a major obstacle for learning text-based languages)

基于文本的编程可能带来的语法错误正是孩子们入门编程的主要困难所在。基于图形化的Scratch能避开这点

这份提案有许多有趣的地方,诸如为了让Scratch卓有成效,需要做到的几点:

  • 这个工具得与孩子们的感兴趣和有热情的事情产生关联,他们才会认为这个工具很酷
  • 孩子们要能一眼就看到工具的价值和潜力(不必费劲地琢磨)
  • 可以很方便地用它创建第一个项目(低门槛)
  • 可以创建出向他人炫耀的作品
  • 能支持不同类型的活动(宽围墙)
  • 能吸引不同背景、文化的孩子
  • 可以逐步(渐进式)学习工具的特性(不必一次学完)
  • 随着时间的推移,可以越来越复杂地使用这个工具(高天花板)

这份提案在2003年提到的这些理念和设计思路在今天看来很是很有启发性,十分值得一读!

更宽的围墙

Logo语言的特色是派珀特所说的“低门槛”(易于学习)和雷斯尼克所称的“宽围墙”(不束缚儿童的想象)

相比于Logo,Scratch的围墙则更宽,你可以在其中做更多你想做的事

除了控制角色移动、画画之外,你还可以创作你自己的音乐、故事、电影、动画或者游戏

并不是每个孩子的兴趣都一样,作为一个优秀的工具,应该把“围墙”做宽,而不应该把孩子围在一个狭小的区域里,你应该给他整个游乐场,而不是一间活动室

关于"宽围墙"的意义,Learning Creative Learning 第五周的课里讲的很清楚

更丰富的媒介和更强的表现力

Taking advantage of the extraordinary processing power of current computers, Scratch will support new programming paradigms and activities that were previously infeasible, making it much better positioned to succeed than previous initiatives to introduce programming to youth.

计算机技术日新月异,Logo并没有跟上时代,Scratch试图将更多的多媒体元素吸收进来,以便孩子们能轻易地创作更具表现力的作品,“可以向他人炫耀的作品”

在Scratch你能够轻松地导入或绘制人物、录制并调制声音、调用摄像头或是现实中的各种传感器!

社区: 分享与合作

雷斯尼克和同事在编写和设计Scratch软件的4年里,波士顿众多计算机俱乐部的孩子们经常在他们的办公室穿梭,带给他们很多灵感,Scratch是很多人共同努力的结晶,他们在Scratch中将社群功能融入软件的核心

Scratch的口号是:

Imagine, Program, Share

对"Share"的重视可以追溯到开源运动和黑客文化。Scratch诞生自MIT,而MIT有着悠久的黑客文化

60年代初,第一批"MIT黑客"将他们写的程序存储在磁带上,随意的放在实验室的抽屉里,任何人都可以自由地使用磁带,将其放到自己的计算机里,学习代码、更新和改进,然后再将传给磁带留给下一个人,大家在这个过程中互相学习,共同改进程序,他们认为这是学习编程最佳的方法。在《大教堂与集市》中,作者从经济学角度论证了,这也是构建高质量软件的最佳方法

弗莱德·摩尔曾明确地将家酿计算机俱乐部定位成一个信息交换中心。信息应该在俱乐部成员之间自由传递,就像在一台精心设计的计算机内无拘无束流动着的二进制位一样。黑客们都奉行与计算机本身雅致的逻辑相一致的理念——共享、开放、分权,以及亲自动手改进机器并改善整个世界

这种分享与合作的的精神一直在黑客社区流传,之后的开源运动、今天的github都是它的产物。对这段历史有兴趣的同学可以参看《黑客:计算机革命的英雄》。

人工智能的开拓者马文·明斯基曾说:“Logo语言的问题是它只有语法而没有文本。” 他的意思是,Logo语言缺少被认可、推崇和复制的可能性,这样一来Share变的艰难。而Scratch改进了这点,它继承了这种合作、开放、分享的黑客文化,在Scratch中你可以从0开始一个自己的项目,也可以看看是不是有其他人做过你想做的事,尝试在Ta的基础上做些调整以符合自己的需要。如果遇到问题,便在社区中和作者交流。当然反馈你更好的解决方法,他将因为作品被改进而感激你。如此一来,社区成为了淘金、合作、激发热情和学习技巧的绝佳场所。

关于合作与分享,雷斯尼克在LCL peers中有做深入探讨

未来 : Scratch3.0

Scratch经历了基于Squeak编写的1.x版本;基于ActionScript编写的2.0版本(依赖flash),如今即将迈向3.0(明年春发布)

Scratch将基于html5技术,能够轻松跨平台运行,十分可期。目前的开发版可以在这儿尝鲜. 对源码有兴趣的小伙伴,想围观或者参与,都可以戳这里

Google与MIT Media Lab将共同开发Scratch Blocks,Scratch Blocks使用谷歌的可视化编程语言Blockly(关于Blockly可以看我之前的这篇文章: blockly入门与介绍)

使用Blockly积木块之后,Scratch将变的更加灵活、美观和易拓展,拼搭好的积木块可以直接转译为6门语言,而这些语言将直接运行在合适的地方(目前许多硬件都能直接运行Python和JavaScript)。Scratch将出现在更多的现实场景中,也许某一天你可以通过拖拽积木来自定义你的新家或是为你的机器管家编程,而目前你已经可以用它控制Cozmo、四轴飞行器。目前也有一些AI公司尝试用积木来封装他们的AI接口,让用户可以更方便地搭建出他们的AI项目。

所有试图将复杂度隐藏、给用户暴露出直观易用接口、同时还想保留足够灵活度的项目,都可能受益于Scratch/Blockly

积木化的编程方式是领域无关的,这种封装/抽象的思想,能恰当地屏蔽复杂度,仅将用户需要的东西暴露为可组合的积木块(很符合Unix设计哲学),如果我们使用得当,我们可以将大多数的事物封装为Scratch积木,任何对创造有热情的人都可以去自定义和改写他的生活,这大概是maker们梦想的天堂。

尾声

我们以雷斯尼克的一次演讲来结束本文

雷斯尼克在一次演讲中,一位听众起身问了一个问题

西蒙·派珀特20年前不也在做同样的事情吗?

这句话当然不是恭维,而是暗示雷斯尼克的想法已经过时了。

雷斯尼克回答说

对,我做的正是西蒙·派珀特20年前做的事情。我认为这是值得继续做的事。我们正在取得一些进展。如果我的余生一直做这些事,我会感到快乐和自豪,因为它们重要到我非做不可。

参考