When [Kent] and I were playing with Smalltalk, we found it amazing what Smalltalk would do compared to anything either of us had used before...sometimes the programming was almost effortless, as if Smalltalk had been made to write that program. It was amazing. But other times we'd be programming away, and we'd say, "Now, wait a second, what are we working on here?" We'd just get stuck. And if we were stuck more than a minute, I'd stop and say, "Kent, what's the simplest thing that could possibly work?"
Cunningham explained that approaching software design from the angle of "what's the simplest thing that could possibly work" was a mind hack that reliably got them free time and time again.
"The simplest thing that could possibly work" soon became adopted as a general design principle by early Agile practioners.
It's not clear how simplicity relates to software. Software is complex, especially in 2021. But there's an easy thought experiment that explains why simplicity should be a goal of software design. Imagine that you are designing a mousetrap. The simple mousetrap that we all know and love probably comes to mind immediately. And another popular design is seen in the board game Mouse Trap.
Of course, we all know that the hilarity of Mouse Trap stems from it being a Rube Goldberg machine. Instead of being the simplest thing that could possibly work it is the most convoluted thing that could possibly work. Half the time, it does not even complete the chain of overcomplicated events that are needed to drop the basket, thereby sparing the player who was unlucky enough to land underneath it.
An ordinary mousetrap is easily preferable.
There are many other expressions of "the simplest thing that could possibly work." The US Navy developed the K.I.S.S. principle in the mid-20th Century. The idea of "elegance" is often linked to simplicity. Edsger Djikstra also linked reliability to simplicity when he said, "Simplicity is prerequisite for reliability." And Leonardo Da Vinci called simplicity "the ultimate sophistication."
A designer knows that he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away.
de Saint-Exupery's Law of Design
Sometimes, complexity in design literature is discussed instead. This is simply the other side of the coin:
The purpose of software engineering is to control complexity, not to create it.
Complexity kills. It sucks the life out of developers, it makes products difficult to plan, build and test, it introduces security challenges, and it causes end-user and administrator frustration.
And, one of my personal favorites:
Fools ignore complexity; pragmatists suffer it; experts avoid it; geniuses remove it.
No one said that simplicity is easy to achieve, though.
Dijkstra, as always, has a great thought to leave us with:
Simplicity and elegance are unpopular because they require hard work and discipline to achieve and education to be appreciated.
Edsger W. Dijkstra