I want to install a tool shelf in my basement. I thought I'd just wash the wall, drill some holes, hang the shelf and be done with it in a few hours. It took 7 days! I will relate this to software development if you bear with me.
The Home Project
First, I needed some supplies. I needed a masonry drill bits for my drill, because I was pretty sure I'd be drilling into some brick or concrete. That's the first trip to Home Depot.
Then, I decided I didn't want to hang the shelf on a dirty wall, because there was a stain from a leak fixed long ago. So, I wash the wall with some soapy water. That helped, but I decided I should recoat this wall with some drylock paint and make it look snappy.
I had a gallon and a half of the paint from way back when we moved in, but did my second trip to Home Depot for a masony paint brush and some painter's coveralls. My basement wall is not a solid wall; it is split into two sections. The bottom half rocky and not smooth. The top half is brick, and there is a notable lip between the two. I also picked up a 2x4, with the hopes I could drill the 2x4 into the wall, and the shelf into the 2x4. Fewer holes in the brick foundation sounds like a good idea.
I lay down some painter's cloth, move a ton of stuff in the basement, and put on the painter coveralls. Then I open the first Drylock Paint can. It is all hardened and unusable. Ugh! Then I open the unopened Drylock paint can. The paint had separated, with the top being a clear liquid and the bottom being a white hard sludgy mess. I thought I could have taken it back to Home Depot and had them remix it in one of their fancy paint mixers, however I was already suited up for painting. So, I decided to mix it myself with a wooden painter stick and see if I could get it usable. It was tedious, frustrating, and messy. I spilled way too much of that clear stuff. I ended up with a gloopy mix, and decided to give that a shot painting the wall. I got about three quarters of the way through the wall before I ran out of paint. The bottom half of the paint can was so hard, it broke my painter's stick trying to mix it. Back to Home Depot for a new can of paint. This new can had a significantly better texture, and I was able to finish painting the wall and even give it a second coat.
I will tie this back to software, I promise!
Unfortunately, the screws that came with the shelf were deeper than the board's depth. I decided to drill through the wood into brick, for all 18 holes required by the shelf. I put the shelf on the wood, marked the hole spots with a marker, removed the shelf, and started drilling. This was slow going because the drill bit kept overheating, so I could only do 3-4 holes per session.
Once done, things didn't like up perfectly, and I was stymied. I messed up one hole significantly, and I think two others are just slightly off. I decided to take a different tact. I took the board outside and put it on sawhorses, and redrilled--really widened--the holes so the shelf would fit. Then back to the wall, and some redrilling into the brick. I think I can make it work.
Now I had 18 drilled holes, but red dust all over the place, and wanted to clean that up. I removed the board, did some more cleanup, and put down another coat of paint. Then I hung up the board and painted the board. After that dried, I started hanging the shelves. All screws fit except one. I took a smaller masonry drill bit and drilled through the shelf screw hole, the painted wood board, and into the brick. That solved it. I now had a hanging shelf.
My one day task took a full week and I had three trips to Home Depot. Why is this like building software?
Back to Tech
Most of the software tasks I have taken on in the past year have gone as smoothly as hanging this shelf. As an experienced engineer, we should be able to think about code 10 steps ahead and make sure we do not back our project into a corner. Sometimes each story has some refactoring built in. Sometimes there is more discovery and learning than expected, especially when dealing with new technology.
Let's drill into an example (no pun intended). I am building an integration library for Svelte with an internal auth microservice. Someone had previously build a POC, but my job was to move it into a library so it would be "drop in" easy to real applications. The team thought it'd be a lift and shift from the prototype to the lib. However, a more experienced Svelte developer in the company strongly recommended we rework to make use SvelteKit, the server-side rendering piece of Svelte.
In UI code, we often store user session data as a global value, possibly injecting it where it is needed. However, on the server side it would be considered an anti-pattern to persist session data associated with an individual user in memory. This required significant refactoring for the code, for every time it referenced the user object; the user object had to be created with the current session data.
Also, a Typescript lib that this ticket relied upon only output, CommonJS files, and not modern ECMAScript (EMS) files. That was causing some build issues which needed to be fixed.
Oh, and no one had set up a unit testing framework on the Svelte lib, so I had to do that too.
My 1 week ticket took close to a month.
Final Thoughts
What seemed like a simple task, complicated itself as I started to peel back layers. Sometimes you estimate tasks wrong, and sometimes there is work not immediately obvious when you evaluate a project. But, we plow through it and adjust as we need to in order to bring business value out of the software we build.
Here is my Shelf:

