PGH Web — Software engineering writing and tools by Jeff Straney

My Opinions Come
from Breaking Things.
What broke, what fixed it, and why the human side usually matters more than the technology.
Free downloads
Reference material I use myself. Sign up once, download all three.
No spam. Unsubscribe any time.
Or get the full guides →- Code Review Checklist — A practical reference for what to actually look for, not a style guide.
- PostgreSQL Tuning Cheat Sheet — Index selection, query planning, and the settings that matter for real workloads.
- Interview Prep Starter — A structured approach to preparing for software engineering interviews.
About
I'm a Lead Engineer at an information security company. Twelve years in the field, a B.S. in Computer Science from UCF, and enough scar tissue to have opinions worth writing down.
I built this site because engineering can be made infinitely hard. Most of the time we choose the hard way. I've been part of that problem and I've been on the other side of it, and the difference is usually not the technology.
What I write about: things that broke, things that worked, practical guides and checklists for problems that couldn't be explained until they could, and the human side of building software.
I play some jazz guitar, walk the hills of Allegheny County. I make pickles in the cold months, grill in the summer, and spend quality time with my wife and our two delightful dogs.
From the blog
Idempotency: The Property Your Retries Depend On
An operation is idempotent if doing it twice produces the same result as doing it once. Most retries assume this. Most operations don't guarantee it by default.
What Gets Logged and Why (and What You're Losing by Logging Everything)
High-volume logging makes it hard to find signal. Selective logging makes incidents easier to investigate.
The Circuit Breaker: The Pattern You Need Before You Need It
Without a circuit breaker, when a downstream service fails slowly, your service fails slowly too. The pattern is easy to implement. Nobody adds it until after the first incident.
Error Handling in TypeScript That Is Actually Usable
The catch (e: any) is a code smell that tells you the team gave up on typed errors. The alternatives, their tradeoffs, and the patterns that make error handling composable.
The Subtle Bug That Lives in Your Retry Logic
Retry logic is everywhere. Most of it is wrong in the same way: retrying when it shouldn't, or not retrying when it should.
Tools
EventBridge Cron Builder
Build and validate AWS EventBridge Scheduler cron expressions with next-run preview.
Regex Tester (Go RE2)
Test regular expressions against Go RE2 behavior with match highlighting and named capture group display.
Go Datetime Format Builder
Visual builder for Go time.Format() strings with live preview using the reference time system.
WCAG Color Contrast Checker
Check every combination in your brand palette for WCAG AA and AAA contrast. Test dark mode and generate neutral tones.
Tailwind Gradient Generator
Generate Tailwind gradient classes and CSS background values for linear, radial, and conic gradients with live preview.
QR Code Generator
Generate QR codes for WiFi, contacts, locations, calendar events, and Bitcoin payments using structured forms.
