A couple of days ago I run into a meme on Fred Brooks’, No Silver Bullet. I don’t remember what exactly the meme was about or where I saw it, just that it had something to do with this awesome paper. It happens to be one of my favourite papers of all time in computing. The paper talks about something that most of us software developers think and claim is obvious but somehow we frequently ignore.
The biggest take away for me from that essay is that there are two main sources of complexity in software. There is complexity that comes from the inherent difficulty in the problem we are solving. This is called essential complexity (complexity that emerges from the essence of the problem we are trying to solve). There isn’t too much that can be done to get around this. Your solution regardless of what you do will tend towards complexity because of it.
The other source of complexity happens to be around the choices we make. Choices range from the tools we chose, all the way down to the tiniest architectural choices. This is essentially self inflicted pain and it is referred to as accidental complexity. You are trying to build a simple CLI app and you decide to go with Java (could be worse, PHP) because well, that’s all you know. Your choice of language there will be your main source of headaches.
Accidental complexity is an odd phenomenon. For something that I am supposed to be in control of, it has been the main source of pain in my career as a software developer (or programmer). There have been cases where I have faced a problem that is indeed complex at its core but if I am honest with myself, these are rare. For the most part, it is just me fighting the tool that I am using to solve a particular problem.
ETBJ!!! Had this article stuck in draft for 3 months and completely forgot about it… Publishing it as is.