DEV Community

Cover image for On Software Complexity: Why Can't We Make Simple Software?
Peter Mbanugo
Peter Mbanugo

Posted on • Originally published at pmbanugo.me

On Software Complexity: Why Can't We Make Simple Software?

I got varying response to my LinkedIn post (one of them I had to block) about software complex systems designed with complexity vs simplicity. To re-iterate Gall's Law:

"A complex system that works is invariably found to have evolved from a simple system that worked. The inverse proposition also appears to be true: A complex system designed from scratch never works and cannot be made to work. You have to start over, beginning with a working simple system."—John Gall, Systems Theorist

One of the pushback was something in the lines of "Modern systems often cannot start simple because they must satisfy non-negotiable requirements from day one".

While there are non-negotiable constraints, this varies from project to project.

What I see often is "complexity by default" mindset. While we argue for the need for complexity for various reasons, I think we can make a distinction between "accidental complexity" and "essential complexity". An essential complexity is something you understand, and by doing so can handle. It doesn't have to leak into every component of your system.

The image I below (generated with Google's Gemini Nano Banana) is an excerpt from the paper—A Plea for lean software, by Niklaus Wirth.

A Plea for Lean Software: The belief that complex systems require armies of designers and programmers is wrong. A system that is not understood in its entirety, or at least to a significant degree of detail by a single individual, should probably not be built.

Your end user doesn't have to suffer from your intentional or unintentional (?) accidental complexity. In fact, this is one of the reasons why software projects fail in the long run. It looks all fine in the moment. You get promoted because you spend hours in meetings bragging about using various flavours of SSR, SPA, MPA, SSG, or whatever acronym your merchant of complexity sells you. You show off your Kubernetes, Kafka, or fantastic Serverless architecture.

These tools are fine. They're not usually the cause for bloat, system or project failure. It's the default mindset of—It's got to be complex from day one. I've got to impress my engineering manager and peers because I used "modern architecture". Stop.

I'm not sure if "merchant of complexity" vendors are to be blamed, or the bootcamp/schools who teach frameworks rather than system and design thinking. I fell into this trap as well 🫠

Rethink your approach. Make sure you understand the system you're building. Aim for simplicity and build up from there.

Start by asking: Can I explain this entire system simply, and in 30 minutes or less? If not, you might be building the wrong thing.

Top comments (0)