Complexity is Bad—as a Concept
I don’t like talking about “complexity” any more because while almost everyone agrees complexity is “bad”, people have radically different ideas of what “complexity” means.
“Complexity” in software conflates several distinct concepts:
- plain poor design
- complexity in operation rather than design (or technology)
- inescapable real-world complexity
- lots of moving pieces and details, code that strains working memory
- abstract or novel concepts that are hard to learn up-front, but easy long-term
- probably more I haven’t considered off-hand
Some of these notions are basically opposites! At the Pareto frontier of system design, there is a fundamental trade-off between having more abstract concepts that are harder to learn up-front and exposing more details that make systems hard to work with on an ongoing basis. But people dismiss both of these as “complexity”! These are two ideas that absolutely should not be conflated.
I’ve seen lots of subtle sociotechnic dynamics dismissed as “complexity”. For example, some of the most effective software I’ve seen has been situated software1; that is, software built for, and largely in a specific social context. Think seemingly messy code that is incestuously coupled to a single person’s or team’s workflow. This software might actually be perfectly simple in context, but it’s going to seem painfully baroque to anybody outside that context.
People tend towards mental models that are simple, legible and wrong. More complex models are less controllable models. It’s easier to oversimplify than to understand social dynamics in nuance. The way complex systems—and any system comprised of people is complex—behave is inherently adaptable, context-specific and varied, not amenable to easy top-down control. A bad simple model might be simpler than a better complex model, but when you apply the bad model, you end up with more complexity overall2—the raw complexity in reality hasn’t gone anywhere, but now you’ve introduced a larger gap between reality and the way you’re trying to control it.
Given all I’ve seen, I’ve come to the conclusion that generic exhortations about “complexity” are actively harmful. If you’re going to write a universally applicable rant, just write about how bad design is bad and good design is good! At least that’s something that people will disagree with—I’ve met far more people who insist there is no such thing as “good” or “bad” design than people who insist that complexity is actually better than simplicity.