02 March 2023

Fixing It, and other uses for Duct Tape

 "If you can't fix it with duct tape, you didn't use enough duct tape"

-- unknown

"The problem is not the problem. The problem is your attitude about the problem"

-- Capt. Jack Sparrow

I've been thinking about fixing things lately. Like the general process of fixing things, not a specific list of things that need fixing (but I have one of those too). I thought I could share some of my thoughts on fixing things here.

Don't Fix Symptoms

A lot of times I see people trying to fix complicated problems by attacking the symptoms of the problem. Rather than pausing a moment and understanding the context of a problem they just tape over whatever it is and move on. This leads to layers of tape. Each layer of tape has its own consequences. And eventually, entropy catches up with you and you can't fix anything. You are too busy fixing your fixes. You should be fixing core problems.

Speculation Is Risk

Many times the reason we're patching over symptoms is due to an incomplete understanding of the problem we see. That is, we think we know the cause of our problem and we move forward. Being prone to action and probably a little overconfident we fix what we think are core problems but we're just covering up another symptom. Speculating about the cause of a problem is risky. It's better to know the cause of the problem.

Core Problems

How do you know you are fixing a core problem? 

You can't find another cause. That is, given a problem you are not able to identify another cause. This is challenging. There are a trillion moving parts in software systems, and identifying the broken one is challenging. All of us have spent hours searching the internet, peeling back layers, and reading source code in search of the causes of our pain. Experience and technique are the salves to this wound. 

Lacking Experience

If you lack the experience that's ok. Just take a deep breath and approach the problem methodically. Try small experiments. Work quickly but in a disciplined manner. With each experiment, write down what you tried and what the result was. Keep trying until you are exhausted. Then, if you still don't have it, seek expert advice. Maybe the problem is intractable and that's ok too. Just back up and look for another way to solve the bigger problem. 

Leverage Comes from the Fulcrum

If you do solve a core problem you won't just have fixed one thing, you will have fixed many things. You've fixed that core problem, but you have also fixed all the symptoms of the core problem. If the core problem was really deep in the system the impact will be huge! 

Whack A Mole

So what happens if we don't fix the core problems? 

You will spend a lot of time and money playing Whack A Mole.  Every time you fix a problem that isn't the core problem you are likely to create or reveal another problem. If that doesn't happen, the core problem will find a way to reveal itself again. Sometimes you will fix an issue and a few weeks later fix another related issue and not even notice. That is because you didn't do the analysis and figure out what the core problem is. 

Pyrricic Victories

Let's go back to that heat-death thing. Look at what you are doing and ask yourself, is my investment in the current solution so great that fixing it is as effective as replacing it? Because sometimes fixing it creates so much damage in the system you'd have been better off leaving it alone than fixing it. 

Expenses

While you are playing Whack A Mole you are wasting the resources of the organization. You are creating a barrier between you and value delivery. Remember that our job as software engineers is to create and deliver value. 

Sunk Cost

Often we fall into the Sunk Cost Fallacy and that further prevents value delivery. Keep in the back of your mind that software is supposed to be soft. If the best-right thing is to rip out the broken thing and replace it, then do that. But do it for a reason, not emotional, but justifiable. 

Don't keep banging on the problem, core or otherwise, without considering that eliminating the cause is the right solution. And think big scope here, not what does this cost in my sprint, but what does it cost my organization?

Conclusion

We don't spend enough time talking about these subjects. We don't spend enough time educating everyone about the causes of strife and pain in the organization or the systems we are building. We certainly don't do a good job of teaching diagnostic techniques. 

Taking the time to find the root cause of an issue and fixing that, rather than the myriad of symptoms caused by that problem is well worth the effort. Being open to radical solutions is also necessary for creating effective solutions. Save your duct tape for more interesting projects.