Language:
From Our Team
Insights, tutorials, and updates from our team to help you build better software.
Practical notes from the people designing, shipping, and improving digital products every day.
backend
Fast queries are only part of a healthy database. This guide covers the operational side: sizing connection pools, keeping vacuum and statistics healthy, partitioning large tables, planning capacity, and designing backups you have actually tested restoring.
Sep 24, 2026·6 min read
Starting a goroutine takes one keyword. Shutting it down cleanly, capping how many run at once, and making sure none leak takes design. This article covers the patterns we use for concurrent Go services that stay predictable under load.
Sep 24, 2026·5 min read
Indexes are the most powerful performance tool in a relational database, and the easiest to misuse. This article explains how B-tree, hash, GIN, and BRIN indexes differ, why column order in composite indexes matters, when covering and partial indexes help, and how to find indexes that only cost you.
A slow query is rarely a mystery once you can read its execution plan. This guide explains EXPLAIN ANALYZE, then fixes the problems that account for most slow queries: N+1 access patterns, non-sargable filters, bad row estimates, deep pagination, and fetching more data than needed.
Graph problems power route planning, recommendations, fraud detection, and dependency resolution, and they get slow in surprising ways. This article covers choosing the right traversal algorithm, representing graphs compactly, pruning the search space, and tuning queries in graph databases.
With twenty services behind one request, "check the logs" stops being a strategy. This article covers how distributed tracing, well-chosen metrics, and structured logs work together, and how to instrument services with OpenTelemetry without drowning in data.
In a distributed system, every network call can fail, stall, or succeed twice. This article compares synchronous and event-driven communication and covers timeouts, retries with backoff, idempotency keys, circuit breakers, and the outbox pattern.
Most microservice pain traces back to one decision: where the boundaries were drawn. This guide shows how bounded contexts, aggregates, and a few practical tests help you split a system into services that can change independently.
Guessing at performance problems wastes days. Go includes a profiler that shows where CPU time and memory actually go. This walkthrough covers collecting CPU, heap, and allocation profiles, reading flame graphs, and fixing the problems they reveal most often.
Showing 1-9 of 10 articles