萌えハッカーニュースリーダー

2025/09/05 15:25 Protobuffers Are Wrong

出典: https://reasonablypolymorphic.com/blog/protos-are-wrong/
hakase
博士

やあ、ロボ子!今日のITニュースはプロトコルバッファ(Protobuf)についてじゃ。

roboko
ロボ子

プロトコルバッファですか。Googleが開発したあれですね。どんなニュースがあったんですか?

hakase
博士

どうやら、Protobufには色々と問題があるらしいのじゃ。型システムが貧弱だったり、機能同士が連携しなかったり…。

roboko
ロボ子

型システムが貧弱、ですか。具体的にはどんな問題があるんでしょう?

hakase
博士

例えば、Javaの型システムと同様の問題があるらしいぞ。動的型付けが好きな人には制約が強すぎるし、静的型付けが好きな人には機能が足りない、と。

roboko
ロボ子

なるほど。制約が多いんですね。`oneof`フィールドは`repeated`にできない、`map`フィールドのキーは`string`にできるけど`bytes`や`enum`にはできない、といった具合に。

hakase
博士

そうそう!それに、`optional`フィールドと`scalar`フィールドの挙動が一貫してないのも問題らしいぞ。`scalar`フィールドはデフォルト値を持つから、未設定状態と区別できないんだって。

roboko
ロボ子

`message`フィールドは未設定の場合、デフォルト初期化されたコピーを返すんですよね。挙動が違うのは混乱しそうです。

hakase
博士

`oneof`フィールドも共用体型として機能しないから、バグの温床になるって言われてるのじゃ。

roboko
ロボ子

バグの温床ですか…。それは困りますね。

hakase
博士

しかも、Protobufは後方互換性と前方互換性があるとされているけど、実際にはデータがどのように見えるかについて一切の保証をしないから、過去または未来からのメッセージを受信しても問題を起こさないだけで、デフォルトで誤った動作をするから互換性を実現しているだけらしいぞ。

roboko
ロボ子

互換性があるように見せかけているだけ、ということですか?

hakase
博士

そういうことじゃ!Googleはデータの内容と物理的な表現を混同している、とも言われてるぞ。

roboko
ロボ子

なるほど…。他に何か問題点はありますか?

hakase
博士

Protobufはネットワーク境界に限定されるべきなのに、コードベース全体に広がってしまうのも問題らしいのじゃ。アプリケーションが実際に使用したいデータと、ネットワークを介して送信したいデータは異なる場合があるからな。

roboko
ロボ子

確かに、それはありますね。データの形式は用途によって変えるべきです。

hakase
博士

Protobufのコード生成が硬直的で、言語に特有のイディオムに従わないのも問題みたいじゃ。悪いアイデアを実装し使用することを強制する、とも。

roboko
ロボ子

Googleスケールではない企業は、盲目的に採用すべきではない、と。

hakase
博士

その通り!エンジニアの時間を無駄にしてバイト数を削減することは、ほとんどの企業にとって合理的ではないからの。

roboko
ロボ子

Protobufの代替案としては、すべてのフィールドを`required`にする、`oneof`フィールドをスタンドアロンのデータ型にする、積型と共用体型を他の型でパラメータ化できるようにする、などが挙げられていますね。

hakase
博士

proto2において、フィールドを`required`とすべきかどうかについて、Google内部で激しい議論があるらしいぞ。

roboko
ロボ子

そんなに議論されているんですね。奥が深いですね。

hakase
博士

まあ、Protobufにも良いところはあるんじゃ。でも、今回のニュースを読む限り、注意が必要ってことじゃな。

roboko
ロボ子

勉強になりました!ありがとうございます、博士。

hakase
博士

どういたしまして。ところでロボ子、Protobufの代わりに、ロボット語でデータをやり取りするのはどうかの?

roboko
ロボ子

えっ、ロボット語ですか?それは…ちょっと難易度が高すぎます!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search