At Codurance, our MDs Sandro Mancuso, Mashooq Badar and José Huerta regularly meet for informal chats after work. These discussions, where they share their personal insights, form the basis of our Fireside Chats, which you can find on our YouTube Channel.
This episode the trio discussed “Why is our software so complex?” and began with why essential and accidental complexity was a good way to frame the conversation.
José explained that essential complexity is the type of complexity that is inherent to the problem that you're trying to solve with certain steps. So accidental complexity was anything else added to that: “And that's when we increase the complexity of what we're doing. This could be selecting a different stack or architectural decision or design principle or programming power, then whatever it is that you choose knowing one of the tools, or the approach that you follow to solve the problem may introduce more.”
Mash added: “It takes you to problem selection, right? So problem selection is the first part of problem solution, which problem you are trying to solve actually allows you to reduce complexity. So you can if you don't select the right problem to solve, you're already introducing accidental complexity.” Mash then shared examples with context and form.
Sandro brought in previous occasions in the design phase or the planning phase, “Not only the simplest thing could possibly work… we would end up putting obstructions everywhere because then whichever way the system evolved that area, we would be protected, but we would be paying the price of a more complex structure across many other areas if we would not evolve beyond a reasonable idea of the more agile way of work.
And we introduce obstructions and complexity when those things evolve, or we need application in that."
He then introduced the concept of the inflection point: “I think that everything we must do is for simplicity in the long run. Everything else we do afterwards we work on whatever we have.”
Takeaways included that often the best way to simplify the problem and explore the solution is looking for multiple solutions, perhaps through code, considering the copy of the conclusion across multiple levels.
Another conclusion was that software developers need to be aware of what is accidental and what is essential complexity to help create simpler, better solutions.