Hãy nghĩ về nơi bạn thực sự làm việc.
Một tầng hầm móng bê tông, không cửa sổ. Một công trình mới, khung thép, ván lót, chưa đấu nối gì cả. Một khu đất ở quê, cách trạm phát sóng cuối cùng hai mươi phút xe. Một phòng kỹ thuật nằm giữa sàn thương mại. Một hầm để xe.
Giờ nghĩ xem người ta trình diễn phần mềm ở đâu: trong văn phòng, có Wi-Fi.
Chính khoảng cách đó khiến phần mềm hiện trường gây ức chế theo một kiểu rất khó nói thành lời. Ứng dụng không chậm, cũng không xấu. Nó chạy ngon lành ngoài sân rồi đứng hình dưới tầng hầm — đúng chỗ bạn cần đến nó. Mà lỗi thì hiếm khi lộ ra thật thà: nó thường chỉ là một vòng tròn quay mãi, một lần bấm lưu mà chẳng lưu được gì, hoặc một biểu mẫu xóa sạch những gì bạn vừa gõ khi bạn bấm quay lại.
Cụ thể thì hỏng theo những kiểu nào
"Mất kết nối" không phải một vấn đề duy nhất. Nó là mấy vấn đề khác nhau, và mỗi cái làm hỏng phần mềm theo một kiểu riêng.
Mất sóng hoàn toàn. Đây là ca dễ. Ứng dụng làm tử tế sẽ biết mình đang ngoại tuyến và cư xử cho đúng. Hầu hết ứng dụng xử lý được ca này, vì nó dễ nhận ra.
Một vạch sóng, trên lý thuyết là vẫn có mạng. Đây mới là ca phá hoại thật sự. Máy báo là có kết nối nên ứng dụng cứ gọi lên máy chủ, rồi treo ở đó. Bạn ngồi nhìn vòng tròn quay bốn mươi giây rồi nhận báo hết thời gian chờ — hoặc tệ hơn, một lệnh chạy được nửa chừng. Phần mềm nào chỉ hỏi "có mạng không?" thay vì hỏi "lệnh này có thật sự thành công không?" thì chết nặng nhất ở đây.
Sóng chập chờn. Một ngày bạn đi từ ngoài sân xuống tầng hầm bốn lượt. Mỗi lượt như vậy là thêm một nguy cơ đồng bộ bị cắt ngang giữa chừng.
Có mạng, nhưng chậm. Trạm phát sóng vùng xa nghẽn cứng vào 4 giờ chiều. Về lý thuyết thì mọi thứ vẫn chạy, chỉ là chậm đến mức bạn bỏ luôn không dùng nữa.
Một ứng dụng chạy ngoại tuyến đúng nghĩa phải xử lý được cả bốn ca. Ứng dụng chỉ lo được ca đầu tiên thì vẫn làm mất dữ liệu của bạn như thường.

"Hoạt động ngoại tuyến" thực sự phải có nghĩa là gì?
Cụm từ này bị dùng rất tùy tiện. Có một phép thử nghiêm túc, gồm bốn phần.
Đọc được. Không cần một chút sóng nào, bạn vẫn mở được công việc, xem được địa chỉ, phạm vi công việc, số điện thoại khách và ảnh chụp hôm qua. Nghĩa là dữ liệu thật sự nằm trong máy, chứ không phải chỉ được giữ tạm khi nào tiện.
Ghi được, và ghi chắc. Bạn thêm được ghi chú, chấm được giờ công, ghi được chi phí, chụp được ảnh. Và nếu điện thoại sập nguồn, ứng dụng bị tắt cưỡng bức, hay pin tụt sạch giữa trời lạnh, thì mở máy lên phần việc đó vẫn còn nguyên. Nằm trong bộ nhớ tạm không phải là đã lưu.
Đồng bộ tự động, không cần để ý. Có sóng trở lại là mọi thứ đang xếp hàng tự đẩy lên. Không bao giờ được bắt người dùng nhớ bấm nút đồng bộ, vì đúng cái lần họ quên bấm mới là lần quan trọng.
Xung đột được báo thật. Hai người cùng sửa một công việc trong lúc cả hai đều mất mạng. Phần mềm tốt phát hiện ra và báo cho bạn. Phần mềm dở lặng lẽ giữ lại một bản, rồi vài tuần sau bạn mới phát hiện một ghi chú đã biến mất.
Điểm cuối cùng này dễ bị bỏ qua nhất, và nó chính là ranh giới giữa một ứng dụng chịu được ngoại tuyến và một ứng dụng lấy ngoại tuyến làm gốc. Muốn phát hiện xung đột, ứng dụng phải theo dõi phiên bản của từng bản ghi rồi đối chiếu lúc đẩy lên. Đó là công sức kỹ thuật thật, mà lại chẳng có tính năng nào để khoe ra — đúng là lý do nó hay bị bỏ.
Vì sao ảnh phải có một đoạn riêng
Ảnh là ca ngoại tuyến khó nhất trong phần mềm hiện trường, mà cũng đúng là thứ nhà thầu cần ghi lại nhất ngay tại công trường: hư hỏng có sẵn trước khi bắt tay vào, tình trạng bên trong tường, phần việc đã xong, chỉ số đồng hồ, một chuyến giao hàng.
Khó vì ảnh nặng. Ảnh nguyên độ phân giải của một công việc là hàng chục megabyte. Với một vạch sóng, lượt tải lên đó sẽ hỏng. Hỏng đi hỏng lại. Ứng dụng nào coi bức ảnh như mọi bản ghi khác thì hoặc là treo máy chờ tải xong, hoặc là vứt luôn tấm ảnh.
Đúng ra phải thế này: ảnh được ghi thẳng vào máy và gắn vào công việc ngay lập tức, còn việc tải lên là một tác vụ nền riêng, tự thử lại — qua cả những lần khởi động lại ứng dụng, và qua nhiều ngày nếu cần. Ảnh phải dùng được trong ứng dụng ngay từ giây bấm máy, bất kể nó đã lên tới máy chủ hay chưa.
Kiểu hỏng cần đề phòng là ứng dụng vẫn hiện ảnh trên máy nhưng lặng lẽ không bao giờ tải nó lên. Mọi thứ trông vẫn ổn, cho đến khi bạn mở công việc đó trên máy tính, hoặc cho đến khi mất điện thoại — và hóa ra mấy tấm ảnh chưa bao giờ rời khỏi cái máy đó.

