Recent Articles
The Rings of Legacy Code
Nov 28, 2025 · 2 min read
It's easy to see the growth of a tree in hindsight by cutting it down and measuring its rings. Software at your company has growth rings, too.

Defensive Shell Scripting with Shell Options
Nov 24, 2025 · 10 min read
Unlike typical programming languages, Bash doesn't terminate when it encounters a variety of exceptions.
Be an Engineer Who Invites Collaboration
Nov 23, 2025 · 7 min read
I don't care if you're a 10x engineer, I care if we can build great things together.
One, Few, or Many: A Guide to Rapid Impact Assessment
Nov 22, 2025 · 3 min read
Stakeholders love this one simple trick.

Querying MySQL Row Counts the Fast Way
Oct 5, 2025 · 7 min read
SELECT COUNT(*) requires an expensive full index scan, which probably isn't what you want.

Installing Old Homebrew Cask Versions
Oct 4, 2025 · 5 min read
Homebrew makes it very difficult to install older versions of a cask.

Pin Your GitHub Actions to Protect Against Supply Chain Attacks
Aug 23, 2025 · 5 min read
Pinning third-party GitHub Actions to a commit SHA helps protect you against supply chain attacks.

Installing Old Homebrew Formula Versions
Aug 13, 2025 · 5 min read
Homebrew makes it very difficult to install older versions of a formula.
I Don't Want to Have to Think About It
Jul 26, 2025 · 6 min read
I spent a substantial amount of time in the first half of 2025 ensuring that I don't have to think about microservices my team owns that have a low rate of change.

Resetting the Working Directory on Shell Function Exit
Jul 24, 2025 · 3 min read
Sometimes you need to change the working directory in a shell function. You should take care to reset it back after.

