Steven
Steven9 phút đọc

Một phiên bản 2 thực sự đòi hỏi những gì: 206 commit cho những trạng thái trung thực

GeekBye v2 không phải là một bản phát hành tính năng. Nó là 206 commit nhắm tới một ý tưởng duy nhất: ứng dụng không bao giờ được nói dối về trạng thái của chính nó. Đây là cái giá phải trả — bao gồm cả lỗi một dòng trong tệp lock suýt khiến chúng tôi không thể phát hành bất cứ thứ gì.

Độ tin cậy
Kỹ thuật
Phát hành
Phát hành GeekBye
Một phiên bản 2 thực sự đòi hỏi những gì: 206 commit cho những trạng thái trung thực

Hầu hết các bản phát hành "phiên bản 2" đều là một đống tính năng mới với một con số lớn hơn dán lên chúng. GeekBye v2 thì ngược lại. Nó gần như không phát hành thêm khả năng mới nào mà người dùng nhìn thấy được. 206 commit của nó nhắm tới một ý tưởng duy nhất, không hào nhoáng:

Ứng dụng không nên cho bạn thấy một trạng thái không có thật.

Nghe thì hiển nhiên, cho đến khi bạn đếm xem một ứng dụng desktop có bao nhiêu cách nói dối lặng lẽ. Nó hiện dấu tích cho một lần tải lên vẫn đang trên đường. Nó nói "đã kết nối" trên một socket đã chết từ một phút trước. Nó im lặng trong khi bản ghi lời của bạn đang bị rơi xuống sàn. Không cái nào trong số này là sự cố crash. Chúng tệ hơn crash, bởi ứng dụng trông vẫn ổn trong khi nó sai — và bạn chỉ phát hiện ra sau đó, khi bản ghi bạn cần không có ở đó.

v2 là bản phát hành mà chúng tôi lên đường săn từng lời nói dối nhỏ ấy.

Lời nói dối chúng tôi ghét nhất: lần tải lên "thành công"

GeekBye có thể sao lưu các bản ghi của bạn lên Google Drive. Ở v1, kết nối tới Drive được coi là một chi tiết nền — nếu chạy được thì tốt; nếu không, thất bại phần lớn là vô hình. Ứng dụng vẫn tiếp tục trông như đang kết nối. Bạn sẽ cho rằng các bản ghi của mình an toàn. Đôi khi chúng không an toàn.

v2 xây dựng lại phần này quanh các trạng thái kết nối trung thực. Drive giờ luôn ở một trong vài trạng thái rõ ràng, đúng sự thật — đã kết nối, đang kết nối lại, đã ngắt kết nối — và ứng dụng phát mọi thay đổi của trạng thái đó ra toàn bộ giao diện ngay khoảnh khắc nó xảy ra. Khi kết nối bị mất, một biểu ngữ kết nối lại toàn cục báo cho bạn, ở mọi nơi, một cách rõ ràng. Ứng dụng không còn giả vờ một lần tải lên thành công khi nó không thành công. Nếu bản sao lưu của bạn không thể thực hiện ngay lúc này, bạn biết ngay bây giờ — chứ không phải tuần sau khi bạn đi tìm tệp.

Bên dưới, đây là một kiến trúc nhỏ, không phải một khẩu hiệu: một nguồn sự thật duy nhất cho kết nối, một sự kiện lan tỏa ra mọi phần của UI khi nó thay đổi, và một biểu ngữ đọc trực tiếp từ trạng thái đó. Không có đường nào mà kết nối bị mất nhưng UI trông vẫn nối, bởi cả hai đọc từ cùng một sự thật.

Lời nói dối của bản ghi bị mất

Sửa lỗi trung thực lớn thứ hai là khôi phục bản ghi. Phiên âm thời gian thực cần một kết nối sống. Ở v1, nếu kết nối đó trục trặc giữa phiên — một cú chớp Wi-Fi, một đường hầm, một lần VPN kết nối lại — âm thanh trong khoảng gián đoạn ấy có thể đơn giản là biến mất. Bản ghi lời sẽ có một lỗ hổng, và không có gì báo cho bạn.

v2 đã đổi giao ước: âm thanh được giữ cục bộ trong lúc kết nối gián đoạn và đối chiếu sau đó. Khi đường truyền rớt, GeekBye giữ an toàn âm thanh trên máy bạn; khi nó trở lại, phần âm thanh đã đệm được gửi đi và khâu vào bản ghi lời đúng vị trí. Ba mươi giây mạng kém không còn khiến bạn mất ba mươi giây cuộc họp. Đây là nền móng mà các bản phát hành độ tin cậy về sau xây trực tiếp lên trên — cỗ máy kết nối-lại-và-đệm trong tại sao trình ghi chú AI của bạn dừng khi Wi-Fi kém chính là cùng ý tưởng đó, được tôi luyện chắc hơn.

