Skip to content

Instantly share code, notes, and snippets.

@ajhyndman
Created May 21, 2026 20:22
Show Gist options
  • Select an option

  • Save ajhyndman/98df674cff15fd5ddbef73529a7f8a02 to your computer and use it in GitHub Desktop.

Select an option

Save ajhyndman/98df674cff15fd5ddbef73529a7f8a02 to your computer and use it in GitHub Desktop.
Glean: Why is protobuf bad?

Protobuf is what happens when engineers hate paying 3 bytes for a brace so much they’re willing to make every future debugging session everyone else’s problem.

The spicy version:

  • It turns data interchange into schema hostage negotiation.
  • Your payload is “efficient,” which is a cute way of saying nobody can read it.
  • The happy path is great right up until you need to inspect, patch, diff, grep, backfill, or recover anything by hand.
  • It works beautifully in tightly-controlled systems where every producer and consumer is versioned, generated, and blessed by the same priesthood.
  • The moment normal humans, SQL tools, data pipelines, or third-party integrations touch it, the tax bill arrives.
  • Struct, Any, and giant oneofs are protobuf’s way of admitting that reality is messy and your “strong schema” is about to become typed fan fiction.
  • Teams adopt protobuf to remove ambiguity, then spend the next two years explaining reserved fields, unknown fields, field numbers, wire compatibility, codegen drift, and why renaming something “should have been safe.”

The meanest fair summary:

Protobuf is excellent for RPC between cooperating services. It is terrible as a general interchange format because it optimizes machine efficiency by externalizing complexity onto every human and every tool around it.

Or even shorter:

JSON wastes bytes. Protobuf wastes lives.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment