Posts on backend engineering — the language-agnostic patterns and decisions that define a great backend. API design, caching, queues, observability, system design tradeoffs, and the lessons that apply whether you write Python, Go, or anything else.
When gRPC actually wins for service-to-service traffic. Performance numbers, the ergonomics gap, debugging tradeoffs, and how to mix gRPC inside with REST at the edge.
Why most health checks lie, the difference between liveness and readiness, dependency-aware checks, startup probes for slow boots, and the patterns that surface real problems.
Why most products should start with a modular monolith, when microservices earn their cost, the modular monolith pattern, and the modern split decision.
How to use gRPC’s three streaming modes correctly. Server-streaming, client-streaming, bidirectional, deadlines, errors, flow control, and concrete patterns for live updates and uploads.
Picking an API versioning strategy in 2026 (URL vs header vs date), deprecation timelines, sunset headers, and the patterns that survive long-term customer relationships.
How to design webhooks producers AND consumers can rely on. Signing, retries, idempotency, ordering, observability, and the patterns from real production webhook systems.
Three multi-tenant patterns: shared (tenant_id everywhere), pooled (schema-per-tenant), per-tenant DB. The decision matrix by scale, isolation, compliance, and cost.
How to ship safely with feature flags in 2026. The OpenFeature standard, picking a vendor, the patterns (boolean flags, percentage rollouts, targeting), and the costs of doing it wrong.
The resilience patterns every backend engineer should reach for: circuit breakers, bulkheads, backpressure, deadlines, jittered retries, and the production tradeoffs.
Event sourcing and CQRS without the religion. Where they earn their cost, why most apps don’t need them, and the pragmatic mid-paths.