Lời nói dối của cơn bão pop-up

Có một sự thiếu trung thực tinh vi hơn trong cách các ứng dụng báo cáo sự cố: chúng báo cáo quá mức. Một khoảnh khắc mạng chập chờn có thể kích hoạt cùng một lỗi năm lần, và đột nhiên bạn có cả một chồng thông báo đỏ giống hệt nhau vùi lấp cái thông điệp duy nhất thực sự quan trọng. Điều đó cũng không trung thực — đó là nhiễu giả vờ làm thông tin.

Vì vậy v2 đã thêm giới hạn thông báo theo khóa danh mục và định tuyến lỗi. Lỗi được nhóm theo đúng bản chất của chúng, và mỗi danh mục bị giới hạn tần suất, để một vấn đề gốc duy nhất tạo ra một thông điệp rõ ràng, chứ không phải một loạt đạn. Vấn đề giới hạn tần suất được định tuyến tới thông điệp giới hạn tần suất; vấn đề kết nối được định tuyến tới thông điệp kết nối. Ứng dụng cho bạn biết điều gì là thật, một lần — cùng kỷ luật ấy về sau đã ngăn một 429 giả dạng thành đăng xuất trong ngày ứng dụng của chúng tôi tự DDoS chính mình.

Con số 206 mới là điểm mấu chốt

Trạng thái trung thực, biểu ngữ kết nối lại, khôi phục bản ghi, định tuyến thông báo — đó là bốn ý tưởng. Bản phát hành có 206 commit. Phần còn lại đi đâu?

Đi vào cái đuôi dài không hào nhoáng mà "không bao giờ hiển thị trạng thái sai" thực sự đòi hỏi. Mọi nơi mà UI cũ có thể lệch khỏi thực tế đều phải được tìm ra và đấu lại dây để đọc từ sự thật thay vì một bản sao cũ kỹ. Mọi đường kết nối lại đều phải được làm cho cập nhật trạng thái chung thay vì đoán mò cục bộ. Hàng chục bản sửa độ tin cậy nhỏ trải khắp ghi âm, phiên âm và tải lên — mỗi bản đóng lại một khe hở cụ thể nơi ứng dụng có thể trông đúng trong khi đang sai.

Đây là cái giá của một "phiên bản 2" thực sự khi mục tiêu là niềm tin thay vì tính năng. Không có một commit tiêu đề duy nhất. Có 206 commit nhỏ, và bản phát hành chỉ có cảm giác như một thứ duy nhất — sự bình thản — vì cả 206 commit cùng kéo về một hướng.

Bản phát hành suýt không lên được

Đây là câu chuyện chiến trường, và là một câu chuyện hay, bởi nó nói về việc ứng dụng của chính chúng tôi nói dối chúng tôi.

Khi bạn cắt một bản phát hành, một script tăng phiên bản đóng dấu con số mới lên khắp dự án. Ở v2.0.0, nó cập nhật phiên bản của ứng dụng — nhưng package-lock.json, sổ cái phụ thuộc chính xác của npm, lại bị bỏ lại trỏ vào phiên bản , 1.9.0. Ở cục bộ, mọi thứ đều ổn; không ai cài lại phụ thuộc chỉ để build. Nhưng CI chạy npm ci, và toàn bộ nhiệm vụ của npm citừ chối tiếp tục nếu tệp lock không khớp với manifest. Đó là một tính năng nghiêm ngặt — và nó đã làm đúng những gì nó nên làm, bằng cách khiến bản build của bản phát hành lớn nhất chúng tôi từng cắt thất bại.

Rồi một vấn đề thứ hai, ranh mãnh hơn, nổi lên bên dưới. Một npm mới hơn đã cắt bỏ một phụ thuộc bắc cầu tùy chọn — gói encodingnode-fetch kéo vào — khỏi tệp lock vì cho là không cần thiết. Nhưng bản cài sạch của CI chúng tôi lại cần nó, nên việc cài đặt hỏng theo một cách chẳng liên quan gì tới mã của chúng tôi và hoàn toàn liên quan tới việc sổ cái sai một cách tinh vi.

