Local-first software: You own your data, in spite of the cloud
你有没有过这种时刻:打开一个在线文档,发现网络断了,你只能盯着那个转圈的加载图标,一个字都改不了。或者你用的某个笔记软件突然宣布要改版,你的数据被迁移到了一个你完全不认识的格式里,而你只能接受。再或者,你订阅了一个在线服务好几年,有一天它关闭了,你连把数据导出的机会都没有。这些体验背后有一个共同的根源:我们把自己的数据交给了云端,而云端是别人的服务器,别人的代码,别人的商业决策。你只是在使用权上拥有它,而不是所有权。
Ink & Switch 这个研究实验室在 2019 年发表了一篇长文,提出了一个看似矛盾但极其务实的愿景,local-first software,本地优先的软件。它的核心主张是:把数据的主权还给用户,让数据存储在本地设备上,同时依然保留云端的协作能力。这听起来像是一个技术乌托邦,但文章不是从理想出发的,而是从一群软件开发者自己的痛苦出发的。他们试过用 Dropbox 同步代码、用 Google Docs 写文档、用 Notion 管理项目,每一次当网络不好、服务变更或者公司政策调整时,他们都会感到一种无力感。他们想要一种软件,像本地文件一样可靠,像纸质笔记本一样私密,同时又像现代协作工具一样可以多人同时编辑。
文章提出了七个原则来定义什么是 local-first。第一条是“数据归你所有”(Your data is yours),意思是数据应该以标准格式存储在本地,用户可以随时读取、备份、迁移,不需要依赖某个服务商的 API 或者导出功能。第二条是“网络不是必须的”(The network is optional),你可以在没有网络的情况下完整地使用软件,网络只是用来同步和协作的,不是用来运行软件的。
第三条是“你的设备就是你的服务器”(Your device is your server),你的电脑或手机本身就是数据的宿主,不需要一个中央服务器来授权每一次读写。还有“协作是平等的”(Collaboration is equal),没有主从之分,每个参与者都拥有完整的数据副本,可以离线工作,然后合并。这些原则听起来很理想,但实现起来有巨大的技术挑战,尤其是如何让多个用户离线编辑同一份数据之后还能无冲突地合并。
文章花了大量篇幅讨论一种叫做 CRDT(Conflict-free Replicated Data Type,无冲突复制数据类型)的技术,这是一种可以让不同用户独立修改数据、最后自动合并而不产生冲突的数据结构。它不是新东西,但在 local-first 的语境里,它成了核心基础设施。
文章并没有只停留在技术层面。它用了一个很具体的例子来说明 local-first 和传统云优先的区别:想象你在一架飞机上,没有网络,你想修改一份共享的项目计划。在 Google Docs 里,你打不开文件,因为文档需要从服务器加载。在 local-first 的软件里,文件就在你的本地硬盘上,你可以直接编辑,等落地联网后,你的修改会自动同步给其他人。这个场景可能不常发生,但它揭示了一个更深层的问题:当我们把软件的使用权建立在对网络的依赖上时,我们就放弃了在离线状态下的自主性。而这种自主性,对于写作、编程、设计、笔记这些需要深度思考的活动来说,恰恰是最宝贵的。
最后,文章没有宣称 local-first 会取代云优先。它承认云优先在很多场景下依然合理,比如需要大量计算资源、需要全局搜索、或者需要严格管控权限的企业应用。但它认为,对于个人创作、小团队协作、以及对数据主权有要求的场景,local-first 提供了一条更健康的路。这篇文章不是一篇技术论文,更像是一份宣言,一份写给所有被云端绑架过的用户的邀请函:你可以拥有你的数据,即使你依然使用云。