Tư duy Local First: Xây dựng phần mềm bền vững không phụ thuộc vào máy chủ

08 tháng 4, 2026·7 phút đọc

Alex Good thảo luận về sự mong manh của các ứng dụng phụ thuộc vào đám mây hiện đại và chia sẻ lộ trình cho phần mềm "local-first". Bằng cách tận dụng cấu trúc DAG giống Git và thư viện Automerge, ông giải thích cách chuyển từ mô hình máy chủ-khách hàng mong manh sang các hệ thống mạnh mẽ nơi dữ liệu nằm trên thiết bị. Bài thuyết trình cũng khám phá việc triển khai kỹ thuật, giải quyết xung đột và cách cơ sở hạ tầng này đơn giản hóa quy trình kỹ thuật.

Tư duy Local First: Xây dựng phần mềm bền vững không phụ thuộc vào máy chủ

Alex Good, người đang chịu trách nhiệm bảo trì thư viện mã nguồn mở Automerge tại phòng thí nghiệm nghiên cứu Ink & Switch, đã có một bài thuyết trình sâu sắc về việc xây dựng phần mềm cộng tác không phụ thuộc vào máy chủ. Ông đưa ra quan điểm về sự mong manh của các ứng dụng phụ thuộc vào đám mây (cloud) ngày nay và đề xuất một lộ trình cho phần mềm "ưu tiên cục bộ" (local-first).

Sự mong manh của phần mềm cộng tác hiện đại

Good bắt đầu bằng câu chuyện cá nhân về việc ông xây dựng một ứng dụng đơn giản để theo dõi bài tập trên Android. Ban đầu, ứng dụng hoạt động tốt và rất dễ phát triển. Tuy nhiên, khi một người bạn yêu cầu sử dụng ứng dụng này trên cả máy tính xách tay, vấn đề nảy sinh: làm thế nào để đồng bộ hóa dữ liệu giữa các thiết bị?

Để thực hiện điều này, ông sẽ phải thiết kế và xây dựng một máy chủ (server), API, xử lý xác thực người dùng, và đảm bảo máy chủ luôn hoạt động. Một dự án vui vẻ đột nhiên trở thành một gánh nặng kỹ thuật phức tạp. Good chỉ ra rằng đây là một vi mô của một vấn đề lớn hơn: phần mềm cộng tác hiện tại quá mong manh vì chúng phụ thuộc vào các phần mềm máy chủ tùy chỉnh.

Hệ quả là trải nghiệm người dùng (UX) bị giảm sút. Chúng ta phải chờ đợi các biểu tượng tải (spinners), không thể làm việc khi mất mạng, và mất quyền riêng tư về dữ liệu sáng tạo. Thậm chí, Leslie Lamport, cha đẻ của giao thức Paxos, từng nói: "Hệ thống phân tán là hệ thống mà sự hỏng hóc của một máy tính mà bạn thậm chí không biết đến có thể khiến máy tính của bạn trở nên vô dụng."

Nếu người phát triển ngừng trả tiền cho máy chủ hoặc startup bị thâu tóm và dịch vụ bị tắt, người dùng sẽ mất toàn bộ dữ liệu. Good nhấn mạnh rằng chúng ta cần một văn hóa sửa chữa và bảo trì, thay vì xây dựng các hệ thống phụ thuộc vào một điểm thất bại duy nhất.

Hướng tới phần mềm Local First

Good đề xuất giải pháp là xây dựng cơ sở hạ tầng đồng bộ hóa chung. Ông mong muốn có một giao thức và bộ máy chủ tiêu chuẩn mà các ứng dụng có thể sử dụng như một loại hàng hóa. Nếu một máy chủ biến mất, ứng dụng có thể trỏ sang một máy chủ khác. Tốt nhất, mạng lưới nên là tùy chọn; ứng dụng vẫn hoạt động hoàn toàn khi offline.

Ink & Switch đã xác định một số nguyên tắc cốt lõi cho phần mềm local-first:

  • Không có biểu tượng tải: Dữ liệu thường nằm trên thiết bị.
  • Mạng là tùy chọn: Ứng dụng hoạt động ngay cả khi mất Wi-Fi.
  • Hợp tác liền mạch: Đồng bộ hóa diễn ra ngầm mà không cần can thiệp thủ công.
  • Dữ liệu trên thiết bị của người dùng là nguồn sự thật chính (source of truth).

Cấu trúc kỹ thuật: Học hỏi từ Git

Để hiện thực hóa tầm nhìn này, Good nhìn vào mô hình của Git. Git là một ví dụ điển hình của local-first: bạn có dữ liệu trên máy của mình, có thể tiếp tục làm việc offline, và máy chủ GitHub không phải là yếu tố bắt buộc.

