Recent Articles

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.

Copying Changes Between Git Clones
Jul 23, 2025 · 3 min read
How to copy uncommitted changes from one clone to another of the same repository.

Discussion Guide: The Pragmatic Programmer, 20th Anniversary Edition
Mar 26, 2025 · 7 min read
A guide with discussion prompts for David Thomas and Andrew Hunt's The Pragmatic Programmer, 20th Anniversary Edition.