Thiếu nó thì bạn mất những gì
Cái giá nhìn thấy được thì nhỏ mà liên tục: mỗi lần vài phút, cộng thêm một quãng đi bộ ra ngoài sân để bắt sóng.
Cái giá thật nằm ở thói quen. Dính hai lần là người ta thôi tin ứng dụng khi ra công trường. Họ quay về ghi giờ công lên mẩu giấy rồi tối thứ Sáu ngồi nhập lại, chụp biên nhận vào thư viện ảnh chẳng bao giờ được sắp xếp, giữ cái lịch thật trong đầu. Phần mềm vẫn cài đó, tiền vẫn trả đều, còn công ty thì lại chạy bằng trí nhớ.
Một khi đã vậy thì mọi khâu phía sau hỏng theo. Tính giá thành công trình ngừng chạy, vì chi phí chẳng bao giờ được gắn vào công việc. Xuất hóa đơn thì trễ, vì không ai chắc việc đã xong hay chưa. Toàn bộ giá trị của hệ thống đặt trên một điều kiện: dữ liệu được ghi ngay lúc làm việc. Và mất kết nối chính là thứ phá vỡ điều kiện đó.
Kiểm tra thế nào trước khi xuống tiền?
Nhìn danh sách tính năng thì không biết được, vì ai cũng ghi "hoạt động ngoại tuyến". Hãy tự thử, mất khoảng mười phút:
- Đặt điện thoại ở chế độ máy bay.
- Mở một công việc đã lâu bạn không mở. Nó có hiện ra đầy đủ không, kể cả ảnh?
- Thêm một ghi chú, chấm giờ công, ghi một khoản chi phí, chụp ba tấm ảnh.
- Tắt cưỡng bức ứng dụng rồi mở lại. Mọi thứ còn nguyên không?
- Bật lại kết nối. Mọi thứ có tự đồng bộ mà bạn không phải bấm gì không?
- Rồi mới đến phép thử thật: bật Wi-Fi nhưng nối vào một mạng không có internet, để điện thoại báo là có kết nối trong khi kết nối đó không dùng được. Làm lại bước 3. Nhiều ứng dụng qua được chế độ máy bay lại chết ở bài này.
Nếu nó qua được cả sáu bước, thì nó do những người từng chui xuống tầng hầm làm ra.
Zeus được làm theo đúng hướng đó, một cách có chủ ý. Ứng dụng giữ nguyên một cơ sở dữ liệu đầy đủ ngay trong máy, nên công việc, khách hàng và bảng giá đều đọc được khi không có mạng; mọi thứ bạn nhập vào được ghi xuống máy trước, rồi mới đồng bộ khi có sóng. Ảnh được lưu vào máy ngay lập tức, và với những gói dịch vụ có sao lưu ảnh thì được tải lên chạy nền, tự thử lại, có tùy chọn chỉ tải qua Wi-Fi để một ngày chụp ảnh không ngốn hết gói dữ liệu di động. Còn khi hai máy cùng sửa một chỗ, Zeus phát hiện xung đột thay vì lặng lẽ ghi đè, và đánh dấu ngay trên chỉ báo đồng bộ để bạn xử lý.
Câu hỏi thường gặp
Việc lưu trữ mọi thứ trên điện thoại có tốn nhiều dung lượng không?
Dữ liệu chữ thì rất nhẹ: hàng nghìn công việc, khách hàng và hạng mục cộng lại cũng chỉ vài megabyte. Chỉ có ảnh mới ăn dung lượng đáng kể, nên ảnh thường được quản riêng, và bản gốc nguyên độ phân giải nằm trên đám mây sau khi đã tải lên.
Dữ liệu trên điện thoại có an toàn nếu nó bị mất hoặc bị đánh cắp không?
Tùy ứng dụng, và đây là câu đáng hỏi thẳng nhà cung cấp. Hai thứ cần tìm: dữ liệu trong máy có được mã hóa không, và có khóa riêng cho ứng dụng không, chứ đừng chỉ trông vào khóa màn hình của điện thoại. Zeus mã hóa cơ sở dữ liệu trong máy, và có thêm tùy chọn khóa ứng dụng bằng sinh trắc học hoặc mã PIN của chính máy bạn.
Điều gì xảy ra nếu hai thành viên đội thợ chỉnh sửa cùng một công việc khi ngoại tuyến?
Trong một hệ thống làm tử tế, xung đột được phát hiện lúc máy thứ hai đồng bộ, rồi đưa ra cho người thật quyết định. Hãy cảnh giác với ứng dụng nào hứa chuyện này không bao giờ xảy ra: cách làm thông thường là ai ghi sau thì đè lên người ghi trước, nghĩa là phần việc của một người biến mất mà chẳng ai được báo.
Tôi có phải đồng bộ tay trước khi đi làm không?
Không, và nếu phải làm thì đó là dấu hiệu đáng lo. Đồng bộ phải chạy nền liên tục, hễ có sóng là chạy.





