Rich Hickey, inventor of Clojure, gave a talk at last year's Strange Loop called Simple Made Easy. In it, he makes the case that Lispy languages and Clojure in particular provide tools for achieving modularity and simplicity. Simplicity Matters, Hickey's keynote at RailsConf in April of this year is a variant on the same themes. Here are my notes, either quoted verbatim or paraphrased.
“Simplicity is a prerequisite for reliability”
- Edsger Dijkstra
“Simplicity is the ultimate sophistication”
- Leonardo da Vinci
Simplicity vs complexity
Complexity comes from braiding together, interleaving or conflating multiple concepts. Complect (braid together) vs. compose (place together)
Simplicity is defined as having one role - one task, one concept, one dimension. Composing simple components is the way we write robust software. A good designer splits things apart. When concepts are split apart, it becomes possible to vary them independently, use them in different contexts or to farm out their implementation.
There are reasons why you have to get off of this list. But there is NO reason why you shouldn't start with it.
Abstraction for simplicity
Analyze programs by asking who, what, when, where, why and how. The more your software components can say, "I don't know, I don't want to know", the better.
- what: operations - specify interface and semantics, don't complect with how; how can be somebody else's problem
- who: data or entities
- how: implementation, connected by polymorphism constructs
- when and where: use queues to make when and where less of a problem
- why: policy and rules of the application
Data is really simple. There are not a lot of variation in the essential nature of data. There are maps, there are sets, there are linear sequential things... We create hundreds of thousands of variations that have nothing to do with the essence of the stuff and that make it hard to manipulate the essence of the stuff. We should just manipulate the essence of the stuff. It's not hard, it's simpler. Same goes for communications... (44:30)
Information is simple, represent data as data, use maps and sets directly (56:30)
(From the RailsConf talk:) Subsystems must have well defined boundaries and interfaces and take and return data as lists as maps (aka JSON). ReSTful interfaces are popular in the context of web services. Why not do the same within our programs?
Simplicity is a choice, but it takes work. Simplicity requires vigilance, sensibility and care. Choose simple constructs. Simplicity enables change and is the source of true agility. Simplicity = opportunity. Go make simple things.