June 12, 2026 · 9 min read · tagged ebpf linux observability
After spending three weeks debugging a production outage caused by a kprobe that worked fine on 5.15 but panicked on 6.1, I've compiled a list of eBPF tracing footguns that nobody talks about.
Rule #1: Never trust bpf_probe_read_user() on a page that might have been swapped out.
SEC("kprobe/tcp_connect")
int trace_tcp_connect(struct pt_regs *ctx) {
struct sock *sk = (struct sock *)PT_REGS_PARM1(ctx);
// ⚠️ This will crash on kernel ≥ 6.1
bpf_probe_read_kernel(&dport, sizeof(dport),
&sk->__sk_common.skc_dport);
return 0;
}
May 28, 2026 · 7 min read · tagged golang generics
It's been over a year since Go 1.18 shipped generics. I surveyed 50 open-source projects to see how they're actually using type parameters — the results surprised me.
The most common pattern isn't data structures or algorithms. It's functional options.
May 14, 2026 · 11 min read · tagged distributed-systems raft
I've seen too many teams reach for Raft when a simple leader-follower with WAL would suffice. Here's a decision framework I use before introducing consensus into a system.
April 30, 2026 · 8 min read · tagged rust async
Cancellation safety, Send bounds on nested futures, and the subtle difference between tokio::spawn and select! — these are the three things that trip up even experienced Rust developers.
April 15, 2026 · 13 min read · tagged postgres performance
Why did Postgres choose a sequential scan over your perfectly crafted index? A deep dive into random_page_cost, correlation statistics, and the dark art of EXPLAIN ANALYZE.