最终用户编程(2019)

2020-12-15 18:45:50

例如,与Unix比较。 Unix系统的用户在日常使用中学习键入命令,编辑文本文件以及复制/移动/删除文件和目录。而且,当他们准备编写程序时,可以继续使用相同的概念和界面,因为Unix shell脚本只是保存在文本文件中的一系列命令。该文本文件可以像其他文件一样被复制,移动,编辑和删除。

Zapier和IFTTT为Web和云API提供了诱人的最终用户可访问的自动化功能。但是从就地工具链的想法的全面衡量来看,这些方法失败了,因为例如,使用IFTTT自动化智能家居组件的行为需要与每天使用这些组件完全不同的界面和概念集。

最终用户编程的学术示例中也存在一个类似的“独立工具中的工具”问题。 Eve,Sketch-n-Sketch和Pharo是技术设计奇迹。但是它们要求用户进入工具和概念的全新世界,而抛弃了他们已经知道的有关使用计算机的所有知识。必须激励他们开始编程,而不是让它们在那里已经在使用的环境中等待他们,例如文字处理器,Web浏览器或照片编辑器。

结合这三种品质以及以前的品质,我们的研究实验室着手进行一些最终用户编程实验。我们的测试平台是一个称为Capstone的平板电脑思维工具。

如果我们假设有创造力的专业人员定期使用Capstone进行笔记,剪辑和研究,那么我们可以提供哪些编程或自动化功能来在这种情况下为其提供更多功能,灵活性和定制性?

我们进行了五个实验,以尝试将实施,生活系统和就地工具链应用于Capstone。

Capstone用户界面由画布上的卡片组成。作为一个简单的起点,我们在Capstone系统内部构建了一个编辑器,允许用户编辑给定卡的基础代码。可以将其视为类似于网络浏览器的“查看源代码”选项,但具有写入功能。

从表面上看,这似乎可以实现就地工具链的目标:用户不需要其他任何东西就可以开始编辑所选卡的代码。这是一个实时编码环境,每次击键都会重新渲染卡,以便用户立即查看其工作结果。

但是,我们发现这种方法的实际使用没有启发性。感觉很明显,不是以前从未尝试过的大胆新方向。从用户的角度来看,它是可编辑的,但并不能吸引用户。从触摸/手写笔界面中的画布上的卡片到使用Javascript和React代码的隐秘代码编辑器的跳转是不协调的。

对于我们的下一个实验,我们希望包含Cardstone + Canvas模型和Capstone的触摸界面,同时还借鉴了Unix管道的一些想法。

对于像Capstone的画布卡这样的视觉环境来说,这会是什么样?我们的方法是允许Capstone中的每张卡接受输入并提供输出,从而允许用户将它们与管道操作员的视觉等效物链接在一起。

我们向每张卡添加了字段:使用和公开。顾名思义,卡现在可以等待一些输入,并公开一些输出。这些输入和输出经过强类型化,以允许交换更丰富的数据类型,例如数组和对象。

在下面的示例中,我们从这个Emacs识字编程示例中借用了一个用例。在这里,老师从学生成绩表开始(电子表格或CSV),并希望创建一个临时仪表板,显示每个学生的合格/不合格。

通过将“公开”标签从一张卡拖动到另一张卡的“使用”标签上,用户可以在卡之间建立连接。受电子表格单元格和范围颜色编码的启发,已连接的卡采用了颜色编码。根据用户的反馈,我们发现用户希望将卡保持在物理上彼此靠近的管道中。

通过组合多个简单的卡,用户可以建立数据处理管道。进一步的增强包括多个输入/输出以及重命名输入或输出。

在类型对新手不宽容的假设下,许多尝试使用更易访问的编程语言的尝试都是弱类型的。我们团队的直觉是相反的:通过使程序组件像构建块一样“对齐”,强健的打字和正确的界面可以使新手更加友好。如果块适合,该程序可能会运行。参见前面提到的Scratch; Elm强大的输入功能可消除运行时错误;和Hazel的“打字孔”实时编程环境。

