Protocol Buffers đối mặt với làn sóng chỉ trích từ cộng đồng lập trình viên về các lỗ hổng thiết kế hệ thống kiểu dữ liệu

Nhóm Cộng đồng BigGo
Protocol Buffers đối mặt với làn sóng chỉ trích từ cộng đồng lập trình viên về các lỗ hổng thiết kế hệ thống kiểu dữ liệu

Một bài phê bình chi tiết về Protocol Buffers của Google đã gây ra cuộc tranh luận sôi nổi trong cộng đồng lập trình viên, làm nổi bật những vấn đề thiết kế cơ bản tiếp tục gây khó chịu cho các kỹ sư làm việc với định dạng tuần tự hóa này. Cuộc thảo luận tập trung vào các hạn chế của hệ thống kiểu dữ liệu, thách thức về khả năng tương thích ngược, và khoảng cách giữa định dạng wire của protobuf với nhu cầu ứng dụng thực tế.

Các hạn chế của hệ thống kiểu dữ liệu tạo ra ma sát trong quá trình phát triển

Những khiếu nại đáng kể nhất tập trung vào vô số hạn chế tùy tiện của protobuf khiến các tính năng không thể hoạt động mượt mà với nhau. Các lập trình viên thường xuyên gặp phải những hạn chế như không thể sử dụng enum làm khóa map, hạn chế về nested map, và việc các trường oneof không thể được lặp lại. Những ràng buộc này buộc các kỹ sư phải viết các giải pháp thay thế và hàm phân tích cú pháp tùy chỉnh, làm mất đi mục đích của việc tự động tạo mã.

Một vấn đề đặc biệt gây khó chịu liên quan đến các hạn chế khóa map. Nhiều dự án cuối cùng phải sử dụng các map dựa trên chuỗi trong toàn bộ codebase của họ hoặc chuyển đổi thủ công giữa string map và các cấu trúc được định kiểu đúng sau khi giải tuần tự hóa. Điều này tạo ra gánh nặng bảo trì bổ sung và các nguồn lỗi tiềm ẩn trong hệ thống sản xuất.

Những Hạn Chế Chính Của Protocol Buffers

  • Hạn Chế Map: Không thể sử dụng enum làm key, không có nested map, key bị giới hạn ở string/integer
  • Kết Hợp Kiểu Dữ Liệu: Các trường oneof không thể là repeated, hỗ trợ tham số hóa có giới hạn
  • Chất Lượng Hỗ Trợ Ngôn Ngữ: Go (tốt) so với Python/Ruby/TypeScript (có vấn đề)
  • Xử Lý Trường: Tất cả các trường đều optional theo mặc định, khởi tạo zero-value có thể che giấu lỗi

Các Định Dạng Serialization Thay Thế

  • Simple Binary Encoding ( SBE ): Xử lý tương thích ngược/tiến tốt hơn
  • Typical: Giới thiệu "asymmetric fields" để phát triển schema an toàn hơn
  • Các phương pháp truyền thống: REST/JSON cho các trường hợp sử dụng đơn giản hơn mà không cần hiệu suất cực cao

Chất lượng mã được tạo ra khác nhau đáng kể theo từng ngôn ngữ

Trải nghiệm của lập trình viên với Protocol Buffers phụ thuộc rất nhiều vào ngôn ngữ lập trình đích. Trong khi các lập trình viên Go thường báo cáo trải nghiệm tích cực, những người làm việc với các triển khai Python hoặc Ruby phải đối mặt với những thách thức đáng kể. Việc tạo mã TypeScript đã nhận được sự chỉ trích đặc biệt vì đánh dấu gần như tất cả các trường là tùy chọn, buộc các nhóm phải viết thêm các lớp xác thực.

Chúng tôi cuối cùng phải viết mã riêng để phân tích các phản hồi từ các phản hồi của TypeScript client được tạo ra một cách hữu ích. Điều này có nghĩa là chúng tôi cũng phải xử lý việc từ chối các phản hồi vô lý khi một trường thực sự bắt buộc không có mặt.

Chất lượng phụ thuộc vào ngôn ngữ này tạo ra trải nghiệm không nhất quán giữa các nhóm phát triển và có thể ảnh hưởng đến các lựa chọn công nghệ ngoài chỉ nhu cầu tuần tự hóa.

Lợi ích tương thích ngược bị đặt dấu hỏi

Trong khi Protocol Buffers quảng bá khả năng tương thích ngược và tiến như một tính năng chính, các lập trình viên báo cáo kết quả hỗn hợp trong thực tế. Cách tiếp cận của định dạng này để xử lý các trường bị thiếu thông qua khởi tạo giá trị zero có thể che giấu các vấn đề dữ liệu thực sự và tạo ra các lỗi tinh vi. Một số kỹ sư cho rằng lợi ích tương thích không biện minh cho độ phức tạp overhead đối với nhiều trường hợp sử dụng.

Cộng đồng đã xác định các định dạng tuần tự hóa thay thế cung cấp đảm bảo tương thích tương tự với các hệ thống kiểu sạch hơn. Tuy nhiên, việc áp dụng rộng rãi và hệ sinh thái công cụ của protobuf khiến việc di chuyển trở nên thách thức đối với các dự án đã được thiết lập.

Các giải pháp thay thế xuất hiện

Một số lập trình viên đã chỉ ra các định dạng tuần tự hóa mới hơn giải quyết các hạn chế của protobuf trong khi vẫn duy trì các tính năng tương thích. Simple Binary Encoding ( SBE ) và Typical đã thu hút sự chú ý với các cách tiếp cận có nguyên tắc hơn đối với sự phát triển schema và type safety. Những lựa chọn thay thế này chứng minh rằng các vấn đề không phải là vốn có của các định dạng tuần tự hóa mà là các lựa chọn thiết kế cụ thể.

Cuộc tranh luận đang diễn ra phản ánh những căng thẳng rộng lớn hơn trong kỹ thuật phần mềm giữa các giải pháp thực dụng hoạt động ở quy mô lớn và các thiết kế đúng đắn về mặt lý thuyết cung cấp trải nghiệm lập trình viên tốt hơn. Trong khi Protocol Buffers tiếp tục phục vụ hiệu quả nhiều tổ chức, sự chỉ trích làm nổi bật các lĩnh vực mà định dạng này có thể phát triển để phục vụ tốt hơn các thực tiễn phát triển hiện đại.

Tham khảo: Protobuffers Are Wrong