On API pagination
Feb 2026
Cursor-based pagination is almost always what you want. Offset pagination breaks under
concurrent writes and gets slower linearly with page depth. The only exception is when
users genuinely need to jump to page 47 -- and even then, I'd rather build a search
feature than maintain offset-based queries at scale.
GraphQL vs. REST
Jan 2026
GraphQL is great when your frontend makes lots of varied queries against a stable schema.
It's a bad fit when your API is mostly writes or when you need strong caching at the HTTP
layer. At Pinpoint, the switch to GraphQL cut dashboard DB round trips by 73%. I'd still
use REST for most microservice-to-microservice calls. The tooling maturity just isn't
there for server-to-server GraphQL yet.
Chaos engineering, practically
Dec 2025
We started Litmus chaos experiments at Bastion and found 8 critical failure modes in the
first 2 months. The biggest win wasn't the bugs we found -- it was that the team had already
rehearsed failures before they happened in production. Monthly game days became a team ritual.
The on-call rotation got noticeably calmer after the third one.
Property-based testing for billing
Nov 2025
Hypothesis caught edge cases in our billing system that 200+ unit tests missed. When money
is involved, generating random concurrent scenarios is worth the setup cost. The invariant
is simple: total charged must equal total consumed. Proving it under concurrency is not.
We found a race condition that had been silently double-charging 0.3% of invoices.
The D3.js learning curve
Oct 2025
D3 clicked for me when I stopped thinking of it as a charting library and started thinking
of it as a data-to-DOM binding engine. The GPU cost dashboard I built at Tensor would have
been painful with any higher-level library because of the drill-down interaction patterns.
That said, for simple bar charts I'd still reach for Recharts or Nivo first.
Why I like Go for gateways
Sep 2025
Goroutines per connection, predictable GC pauses at high throughput, easy to reason about
memory. The Bastion API gateway handles 2,400 req/sec and the tail latency stays flat. I
wouldn't write a data pipeline in Go, but for request routing it's hard to beat. Python's
asyncio gets close on developer speed but the runtime overhead shows at p99.