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中传递消息。它最好是类似broadcask
和when 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 a 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 a message(EIM)
。 虫洞由消息实现,通过处理收发消息,开发者可以任意改造它!
Scratch社区
我们来展示一个例子:
右边的“螃蟹”由树莓派中的adapter驱动(用户A),而左边的小猫则由电脑中的adapter驱动(用户B)。任何一个设备上的操作将传递到局域中的所有adapter。由于scratch和adapter在设计上都受smalltalk的影响,采纳everything is a message
的设计原则,所以MIT Scratch社区里3500多万用户创建的超过1亿的项目将直接得到虫洞功能,在局域网内随意连接!延迟在毫秒级。足以构建实时游戏。
because we can
如果我们是谢耳朵,我们就要基于虫洞去制作视频聊天工具。复现《生活大爆炸》里的著名桥段,
“But why?"(面对面在局域网内,为何需要视频聊天)
“because we can”(基于ZeroMQ的虫洞每秒钟能处理2000万条消息啊)
参考
文章作者 种瓜
上次更新 2019-03-01