CodeLab 可编程空间 背后的理念与设计原则
但 自由 的真实含义,教育者尚未知悉。 -- 蒙台梭利(Montessori)
前言
如果我们让教师培训仅仅停留在技术层面,就好比是把他们留在识字水平上便撒手不管了。 -- 蒙台梭利
CodeLab 分享了构建社区版可编程空间的方案。
仅仅有技术方案是不够的,围绕技术方案,提供成册的使用说明、配套的教师用书,依然不够。
让我们停下来,好好看看当下 Scratch 被滥用到何等缺乏想象力的境地,便会理解: 当新技术脱离了它的理念,运行在旧思维和旧传统中,只是徒有躯壳。
如果我们要实施有意义的编程教育,需要理解这件事背后的理念和精神是什么。 这让我们联想到蒙台梭利的见解:
什么样的人才能称作真正的科学家呢?当然,不是那种只懂得操作物理实验室里所有工具的人,也不是仅仅能在化学实验室中灵巧、安全地掌控所有化学反应的人,更不是生物实验室中明白如何制备标本以呈现到放大镜前面的人。助手的实验技能确实往往比科学大师本人更加熟练敏捷。这样的人我们才称之为科学家:他们将实验视作带领他们探寻生活的深刻真理、揭开事物神秘面纱的途径,并且在追求过程中,他们内心滋生出对神秘的大自然的爱意,激情四射以至于忘却了自身的想法。科学家不是聪明的工具操作者,而是大自然的礼拜者,他们带着可见的热情的标志,就像信仰命令的追随者一样。
难道编程不该也是这样一种充满激情的探寻过程吗?
构建一个服务于创造和教育的可编程空间,并不容易,甚至十分困难,但这正是 CodeLab 的目标之一。如果它是我们的目标,就不应该妥协或惧怕困难与现状。
本文将阐述 CodeLab 可编程空间背后的理念,以及由此推演出的设计原则和架构思路。
本文是对 Smalltalk 核心开发者 Daniel Ingalls 的 Design Principles Behind Smalltalk(我的翻译:Smalltalk 背后的设计原则)一文的致敬,采用与其相似的标题和文章结构。
Smalltalk 背后的设计原则以 Smalltalk 项目的目标和愿景为起点,逐步推演出其设计原则,思考之深刻,论述之有力,无不令人叹为观止。
Daniel Ingalls 在论文里写到:
这些原则本身却更为通用,被证明对评估其他系统和指导未来的工作都很有用。
Smalltalk 对我们产生了深刻影响,其设计原则也成为我们的思考背景之一。所以,本文并不只是在形式上与Smalltalk 背后的设计原则相似,在诸多原则上也与其强烈共鸣。
Smalltalk 项目的目标是为所有人的创新精神提供计算机支持。我们的工作源于这样一个愿景: 其中包括一个富有创造力的人和尽可能好的计算硬件。
CodeLab 可编程空间 在目标上与 Smalltalk 完全重叠。 愿景则有不同, 我们作如下表述:
CodeLab 可编程空间 的目标是为所有人的创新精神提供计算机支持。我们的工作源于这样一个愿景: 其中包括一个富有创造力的人和用以支持创造的整个现实空间。
Smalltalk 专注于两个主要的研究领域:一种描述性语言(编程语言),它充当人类大脑模型与计算硬件模型之间的接口,以及一种交互式语言(用户界面)。充当人与计算机之间的通信系统。
CodeLab 可编程空间 并不计划自行构建一门编程语言(虽然这事很有趣),我们选择 Scratch/Smalltalk/Python (等 34+编程语言)作为与空间交互、为其编程的语言。
其中,Scratch 比较特殊,它除了可以作为编程语言,也充当用户界面,所以 CodeLab 可编程空间对 Scratch 提供优先支持。我们一般建议用户先考虑 Scratch,当然,由于基于消息为整个空间构建驱动设施,所以可以方便地使用任何编程语言为其编程。
理念来源: 为何是一个空间?
计算机过去是一个房间(世界上第一台电子计算机,占地 170 平方米),在未来,它可能也是一个房间(参考'下一件大事'是一个房间)。
我们相信 Alan Kay 的判断: Bret Victor 正在 Dynamicland 里重塑计算机的未来。 置身于 Dynamicland 之后,这种信念就更加坚定,在 Dynamicland,计算机是人们所生活的环境,人们在其中学习、玩耍、交流以及协作。
把编程和空间联系在一起的原因,除了Dynamicland,还有以下原因:
教育即生活
杜威提出这样一个问题:
如果你从儿童的冲动和兴趣出发,一切都是如此粗率,如此不规则,如此散乱,如此没有经过提炼、没有精神上的意义,他将怎样获得必要的训练、陶冶和知识呢?
这个问题十分尖锐, 如果我们退怯或妥协了,或许会立马逃避到传统之中,逃避到按部就班的灌输式教育之中, 逃避到奖励、分数和惩罚系统之中, 并以它是不可避免的现状作为遁词。 就像蒙台梭利说的:
在一般的教室里,老师们必须向学生的脑子里灌输事先预备好的材料。他们发现,为了顺利完成这项枯燥的任务,有必要约束学生,让他们一动不动,被迫集中精力。对于被迫做听众的人,老师必须迫使他们的身体和精神达到要求的那种状态,奖励和惩罚就是现成、有效的辅助手段。
但杜威并没有退怯:
如果除了激发和迁就儿童的这些冲动以外,我们就别无其他道路可走,这个问题问得就是有道理的。那样的话,我们要么压制这些冲动,要么迁就它们。但是如果我们有设备和材料的结构,在我们面前就开辟了另一条路径。我们可以指导儿童的活动,使它们沿着一定方向运行,把它们渐渐引导到这条道路逻辑上必然要达到的目标上。
杜威进一步论述 教育即生活 的见解,如果我们能够把学习带到更广阔的现实中来,带到人们日常各类活动之中,教育将是一件充满乐趣和无限可能之事。
我们生活在三维空间中,生活中的事件都发生在空间里。 在学校,这个空间可能是一个教室,在校外,它是你喜欢的俱乐部、图书馆、少年宫,回到家里,它是你的客厅或卧室。
我们成长中的大多数时光都在这些空间里渡过。12 岁的生日 party、灵光闪现的时刻、恶作剧现场...也都发生在这些空间之中。
当一个孩子在看完《哈利波特》,得知使用机器视觉可以将整个家庭编程为魔法世界,实施教育还会成为难事吗?孩子会缠着你教他这些魔法,而魔法, 混合了编程、AI、物联网... 所有这些知识,Ta 都将如饥似渴地汲取。
当 Ta 想为心爱的宠物做一个自动开门器: 只为自家的宠物开门,而不让其他动物进入,Ta 还会觉得有监督学习和开源硬件是无聊乏味的吗?
不会的,Ta 会深切赞同培根的那句名言:
知识就是力量。
知识帮助孩子们实现他们生活中的愿望,它和魔法有什么区别呢?唯一的区别或许是,你许愿的数量可不受神灯的限制。
编程是一种强大的力量,它可以让我们的想法运行在我们生活的空间之中。
这是约翰·杜威的教育即生活所导向的可编程空间。
在法国学法语
法国的孩子,法语都说得很好,无论他们智力如何,阶层如何。
在美国法语班学法语的孩子,普遍糟糕,无论他们如何用心完成作业。
这是有关环境的讨论。
Seymour Papert 在《Mindstorms: Children, Computers, and Powerful Ideas》对 land 一词做了有力论述,置身在法语的世界(land)里, 学习是一件愉快而自然的事情。
作为一个数学家,他身体力行,为数学学习构建了一个大陆: LOGO -- Seymour 的 数学大陆(mathland)。 LOGO 让人们置身其中,与数学对象打交道,学习数学成为一件直观而有趣的事情,这个项目影响了整整一代人,《Mindstorms》论述了很多惊人的成果。
我向周围的朋友推荐 《Mindstorms》,许多人都没听过,若干朋友阅读后,跟我说 啊原来他是 LOGO 作者,最早爱上数学,就是因为在 LOGO 中的经历。
我们是否可以为孩子构建一个编程的大陆?在这儿,目之所及,都可被编程?Ta 置身在一个可编程的空间中,在那儿呼吸、玩乐、协作和创造。
如此一来,或许可以实现 Seymour Papert 的愿景:
我们能够让计算机变得易于学习,让学习的过程变得自然。就像居住在法国学法语,而不是在美国的学校课堂里接受非自然的外语培训
Seymour 的关于 land 的想法启发了许多人, Alan kay 受此启发,构建了 squeakland -- Etoys; Bret Victor 则受此启发构建了 Dynamicland; CodeLab 则构建了 Neverland -- 我们的第一个可编程空间。
Neverland 目前在广州,是我们的办公室。我们在其中办公,在其中编程,在其中玩乐,在其中做一些有趣的探索和创作。
后来,他领着我飞到了永无乡(Neverland),那儿还有仙子,还有海盗,还有印第安人,还有人鱼的礁湖;还有地下的家,还有那间小屋子。 -- 《小飞侠彼得·潘》
设计原则
CodeLab 可编程空间 的目标是为所有人的创新精神提供计算机支持。我们的工作源于这样一个愿景: 其中包括一个富有创造力的人和用以支持创造的整个现实空间。
开篇提及的这个目标,要如何实现?
用以支持创造的整个现实空间应当如何构建?
应该把这个问题抛给设计师吗?并叮嘱 Ta,门口的 Logo 要大气,往左移一些,往右移一些,还是改回原来的样子吧。
还是说我们应该把问题抛给一个技术团队,因为这里既有软件、硬件、AI、IoT、编程语言、交互界面... 以及一大堆其他的技术流行词汇。甚至还得构建一个完整的“空间操作系统”。
我们应该把这个问题抛给一个创客空间方案提供商吗?又或者找一个 AI/物联网实验室解决方案?
这并不是本质性的差异,因为深度差别不可能单独存在于表面技术中,而是存在于人心之中。 -- 蒙台梭利
无论我们准备把问题抛给谁,准备采用哪家的图像识别、哪家的机器人、哪家的编程界面,我们都无法回避最根本的一个问题: 如何支持创造?
它是一个综合问题。其中将包含空间设计、驱动软件、硬件/物联网设备、AI 服务、编程语言、人机交互 ...
这些问题需要站在教育视角去回答,无法偷懒,正如蒙台梭利在 20 世纪 对幼儿园做得改造,它不是一个装修或者配备桌椅的问题,它首先关于你的教育理念是什么?其次,关于由此推演的设计原则是什么?继而关于由此推演出的架构方案和实施方案。
可理解的空间
The challenge is not building it but understanding it -- Bret Victor 《Seeing Spaces》
和 Smalltalk 一样,我们从一个比技术更加社会化的原则开始:
个人精通:如果一个系统要发挥创造精神,那么个体必须完全可以理解该系统。 -- Smalltalk 背后的设计原则
为了让探索者能够发挥创造精神,个体应当能够理解整个可编程空间。
可编程空间中的一切都可编程,空间里的设备可能来自不过国家,不同厂商。通常情况下,它们配备不同的编程工具,不同的编程语言,不同的编程风格... 对于学生而言,ta 需要不停适应各类不同风格的系统,多数的时间纯粹是一种浪费。
Smalltalk 已经提醒我们:
如果系统的一部分工作方式与所有其他部分不同,该部分将需要付出更多的努力来掌握。这样增加的负担可能会损害最终结果,并会阻碍将来在这方面的尝试。
用户和系统某些部分之间存在的任何障碍, 最终都会成为创造性表达的障碍。
良好的设计要求:
系统应以最少的不可变零件组成;这些部分应尽可能通用;系统的所有部分都应聚拢在一个统一的框架中。
驱动空间里所有设备的系统,应该具有某种 统一隐喻, 该隐喻可以统一应用于所有领域, 这是提高可理解性的核心。
Smalltalk 的历史向我们表明,基于 消息/对象 隐喻的系统,是理想方案。
在 消息/对象 隐喻中,心理图景是空间里不同的物体(small object)在彼此对话(talk)。
这样的一个隐喻模型,我们可以使用任何编程语言来表达,目前 CodeLab 已经在 Scratch 和 Python 里都完成了这样的隐喻模型。
开放的连接能力
我们相信创意来自广泛的连接和分享。 -- CodeLab Adapter 的价值观
有了 消息/对象 统一隐喻, 我们就可以着手将不同事物接入系统中,这些不同公司的产品,一旦接入的 消息/对象 系统(CodeLab Adapter是其具体实现之一), 我们便可以以一种统一的方式与它们沟通,去编程和创造,它可以支持任何编程语言和编程平台。 此外还将免费得到不同设备之间的互操作能力。
CodeLab 已经展示了许多有趣的例子:
这里并不要求设备在生产时,严格遵守某种规范,要求所有厂商遵循某种统一的规范是美好的幻想,在技术上极难实现,尤其是,当规范的提出者缺乏领域经验时, 他们甚至都不怎么编程。这种不合理的规范如果诉诸强力,实践起来将非常艰难,学习者也将深受其害,因为由此导致的系统非常蹩脚。
要让这场复杂博弈变得可行,关键是 开放的连接能力。设备厂商的 SDK/开放 API 具体如何实现是无所谓的,交由各个厂商自行决定,设备的最佳交互方式,只有厂商自己最清楚,我们要接纳这样一个前提: 知识分散在不同企业中,去做一个全局的大而全的细致规划,不是太自负,就是太愚蠢,或者兼而有之。
如果我们采用基于消息系统的架构,我们就可以很好兼容任何厂商的开放设备。
此外值得一提的是,可编程空间可以与商业产品共存,而不是只与开源硬件共存。由于采用了消息系统,所以我们只要求设备拥有开放接口,而不对其是否开源有要求。
Bret Victor 在可理解性与开源的话题下,做过深入的讨论,正因为 Bret,我抛弃了开源原教旨主义。
消息系统之所以适合作为基础架构的原因是消息支持晚绑定(lazy bind), 这也是 Smalltalk 和 LISP 的主要力量来源。
CodeLab Adapter是上述想法的一个实现,可以与任何的开放设备连接,也允许任何人/组织自行建立这种连接。
拥有开放的连接能力的空间,就像一个生物,它会持续成长,它会越来越聪明和有趣。
可探索的空间
理解世界的最好方式是动手构建它。
建构主义是我们理念的来源之一。
为了支持建构主义,这样的一个空间(环境)应该是可探索和可与之交互的。
学习者对空间里的事物感到好奇的时候,应该能与之交互(两种硬件编程风格的比较),Ta 在空间中与其说是学习,不如说在探险,知识正如精灵一般隐藏在眼前的事物背后。
可探索性要求空间在物理上,应该尽可能 多元 ,单调的光滑地板可不是探险的好地方。
相比于有多个相同的功能分区(多个小组),更好的空间布局是,每个区域里的事物是不同的,它们可以按照主题分类(AI / IoT / 开源硬件 / 视觉艺术), 这样学习者在其中探索,不同的小组可能在做不同的事情。
可探索性也要求空间尽可能是开放的, 开放的空间允许学习者发生碰撞,他们可以走到其他小组去看看他们都在做些什么有趣的东西。正如在 Scratch 社区里,人们逛 项目广场。
AI 小组的成果可能会被借用到隔壁开源硬件小组中, 他们最终可能将树莓派和图像识别整合到一起,构建一个自动宠物开门器。如果你是 Scratch 用户,会想到 remix 这个功能,人们在这样一个空间里,应该能够 remix 他们的项目和 idea,彼此协作与增强。
所有这些,都依赖于我们前边提到的 开放连接能力,系统需要能够支持这些,它得是开放的,每个接入的设备/软件/AI 服务都应该能够互操作。
开放空间里的更多潜在灵感碰撞,尚不可知,正是这种潜在的未知和可能性,我们才会相信,孩子随时都可能超越我们。在一个被详尽规划的系统里,详尽到每个实验的操作手册和操作流程,这是培养操作员的体系,在那儿,意外是难以产生的,创造和灵感有时只是意外的同义词。
关于开放环境可能发生的更多惊喜, 参考《终身幼儿园》和《蒙台梭利早期教育法》。
开放 作为设计原则,当然也将影响空间的设计和布局,空间因尽可能得减少视觉障碍(CodeLab Neverland 整个空间没有任何阻隔,完全开阔,这个想法最初来自 @罗云 )。
空间里的桌子应该尽可能轻巧,可挪动,而学习者所坐的椅子,则最好带有滑轮, 为开放协作提供土壤。
可扩展的空间
我们每个人在内心深处都怀有一个梦想:希望创造出一个鲜活的世界,一个宇宙。那些处在我们生活中心、受到过专业训练的架构师们,都怀有这样的渴望:在某一天,在某个地方,因为某种原因,我要创造出一个不可思议的、美丽的、夺人心魄的场所,在那里人们可以漫步,可以梦想,历经很多世纪生生不息。 ——Christopher Alexander
为了支持创造, 可编程空间应当具有强大的可扩展性。
如果足够诚实,就得承认,我们并不确切知道学习者的兴趣和热情在哪里,而且不知道随着他们的成长,空间如何随之一同成长。如果这个可编程空间是一间卧室,这个意义就更加重大,这意味这它将伴随它的主人许多年,它难以是一个功能确定的商品,理想情况下,它应该是极度灵活和可扩展的,它与房间的主人一起成长,最终这个空间便是它的主人一手构建的魔法世界。
这正是可扩展性对于学习者的意义,Ta 可以将自己热爱的任何事物接入进来,任何的年龄段任何的点子。
Ta 可以把玩具四驱车变得和动画片里一样智能
它可以在学完 micro:bit 的第一堂课,使用 micro:bit 制作一根魔杖,对空间里的一切施以魔法
当然,可扩展性也意味着空间的建设者 不需要一次性想清楚 空间的所有功能和搭配设备,因为我们在使用它之前,并不会深刻理解它,深刻理解发生在沉浸使用之后。可扩展性意味着空间的灵活性,它可以服务未来的教学场景,那些我们曾经不曾设想的场景。
可扩展性依赖于前边提及的晚绑定、 连接能力 和 开放性 ,
由于可编程空间高度可扩展,于是人们便会构建出许许多多自己自豪的项目, 人们通常乐意分享它,就像一个手工艺人乐于分享 Ta 的手工艺品。
空间里最好考虑有用于展示作品的地方,可以使用展示墙,贴上项目的设计图和程序打印图纸;可以使用展示柜摆放一些实物项目,这样一来它能给路过它的人以新的灵感,新的创意或许就此起步。
总结
本文从 CodeLab 可编程空间的理念出发,推演出空间的设计原则和架构思路。
为了支持创造和教育,空间应当具备:
- 可理解性
- 可探索性
- 可扩展性
为了实现这些特性,核心设计原则是 开放。
这些特性与空间的驱动系统高度相关,空间驱动系统应该具备开放的连接能力,理想方案是采用 消息/对象隐喻,使其支持晚绑定,从而获得开放连接能力。
CodeLab Adapter 是由 CodeLab 按照以上讨论实现的空间驱动系统,满足以上约束。
CodeLab Neverland 则是 CodeLab 实现的可编程空间。
至于将 CodeLab 可编程空间落地到
- 家庭
- 俱乐部
- 学校
等其他场景中,其最佳实施方案是什么?本文未做讨论,但其原则已在本文之中。实施者可以据此去构建更详细的实施方案。
致谢
以下这些事物 是我们所有灵感的来源:
- Seymour Papert: 《Mindstorms》
- 蒙台梭利:《蒙台梭利早期教育法》
- Bret Victor : Dynamicland
- Alan Kay/Daniel Ingalls : Smalltalk/Etoys/Lively
- Mitchel Resnick: 《终身幼儿园》/ Scratch
- 约翰·杜威: 《学校与社会》