Protocol Buffers の型システム設計上の欠陥に対する開発者からの批判が高まる

BigGo コミュニティ部
Protocol Buffers の型システム設計上の欠陥に対する開発者からの批判が高まる

Google の Protocol Buffers に対する詳細な批判が開発者コミュニティで激しい議論を巻き起こし、このシリアライゼーション形式を使用するエンジニアを継続的に悩ませている根本的な設計問題が浮き彫りになった。議論の中心は型システムの制限、後方互換性の課題、そして protobuf のワイヤ形式と実用的なアプリケーションのニーズとの間のギャップである。

型システムの制限が開発の摩擦を生む

最も重要な苦情は、機能が円滑に連携することを妨げる protobuf の数多くの恣意的な制限に焦点を当てている。開発者は定期的に、enum をマップキーとして使用できない、ネストしたマップの制限、oneof フィールドを繰り返すことができないといった制限に遭遇する。これらの制約により、エンジニアは回避策やカスタム解析関数を書くことを余儀なくされ、自動生成コードの目的を台無しにしている。

特に苛立たしい問題の一つは、マップキーの制限に関するものである。多くのプロジェクトでは、コードベース全体で文字列ベースのマップを使用するか、デシリアライゼーション後に文字列マップと適切に型付けされた構造体の間で手動変換を行うことになる。これにより、追加のメンテナンスオーバーヘッドと本番システムでの潜在的なエラー源が生まれる。

Protocol Buffers の主な制限事項

  • マップの制限: enumをキーとして使用不可、ネストしたマップ不可、キーは文字列/整数に限定
  • 型の組み合わせ: oneofフィールドはrepeatedにできない、パラメータ化サポートが限定的
  • 言語サポートの品質: Go (良好)対 Python / Ruby / TypeScript (問題あり)
  • フィールド処理: 全フィールドがデフォルトでオプション、ゼロ値初期化がエラーを隠蔽する可能性

代替シリアライゼーション形式

  • Simple Binary Encoding ( SBE ): より優れた後方/前方互換性処理
  • Typical: より安全なスキーマ進化のための「非対称フィールド」を導入
  • 従来のアプローチ: 極端なパフォーマンス要件のないシンプルなユースケースには REST / JSON

生成されるコードの品質は言語によって大きく異なる

Protocol Buffers での開発者体験は、対象となるプログラミング言語に大きく依存する。Go 開発者は一般的にポジティブな体験を報告しているが、Python や Ruby の実装で作業している開発者は重大な課題に直面している。TypeScript のコード生成は、ほぼすべてのフィールドをオプションとしてマークするため特に批判を浴びており、チームは追加の検証レイヤーを書くことを余儀なくされている。

「役に立つ生成された TypeScript クライアントのレスポンスを解析するために、独自のコードを書かなければならなくなった。これは、実際に必要なフィールドが存在しない無意味なレスポンスを拒否することも処理しなければならないことを意味した。」

この言語依存の品質は、開発チーム間で一貫性のない体験を生み出し、単なるシリアライゼーションのニーズを超えて技術選択に影響を与える可能性がある。

後方互換性の利点に疑問

Protocol Buffers は後方および前方互換性を主要な機能として宣伝しているが、開発者は実際には混合した結果を報告している。欠落フィールドをゼロ値初期化で処理するこの形式のアプローチは、実際のデータ問題を隠し、微妙なバグを生み出す可能性がある。一部のエンジニアは、多くの使用ケースにおいて、互換性の利点が複雑性のオーバーヘッドを正当化しないと主張している。

コミュニティは、よりクリーンな型システムで同様の互換性保証を提供する代替シリアライゼーション形式を特定している。しかし、protobuf の広範な採用とツールエコシステムにより、確立されたプロジェクトでの移行は困難になっている。

代替ソリューションの登場

数人の開発者が、互換性機能を維持しながら protobuf の制限に対処する新しいシリアライゼーション形式を指摘している。Simple Binary Encoding(SBE)と Typical は、スキーマ進化と型安全性に対するより原則的なアプローチで注目を集めている。これらの代替案は、問題がシリアライゼーション形式に固有のものではなく、むしろ特定の設計選択であることを実証している。

継続的な議論は、大規模で機能する実用的なソリューションと、より良い開発者体験を提供する理論的に健全な設計との間のソフトウェアエンジニアリングにおけるより広範な緊張を反映している。Protocol Buffers は多くの組織に効果的にサービスを提供し続けているが、この批判は、この形式が現代の開発実践により良くサービスを提供するために進化できる分野を浮き彫りにしている。

参考: Protobuffers Are Wrong