Máy chủ của chúng tôi đổi ngày theo Giờ Phối hợp Quốc tế. Jakarta sớm hơn giờ đó 7 tiếng. Vì vậy từ nửa đêm cho đến 7 giờ sáng ở đây, bên trong máy chủ vẫn là ngày hôm trước. Bất cứ điều gì được ghi trong 7 tiếng ấy đều là hôm nay với người ghi, và là hôm qua bên trong phần mềm của chúng tôi.
Người phát hiện ra là E. Anh sống ở một thị trấn nhỏ cách Jakarta khá xa và bắt đầu ngày của mình rất sớm. Sáng ngày 11 tháng 8 lúc 6:40, anh định nhập 1 bút toán vào KAZENA Books từ thiết bị của mình thì thấy ô ngày đã được điền sẵn ngày hôm trước. Anh gửi cho tôi một đoạn quay màn hình. Anh gõ lại ngày, lưu, rồi hỏi có phải đồng hồ trên máy anh bị lệch không. Máy của anh không lệch.
Xin viết về cơ chế. Giá trị mặc định của ô ngày trên bút toán được dựng từ giờ hiện tại của máy chủ. Dấu thời gian chúng tôi ghi khi lưu cũng đến từ chính giờ đó. Và khoảng thời gian mà bảng tổng hợp doanh thu theo ngày gọi là hôm nay cũng đến từ đó. Không phải 3 chỗ sai riêng rẽ, mà là 3 chỗ dùng chung một nguồn. Cái sai không nằm ở nguồn, mà ở việc biến nó thành một ngày trên lịch.
Chúng tôi đã đếm. Trong số các bút toán được tạo từ ngày 1 tháng 6 đến ngày 20 tháng 8, có 613 bút toán được tạo trong khoảng từ nửa đêm đến 7 giờ sáng theo giờ địa phương của người tạo. Trong đó, 488 bút toán được lưu mà không ai sửa tay ô ngày. 488 bút toán ấy mang trong sổ một ngày sớm hơn ngày thực tế 1 ngày.
Có 19 bút toán vượt qua ranh giới tháng. Giao dịch ghi vào rạng sáng ngày 1 nằm trong tổng của tháng trước, tất cả là 31.400.000 rupiah. Tổng cả năm không đổi; tổng từng tháng thì đổi. Ai đọc báo cáo của mình theo từng tháng sẽ thấy tháng 8 nhẹ đi và tháng 7 nặng lên.
Cũng nên viết ra vì sao không ai báo. Ô ngày có thể sửa được. Người thấy lạ thì gõ lại rồi lưu. Một lỗi có thể chữa ngay tại chỗ sẽ không bao giờ được báo như một lỗi, vì người ta cho rằng chính mình gõ nhầm. Sự cố mà người dùng có thể tự trách mình thì sẽ không bao giờ đến được chỗ chúng tôi.
7 tiếng đó không phải là những giờ yên tĩnh ở thành phố này. Con đường gần văn phòng đã động đậy từ trước 5 giờ, và xe bubur ayam đã có người xếp hàng. Có những quán warung không bao giờ đóng cửa. Cái mà chúng tôi coi là vẫn còn hôm qua lại chính là quãng bận rộn nhất trong ngày của rất nhiều cửa hàng nhỏ.
Bên dưới còn một hiểu lầm sâu hơn. Chúng tôi suy ra múi giờ từ quốc gia. Indonesia có 3 múi giờ: Jakarta là WIB ở +7, Makassar là WITA ở +8, Jayapura là WIT ở +9. Đọc thiết lập quốc gia rồi quyết định +7 nghĩa là chúng tôi trao thêm cho người dùng ở các đảo phía đông sai lệch 1 hoặc 2 tiếng nữa.
Tôi sẽ không bao biện. Lưu thời gian theo UTC không phải là ý tưởng sai. Cái sai của tôi nằm ở bước sau đó. Một thời điểm và một ngày trên lịch là hai thứ khác nhau. Một thời điểm là như nhau ở mọi nơi trên thế giới; một ngày trên lịch phụ thuộc vào chỗ người nhìn đang đứng. Tôi gọi cả hai là ngày, và cất chung vào một ngăn kéo.
Các bài kiểm thử đều qua. Kiểm thử tự động của chúng tôi chạy vào khoảng giữa trưa UTC, một giờ rơi vào cùng một ngày lịch dù nhìn từ bất kỳ quốc gia nào chúng tôi phục vụ. Chúng tôi kiểm tra ranh giới từ một chỗ chưa bao giờ đi qua nó. Bây giờ giờ chạy đã được ghim lại: 23:50, 00:10 và 6:59, chạy trên 5 múi giờ chúng tôi phục vụ. Tổng cộng 15 tổ hợp, mỗi lần.
Đây là phần sửa. Bây giờ mỗi sổ sách mang múi giờ của riêng nó. Quốc gia chỉ đề xuất giá trị ban đầu, và có thể đổi trong phần thiết lập bất cứ lúc nào. Giá trị mặc định của ô ngày, cùng các khoảng thời gian phía sau bảng tổng hợp theo ngày và theo tháng, đều được dựng từ ngày lịch trong múi giờ đó. Dấu thời gian đã lưu vẫn giữ theo UTC, vì thứ tự và dấu vết kiểm toán cần nó ở đó. Chỉ có ngày mà chúng tôi hiển thị cho một người là được dời về phía người đó.
Chúng tôi không viết đè lên bất kỳ bút toán nào trong số 488 bút toán đã lưu. Ô ngày là một ô có thể sửa. Thứ nằm trong đó, xét cho cùng, là ngày do chính người ấy đặt vào, không phải thứ để chúng tôi đoán rồi ghi đè. Với 19 bút toán vượt tháng, chúng tôi có liên hệ, kèm danh sách bị ảnh hưởng và các bước để sửa. Sửa hay không là quyết định của họ.
Xin nói rõ một điều. Tôi không phải là kế toán thuế. Ngày của một giao dịch quyết định nó thuộc kỳ kê khai nào, và chênh lệch 1 ngày mà vượt sang tháng khác sẽ đổi tháng phải kê khai. Nếu điều này nghe quen, hãy kiểm tra lại những gì bạn đã ghi vào rạng sáng đầu tháng. Và xin luôn xác nhận kết luận cuối cùng với một chuyên gia.
Bây giờ, mỗi lần chữ hôm nay xuất hiện trong mã của chúng tôi, tôi dừng lại một lần và hỏi đó là hôm nay của ai. Máy chủ không có hôm nay. Nó chỉ có một thời điểm. Người giữ hôm nay là người ngồi trước màn hình. Nếu ở đâu đó trong KAZENA có một ngày lệch 1 ngày so với điều bạn nghĩ, hãy cho chúng tôi biết. Đồng hồ của bạn nhiều khả năng là đúng.
Hãy cho chúng tôi biết bạn nghĩ gì
Cảm giác khi dùng các ứng dụng KAZENA, điều gì chúng tôi nên sửa, những tính năng bạn ước có — nếu bạn đang điều hành một doanh nghiệp nhỏ hoặc vừa, hay làm nghề tự do ở Indonesia hoặc Philippines, tiếng nói của bạn chính là điều chúng tôi mong được nghe nhất. Những tin nhắn bằng tiếng Indonesia hoặc tiếng Anh sẽ được trả lời bởi các đồng đội hiểu thị trường của bạn từ bên trong. KAZENA Books đã được ấn định ra mắt tại Philippines và Indonesia — và nếu công ty của bạn muốn đưa nó đến các quốc gia khác với tư cách đối tác, hoặc quan tâm đến việc mua lại hệ thống, chúng tôi cũng rất mong nhận được liên hệ từ bạn. Chúng tôi cũng nhận phát triển hệ thống mới. Chúng tôi là một đội nhỏ, nên không phải lúc nào cũng có thể bắt tay ngay — nhưng những gì chúng tôi xây dựng đều mang chất lượng made-in-Japan và luôn bám sát cách công việc kinh doanh thực sự vận hành ở đây, từng dự án một.
Liên hệ với chúng tôi