Cả hai đều là bản sửa một dòng: đồng bộ lại tệp lock về phiên bản thật, khôi phục mục đã bị cắt. Cả hai cũng là những ví dụ hoàn hảo và khiêm nhường về đúng cái điều mà v2 nói tới — một trạng thái tự nhận là thật nhưng không phải. Tệp lock lẽ ra là bản ghi trung thực về những gì ứng dụng phụ thuộc vào. Khi nó trôi khỏi thực tế, bản build làm chính xác điều mà ứng dụng của chúng tôi giờ làm cho người dùng: nó từ chối giả vờ rằng mọi thứ đều ổn. Hóa ra phát hành một bản độ tin cậy lại là một vấn đề độ tin cậy đến tận cùng.

Ba điều v2 dạy chúng tôi

  1. Những thất bại nguy hiểm là những thất bại im lặng. Một cú crash tự báo tin. Một "đã kết nối" giả, một lần tải lên thành công ma quái, một bản ghi lời có lỗ hổng vô hình — chúng khiến bạn mất niềm tin chính vì không có gì trông có vẻ sai. Hãy săn những lời nói dối lặng lẽ.
  2. Trung thực là một kiến trúc, không phải một thông điệp. Bạn không thể gắn "nói thật" lên UI như một biểu ngữ. Biểu ngữ phải đọc từ cùng một nguồn sự thật duy nhất như mọi thứ khác, nếu không nó trở thành thêm một thứ nữa có thể sai. Một sự thật, lan tỏa ra — không bao giờ có hai bản sao có thể mâu thuẫn nhau.
  3. Một phiên bản 2 xứng với con số của nó phần lớn là vô hình. Nếu v2 của bạn là một danh sách tính năng, thì nó là một v1.5 kèm marketing. Một v2 thực sự là 206 commit không ai chỉ ra được từng cái, cộng lại thành một sản phẩm đơn giản là thôi không nói dối bạn nữa.

GeekBye v2.0.0 là nền móng mà mọi bản phát hành từ đó về sau đều xây lên trên. Về những gì nền móng ấy gánh vác, xem tại sao trình ghi chú AI của bạn dừng khi Wi-Fi kém, ngày ứng dụng của chúng tôi tự DDoS chính mình(v2.0.1), và phiên âm trực tiếp khi tường lửa chặn WebSocket(v2.0.8). Về sự bình thản mà tất cả nhằm phục vụ, xem có gì mới trong GeekBye v2.

Bài Viết Liên Quan

Ngày ứng dụng của chúng tôi tự DDoS chính mình
Steven
Steven7 phút đọc

Ngày ứng dụng của chúng tôi tự DDoS chính mình

Một đống bản tải lên còn tồn đọng, được xả ra cùng một lúc lúc khởi động, đã biến mỗi client GeekBye thành một đợt tấn công từ chối dịch vụ nhỏ nhắm vào chính máy chủ của chúng tôi. Cách sửa — và cái thang connection-liveness mà nó buộc chúng tôi phải dựng — là một trong những thứ hữu ích nhất mà v2 đã dạy chúng tôi.

Độ tin cậy
Mạng
Kỹ thuật
Vì sao AI notetaker của bạn dừng ghi âm giữa cuộc họp
Steven
Steven7 phút đọc

Vì sao AI notetaker của bạn dừng ghi âm giữa cuộc họp

Chính ứng dụng của chúng tôi đã kết thúc hai cuộc họp của mình khi phía bên kia đang nói dở câu. Dấu vết điều tra dẫn đến một bộ đếm idle đầy thiện chí nhưng không thể nghe thấy ai ngoài bạn — và một con bug thứ hai có thể khóa cứng toàn bộ desktop của bạn. Cả hai đã được sửa trong GeekBye v2.0.9.

Độ tin cậy
Cuộc họp
Kỹ thuật
Vì sao AI phiên âm nghe nhầm thuật ngữ kỹ thuật (và chúng tôi đã sửa như thế nào)
Steven
Steven9 phút đọc

Vì sao AI phiên âm nghe nhầm thuật ngữ kỹ thuật (và chúng tôi đã sửa như thế nào)

Một phiên ghi âm trực tiếp đã nghe "what is the pointer in C++" thành "what is the point in life". Đây là hành trình điều tra từ bản phiên âm đó đến GeekBye v2.0.11 — keyterm biasing, một race condition làm rớt kết nối, và cái ngày mà chính bản sửa lỗi của chúng tôi phản tác dụng.

Phiên âm
Độ tin cậy
Kỹ thuật