本地優先 (local-first) 的軟體設計

2024年7月18日

💎 加入 E+ 成長計畫 如果你喜歡我們的內容,歡迎加入 E+,獲得更多深入的軟體前後端內容

當談到開發一個新的系統或應用,在二十一世紀的今天,多數人第一直覺應該會想到透過雲端 (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 上追蹤我們