Unix管道仍然是可组合性的主导者-在GUI环境中尚未复制。我们认为,该CSV管道实验产生了积极的发现,支持了强类型(在这里是使用/公开)的价值,并显示了不脱离触摸屏界面的就地工具链的潜在界面。

另一方面,数据管道的可视化实施方式带来了一些问题。它增加了视觉混乱(许多/大多数视觉编程系统都存在问题)。此外,我们发现在将卡片分组在一起(这可以使程序流程清晰(例如,管道从上到下或从左到右))与在反映用户想要如何思考他们的卡片的方式之间进行权衡内容更一般。

对于我们的第三个实验,我们决定放宽就地工具链的约束,以换取其他维度上的更好结果。特别是,我们希望了解在许多编程系统中使用的REPL(读取评估打印循环)是否有价值。

传统上,REPL是建立在有线协议上的。也就是说,用户控制台通过网络将命令发送到运行时系统。但是Capstone使用同步数据模型,该模型将所有可见元素存储在实时文档中。这使我们能够通过从另一设备上的会话直接写入文档来构建REPL。

能够与实时系统交互非常神奇。就像浏览器开发工具一样,用户可以通过CSS更改外观。他们还可以与卡数据模型进行交互,以在屏幕上四处移动卡,在板之间移动卡,或在系统中进行其他任何操作。但是,与开发工具不同,所有这些更改仍然存在。用户通过完全可编程的界面修改了工作空间,并根据自己的喜好对其进行了自定义。

我们的团队为这一结果感到鼓舞,我们立即希望为我们所有现有系统(例如我们在日常工作中使用的台式计算机)提供此功能。但是,我们也很快遇到了使这样的系统成为现实的最大工作量:API设计。

通常,软件系统是使用内部API构建的,内部API仅由构建该系统的专业工程师使用。这些函数通常很少进行文档记录,其名称晦涩难懂,可能反映出历史甚至是内部笑话,而面向公众的API则经过单独设计,有据可查,经过版本控制并保持更稳定。

我们在这里的发现是,要使运行中的系统正常工作,内部和外部API必须基本相同。

我们还注意到,生命系统在可破解性与用户破坏危险之间产生了张力。例如,用户可以像执行命令那样轻松更改卡的背景颜色,该命令会丢弃屏幕上的每张卡,甚至使系统进入崩溃状态或无限循环。允许的内容,如何显示错误以及如何恢复是我们在本实验过程中未探讨的深层且具有挑战性的问题。

我们的下一步是使用系统事件的钩子扩展REPL,例如用户在画布上拖动卡片。

有了卡拖动的钩子,我们就可以在Capstone环境中构建一个“窗口管理器”:

挂钩带来了很大的缺点:计算不再可见。用户的代码可以做隐藏在幕后的事情,这与实施例相反。

与之类似的是诸如PostgreSQL之类的数据库中的触发器和存储过程。他们也有没有体现的缺点。因此,尽管SQL是最终用户编程的成功案例,但触发器通常是为专业数据库工程师而不是SQL控制台涉猎者保留的。

对于我们的最终实验,我们想探索用户如何在Capstone内部创建长期运行的程序(或守护程序),以解决钩子的体现问题。

通常,当我们说实施例时,是指屏幕上的视觉元素。但是我们从聊天机器人的世界中汲取了灵感:如果将计算体现为具有某种个性,与系统中的角色或协作者以及人类协作者一样的东西,该怎么办?

像REPL实验一样,Capstone机器人仍然没有适当的工具链。最终用户程序员必须使用Javascript编写脚本,然后发出命令以在其Capstone工作区中添加卡(或更新现有卡)。在拉取请求中可以找到技术细节。

