gRPC: The Bad Parts

Tooling and Developer Experience

  • Many find core tooling clunky: manual protoc wiring (esp. in Go), weak integration with build systems like Bazel, and confusing config via JSON strings in some languages.
  • Others report excellent workflows in ecosystems with first-class integration (notably .NET/C# and some Java setups), where proto compilation is wired into the build and “just works.”
  • grpcurl and GUI tools (e.g., Kreya) are highlighted as essential for debugging; some still prefer writing small custom CLIs.
  • Buf is repeatedly cited as significantly improving proto dependency management, packaging, linting, and codegen.

Language Implementations and API Quality

  • Implementations vary widely: C# and Java often praised; Go’s gRPC/protobuf stack is criticized as ergonomically and performance-poor; C++ bindings are seen as over-abstracted and even encouraging anti-patterns.
  • Python and Ruby users report missing features or fragile integrations; protobuf version pinning across dependencies is a recurring pain.

Protobuf Semantics and Versioning

  • Proto3’s “everything optional, default values everywhere” design is contentious. Critics dislike not distinguishing “unset” from “default”; supporters say required fields made evolution impossible and nullability is overused.
  • Later proto3 additions (optional primitives, presence checks, annotations like field_behavior) partly address this but remain inconsistent across languages.
  • Proto file versioning and lack of a canonical proto package manager (beyond Buf) are seen as real gaps.

Transport, HTTP/2, and Web/Browsers

  • Heavy reliance on HTTP/2 and trailers is viewed as a major design misstep, especially for browsers, certain runtimes (e.g., game engines), and some platforms that still lack HTTP/2.
  • gRPC-Web and HTTP/1 compatibility layers exist but add complexity; some wish for a native HTTP/1 mode or WebSocket/WebTransport-based design.

Complexity, Overuse, and Suitability

  • Many argue most projects don’t need gRPC and pay unnecessary complexity versus simple JSON/REST or JSON-over-WebSockets.
  • Fans emphasize strong typing, shared IDL, smaller payloads, multiplexing, and easier multi-language stubs compared to ad-hoc REST/OpenAPI ecosystems.
  • There’s concern that feature bloat and ecosystem impenetrability make independent implementations hard and tie users to “the official” stack.

Alternatives and Variants

  • ConnectRPC plus Buf (and protovalidate) are repeatedly praised as “gRPC done right,” with better HTTP/1 support, simpler semantics, and good tooling while remaining interoperable with gRPC.
  • Other options mentioned: JSON-RPC, Thrift, NATS-based RPC, MessagePack, FlatBuffers/Cap’n Proto, and custom binary protocols for niche high-performance or low-latency domains.