本地优先 (local-first) 的软体设计

2024年7月18日

💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

当谈到开发一个新的系统或应用,在二十一世纪的今天,多数人第一直觉应该会想到透过云端 (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+,详细介绍可以点此连结

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們