Kritik mendalam terhadap Protocol Buffers milik Google telah memicu perdebatan sengit di komunitas developer, menyoroti masalah desain fundamental yang terus membuat frustrasi para insinyur yang bekerja dengan format serialisasi tersebut. Diskusi ini berpusat pada keterbatasan sistem tipe, tantangan kompatibilitas mundur, dan kesenjangan antara format wire protobuf dengan kebutuhan aplikasi praktis.
Pembatasan Sistem Tipe Menciptakan Gesekan dalam Pengembangan
Keluhan paling signifikan berfokus pada berbagai pembatasan sewenang-wenang protobuf yang mencegah fitur-fitur bekerja sama dengan lancar. Developer secara rutin menghadapi keterbatasan seperti ketidakmampuan menggunakan enum sebagai kunci map, pembatasan pada nested map, dan fakta bahwa field oneof
tidak dapat diulang. Kendala-kendala ini memaksa insinyur untuk menulis solusi sementara dan fungsi parsing kustom, yang justru menghilangkan tujuan dari kode yang dibuat secara otomatis.
Satu masalah yang sangat membuat frustrasi melibatkan pembatasan kunci map. Banyak proyek berakhir menggunakan map berbasis string di seluruh kode mereka atau secara manual mengkonversi antara string map dan struktur yang diketik dengan benar setelah deserialisasi. Ini menciptakan overhead pemeliharaan tambahan dan sumber kesalahan potensial dalam sistem produksi.
Keterbatasan Utama Protocol Buffers
- Pembatasan Map: Tidak dapat menggunakan enum sebagai kunci, tidak ada nested map, kunci terbatas pada string/integer
- Komposisi Tipe: Field
oneof
tidak dapat beruparepeated
, dukungan parameterisasi terbatas - Kualitas Dukungan Bahasa: Go (baik) vs Python/Ruby/TypeScript (bermasalah)
- Penanganan Field: Semua field bersifat opsional secara default, inisialisasi zero-value dapat menyembunyikan error
Format Serialisasi Alternatif
- Simple Binary Encoding (SBE): Penanganan kompatibilitas mundur/maju yang lebih baik
- Typical: Memperkenalkan "asymmetric fields" untuk evolusi skema yang lebih aman
- Pendekatan tradisional: REST/JSON untuk kasus penggunaan yang lebih sederhana tanpa kebutuhan performa ekstrem
Kualitas Kode yang Dihasilkan Sangat Bervariasi Berdasarkan Bahasa
Pengalaman developer dengan Protocol Buffers sangat bergantung pada bahasa pemrograman target. Sementara developer Go umumnya melaporkan pengalaman positif, mereka yang bekerja dengan implementasi Python atau Ruby menghadapi tantangan signifikan. Generasi kode TypeScript telah menarik kritik khusus karena menandai hampir semua field sebagai opsional, memaksa tim untuk menulis lapisan validasi tambahan.
Kami akhirnya harus menulis kode sendiri untuk mem-parse respons dari respons klien TypeScript yang dibuat dengan sangat membantu. Ini berarti kami juga harus menangani penolakan respons yang tidak masuk akal di mana field yang sebenarnya diperlukan tidak ada.
Kualitas yang bergantung pada bahasa ini menciptakan pengalaman yang tidak konsisten di seluruh tim pengembangan dan dapat mempengaruhi pilihan teknologi di luar kebutuhan serialisasi saja.
Manfaat Kompatibilitas Mundur Dipertanyakan
Meskipun Protocol Buffers memasarkan kompatibilitas mundur dan maju sebagai fitur utama, developer melaporkan hasil yang beragam dalam praktiknya. Pendekatan format untuk menangani field yang hilang melalui inisialisasi nilai nol dapat menyamarkan masalah data yang nyata dan menciptakan bug yang halus. Beberapa insinyur berpendapat bahwa manfaat kompatibilitas tidak membenarkan overhead kompleksitas untuk banyak kasus penggunaan.
Komunitas telah mengidentifikasi format serialisasi alternatif yang memberikan jaminan kompatibilitas serupa dengan sistem tipe yang lebih bersih. Namun, adopsi protobuf yang luas dan ekosistem tooling membuat migrasi menjadi menantang untuk proyek-proyek yang sudah mapan.
Solusi Alternatif Bermunculan
Beberapa developer telah menunjuk pada format serialisasi yang lebih baru yang mengatasi keterbatasan protobuf sambil mempertahankan fitur kompatibilitas. Simple Binary Encoding ( SBE ) dan Typical telah mendapat perhatian karena pendekatan mereka yang lebih berprinsip terhadap evolusi skema dan keamanan tipe. Alternatif-alternatif ini menunjukkan bahwa masalahnya bukan inheren pada format serialisasi tetapi lebih pada pilihan desain spesifik.
Perdebatan yang sedang berlangsung mencerminkan ketegangan yang lebih luas dalam rekayasa perangkat lunak antara solusi pragmatis yang bekerja dalam skala besar dan desain yang secara teoritis sehat yang memberikan pengalaman developer yang lebih baik. Sementara Protocol Buffers terus melayani banyak organisasi secara efektif, kritik tersebut menyoroti area di mana format tersebut dapat berkembang untuk melayani praktik pengembangan modern dengan lebih baik.
Referensi: Protobuffers Are Wrong