Tales of the Autistic Developer - Bringing It Into Focus
How I process problems: hyperphantasia, rotation, the click moment, and using AI as a variance accelerator for a brain that generates more ideas than it can hold.
Engineering systems that endure.
How I process problems: hyperphantasia, rotation, the click moment, and using AI as a variance accelerator for a brain that generates more ideas than it can hold.
Organizations teach themselves helplessness through reinforcing loops of scarcity, cynicism, and declining trust. This article is about breaking that cycle.
A walkthrough of my current development environment: Ghostty, MonoLisa, mise, ZSH without a framework, and why I automated the whole thing into a single script.
For those who don't know me, I'm autistic. This post is about panic: the kind that locks your body, floods your brain, and makes every solution feel equally impossible.
I need to level up on Go, and Pokémon data felt like a good excuse. This post builds the same API client in Ruby and Go, comparing how I think about the problem in each.
Checking whether you've seen something before usually means storing everything you've seen. A Bloom filter does it in about ten bits per item and can only be wrong in one direction. This post builds from a single bit to the structure RocksDB and Cassandra use to skip disk reads.
You inherited a monolith with no map. This is how you start drawing one.
Every successful Rails monolith becomes a ruin if it survives long enough. This post is about why, and what a recovery looks like from the inside.
Polymorphic associations store a relationship as a class name in a string with no foreign key. That has unintended consequences which may not be obvious, and this article covers five of them.
Counting distinct values exactly means remembering all of them. HyperLogLog does it in 16 kilobytes. This post builds from coin flips to bitmaps to the algorithm Redis uses behind PFCOUNT.
Queries own the reads the way commands own the writes, and a T::Struct is the only thing that crosses between them. Every read here ran against ActiveRecord 8.1 before it went in.
Callbacks promise that something always happens when a record changes. They can't keep that promise, and Rails documents the ways out. Every failure mode here ran against ActiveRecord 8.1 before it went in, and the replacement is a command with one door.
add_index looks like a one-line fix for slow queries. It isn't. This article walks through the failure modes, proves each one with EXPLAIN on half a million rows, and shows how to build an index the optimizer will actually use.
Enumerable assumes the whole collection fits in memory. This post is about what happens when it doesn't, built up one step at a time from lazy streams to external merge sort.
Enumerable named the ways we walk a line, but some data is not a line. This article builds graphs up from a plain Hash, covering dependency ordering, tsort, friend lists, and a few pathfinding algorithms.
Enumerable named our traversals, but some collections live past it. This post goes after ordered retrieval: heaps, priority queues, their real uses, and why they belong in Ruby itself.
lock looks like a one-line fix for concurrency bugs. It isn't. This article walks through eight failure modes, proves each one with forking tests, and shows what actually holds an invariant.
Enumerable taught us a better path for iteration, what if we applied those lessons to other forms of iteration? This article covers windows and pointers.
Every guardrail we need for AI is a good practice we should have already been doing. AI exposes the systemic gaps that experienced developers have been quietly routing around for years.
A tornado flattened my town in 2011. What I learned that night still shapes how I show up to work today.