The total complexity of a system is a constant. If you make a user’s interaction with a system simpler, the complexity behind the scenes increases.
That’s Tesler’s Law, from Larry Tesler, the cut-copy-paste guy. You know there’s a whole Wikipedia entry waiting to outline most of his career.
The way I put think of Tesler’s Law goes something like this:
In any given application, someone has to inherit the complexity. Usually, that’s you or your users, and it’s inevitably you.
I call that Charlie’s Law it is not nearly as catchy.
But what is complexity, to me complexity is the non-linear actions a given application has to perform. This is usually the result of side effects or network requests. In a given system or organization, it’s the competing conceptions of what value an application provides or roles it must fill.
In order to deal with the “reduction” of complexity is really to accept that Tesler’s law is true and that we need a shared a better conceptual model of what something is. Notice, shared. You could come to your private beliefs, but that will maybe get you a really great Twitter following from the ensuing shitposts, but if it’s not shared with your team what have you actually accomplished.
Building complex applications is often less about technology and more about evangelism/propaganda or coming to a common understanding. Simplicity is a hard-earned slog but one worth it for the people who inevitably will have to use the thing you’re building. The work isn’t the labor of writing code, it’s in consensus and shared understanding.
More about Tesler’s Law