As I prepare this generic-sounding merge request for A Place For My Head…

A GitLab merge request showing a count of 60 commits, 7 pipelines, and 42 changes.

…I’m thinking about what it takes to get things done. My first commit to this blog was a year ago, on the 20th of April, 2020. Until yesterday evening, there was no front page and the few posts looked like this:

A plain, structured but unstyled (except for the code blocks) HTML document.

Most of the content existed only as accumulated notes in the project’s wiki. The site existed in a silo. Not even Google knew about it.

109 commits later, the posts look like this:

A fancy post with styling, metadata, etc.

…with a matching front page that shows actual content. The only major things left to add are proper image handling, comments, and archive pages.

Meanwhile

At work, we had two large web applications that were 95% identical but different in a few key ways. These began development before my time. Instead of being extracted into a common library, identical code was duplicated. Since it had to be continually copied and often adapted from one application to the other—an easy task to forget or postpone—both applications would usually be ‘behind’ in different areas.

I was initially working on only one of the two. I couldn’t see common libraries, so I assumed the other was completely different. When I started working on that one as well, I was taken aback by the duplication. I brought up the situation many times with the team and found out the two started with different purposes, but had converged.

When I checked again in the new year, I found everyone amenable to the idea of merging them; however, it was a daunting task to take on. Much harder than merging two completely disparate applications was the idea of examining two nearly-identical codebases with a magnifying glass to identify the differences and implement the branching logic—the ‘Spot The Differences’ game from hell. It was just an idea we would discuss wistfully, not something anyone was doing.

Or it was just an idea until Wednesday, when I woke up with a sense of purpose. I confirmed we did want to merge them, opened an issue in the tracker, rolled up my sleeves, and started working. I spent two days poring over code and refining my strategy, from the first phase of simply copying files from one into the other wholesale (to be used only for those routes which differed) to later refinements that consisted of checking flags on individual lines. It was a lot of ediff, a lot of sort-lines and import-sort to normalize files, a lot of switching back and forth between environments, a lot of relief at having taken this on after finally accepting PowerShell as my lord and saviour, and a lot of carefully targeted copying, pasting & tweaking. Most of all, it was simply a lot of work that no one ever wants to do. Now we have a single, unified codebase for everyone to work on. There was nothing glamorous about it and it didn’t change anything the user sees,[1] but because of this work, we can now put our effort into making this single version better many times more quickly and implement improvements we’ve been talking about forever.

Hard Work Works

That’s what I’ve focused on in the past few weeks. The things I avoided. Backlog. Technical debt. The tedious but necessary. The intimidating and complicated but necessary. And you know what? Doing things works.


  1. In fact, maintaining identical behaviour, whether it’s correct or not, was the goal. Fixing things will come later.