Các kỹ sư phần mềm đang thảo luận về những ví dụ thú vị về cách các ngôn ngữ lập trình chủ động chống lại Định luật Hyrum - nguyên tắc cho rằng người dùng sẽ không thể tránh khỏi việc phụ thuộc vào bất kỳ hành vi có thể quan sát được nào trong hệ thống, bất kể những gì được hứa hẹn chính thức. Các cuộc thảo luận gần đây trong cộng đồng tiết lộ cách các nhà thiết kế ngôn ngữ sử dụng những thủ thuật thông minh để ngăn chặn các nhà phát triển vô tình phụ thuộc vào các chi tiết triển khai.
Giải Pháp Sáng Tạo của Go để Ngăn Chặn Các Phụ Thuộc Vô Tình
Go áp dụng một cách tiếp cận khác thường để ngăn chặn các nhà phát triển phụ thuộc vào thứ tự lặp map. Ngôn ngữ này cố意 ngẫu nhiên hóa thứ tự mỗi khi bạn lặp qua một map. Điều này có nghĩa là cùng một map sẽ trả về các key theo các chuỗi khác nhau qua nhiều lần lặp, buộc các nhà phát triển phải viết code không dựa vào bất kỳ thứ tự cụ thể nào.
Việc triển khai này hiệu quả một cách đáng ngạc nhiên. Thay vì tạo ra các bản sao bộ nhớ tốn kém, Go chọn một bucket bắt đầu ngẫu nhiên, lặp qua các bucket theo thứ tự bình thường trong khi quay vòng, và tạo ra một sự sắp xếp ngẫu nhiên của các item trong mỗi bucket 8 item. Cách tiếp cận này ngăn chặn lỗi phổ biến khi code hoạt động trong quá trình testing nhưng thất bại trong production do các mẫu lặp khác nhau.
Ghi chú kỹ thuật: Một bucket trong triển khai map của Go là một container nhỏ chứa nhiều cặp key-value như một phần của cấu trúc hash table.
Chi tiết triển khai Go Map
Phương pháp ngẫu nhiên hóa:
- Chọn bucket khởi đầu ngẫu nhiên
- Lặp qua các bucket theo thứ tự (quay vòng lại từ đầu)
- Tạo hoán vị ngẫu nhiên từ 0-7 cho các phần tử trong mỗi bucket
- Không yêu cầu overhead bộ nhớ O(n)
Đặc điểm hiệu suất:
- Độ phức tạp không gian O(1) cho việc ngẫu nhiên hóa
- Overhead thời gian tối thiểu trong quá trình lặp
- Ngăn chặn các phụ thuộc thứ tự tình cờ
Hành Trình Ngược Lại của Python với Dictionary Ordering
Python đã đi một con đường hoàn toàn khác với các dictionary của mình. Ban đầu, CPython bảo tồn thứ tự chèn như một tác dụng phụ không mong muốn của một triển khai mới trong phiên bản 3.6. Rất nhiều nhà phát triển bắt đầu phụ thuộc vào hành vi này đến mức Python chính thức biến nó thành một phần của đặc tả ngôn ngữ trong phiên bản 3.7.
Đây là một trường hợp điển hình của Định luật Hyrum trong thực tế. Những gì bắt đầu như một chi tiết triển khai đã trở thành một tính năng mà hàng triệu chương trình hiện đang dựa vào. Đội ngũ Python nhận ra rằng việc phá vỡ hành vi này sẽ gây ra các vấn đề lan rộng, vì vậy họ đã chấp nhận nó thay thế.
Dòng thời gian phát triển của Python Dictionary
Python 3.6: Các dictionary trong CPython bắt đầu bảo toàn thứ tự chèn như một chi tiết triển khai Python 3.7: Việc bảo toàn thứ tự chèn trở thành một phần của đặc tả ngôn ngữ chính thức Lý do: Quá nhiều người dùng đã bắt đầu phụ thuộc vào hành vi sắp xếp này Tác động: Điều bắt đầu như chi tiết triển khai đã trở thành tính năng ngôn ngữ được đảm bảo
Cách Tiếp Cận của Ngành Ngân Hàng đối với Độ Tin Cậy
Các hệ thống tài chính cung cấp một góc nhìn thú vị khác về việc quản lý kỳ vọng của người dùng. Các mạng lưới ngân hàng đã xử lý các thách thức giao hàng tin nhắn trong nhiều thập kỷ bằng cách sử dụng các quy trình đối chiếu. Khi giao tiếp giữa các ngân hàng bị gián đoạn, họ không chỉ thử lại tin nhắn - họ có các hệ thống phức tạp để đảm bảo cả hai bên đồng ý về những giao dịch thực sự đã xảy ra.
Cách tiếp cận này thừa nhận rằng việc giao hàng chính xác một lần hoàn hảo là không thể trong các hệ thống phân tán, nhưng tạo ra các giải pháp thay thế đạt được cùng kết quả thực tế thông qua sự phối hợp cẩn thận và các định danh giao dịch duy nhất.
Đảm Bảo Giao Nhận Thông Điệp Ngân Hàng
Các Lựa Chọn Tiêu Chuẩn:
- "Tối đa một lần" - có thể xảy ra mất mát thông điệp
- "Ít nhất một lần" - có thể xảy ra trùng lặp thông điệp
- "Chính xác một lần" - không thể đảm bảo trong các hệ thống phân tán
Giải Pháp Ngân Hàng:
- Sử dụng tiêu chuẩn đối soát ISO 20022
- Áp dụng mã định danh giao dịch duy nhất để đảm bảo tính idempotency
- Triển khai trao đổi thông điệp qua lại cho đến khi cả hai bên đồng thuận
- Được sử dụng bởi SWIFT , FedNow , FedWire và các hệ thống tại khoảng 70 quốc gia
Ý Nghĩa về Bảo Mật và Testing
Cuộc thảo luận cộng đồng tiết lộ cách những nguyên tắc này mở rộng ra ngoài thiết kế API đơn giản. Các hệ thống an ninh sân bay tiêm những mối đe dọa giả vào máy quét X-ray để giữ cho các nhân viên vận hành tỉnh táo, vì các mối đe dọa thực sự rất hiếm đến mức công nhân có thể trở nên tự mãn. Tương tự, một số người đề xuất rằng xe tự lái yêu cầu giám sát của con người có thể cần thỉnh thoảng yêu cầu việc tiếp quản không cần thiết để đảm bảo tài xế luôn tham gia.
Đối với một chiếc xe tự lái, nếu nó phải được giám sát, thì có lẽ bạn sẽ cần xe ngẫu nhiên yêu cầu tài xế tiếp quản, mặc dù điều đó không cần thiết. Hoặc ngẫu nhiên xuất hiện để đang phạm sai lầm, để xem liệu người dùng có phản ứng không.
Thách Thức cho Các Nhà Thiết Kế API
Những ví dụ này làm nổi bật sự căng thẳng liên tục giữa kỳ vọng của người dùng và thực tế kỹ thuật. Trong khi một số người cho rằng việc phụ thuộc vào hành vi không được ghi chép cấu thành thực hành kỹ thuật kém, thực tế là những phụ thuộc như vậy thường xuất hiện một cách vô tình. Một nhà phát triển viết code hoạt động, ship nó, và chỉ sau đó mới phát hiện ra nó dựa vào một timing hoặc ordering cụ thể không được đảm bảo.
Các thực hành phát triển hiện đại ngày càng nhận ra thách thức này. Một số đội ngũ hiện giới thiệu sự hỗn loạn có kiểm soát vào hệ thống của họ - cố ý thay đổi các hành vi không được đảm bảo giữa các bản phát hành để ngăn người dùng trở nên quá thoải mái với các chi tiết triển khai.
Cuộc thảo luận cho thấy Định luật Hyrum không chỉ là một quan sát học thuật mà là một thách thức thực tế định hình cách chúng ta thiết kế các ngôn ngữ lập trình, API và hệ thống phức tạp. Cho dù thông qua việc ngẫu nhiên hóa của Go, các thay đổi đặc tả của Python, hay các quy trình đối chiếu của ngân hàng, các hệ thống thành công phải tính đến khoảng cách giữa những gì họ hứa hẹn và những gì người dùng thực sự phụ thuộc vào.
Tham khảo: Định luật Hyrum