
Phần mềm điềm tĩnh: Loại bỏ nút gạt nhấp nháy và dạy chat nói rõ nó đang ở chế độ nào
Hai bản phát hành nhỏ của GeekBye, không có tính năng nổi bật nào — chỉ là một nút gạt trong cài đặt hết nhấp nháy và một trợ lý chat cuối cùng cũng cho bạn biết nó trả lời ở chế độ họp hay chế độ lập trình. Đây chính là cái giá thực sự của "phần mềm điềm tĩnh", từng chi tiết một.
Không phải bản phát hành nào cũng là một câu chuyện chiến trận. Có những bản chỉ là danh sách những thứ nhỏ nhặt, gần như vô hình, âm thầm sai — kiểu thứ không làm sập cái gì cả nhưng khiến ứng dụng có cảm giác hơi kém đáng tin, hơi giật cục, hơi không-phải-của-bạn. GeekBye v2.0.3 và v2.0.5 là hai bản như vậy. Không tính năng mới. Chỉ có sự điềm tĩnh.
"Phần mềm điềm tĩnh" nghe như một cảm xúc. Thực ra nó là một chồng những quyết định cụ thể. Đây là ba trong số đó.
Một nút gạt không thể quyết định nổi
Có một nút gạt trong cài đặt — cái điều khiển khôi phục âm thanh — bị nhấp nháy khi bạn bấm vào. Gạt bật lên, và trong một phần nhỏ của giây nó hiện bật, rồi bật ngược về tắt, rồi mới ổn định. Một cú giật hình ảnh tí xíu, nhưng mắt bạn bắt được, và nó được đọc thành ứng dụng không chắc mình đang làm gì.
Nguyên nhân là một cuộc đua giao diện kinh điển gọi là cập nhật lạc quan (optimistic update). Khi bạn bấm một nút gạt, ứng dụng có hai lựa chọn: chờ cài đặt thực sự lưu xong rồi mới cập nhật công tắc (đúng, nhưng cảm giác chậm chạp), hoặc lật công tắc ngay lập tức và lưu ở nền (cảm giác tức thì). GeekBye làm theo cách thứ hai — lật ngay — nhưng nó cũng đọc lại giá trị đã lưu khi giá trị đó quay về. Nên trình tự là: bạn bấm, công tắc lật bật lên một cách lạc quan, giá trị đã lưu thật ập tới sau một nhịp, và trong đúng một khung hình hai bên bất đồng khiến công tắc nảy lên thấy rõ.
Cách sửa là làm cho giá trị lạc quan và giá trị đã xác nhận đồng thuận sạch sẽ — công tắc cam kết với trạng thái bạn chọn và thôi tự nghi ngờ mình khi việc lưu được xác nhận. Song song đó, v2.0.3 làm một lượt rà lại câu chữ chẳng lấp lánh gì: mô tả khôi phục âm thanh được cắt gọn cho khớp với các dòng cùng cấp, và câu chữ trong cài đặt được viết cho ra con người hơn. Chẳng cái nào là tính năng cả. Nhưng tất cả chúng chính là sự khác biệt giữa một bảng cài đặt có cảm giác được kỹ thuật hóa và một bảng có cảm giác được chăm chút.
Một tour hướng dẫn không chịu rời đi
Tour dành cho người dùng mới hữu ích đúng một lần. Vấn đề nằm ở sự "một-lần" đó: sau khi đã xem xong, một lớp phủ onboarding mà bạn không thể tắt trở thành thứ lộn xộn phát đi tín hiệu ứng dụng này vẫn nghĩ bạn còn mới. v2.0.3 sửa cả hai đầu: giờ đây tour sản phẩm có thể được ẩn, và nếu bạn thực sự muốn nó quay lại, có một nút Xem lại Tour. Hiện nó ra khi nó giúp ích, tránh đường khi không, và để người dùng gọi nó theo điều kiện của họ. Tôn trọng việc người dùng không còn mới nữa tự nó là một dạng điềm tĩnh nhỏ.
Trợ lý không chịu nói nó đang nghĩ theo cách nào
Đây mới là cái thực sự quan trọng, và nó nối với một vấn đề sâu hơn mà chúng tôi đã đuổi theo bấy lâu.
Trợ lý của GeekBye trả lời khác nhau tùy theo bối cảnh. Trong một cuộc họp, câu "bạn nghĩ sao về cái này?" nên nhận được câu trả lời mang tính trò chuyện, hiểu bối cảnh họp. Trong một phiên lập trình, cùng những từ đó nên nhận được câu trả lời kỹ thuật. Vậy nên backend chạy câu hỏi qua đúng khung — gọi là chế độ họp hay chế độ lập trình — và cách khung hóa đó thực sự thay đổi câu trả lời bạn nhận.
Rắc rối là: ứng dụng không bao giờ nói cho bạn biết chế độ nào đã trả lời. Nên khi trợ lý đưa cho bạn một câu trả lời đậm mùi lập trình cho một câu hỏi trò chuyện — hoặc trả lời một câu hỏi về code như thể bạn đang tán gẫu — thì trông cứ như AI đơn giản là sai. Nó không sai; nó đang ở chế độ kia, và bạn không có cách nào thấy điều đó. Một trạng thái bị ẩn khiến hành vi đúng trông như bị hỏng. (Bản thân logic chế độ là một mảng công việc lớn hơn — bộ điều phối quyết định cách trả lời các câu hỏi không phải về code trong một phiên lập trình — nhưng tất cả những cái đó chẳng ích gì cho bạn nếu bạn không thể thấy quyết định nó đã đưa ra.)
v2.0.5 bổ sung một con chip chế độ chỉ đọc vào chat: một nhãn nhỏ cho biết trợ lý đã trả lời ở chế độ họp hay chế độ lập trình. Chỉ đọc mới là toàn bộ vấn đề — nó không phải một điều khiển bạn đặt, nó là một ô cửa nhìn vào quyết định mà hệ thống đã đưa ra. Bạn thôi đoán mò vì sao một câu trả lời có cảm giác lệch; bạn có thể thấy cái khung mà nó đến từ đó.
Chi tiết khiến con chip trung thực
Đây là lựa chọn kỹ thuật đáng truyền lại, bởi nó là kiểu thứ phân biệt một chỉ báo gắn tạm với một chỉ báo đáng tin.
Thông tin chế độ đến từ backend như một phần của phản hồi được truyền phát (stream) — một khung mode nhỏ trong luồng sự kiện server gửi về. Nhưng một client cũ hơn, ra đời trước tính năng này, sẽ không biết khung mode là gì; tốt nhất là nó bỏ qua, tệ nhất là nó hiển thị ra thứ gì đó lỗi loạn. Vậy nên client tự khai báo khả năng của mình: nó gửi một request header nói tôi biết cách hiển thị con chip chế độ, và backend chỉ phát khung mode tới những client đã gửi header đó. Client cũ không bao giờ nhận được một tín hiệu chúng không xử lý được; client mới nhận đúng khung mà chúng đã yêu cầu.
Đó là một cái bắt tay bằng một-header, và nó là sự khác biệt giữa "chúng tôi thêm một tính năng" và "chúng tôi thêm một tính năng mà không làm hỏng bất kỳ ai chưa cập nhật." Cùng lượt rà soát ấy đã siết chặt phần còn lại của hành vi: con chip tự xóa khi reset và khi bối cảnh cuộc trò chuyện thay đổi (một nhãn chế độ đã cũ tự nó là một lời nói dối nhỏ), và nó chỉ hiện trong khung chat, nơi nó thuộc về.
Hai bản phát hành "không tính năng" đã dạy chúng tôi điều gì
- Sự giật cục là một tín hiệu về độ tin cậy. Một nút gạt nhấp nháy, một công tắc nảy lên, một nhãn nán lại lâu hơn một khung hình — chẳng cái nào là bug theo nghĩa gây sập, nhưng mỗi cái đều thì thầm ứng dụng này chưa hoàn toàn làm chủ được mình. Điềm tĩnh là sự vắng mặt của những lời thì thầm đó, và bạn giành được nó từng điều kiện đua (race condition) một.
- Một chế độ bị ẩn khiến hành vi đúng trông như một bug. Trợ lý đang làm điều đúng và bị đổ lỗi vì nó, thuần túy chỉ vì người dùng không thấy được cái khung. Khi hệ thống của bạn đưa ra một quyết định vô hình làm thay đổi đầu ra, hãy hiển thị quyết định đó — một con chip chỉ đọc thường là toàn bộ giải pháp.
- Tính năng mới nên vô hình với những client không dùng được nó. Cái bắt tay bằng capability-header có nghĩa là tín hiệu chế độ chỉ đến với những client có thể hiển thị nó. Tương thích ngược không phải là một cú kiểm tra phiên bản gắn thêm về sau; nó là việc client nói ra điều nó hiểu và server tôn trọng câu trả lời.
Đây là những bản phát hành chẳng ai viết tiêu đề changelog về chúng, và chúng là một phần lớn lý do vì sao GeekBye v2 cho cảm giác như hiện tại. Về bản phát hành mà sự điềm tĩnh này được xây trên đó, xem một phiên bản 2 thực sự cần những gì (v2.0.0). Về công việc độ tin cậy đi cùng nó, ngày ứng dụng của chúng tôi tự DDoS chính mình (v2.0.1) và vì sao app ghi chú AI của bạn ngừng ghi giữa cuộc họp (v2.0.9).