僵尸程序界面设计的一个微妙但重要的部分是,僵尸程序订阅了文档中的所有更改(类似于反应式编程)。这不是预订特定的事件类型(类似于事件发射器),例如移动或删除卡。此实验的另一个变体是允许漫游器公开一个小的UI。由于漫游器卡已经具有屏幕空间,为什么不允许编程直接交互功能?

尽管创建机器人代码不能满足就地工具链的目标,但是将其体现为卡片具有自己的就地工具链优势。 Unix用户可以像其他文件一样操作脚本文件,Capstone用户可以像其他文件一样操作机器人程序。

我们注意到用户的行为,例如创建一个装满他们最喜欢的机器人的棋盘,并将这些卡镜像到架子上,以将其带到他们想要的棋盘上。删除漫游器是通过像其他任何卡片一样将卡片从屏幕上丢下来完成的。所有处理(例如)图像卡的操作也都适用于机器人卡。计算遵循与数据相同的规则(可以克隆,共享,存储等)。这很重要。

在当今的计算设备中,最终用户编程的潜力仍然很大。学术界和工业界所做的大量工作表明,这确实是一个非常棘手的问题。但是在通过这些实验解决此问题时,我们的团队认为,通过我们行业的足够努力,这是可以实现的,值得这样做。

从这些实验中我们获得的积极发现包括将强类型(使用/暴露)与可视化程序流相结合的优势;与生命系统互动的神奇感觉;以及长期运行为机器人的计算的实施方式,以视觉上表示为具有用户已经知道的属性的卡片。

我们的负面发现包括我们最好的实验(REPL)仍然需要外部/单独的工具链;计算卡的视觉布置会很快变得混乱;对于强大的最终用户系统而言,API设计和文档编制将是巨大的挑战。

在油墨Switch我们继续认为,最终用户编程的乌托邦是可以实现的。您是在解决这个问题,还是对我们在这里写的内容有想法?保持联系:@inkandswitch或[受电子邮件保护]

五个Capstone最终用户编程实验中的三个在编程界面上使用了不同的设备。在这两种情况下,我们都可以在CRDT / Hypermerge数据存储层上构建,而不必使用诸如ssh或nREPL之类的传统网络连接。

我们可以推测这是命令性代码与声明性代码之间的区别。命令性程序说“在主机上运行此功能”。声明式说:“更新文档的一部分,并让文档的所有订阅者选择如何呈现新状态。”

即使在本质上是必须的REPL的情况下,简单地将命令的历史记录存储在文档中也可以使我们对系统进行的更改具有可清除的历史记录,任何有权访问该文档的人都可以检查该历史记录。

我们已经在下一个Ink&中探索了这个主题。切换项目。我们正在尝试将实时文档作为新编程模型的基础;实时版本控制,结合了Git / Github和Google Docs的最佳功能;可检查的变更历史记录,以向最终用户展示CRDT的功能;当每个人都连接到共享文档时,最终用户可编程环境会发生什么。

我们选择Chrome OS作为Capstone的平台,而不是iPad和Surface等更成熟的选项,主要是因为网络技术为最终用户编程提供了更多的可能性。在其他平台上,我们将需要嵌入脚本语言和运行时,例如Lua。

充分利用网络的本机可扩展性的一些应用示例:

嵌入Javascript工具链以就地构建和运行Javascript程序(例如我们的第一个实验中显示的可编辑卡)非常简单。在这种情况下,我们通过@ babel / standalone捆绑了Babel编译器以构建JSX文件。另外,它捆绑了最流行的预设和插件。

一个未解决的问题是如何使用外部库。潜在的解决方案是使用unpkg之类的服务为用户提供获取和缓存机制。

总体而言,网络是有史以来创建的唯一功能齐全的平台,该平台允许即时下载和执行由陌生人编写的程序(通过访问网站URL)。但是Javascript运行时的完美沙箱意味着此操作几乎是完全安全的。这是一项真正令人惊叹的技术成就,意味着网络是最终用户编程功能的有希望的地方。