Simplicity, the key concept for high-quality software
- TODO: decouple from software engineering
Thanks to Rich Hickey for Simple Made Easy: the talk with a profound impact on my work, communication & way of thinking. The talk is the basis for this note.
Why simplicity matters? To answer that question, we first need to understand what simple means. Let's look at the word origin:
Simple, from Latin simplus: a medicine made from one constituent, especially from one plant..
origin of the word simple (Oxford Dictionary)
So simple means of one fold, one braid, one constituent. For example, this note talks about one topic: simplicity in building software. This note is simple by our definition. In software, we define the concept of simple as to be of one role, one task, one concept, one dimension from which we look at things. For example, the
grep command in shell is simple: it relates to one task, that is, searching input files.
The opposite of simple is complex: of more folds, of more complected braids. Imagine I start talking now about Michaal Jordan and how he won the 6th NBA championship with Chicago Bulls in 1998. I'd introduce complexity: the simplicity braid would complect with the braid of Michael's story. The same goes for software. For example, the database table
Person with columns
name, age, company_address, company_web, is complex: two concepts, the person and the company, are stored within one table.
Note that simplicity is not about cardinality, that is, the number of things. For example, when I write, I strive to write a simple note. And there are multiple notes written with such ambition.
How complexity impacts our ability to build reliable systems?
In our heads, we can consider only a few things at a time1. Everytime you combine two things, you twist two more things. So every intertwining adds this burden, and the burden is combinatorial. Fundamentally, this complexity, this twisting, limits our capability to understand our systems. How can we possibly make things reliable that we don't understand?
Rich Hickey, Simple Made Easy
So before you fix a bug or add a feature, you need to understand what the code does. Understanding is critical. Understanding also impact speeds: without understanding, things slow down2. And speed matters, at least for code that is not throwaway. You want speed? You seek simplicty.
Simplicity is prereqisite for reliability. Simplicity and clarity are not a dispensable luxury, but a crucial matter that decides between success and failure?
Edsger Dijkstra (essays)
So which system shall we strive to build? The knitted castle, a complex system of complected braids, or the lego castle, a system of simple components? If you choose the lego castle, welcome. I will show you how deep the rabbit hole goes.
If you need help with building the tech products get in touch.