I started reading Vehicles, by Valentino Braitenberg. Braitenberg asks us to consider the implications of extremely simple notional machines. For instance, the very first machine has only a single motor controlled linearly by a single sensor.
If we say that the sensor senses heat, then this machine will move faster in warm areas (seemingly trying to escape them) and slower in colder areas. If we then add small “perturbations” to its environment—say, water currents, or other objects randomly nudging it—it will appear to wander around in a rather “lifelike” manner. It will appear to have a kind of purpose, even though we know it is nothing more than sensor and motor.
Braitenberg demonstrates how adding only a few more elements to such a vehicle vastly increases the richness of its behavior.
Vehicles with only two sensors and two motors can appear to display tendencies towards an energy emitter that we might term fear, aggression, or love, if we didn’t know we were looking at a simple machine.
What if we again add some sources of random perturbations and throw a swarm of these ultra-simple machines together and allow them to also perturb each other? We get a system of extraordinarily complex emergent behavior… even though the individual elements are about as simple as we could imagine.
To restate: this system is not complicated. But it is complex.
Now consider a Chad Fowler-style microservice architecture (or Fred George-style, if you prefer). E.g. microservices so small that they fit on a single screen. We don’t rewrite or add to them; we throw them away and make new ones.
These services are simple. But throw them all together, interacting with each other and perturbed by real-world inputs, and what do we get? Emergent, unpredictable behavior and interactions.
This is a system that is not complicated. But it is complex.
Or in other words: Simplicity leads to complexity.
This isn’t a bad thing. Complex systems are rich systems. But living with them requires a graceful approach. We very quickly pass the point at which it is feasible to understand the system, let alone predict it. Instead, we need to be able to deeply observe the system, mitigate failures (but only after the fact!), note trends, and nudge it in new directions.