Tuy nhiên, việc sử dụng trực tiếp Git để lưu trạng thái ứng dụng là một ý tưởng tồi. Git lưu trữ các snapshot của hệ thống tệp, dẫn đến xung đột gộp (merge conflicts) liên tục và khó xử lý. Thay vào đó, Good đề xuất một cấu trúc tinh vi hơn:

  1. Đồ thị Commit (DAG): Thay vì yêu cầu trạng thái kho lưu trữ phải là một commit đơn nhất, chúng ta chấp nhận một đồ thị có hướng không chu kỳ (DAG) của các thay đổi.
  2. Mô hình dữ liệu chi tiết: Thay vì snapshot tệp, mỗi commit là một thao tác trên cấu trúc dữ liệu chung (như danh sách, bản đồ). Ví dụ: "chèn đối tượng vào danh sách", "đặt giá trị của thuộc tính".
  3. Giải quyết xung đột tự động: Hệ thống cung cấp cơ chế giải quyết xung đột mặc định. Nếu hai thay đổi xung đột, hệ thống sẽ chọn một trạng thái thắng (ví dụ: commit có hash thấp hơn) nhưng vẫn cung cấp API để ứng dụng hiển thị các trạng thái khác cho người dùng xem xét sau.

Cách tiếp cận này cho phép đồng bộ hóa thời gian thực và không đồng bộ (asynchronous) trên cùng một nền tảng, giúp nhà phát triển tập trung vào kiểm soát phiên bản dữ liệu thay vì quản lý hệ thống phân tán phức tạp.

Triển khai với Automerge

Good giới thiệu Automerge, một thư viện hiện thực hóa các ý tưởng trên. Ông trình bày một ví dụ về ứng dụng Todo list viết bằng TypeScript.

Để thêm tính năng đồng bộ hóa vào một ứng dụng cục bộ đơn giản, nhà phát triển chỉ cần:

  • Tạo một kho lưu trữ (Repo) với các bộ điều hợp mạng (WebSocket) và lưu trữ (IndexedDB).
  • Sử dụng docHandle.change để bao bọc các thay đổi dữ liệu. Logic bên trong vẫn giống như làm việc với đối tượng JavaScript thông thường, nhưng Automerge sẽ tự động ghi lại thay đổi, tạo commit và đồng bộ hóa.
  • Tận dụng tính phản ứng (reactivity) để cập nhật giao diện khi dữ liệu thay đổi (cục bộ hoặc từ mạng).

Quan trọng nhất, quá trình này mang tính gia tăng rất nhỏ so với việc viết ứng dụng cục bộ truyền thống, nhưng mang lại khả năng đồng bộ hóa mạnh mẽ mà không cần backend tùy chỉnh.

Thách thức và Cơ hội trong tương lai

Mặc dù hứa hẹn nhiều lợi ích, mô hình local-first vẫn đối mặt với các thách thức:

  • Xác thực và ủy quyền (Auth/Authz): Hiện tại, việc này thường được xử lý bởi các lớp phụ thuộc trên máy chủ. Good đề xuất việc sử dụng các cặp khóa mật mã (cryptographic key pairs) để biến vấn đề thành bài toán quản lý khóa.
  • Lập chỉ mục và đồng bộ một phần: Với các tập dữ liệu lớn, người dùng không muốn tải xuống mọi thứ về thiết bị.
  • Thực thi sơ đồ (Schema enforcement): Đảm bảo tính toàn vẹn của dữ liệu khi các phiên bản ứng dụng khác nhau tương tác với nhau.

Tuy nhiên, Good cũng thấy một cơ hội lớn với các Mô hình Ngôn ngữ Lớn (LLM). LLM rất mạnh mẽ nhưng không đáng tin cậy. Cơ sở hạ tầng kiểm soát phiên bản của local-first cho phép xem xét các thay đổi do LLM tạo ra trước khi áp dụng, tương tự như cách chúng ta xem xét mã nguồn (code review). Điều này tạo ra các ứng dụng AI mạnh mẽ hơn và đáng tin cậy hơn.

Kết luận

Bài thuyết trình của Alex Good vạch ra một con đường rõ ràng để thoát khỏi sự phụ thuộc vào các máy chủ đám mây tập trung. Bằng cách coi việc phát triển ứng dụng là "kiểm soát phiên bản cho dữ liệu miền" thay vì là "giao diện cho nguồn sự thật từ xa", chúng ta có thể xây dựng các hệ thống bền vững hơn, bảo vệ quyền tự chủ của người dùng và đơn giản hóa sự phức tạp kỹ thuật.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