Silhouetted cybersecurity professional monitoring colorful data flows and server alerts

Application Logs Are Your Friend (and How to Write Them)

Application logging done right means picking the right log level, masking PII with Serilog, and understanding how sinks route your logs.

A while back I wrote about why application logs are your friend: when something breaks in production, read your logs before you panic and roll back. That post assumed the logs were already good. It never asked the harder question: who wrote them, and did they write them well? Good application logging is a skill, not an afterthought, and most of us pick it up the hard way, one 2 AM incident at a time.

Android and iOS development paths with code, .apk, and ipa files

Building One Publish Script for Two App Stores (and Debugging the One That Almost Worked)

One publish script for two app stores hid three PowerShell bugs, including a case-insensitive variable collision with a switch parameter.

I wanted one command that builds a release, stamps the right version into it, and hands me an artifact ready for the App Store or Google Play. No manual archive steps, no hunting through Visual Studio menus, no “wait, which signing profile did I use last time.” Just a publish script for two app stores.

wtf failure

MAUI iOS Archive Fails on Windows: The Real Cause

A MAUI iOS archive fails on Windows with a cryptic Unzip error. Two documented bugs looked like the cause and weren’t — here’s the real fix.

A MAUI iOS archive fails on Windows with a cryptic Unzip error. I burned an afternoon blaming two real, documented bugs before finding the actual cause: a plain JSON file. Have you hit “The filename, directory name, or volume label syntax is incorrect” or “The given path’s format is not supported” while archiving a .NET MAUI iOS app through Visual Studio’s Pair-to-Mac? Save yourself the detour. Here’s the whole mess, dead ends included.

spooky abandoned mansion

MAUI iOS Provisioning: Why Old Certs Return

Visual Studio’s Pair-to-Mac tooling keeps restoring dead Apple certificates because MAUI iOS provisioning now lives in a different cache location.

I spent an evening trying to convince Visual Studio and my Mac that I no longer work for a defunct company — and that my MAUI iOS provisioning setup has nothing to do with it.

dominos ready to all fall down

The Real Cost of Developer Context Switching (And Why ‘Quick Fix’ Is a Lie)

What does developer context switching actually cost? A real production incident, plus the research on why ‘just a quick fix’ is more expensive than it looks.

Developer context switching sounds like a minor inconvenience. Then you live through what it actually costs a project. Here’s what it cost one of mine.

Hype

Every Software Engineer Is About to Lose Their Job. Again.

Twenty years in software has taught me one thing: every generation swears the current abstraction will be the one that finally eliminates programmers. Compilers, COBOL, 4GLs, no-code — none of them did. So when people say AI will end software engineering, I think about what actually happened last time.

I’ve been in this field for over twenty years, and in that time I’ve watched a lot of technologies show up promising to revolutionize the industry. Some of them actually did. Most didn’t. Each time, people proclaim that every software engineer is about to lose their job. So even though I’ve been using chat-based AI for a while now, I was slow to touch the newer agentic coding tools. Call it stubbornness, call it healthy skepticism, call it whatever you want — I just wasn’t in a hurry.

linux console

host.docker.internal Is a Liar (On Linux)

A 5-second page load survived a moved-off-Docker-Desktop UAT deploy, three red herrings (CPU governor, IPv6, disk contention), a crash-looping RabbitMQ broker, a silent Redis hang, and a one-digit port typo. The actual culprit: host.docker.internal doesn’t auto-resolve on native Linux Docker Engine like it does on Docker Desktop.

I spent two days chasing a 5-second page load that had no business existing. Along the way I blamed the CPU governor, IPv6, disk contention, and a laundry list of side projects running on the same box. All of those theories were reasonable. None of them were it. The real answer was one bad assumption baked into a couple of connection strings, and it wore three different disguises before I finally cornered it. The gist of it: host.docker.internal is a liar (on Linux).

Here’s the whole mess, in order, mistakes included.

passive aggressive open-source maintainer

How to Alienate Your Users: An Asshole’s Guide For Responding to Help Requests in Open Source

The post discusses how open-source maintainers can alienate users through poor communication strategies. Key behaviors include ignoring help requests, being condescending, defensive, vague, neglectful of documentation, lacking transparency, being inflexible, and failing to express gratitude. These actions create a negative user experience and reflect poorly on the project.

Open-source projects thrive on community participation and collaboration. As a maintainer, how you respond to help requests can make or break the user experience. Here are some key points to implement if you want to ensure you alienate your users.

full-stack

What is a Full-Stack Software Engineer?

You’ve heard the buzzword, you’ve seen the job postings. If so many people are hot about this topic, it must be worth learning about, right? What is a full-stack software engineer anyway?

You’ve heard the buzzword, you’ve seen the job postings. If so many people are hot about this topic, it must be worth learning about, right? What is a full-stack software engineer anyway?