The world is inherently complex. Countless moving parts interact in exponential ways to create a a beautiful, functional but complex system. Even though the constituent parts of the system are really simple the consequent complex interactions give the system it’s unique characteristics. Take the Universe as an example, it’s just couple of subatomic particles all interacting within themselves and the ones around them in ways we don’t even know exist, which gives the universe it’s unique character.
This type of complexity is inherent in any system and let’s call in Natural Complexity. The Natural Complexity of any system is the complexity that is characteristic of the system and cannot be reduced furthur. The Inherent Complexity of the system is the one which the system displays that can be reduced by creating tools. This type of complexity should be cherished. But there is another type of complexity that should be actively reduced to zero and that is Artificial Complexity.
Humans are the one of the few species on the planet Earth that can create tools to reduce the Inherent Complexity of a system, and the only ones who do it well. It’s the capacity to reduce complexity that makes the world go round. But in the race to reduce complexity we introduce Artificial Complexity to the system. It is the complexity that is not inherent to the system but which gets added as the by product of using tools to reduce it. The additional complexity although needed does not add any characteristic to the system in question and should be actively reduced.
Whatever we are trying to do we should be actively trying to reduce the complexity of it, and should take care not to introduce more complexity to the same system.
The most modern tools employed by humans to reduce Natural Complexity is Software. We have gotten somewhat good in taming complex systems with Software and that has propelled the world forward. But there has been a somewhat digressive trend in software nowadays. Comparing to code written decades ago, modern software is buggy, error prone, resource hungry and you guessed it complex.
Most of the complexity of modern day systems can be attributed to the stack of abstractions that it packs under the hood.
Try to make simpler stuff. Nobody likes interacting with Complex pieces of anything, not the ones who make it, not the ones who use it and not even the ones who hear about it. Granted some problems do need really complex solutions, you can’t just reduce a Nuclear Reactor to a single button on an Android App, but nor should managing todos require a 100 page tutorial. We should try to simplify everything down to the absolute core of the problem.
We should not be try to reduce complexity, but obsessed with it. With some forethought and some consious effort we can reduce the complexity of any system down and not introduce new complexity in the process.
Complex Software Sucks
Everybody hates complex software. The ones that require a thousand different states to operate, and pulls in data from a million different places because it can and not because it has to.
So whenever you are trying to make anything relentlessly try to simplify it. You might be left with a beautiful piece of software in the end, that your users would love to use and that you would be happy to maintain.