摘要
在本文中,我们提出了“本地优先”(local-first)的软件原则,支持用户的协同和所有权。本地优先的理念包括离线工作和跨多个设备协同的能力,同时提高了数据的安全性、隐私性、长期保存性和用户控制权。
正文
目前 Google Docs 和 Trello 的云应用很受欢迎,可以实现与同事的实时协同,并且可以轻松地通过各种设备访问我们的工作。但是,云应用需要将数据集中存储在服务器上,剥夺了用户的数据所有权和代理权。如果关闭服务,软件将停止运行,使用该软件创建的数据也会丢失。
在本文中,我们提出了“本地优先”(local-first)的软件原则,支持用户的协同和所有权。本地优先的理念包括离线工作和跨多个设备协同的能力,同时提高了数据的安全性、隐私性、长期保存性和用户控制权。
我们调查了现有的各种数据存储和共享方法,从电子邮件附件到 Web 应用程序,再到基于 FireBase 的移动应用程序,分析了每种方法的优缺点。我们研究的是无冲突复制数据类型(Conflict-free Replicated Data Types,CRDTs):从一开始就是多用户的数据结构,同时基本上也是本地和私有的。CRDT 有潜力成为实现本地优先原则的基础技术。
我们分享了几年来在Ink&Switch开发本地优先软件原型的一些发现。这些实验测试了 CRDT 在实践中的可行性,并探讨了这种新数据模型对用户界面的挑战。最后,为了实现本地优先这一目标,我们给研究人员和应用程序开发人员提出了如何前行的一些建议,这些建议也可以成为创业者的一些创业机会。
本篇是这个系列的第一部分,下一个部分中会介绍利用本地优先的几个理念,以及如何迈向更美好的未来。
动机:协同和拥有
令人惊讶的事实是,我们现在可以如此轻松地进行在线协同。我们通过 Google 文档在文件、电子表格和演示文稿上进行协同,利用 Figma 共同设计用户的界面,使用 Slack 与同事进行沟通,在 Trello 中执行任务跟踪,等等。我们依赖于这些服务和许多其他的在线服务,例如记录笔记、计划项目或事件、记住联系人以及大量的业务用途。
我们将这些服务称为“云应用”(Cloud apps),也可以将它们称为“ SaaS ”或“基于 Web 的应用程序”。它们的共同点是,通常通过 Web 浏览器或移动应用访问它们,将数据存储在服务器上。
与早期开发的软件相比,如今的云应用提供了巨大的好处:无缝协同,能够从任何设备访问数据。随着我们越来越多的生活和工作通过这些云应用实现,它们对我们来说变得越来越重要。在这些应用程序上投入使用的时间越多,其中的数据对我们就越有价值。
不过,在研究中我们与很多有创造力的专业人士进行了交流,了解到云应用也是有缺点的。
当投入了大量的创造力和努力去做某件事时,往往对它会有深刻的情感依恋。如果你从事的是创造性的工作,应该会深有同感。(当我们说“创造性工作”时,意思不仅仅是视觉艺术、音乐或诗歌,还包括许多其他的活动,例如解释一个技术主题、实现一个复杂的算法、设计一个用户界面,或者弄清楚如何带领一个团队朝着某个目标前进,都是创造性的努力。)
对支持创新过程的软件的研究,将在我们的文章中进一步讨论:Capstone,一种思维的平板电脑和作为快速、精确创新工具的iPad。
在执行创造性工作的过程中,通常会生成文件和数据:文档、演示文稿、电子表格、代码、注释、绘图等。我们会保留这些数据作为参考和灵感包含在将来的产品组合中,或者只是因为感到自豪而进行归档。感受到数据的所有权非常重要,因为创造性的表达是非常个人化的。
不幸的是,云应用在这方面存在问题。尽管它们允许随时随地访问数据,但是所有数据访问都必须通过服务器进行,并且只能执行服务器允许的操作。从某种意义上说,我们并不拥有数据的完全所有权,云提供商也是如此。
“没有什么云,它只是别人的电脑。” - Chris Watterston
云应用作为服务被提供,如果服务不可用,则无法使用该软件,并且无法再访问使用该软件创建的数据。如果服务关闭,即使可以导出数据,但没有服务器,通常也无法继续运行自己的软件副本。因此,我们完全由提供服务的公司来支配。
在 Web 应用程序出现之前,我们有所谓“老式”的应用:在本地计算机上运行的程序,在本地磁盘上读写文件。我们现在仍在使用许多这种类型的应用程序:文本编辑器和 IDE、Git 和其他的版本控制系统,以及许多专用的软件包,如图形应用程序或 CAD 软件,都属于这一类。
我们在本文中讨论的软件是用于创建文档或文件(如文本、图形、电子表格、CAD 绘图或音乐)或个人数据存储库(如笔记、日历、待办事项列表或密码管理器)的应用程序)。我们所说的不是实施银行服务、电子商务、社交网络、共享出行或类似的服务,这些服务都是由集中系统提供的。
在老式的应用程序中,数据保存在本地磁盘上的文件中,因此我们对这些数据拥有完全的代理权和所有权:可以做任何自己喜欢的事情,包括长期存档、备份、使用其他程序操作文件,或者删除不再需要的文件。不需要任何人的许可来访问文件,因为它们是你的,不必依赖由其他公司操作的服务器。
总而言之:云提供了协同,而老式的应用给了所有权。难道我们不能两全其美吗?
我们既希望云应用程序提供方便的跨设备访问和实时协同,也希望通过“老式”的方式实现自己对数据的个人所有权。
本地优先的七个理念
我们认为,数据所有权和实时协同并不矛盾。可以创建具有云应用所有优点的软件,同时保留所创建数据、文档和文件的完全所有权。
我们称这种软件为本地优先软件,因为它优先使用本地存储(计算机中内置的磁盘)和本地网络(例如家庭 WiFi),而不是远程数据中心的服务器。
在云应用中,服务器上的数据被视为数据的主要可信副本;如果客户端有数据的副本,则它仅仅是从属于服务器的高速缓存。任何数据修改都必须发送到服务器,否则“没有发生”。在本地优先的应用中,我们互换了这些角色:将本地设备(笔记本电脑、平板电脑或手机)上的数据视为主要副本。服务器仍然存在,但它们保存数据的辅助副本,来帮助从多个设备进行访问。正如将要看到的,这种视角的变化具有深远的影响。
以下是我们希望在本地优先软件中努力实现的七个理念。
1. 无需等待:立即工作
今天的许多软件感觉都比前几代的软件慢,尽管 CPU 变得越来越快,但在一些用户输入(例如,点击按钮或按键)和显示器上出现相应结果之间经常存在明显的延迟。在早前的工作中,我们测量了现代软件的性能,并分析了这些延迟发生的原因。
全球各地 AWS 数据中心之间的服务器到服务器往返时间。数据来自:Peter Bailis,Aaron Davidson,Alan Fekete 等人:“高可用的事务:优点和局限性”,VLDB 2014。
对于云应用,由于数据的主要副本在服务器上,因此所有数据修改和许多数据查找都需要往返于服务器。相对于本地所在的位置,服务器可能位于另一个大陆,因此光速就限制了软件的速度。
即使请求仍在进行中,用户界面可能会试图通过将操作显示为已完成来隐藏该延迟(一种称为乐观UI的模式),但在请求完成之前,始终存在失败的可能性(例如,由于不稳定的 Internet 连接)。因此,乐观的 UI 有时仍然会在发生错误时暴露网络往返的延迟。
本地优先的软件是不同的:因为它将数据的主副本保存在本地设备上,所以用户永远不需要等待对服务器的请求的完成。所有操作都可以通过在本地磁盘上读写文件来处理,与其他设备的数据同步在后台安静地进行。
虽然这本身并不能保证软件的速度很快,但我们预计本地优先的软件有可能对用户输入做出近乎即时的响应,不需要显示等待的旋转指针,就可以很轻易地对数据进行操作。
2. 工作不会被困在一台设备上
今天的用户依靠多个计算设备来完成他们的工作,现代应用程序必须支持这样的工作流程。例如,用户可以使用智能手机随时随地捕捉想法,在平板电脑上组织和思考这些想法,然后在笔记本电脑上将结果输成文档。
这意味着,虽然本地优先应用将数据保存在每个设备上的本地存储中,但也有必要在用户进行工作的所有设备上同步这些数据。存在各种数据同步技术,我们将在后面的部分中详细讨论它们。
大多数跨设备同步服务还在服务器上存储数据副本,这为数据提供了方便的异地备份。只要每个文件一次只能由一个人编辑,这些解决方案就能很好地工作。如果有多个人同时编辑同一个文件,可能会出现冲突,我们将在协同部分讨论。
3. 多选的网络
个人移动设备会穿过不同的可用网络区域:不可靠的咖啡店 WiFi、在飞机上或火车上通过隧道、电梯或停车场时。在发展中国家或农村地区,互联网接入的基础设施有时是不完整的。在国际旅行期间,许多移动用户由于漫游成本而禁用手机数据。总的来说,有很多需要离线功能的应用程序,例如研究人员或记者需要在现场写作。
“老式”的应用程序在没有 Internet 连接的情况下工作正常,但云应用通常在离线时无法正常工作。多年来,离线优先(Offline First)运动一直鼓励 Web 和移动应用程序的开发人员改进对离线的支持。但实际上,很难对云应用的离线支持进行改造,因为以服务器为中心的模型设计的工具和库不容易适应用户在离线时进行编辑的情况。
尽管可以使Web应用程序离线工作,但是用户可能难以知道是否已经下载了应用程序所需的所有代码和数据。
本地优先的应用将数据的主副本保存在每个设备的本地文件系统中的文件中,因此用户可以随时读取和写入这些数据,即使在离线时也是如此。然后,当网络连接可用时,数据将与其他设备同步。数据同步不一定需要通过互联网:本地优先的应用也可以使用蓝牙或本地 WiFi 将数据同步到附近的设备。
此外,为了获得良好的离线支持,软件需要是运行在设备上本地安装的可执行文件,而不是 Web 浏览器中的一个标签页。对于移动应用程序,在使用前下载并安装整个应用程序已经已经成为标准。
4. 与同事无缝协同
协同通常需要几个人对一个文档或文件贡献材料。但是,在老式软件中,几个人同时处理同一个文件是有问题的:结果通常是冲突。在诸如源代码之类的文本文件中,解决冲突既乏味又烦人,而且对于电子表格或图形文档等复杂的文件格式,任务很快变得非常困难或不可能完成。因此,合作者可能必须事先同意谁将要编辑文件,并且一次只有一个人可以进行更改。
Dropbox 上的一个“冲突副本”,用户必须手动合并更改。
在 Evernote 中,如果同时更改了注释,则会将其移至“冲突更改”笔记本中,并且在解决此问题时没有任何支持用户的功能,甚至不能比较不同版本的注释。
在 Git 和其他版本控制系统中,几个人可以在不同的提交中修改同一个文件。合并这些更改通常会导致合并冲突,这可以使用专门的工具(例如上面显示的DiffMerge)来解决。这些工具主要设计用于面向行的文本文件,如源代码。对于其他文件格式,工具支持要弱得多。
另一方面,像 Google Docs 这样的云应用程序通过允许多个用户同时编辑一个文档,大大简化了协同,而不必通过电子邮件来回发送文件,也不必担心冲突。用户已经开始期望这种无缝的实时协同出现在各种各样的应用程序中。
在本地优先的应用程序中,我们的理想是支持与当今最好的云应用一样或者更好的实时协同。实现这一目标是实现本地优先软件的最大挑战之一,但我们相信这是可能的:在后面的部分中,我们将讨论在本地优先设置(local-first setting)中实现实时协同的技术。
此外,我们希望本地优先的应用程序可以支持各种的协同工作流。除了可以让几个人实时编辑同一文档之外,当某人暂时提出变更并由其他人审查以及选择性地应用时,本地优先有时是有用的。Google Docs 通过建议模式支持这种工作流,并且在 Git 中通过拉取请求实现此目的。
GitHub 上的协同工作流基于拉取请求。用户可以在多次提交中更改多个源文件,并将它们作为建议的更改提交到项目中。在最终合并或拒绝请求之前,其他用户可以审查和修改请求。
5. 永远是最新
数据所有权的重要性之一,是将来可以长时间继续访问数据。使用本地优先软件进行一些工作,即使生产软件的公司已经消失了,工作应该可以无限期地继续访问。
泥版文书上的楔形文字, 约公元前 3000 年。来自维基共享资源的图片
只要有一份数据拷贝和某种运行软件的方式,“老式”应用程序就可以永远工作。即使软件作者破产,仍可以继续运行该软件的最新发布版本。即使操作系统及其运行的计算机已过时,仍可以在虚拟机或模拟器中运行该软件。随着存储介质在过去几十年中的发展,可以将文件复制到新的存储介质并继续访问它们。
Internet Archive 维护着一系列历史软件,可以在现代 Web 浏览器中使用模拟器运行; 英语Amiga Board的爱好者分享了运行这些历史软件的技巧。
另一方面,云应用依赖于持续可用的服务:如果服务不可用,则无法使用该软件,也无法再继续访问该软件创建的数据。这意味着,只要还关心数据,就得确信软件的创建者将继续支持它很长一段时间。
虽然 Google 似乎不存在很快关闭 Google Docs 的巨大危险,但是热门产品有时会关闭或丢失数据,所以我们要小心。即使是长期使用的软件,也存在价格或功能以我们不喜欢的方式发生变化的风险。并且对于云应用来说,继续使用旧版本不是一种选择 – 无论喜欢与否,都会被升级。
我们的一个博客就是让人难以置信的旅程,记录了创业产品在收购后被关闭的情况。
本地优先的软件把数据以及读取和修改数据所需的工具都存储在本地计算机上,因此使用寿命更长。我们相信这一点很重要,不仅是为了自己,而且对于未来想阅读我们今天创建的文档的历史学家也是如此。如果无法做到数据的持久,我们可能创造的是Vint Cerf称之为“数字黑暗时代 ”的东西。
我们以前写过关于网页长期存档的文章。有关长期数据保存的有趣讨论,请参阅 Long Tien Nguyen 和 Alan Kay 在Onward 2015大会上发表的“2015年的楔形文字” 。
有些文件格式(例如纯文本、JPEG 和 PDF)非常普遍,在未来的几个世纪里可能还是可读的。美国国会图书馆还建议使用XML、JSON或SQLite作为数据集的归档格式。但是,为了读取不太常见的文件格式并保持交互性,还需要能够运行原始软件(如果需要,可以在虚拟机或模拟器中运行),本地优先软件实现了这一点。
6. 默认的安全和隐私
云应用架构的一个问题是,它们将来自所有用户的所有数据存储在一个集中的数据库中。这一庞大的数据集对于攻击者来说是一个有吸引力的目标:一个流氓员工,或者能够获得公司服务器访问权限的黑客,可以读取和篡改所有数据。令人遗憾的是,这种安全漏洞非常普遍,对于云应用程序,我们很不幸只能由提供商来支配。
虽然谷歌拥有世界级的安全团队,但令人遗憾的是,大多数公司都没有。虽然 Google 善于保护我们的数据免受外部攻击者的攻击,但公司内部可以自由地以各种方式使用数据,例如将数据提供给它的机器学习系统。
引用Google云端服务条款:“我们的自动系统会分析您的内容,为您提供个人相关的产品功能,如自定义搜索结果、垃圾邮件和恶意软件检测。”
也许我们觉得任何攻击者都不会对数据感兴趣,然而,对于许多职业来说,处理敏感数据是他们工作的重要部分。例如,医疗专业人员处理敏感的患者数据,调查记者处理来自消息来源的机密信息,政府和外交代表进行敏感的谈判,等等。由于遵守法规和保密义务,许多专业人员无法使用云应用程序。
另一方面,本地优先的应用在内核中具有更好的隐私和安全性。本地设备只存储自己的数据,避免了集中的云数据库来保存每个人的数据。本地优先应用可以使用*端到端加密,*这样存储文件副本的任何服务器都只能保存而无法读取的加密数据。
iMessage,WhatsApp和Signal等现代消息传递应用已经使用端到端加密,Keybase提供加密文件共享和消息传递,Tarsnap采用这种方法进行备份。我们希望看到这种趋势也扩展到其他类型的软件。
7. 保留最终控制权
使用云应用程序,所做的任何事情都要遵守提供商的服务条款。大多数人从来没有遇到任何问题,但偶尔会出现问题。例如,在 2017 年 10 月,由于自动系统错误地将一些文档标记为滥用,多个 Google Docs 用户被挡在文档之外。这一事件提醒人们,通过云应用程序,服务提供商(而非个人)对个人可以做的事情有最终发言权。
在本地优先应用中,我们可以做的只受物理定律的约束,而不受任何服务条款的约束。
如果在物理上能够将某些数据从一个地方复制到另一个地方,那么我们就应该可以这样做。由于数据存储在自己的设备上,因此无人可以阻止。我们可以随意对数据执行任何操作:修改、备份、编写程序来处理数据,或者在不再需要时删除数据。我们有完全的控制权。
根据欧洲人权公约,自由的思想和观点是无条件的 — 国家永远不会干扰它,因为它是你自己的 — 而表达自由(包括言论自由),可以在某些方面受到限制,因为它影响到其他人。社交网络这样的传播服务传递着表达方式,但创意人的原始笔记和未发表的作品是一种发展思想和观点的方式,因此需要无条件的保护。
原文链接:Local-first software: You own your data, in spite of the cloud
评论