Kent Beck wrote a lovely note on Facebook on the strategy the company adopted to fighting complexity:
He argues that complexity is the biggest enemy to scaling. And complexity, in turn, is driven by four different attributes of the system:
- States. When there are many elements in the system and each can be in one of a large number of states, then figuring out what is going on and what you should do about it grows impossible.
- Interdependencies. When each element in the system can affect each other element in unpredictable ways, it’s easy to induce harmonics and other non-linear responses, driving the system out of control.
- Uncertainty. When outside stresses on the system are unpredictable, the system never settles down to an equilibrium.
- Irreversibility. When the effects of decisions can’t be predicted and they can’t be easily undone, decisions grow prohibitively expensive.
A successful complexity-fighting strategy must focus on eliminating one of those attributes completely and figure out a way to manage the rest.
Since uncertainty is a factor of outside forces that our by definition outside of your control, it is extremely hard to design a strategy focused on it. Strategies focused on reducing the number of states are effective in some cases (Henry Ford’s Mass Production is a notable example). But in complex systems, like software, managing states and predicting interdependencies is incredibly difficult. So instead Facebook chose to focus on eliminating irreversibility in almost everything that they do with their software: for introducing “feature switches”, through doing gradual deployments to having backup internal communication channels in case the site crashes.
A rather compelling case for auditing the full spectrum of decisions your organization makes, identifying the ones that are currently irreversible, and figuring out what it would take to make them reversible.