本地優先 (local-first) 的軟體設計
2025年8月30日
當談到開發一個新的系統或應用,在二十一世紀的今天,多數人第一直覺應該會想到透過雲端 (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,能夠直接多人同時線上編輯。
當選擇本地優先,意味著能在純雲端以及純本地中,取得兩邊的好處。
OT 與 CRDT
當談到本地優先,或是離線版本,甚至是即時多人共編的系統,OT 與 CRDT 這兩種方式,是目前社群中最常被談到的。先前 Notion 推出離線版時,Notion 的執行長就發文表示他們用了 CRDT。

具體來說,OT 是指 Operational Transformation,業界中用 OT 比較有名的例子是 Google Doc。
Operation (簡稱 O) 是指任何的操作,例如對於文件新增一個字、刪減一個字,這些都是操作。而 Transformation (T) 是指轉換,這是指接收不同的狀態 (例如 ExplainThis
與 ExplainThat
是來自兩個不同客戶端的修改,可以理解成不同狀態),然後計算出一個新的狀態,然後再同步給所有客戶端,讓所有的客戶端最終可以有一致的內容。
而 CRDT 則是 Conflict-free Replicated Data Type,意即無衝突複製資料型態的資料結構。
如何理解 CRDT 呢? 我們先看複製資料 (Replicated Data),這代表這個資料結構會在分散式的系統中的不同台機器,複製資料結構。而被複製的副本,可以獨立並行更新,不用在副本之間做協調,所以被稱為無衝突 (Conflict-free)。
只要符合上述定義,且有在數學上能夠達到最終一致性的資料結構,都算是 CRDT,在這個 GitHub 開源專案中,有列下一系列不同的 CRDT 資料結構(詳細可見此連結)。CRDT 在設計上會確保能達到最終一致性 (eventual consistency),假如沒有任何的狀態更新,最終不同裝置所看到的內容會是相同的。
了解更深入
關於本地優先的內容,我們在 E+ 中寫了一個更深入的版本,包含
- 具體實踐本地優先設計的例子
- 對 CRDT 更深入的討論
- 本地優先的對開發者的影響
如果有興趣閱讀,歡迎加入 E+,詳細介紹可以點此連結。