I had to go through an “AI” course recently for work, which included a couple of homework assignments. The intent was that these would be company-specific, but because 1 of these had to be posted on GitHub1, I have a version without internal data. That was the RAG assignment (probably the closest thing the “AI” hype has to a redeeming value). In theory, this would seem academically dishonest, but 1) I had to make the repo public to submit it, 2) it wasn’t really “graded” so much as “checked to see you did it at all,” 3) assumed that everyone was just slopping it out as a vibe coding exercise anyways. Since they didn’t really seem to care if learned anything, I don’t really care about posting the answer. For people who do want to learn and do it themselves, this isn’t really that complicated, and can be done in your spare time over a weekend.
(more…)-
The curious case of the unrun defer
Over the course of learning Go, I’ve come to like some aspects of the language. 1 of those is the
(more…)deferstatement. For those that aren’t familiar with the language,deferqueues up a function call for just before your current function exits. I’ve found it similar in purpose to afinallystatement in Java, a keyword that helps ensure that some piece of code is run. It’s just that defer can be put right next to the thing I want to clean up, instead of trying to remember to include it at the very end of a wrapper around everything. As part of testing what I write by just running the code, I’m setting up a databases for test packages, and usingdeferto clean them up once the package tests are done. Except…thedeferwasn’t running. So, what gives? -
The “I had to lay everyone off because AI changes things” slop notes
Recently, ClickUp joined the (very large) club of companies laying off tons of people and trying to say that it’s “bEcAuSe Of Ai.” I had this sitting open for a while because there’s a lot of stuff I wanted to comment, and while I was well underway of a Tweet (never X) thread (EDIT: linked the thread), I realized I was basically writing a blog post in umpteen parts, so I’m just going to roll up the same commentary here to make things actually readable.
(more…) -
I need to start shipping crap
That title is a bit dramatic. I’ve written infrastructure as code, pushed stuff to AWS, and supported it for over 10 years. I’ve gotten a bug report in the morning and messaged the support engineer (via Hipchat, because that’s how old I am) that afternoon to let him know the issue was fixed. But most of the “let’s get it out quickly” I’ve worked on over the last several years has been bugfixes. And up until fairly recently, I’ve been in a “big enterprise” environment (although around the time I left we were being encouraged to “pretend we were in a startup” in an attempt to convince us to work weekends to make a release date that was made by people who shouldn’t have been making release dates way too early to be making release dates), so putting things in production was such an involved process that required work from so many other people that my “let’s get this in prod” muscles have atrophied, severely. Now I need to get them back.
(more…) -
“(Pain) is a good thing”
The movie Kingdom of Heaven has 1 of the best knighting scenes in cinema – punctuating the knight’s oath with a hard slap, because “…that’s so you’ll remember it.” While software development doesn’t come with quite the same…”haptic feedback,” the fact is a lot of us have leveled up after getting metaphorically slapped around. It sucks in the moment, but that suffering is so we remember the lessons we learned.
(more…) -
Simple and easy HTML validation in Go
I didn’t spend as much time in 2025 working on my gift registry, so all I really have is a login flow and profile management. I am building out a test suite that seems to do a pretty good job of validating the code works (I’ve only had a couple of bugs the automated tests didn’t catch, but did after a quick update, and more than a few that the tests did catch) – mostly because I’m just running the code when I test. It’s a server-side rendered app, using Go’s html/template package, so validating the output has been more difficult than reading JSON data like you would in a traditional web app. I tried Playwright, and that was really handy, but also slower than I wanted, so I abandoned it1, and wound up just writing a quick-and-dirty depth-first DOM search that does the validation that I really need, which wound up being a lot easier than I thought.
(more…) -
Who’s going to end up holding the flashlight?
Have you ever been asked to help with something, agree to do it, only to find out your job is to just stand there and hold a flashlight while someone else does all the work? Then, when they’re done, they thank you for the help? When you’re a kid and get relegated to flashlight holder, it’s the most depressing feeling in the world. You did literally nothing, and the other person had the gall to thank you. Then you get older, and have to do some job that requires a third (or even fourth) hand, and all of a sudden having someone there to just hold something in place for you actually is a really big help. I get the impression that the whole trend of AI development is a bit struggle to figure out who’s doing the work, and who’s doing the minor, but still very helpful, assisting.
(more…) -
Why I’m shifting my programming vocabulary
Yes, I know I missed the peak on renaming software terms, like changing the default trunk branch name from “master” to “main,” or the trend of renaming “whitelist” and “blacklist” to “allowlist” and “blocklist,” but I’m also not trying to change how I talk because people are capable of stretching words until they get offended. That’s always going to be an issue, and I don’t have nearly enough patience to indulge it. What I am trying to do is avoid terms that have developed connotations that lead to bad programming habits, and replace them with ones that are clearer about what I’m trying to accomplish, and don’t invite people into fixating on the wrong pieces and losing sight of the point.
(more…) -
Product management really does matter
Not too long ago, Joel Spolsky’s blog post about architecture astronauts hit my various consumption feeds, and it serves as a good reminder that, as fun as it is to make fun of product managers (and it is a lot of fun), they’re also probably the most important people in software development. That may seem a bit over the top, seeing as how QA engineers are the ones who ensure that what’s shipped actually works, developers like me actually write the applications and services in the first place, and then there’s the operations teams that build and run the production infrastructure the code actually runs on. It sure sounds like there’s a lot of other people with a lot more direct connection to the actual engineering bits. The truth is, we’re all important, but without good product management, it’s entirely possible for everyone else to do a perfect job…and the release still fail.
(more…) -
If you’re going to just run the code, just run the code
I’m very pro “just running the code” when it comes to testing software. But while just spinning up containers does actually “work” – in the sense that the test runs and completes without error. But you very quickly realize that’s clearly not how these things are supposed to work. I’ve been using testcontainers to test the gift registry app I’ve been working on, and it’s been great. I’ve implemented a basic passwordless login setup, and I can test every part of this using live code with the sole exception of actually sending an email via a simple
(more…)make test. But this was very obviously not the best way to go about it, as you can see from the test output: