Steven
Steven8 phút đọc

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.

Sản phẩm
Thiết kế
Kỹ thuật
GeekBye Releases
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

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.3v2.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ì

  1. 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.
  2. 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.
  3. 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).

Bài Viết Liên Quan

App Mac của bạn cấp quyền micro — rồi quên sạch sau mỗi lần mở
Steven
Steven7 phút đọc

App Mac của bạn cấp quyền micro — rồi quên sạch sau mỗi lần mở

GeekBye xin quyền micro, bạn đồng ý, và nó chạy được. Lần mở kế tiếp: mất tiêu. Và app chẳng bao giờ hiện ra trong System Settings → Microphone. Thủ phạm là một tính năng bảo mật của macOS âm thầm chạy app từ một đường dẫn biến mất — đây là chẩn đoán và bản sửa chỉ-một-lời-nhắc.

macOS
Quyền truy cập
Kỹ thuật
Một biến CSS, năm vòng review, và một chuỗi công cụ Swift đã nói dối
Steven
Steven9 phút đọc

Một biến CSS, năm vòng review, và một chuỗi công cụ Swift đã nói dối

GeekBye v2.0.7 làm cho toàn bộ overlay có thể điều chỉnh độ trong suốt — nghe như một thay đổi CSS một dòng và hoàn toàn không phải vậy. Câu chuyện thực sự là những gì mà quá trình review đã bắt được: hai bề mặt nhất quyết không chịu mờ đi, một thanh ghi âm trông sai dù cùng độ mờ, và một tệp binary đã biên dịch lật qua lật lại 672 byte vì chính tài liệu của chúng tôi báo cho reviewer sai phiên bản Swift.

Kỹ thuật
Thiết kế
Build
Khi tường lửa chặn WebSocket, phiên âm thời gian thực sẽ ra sao
Steven
Steven6 phút đọc

Khi tường lửa chặn WebSocket, phiên âm thời gian thực sẽ ra sao

Mạng doanh nghiệp thích cho HTTPS đi qua nhưng âm thầm giết chết bước nâng cấp WebSocket. Điều đó lặng lẽ làm hỏng phiên âm thời gian thực. GeekBye v2.0.8 tự động fall back sang một transport thuần HTTPS — và trong lúc làm ra nó, chúng tôi đào được một con bug có thể khiến cả tính năng trở nên vô dụng.

Phiên âm
Mạng
Kỹ thuật