codelab-adapter的虫洞(wormhole)

相隔遥远的两个巫师同时讲一句相同的魔法咒语,这导致了他们之间建立了某种神秘的联系。接着一个巫师把魔法书扔进虫洞,书就从另一个巫师身边的虫洞掉了出来。

上上周去了趟杭州/南京,与几个团队碰面交流。期间聊到许多有趣的技术话题,大家对codelab-adapter的架构设计、合作计划以及未来目标都很感兴趣。

其中聊到的一个话题让我印象深刻: codelab-adapter计划对classroom/club中的协作者提供怎样的支持?

设想这样一种场景,一群用户聚集在一个线下空间里,线下空间可能是一个线下俱乐部(如coderdojo)、一个线下培训机构、一个班级、以及我们的codelab neverland。他们接入同一个局域网中。学习者们身处同样的物理空间,我们是否考虑将他们所处的虚拟空间和创作平台中也连接在一起,支持更多的协作和交互。

Scratch本身有考虑人的连接,出于这个考虑,他们构建了线上社区, Mitchel Resnick(Scratch之父)宣称相比于Scratch这个创作工具,Scratch社区是他们更重要的创造。

但目前Scratch社区并不支持强连接,诸如构建一个聊天工具或联网游戏。

如果你是《终身幼儿园》的忠实粉丝,你会发现为classroom/club提供强连接是践行4P理念(Projects, Passion, Peers, Play)的绝佳机会。

从杭州/南京回来之后,一直在想这件事。

思考

将局域网内的机器进行联机不是什么难事。利用局域网内的ip地址或hostname,建立socket连接,就可以连接局域网内的机器。

这只是技术上可行,教育层面呢?拿ip地址来说,当我们告诉学习者如何查看ip地址时,Ta需要了解ip地址这个概念吗?还是只是做一个机械操作(ifconfig/ipconfig)?又或者我们应该在教学工具中内置查看ip地址功能呢?

艾伦·凯上周在Quora上回答了一个问题 为何艾伦·凯认为入门编程应当使用Squeak/Pharo,他说:

服务于教学和学习的用户界面有许多需要考虑的因素。如果你只想选择一个重点来考虑,那应该是"减少认知负担"。

它需要处于试图学习的人的心理空间中。

艾伦·凯对编程教育的观点极大影响着CodeLab,我们对codelab-adapter的设计以及积木的设计都深受他的影响。

我们希望"减少认知负担"。如果我们希望构建一种积木,允许实时在局域网内的Scratch中传递消息。它最好是类似broadcaskwhen I receive这类的积木, 它与Scratch的事件积木以及CodeLab的EIM积木保持完全相同的结构。这样用户无需学习新概念,只需要利用传递消息就能进行联网创作。

我们想构建这样的积木:

于是,我们想到"虫洞"的概念。magic-wormhole是我很喜欢的一个开源项目,它的灵感来自:

相隔遥远的两个巫师同时讲一句相同的魔法咒语,这导致了他们之间建立了某种神秘的联系。接着一个巫师把魔法书扔进虫洞,书就从另一个巫师身边的虫洞掉了出来。

这个概念如此简洁。巫师只是说了相同的咒语,连接就自动建立了。虫洞是声明式的!上帝说要有光,于是就有了光,看起来也类似申明式编程。

我们将"虫洞"内置到codelab-adapter中,codelab-adapter通过一个"咒语"发现彼此,之后自动建立连接,消息在adapter内置的虫洞中传递,用户只要收取虫洞里的消息即可。

一旦有了目标,github里总有项目能节约你90%的编程工作:)

我们选择zeromq来传递消息。zeromq有着比socket优美得多的设计。云风在他的博客文章ZeroMQ 的模式里写道:

任何分布式,并行的需求,都可以用这三种模型组合起来解决问题。ZeroMQ 只专注和解决了消息通讯这一基本问题,干的非常漂亮。

任何消息通讯相关的问题,ZeroMQ都是非常好的选择。

还有一件事需要考虑,传递消息之前,需要发现局域网中的各个codelab-adapter的ip,可以采用UDP – Broadcast来做。

理念

Bret Victor在他的出色演讲《Inventing on Principle》里说

If there is something in the world you feel the wrong and you have a vision for what a better world could be, you can find your guiding principle and you can fight for a cause.

codelab-adapter的guiding principle是

Everything Is Message(EIM)

灵感来自艾伦凯设计smalltalk时采用的原则:

Everything is an object, and objects communicate only by sending each other messages.

smalltalk的一致性,允许所有的语法(概念)在一张明信片中写完,一个小孩在Ta入门的时候学会这些概念,可以用于创造小玩具。待Ta长大后,如果雄心勃勃想构建一个操作系统,需要的所有东西,都在Ta小时候看过的那张明信片上。

wormhole的设计依然满足EIM原则,codelab-adapter的架构试图保持一致性。我们之所以重视一致性,原因之一是计划等到codelab-adapter开源之后,用它的源码本身来教学编程。我们希望一致性带来简单和清晰,让一个3年级的孩子可以完全理解codelab-adapter。并能轻松去改造和拓展它。

发布计划

codelab-adapter的下个版本将内置虫洞(wormhole)功能。

使用场景

虫洞功能将支持很多有趣的场景。

它尤其适合classroom/club/线下活动 场景。正如我们前头提到的: 一群人聚集在一个物理空间里,他们接入同样的局域网,虫洞就发生作用。

学习者

利用虫洞功能,学习者可以轻松为他的小区或学校创建聊天程序,当然也可以用于在Scratch中制作网络游戏。

利用codelab-adapter连接硬件的能力,他们甚至可以一起构建一个"机器军团"。

教师

在俱乐部/教室场景中,教师可以利用虫洞功能管理局域网中的设备,甚至构建教学引导程序。就像在机房中教室机与学生机的互动。只要基于虫洞构建新的插件来支持这些场景即可。

虫洞本身也可以用于教学计算机网络。

开发者

Everything Is Message(EIM)。 虫洞由消息实现,通过处理收发消息,开发者可以任意改造它!

Scratch社区

我们来展示一个例子:

右边的“螃蟹”由树莓派中的adapter驱动(用户A),而左边的小猫则由电脑中的adapter驱动(用户B)。任何一个设备上的操作将传递到局域中的所有adapter。由于scratch和adapter在设计上都受smalltalk的影响,采纳everything is message的设计原则,所以MIT Scratch社区里3500多万用户创建的超过1亿的项目将直接得到虫洞功能,在局域网内随意连接!延迟在毫秒级。足以构建实时游戏。

because we can

如果我们是谢耳朵,我们就要基于虫洞去制作视频聊天工具。复现《生活大爆炸》里的著名桥段,

"But why?"(面对面在局域网内,为何需要视频聊天)

"because we can"(基于ZeroMQ的虫洞每秒钟能处理2000万条消息啊)

参考




Fork me on GitHub