本地优先 (local-first) 的软体设计
2024年7月18日
当谈到开发一个新的系统或应用,在二十一世纪的今天,多数人第一直觉应该会想到透过云端 (cloud) 来建置。然而,与云端相对的本地端 (local),在最近几年重新流行一个趋势 -- 本地端优先 (local first)。举例来说, 在 2024 年起,国外的社群也首次举办 Local-First Conf,聚集这主题相关的学术研究人员、业界资深工程师,一同来分享深入的洞见。
事实上,如同多数的软体设计概念,本地优先 (local-first) 并不是什么新的概念,因为在云端还没出现前,软体开发基本上都是本地为主,所以自然也是本地优先。
然而,因为现代的多数服务,都是部署在云端,甚至目前的网页应用 (web app) 多半是不支援本地。然而云端有云端的问题,这进而让业界回过头来思考,有没有整合本地与云端的新模式,而本地优先就是在这个脉络中出现的。
什么是本地优先 (local-first) 设计?
在谈本地优先前,先让我们聊聊纯云端的问题。如果云端伺服器挂掉,那会导致整个应用程式无法运行。在过去不乏有大型云端公司出现事故,导致全球各地非常多应用程式都没办法运作的状况。
多年前,图灵奖得主 Leslie Lamport 曾用一句很精辟的话总结这个状况,他说「 A distributed system is one in which the failure of a computer you didn't even know existed can render your own computer unusable」。
意即,在分散式系统,很可能有某台你甚至不知道存在的电脑发生故障,导致你在用的电脑无法使用系统。就像 AWS 挂掉代表某台在远端的、你根本不知道是哪台的机器出问题,结果导致你没办法用依赖 AWS 的某个服务。
从上面的例子可以看到,完全依赖云端是有风险的。毕竟当别的机器故障,导致使用者的手上的软体不能用,这对使用者来说,某种程度上相当于失去对软体使用的掌握。
在了解纯云端的问题后,让我们回过头看本地优先。提出本地优先的 Martin Kleppmann 等人是这样描述本地优先,他们说本地优先的软体可以完全在本地运行,即使没有网路连线也没问题;同时,在多人协作的状况下,能够确保软体的安全性、隐私性,以及长期的持久性。
基于这个定义,本地优先的软体对,就不会有上述云端软体发生的问题,本地优先意味着即使其他台机器挂掉,也不该影响你使用某个你正在用的软体。甚至更进一步说,如果原本的开发者决定关闭服务 (例如关掉 AWS 帐号),在本地优先的设计下,正在用该软体的使用者,也仍可以继续在本地使用。
本地优先,不代表只有本地
但这边也要特别厘清,本地优先不只局限于本地 (not local-only),在上面的定义中有提到「多人协作」,换句话说,本地优先仍会是会连网,只是在与云端连接的同时,是以本地为优先。
前面提到,在早些年,基本上绝多数的应用程式都是只有本地,但这会在协作上有所限制。举例来说,早些年的微软 Words,需要本地编辑完后,档案存下来输出,然后用 USB 带到另一台电脑才能继续编辑,而不是像现在的云端版 Words,能够直接多人同时线上编辑。
当选择本地优先,意味着能在纯云端以及纯本地中,取得两边的好处。
了解更深入
关于本地优先的内容,我们在 E+ 中写了一个更深入的版本,包含
- 具体实践本地优先设计的例子
- 如何透过 CRDT 实现本地优先的设计
- 本地优先的对开发者的影响。
如果有兴趣阅读,欢迎加入 E+,详细介绍可以点此连结。