18 Oct 2025
Simplicity in software
Simplicity in Software
Rich Hickey
- "Simplicity is a prereq for reliability" ~ Dijkstra.
- Cardinaility is not simplicity. A simple thing may be large, in fact it is. What matters is how 'tangled' it is.
- Simple is actually an objective notion. As in, it can be quantified based on how entangled the thing is.
- Easy comes from the "ease of use" or the "familiarity" of the <insert x> that you're trying to use.
- It's relative!
- If you want everything to be familiar, you will never learn anything new because it can't be significantly different from what you already know and not drift away from the familiarity.
- Separate the construct (code) from the artifact.
- We have small context memories. Keeping large things in our heads is not our strong suit.
- If you can't reason about your program, you can't make these decisions.
- List of complex things:
- State
- Methods
- Inheritance
- switch statements
- pattern matching
- loops/fold
- List of simple things:
- Values
- Functions
- Namespaces
- Polymorphism
- set functions
- If something depends on the private behavior of something else, things are complex.
Peter's Ink and Switch talk
- Complexity isn't difficulty.
- Complexity occurs when your systems interact with each other and become 'unreasonable'.
- You literally lose the ability to reason about them. You cannnot predict what's going to happen next.
- However, a complex system can also be generative and surprising if you harness that complexity in positive ways.
- The most basic reason code gets complex fast is because we start off naively and then have to keep adding defensive measures to it.
- This leads to shotgun parsing, which creates a big giant mess of a codebase.
- You have validation checks and stuff littered everywhere.
- The actual logic of the code begins to turn into dust.
- The value of well written libraries and languages and type systems is immense. They can greatly simplify your code and make expressiveness their prime goal.
