Tuesday, May 30, 2006

Simple ain't Easy: Myths and Misunderstandings about Simplicity

Obviously not all of us have the same idea of what Simple or Simplicity actually mean, specifically in the context of system design (including software, and processes). Here are some common misunderstandings that I frequently encounter about the meaning of "simple design":
"Simple" is not the same thing as "easy to do/understand."

Sometimes something that is "simple" is easy to do or easy to understand. Whether or not it is easy, is often more closely related to how familiar or intuitive it is. Eventually, it may be quite simple to do or understand. But initial attempts to do or understand it may be anything but easy!

The simpler solution may require us to learn something new, and think about something in a way that hasn't occurred to us before. Closed-minds will often close-doors on new ideas (simple or otherwise) because they simply don't want to entertain changing their current views and beliefs.

"Simple design" is not the same thing as "simple to develop/deploy."

If it's simple from the get-go, then it may perhaps be simple to develop/deploy. If the solution is already in place, then making it simpler may involve changing a lot of minds/behaviors as well as a lot of the system, and both of those may be anything but easy to do (especially changing minds/behaviors).

"Simple" is not the same thing as "good enough!"

Put another way, Simplicity != Sufficiency. "Good enough" has more to do with whether something is sufficiently workable "for now" while still fostering subsequent improvement or refinement for later. That doesn't mean the deployed result is simple/simpler; it just means we may be better served by getting to that point in an incremental and evolutionary (emergent) fashion.

In order for that to be true however, it means that the partial/incremental solution must be easy to subsequently change in order to refine and improve!!!

If I install something that is incomplete with the intent of making it more complete, and if it is very hard/painful to change, then I may end-up with the current-state-of-affairs for a number of IT solutions and business-processes: short-sighted, insufficient solutions that the organization defends, and chooses to suffer and impose on others because they don't want to suffer the impact of the change that could bring about relief from the suffering they have become accustomed to living with.

"Simple" is not the same thing as "simplistic!"

A simplistic solution often does not work! One definition of "simplistic" might be the false appearance of simplicity. It's not enough to seem/appear simple. It also has to work (successfully) in order to actually be simple!

Many times someone will discard or exclude a suggestion because it introduces something additional or new into the current design, and they don't want to add anything more/new in the name of simplicity, but they may be being simplistic instead. If the new/added thing is a rightful part of the problem that needs to be solved, then its introduction is correcting an act of omission in the solution design that neglected something essential in the problem-domain.

Sometimes we exclude things that we don't want to see (in the name of simplicity) which are nonetheless a real-world element of the problem we need to solve. Dismissing them in the case where ignoring them has failed to solve the problem, is not simplicity; it is ignorance. It is okay to want something that is "stupidly simple," but not at the expense of being simply stupid!

If the result doesn't do what it's supposed to do when it's supposed to do it, it may seem simple, but, as Gerry Weinberg points out, it's likely that something crucial to the problem statement was omitted or misunderstood either in the design, or in the problem statement itself.

What is "simple" for one request may not be "simple" for the whole!

When faced with a single, seemingly simple request to enhance a system, the requestor may want the specific solution to be simple for their particular situation and perspective (this is sometimes called "point-based thinking"). But what usually needs to be simple is the resulting overall system. Making it simple from one view or situation may just compromise other parts (and stakeholders) of the system. That's not eliminating complexity; it's not even "sweeping it under the rug"; it's just sweeping it onto someone else's doorstep.

Note how a lot of these myths/misunderstandings are more about resistance to changing our thinking/behavior than about being simple.

The Agile Manifesto defines simplicity as "maximizing the amount of work not done." But I think that's a more accurate characterization of Lean than of simplicity.

Recently, I looked though a number of sources of information about what is the meaning of "simplicity" and what are its principles, and I came across a number of interesting resources:
After mulling-over all of those, I think it's fair to say that while "Simplicity" may be, well, "simple", truly understanding "simplicity" is in fact quite hard!
  • Simplicity involves being able to see the whole from a systems thinking perspective while at the same time being able to focus in on what is relevant and essential and how it impacts the rest of the system.
  • Sustainable simplicity often has to evolve or emerge on it's own from a set of simple guiding rules.
  • The opposite of simplicity is complexity (as opposed to "hard" or "difficult" or "time-consuming" or "labor-intensive")
  • In mathematics, simplicity is often "elegance" and is more than just the intersection of "what is necessary" and "what is sufficient"
  • In architecture, "simplicity" is often synonymous with "beauty"
  • Hiding complexity isn't the same as removing complexity.
  • Many of the tools we use to manage complexity in systems design may in fact add more/new objects to hide complexity or separate concerns
  • Minimizing dependencies throughout a system is more critical to simplicity than minimizing the number/types of objects
  • Occam's Razor does not in fact say that the "simpler explanation is better" ... it says that the explanation that makes the fewest assumptions and poses the fewest hypotheticals (i.e., minimizes the number of "given" and "unproven" conditions) is the most preferable because it is easier to comprehensively test in order to prove/disprove.

I think that true simplicity is about minimizing and managing overall complexity. Complexity in software design and development comes from the sheer size and complexity of the problem we are being asked to solve, and the richness and vastness of the interconnected maze of interactions within the system and between the system and its environment.
  • The overall complexity of the system is dominated far more by the interactions between the parts that makeup the whole than it is by the parts alone.
  • For any non-trivial system, simplicity often has less to do with the number and kind of different things involved and more to do with the number and kind of interdependencies between them.
So achieving simplicity is less about managing "parts" of "things" or individual point-solutions, and is more about managing rules and relationships between the parts and things and solution-sets.

When dealing with large or complex systems (like most software, and software processes) the number of things (scale) and different types of things (diversity) that need to be managed is overwhelming. If we can come up with a modicum of modest, simple rules & principles to govern our design decisions in ways that help us minimize and manage interdependencies, eliminate constraints, and remove waste, then we are on the path to solving the real problem and meeting stakeholder needs in a way that is both simple and sustainable.

I'll close with my collection of favorite quotes on simplicity and simple design from the sources I culled above.

Everything should be made as simple as possible, but not simpler.
-- Albert Einstein
Three Rules of Work: Out of clutter find simplicity; From discord find harmony; In the middle of difficulty lies opportunity.
-- Albert Einstein
For every problem there is a solution which is simple, clean and wrong.
-- Henry Louis Mencken
Think simple as my old master used to say - meaning reduce the whole of its parts into the simplest terms, getting back to first principles.
-- Frank Lloyd Wright
Beauty of style and harmony and grace and good rhythm depend on simplicity.
-- Plato
The ability to simplify means to eliminate the unnecessary so that the necessary may speak.
-- Hans Hofmann
Making the simple complicated is commonplace; making the complicated simple, awesomely simple, that's creativity.
-- Charles Mingus
Everything is both simpler than we can imagine, and more complicated that we can conceive.
-- Goethe
The whole is simpler than the sum of its parts.
-- Willard Gibbs
The pure and simple truth is rarely pure, and never simple.
-- Oscar Wilde
Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius--and a lot of courage--to move in the opposite direction.
-- E. F. Schumacker
Besides the noble art of getting things done, there is the noble art of leaving things undone. The wisdom of life consists in the elimination of nonessentials.
-- Lin Yu Tang
Very often, people confuse simple with simplistic. The nuance is lost on most.-- Clement Mok
You can't force simplicity; but you can invite it in by finding as much richness as possible in the few things at hand. Simplicity doesn't mean meagerness but rather a certain kind of richness, the fullness that appears when we stop stuffing the world with things.
-- Thomas Moore
The point of philosophy is to start with something so simple as not to seem worth stating, and to end with something so paradoxical that no one will believe it.
-- Bertrand Russell
The aspects of things that are most important to us are hidden because of their simplicity and familiarity.
-- Ludwig Wittgenstein
Manifest plainness, Embrace simplicity, Reduce selfishness, Have few desires.
-- Lao-Tzu, Tao Te Ching
Simple things should be simple and complex things should be possible.
-- Alan Kay
The key to performance is elegance, not battalions of special cases. The terrible temptation to tweak should be resisted unless the payoff is really noticeable.
-- Jon Bentley and Doug McIlroy
... the purpose of abstraction is not to be vague, but to create a new semantic level in which one can be absolutely precise.
-- Edsger W. Dijkstra
Simplicity and elegance are unpopular because they require hard work and discipline to achieve and education to be appreciated.
-- Edsger W. Dijkstra
Beauty is more important in computing than anywhere else in technology because software is so complicated. Beauty is the ultimate defense against complexity.
-- David Gelernter
Fools ignore complexity; pragmatists suffer it; experts avoid it; geniuses remove it.
-- Alan Perlis
Technical skill is mastery of complexity, while creativity is mastery of simplicity.
-- E. Christopher Zeeman
Architect: Someone who knows the difference between that which could be done and that which should be done.
-- Larry McVoy
One of the great enemies of design is when systems or objects become more complex than a person - or even a team of people - can keep in their heads. This is why software is generally beneath contempt.
-- Bran Ferren
A complex system that works is invariably found to have evolved from a simple system that worked.
-- John Gall
The most powerful designs are always the result of a continuous process of simplification and refinement.
-- Kevin Mullet
There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.
-- C.A.R. Hoare
Perfection (in design) is achieved not when there is nothing more to add, but rather when there is nothing more to take away.
-- Antoine de Saint-Exupéry
Simple, clear purpose and principles give rise to complex intelligent behavior. Complex rules and regulations give rise to simple stupid behavior.
-- Dee Hock


Anonymous said...

The real meaning of KISS?

OK, Brad, I'll jump in... but first, let me say this: Marvelous post! Great collection of references and quotes! And your outlined distillation is fascinatingly thought-provoking! Bravo!!!

Now, for the real meaning of KISS (paraphrasing your first Einstein quote)...

"Keep It Simple & Sufficient"

I never did like the "stupid" slogan. So, for some years now, I've offered my alternative paraphrase befitting Einstein, suitably arranged to spell out the "KISS" acrostic or acronym.

I hope you like it. Feel free to pass it on.

Unknown said...

Excellent blogpost!

For me simple means "easy to understand", where easy means "requiring a minimum amount of knowledge, information or skills".

Playing a piano is simple. Anyone can do it and it requires minimum of explanation: just press the keys.
But making music with a piano is not simple. For a concert pianist is may seem simple to play an easy piece, but he has an enormous amount of background (knowledge and skills).

You are right that "simple" depends on your perspective. Starting a car is simply a matter of turning the key or pressing a button (user perspective), but a lot of very complicated things happen (technician's perspective).

I really enjoy reading your blogs (and other writings). Thank you!


Anonymous said...

I'll echo the first commenter's appreciation of your post and collected references/quotes... nice job!

My interpretation of what I think you're getting at is this: 'simplicity is when the solution fits the problem'... solutions that are less complicated than the problem they intend to solve are bad; so are solutions that are more complicated than the problem they solve. Simplicity is achieved when the distance between the solution and the problem is minimized.

How's that?

Prabhakar Karve said...

Brad, this is fantastic.

I think from the system perspective, simplicity has two ways of looking at it, objective and subjective. The structure of the system may be inherently complex because the builder(s) of the system did not think through the underlying simple patterns. On the other hand, a simple system may appear complex to somebody who has limited knowledge or exposure to the system. Like beauty, simplicity is in the eyes of the beholder.

In my opinion, system is really a combination of process and the structure which implements the process. I have recently posted my thoughts on this at http://prkarve.wordpress.com

I am looking forward to some generic rules about how to build a simple structure for a given process.

Prabhakar Karve

Brad Appleton said...

Responding to pjm2 ... I think the solution fitting the problem is simply a way of ensuring that the solution contains the essence of the problem, and no more.

So in that sense, it's less about the distance/fit between the two, and more about minimizing the number of objects and relationships in the design. When the solution doesnt fit the problem, it often had to create a lot more objects or relationships because it missed something "essential" in the problem.

But sometimes the solution can be made simpler by adding an object that may not have been in the problem. The mediator design pattern is a good example of this. Inserting the mediator object takes a network of N objects and N*(N-1)/2 relationships and turns it into a network of N+1 objects and N relationships.

So in the context of system design, I guess Im saying "simple" is all about interaction. The fewer object interactions there are to manage, the smaller the impact of change and the more localized the change can be.

If I consider relationships/dependencies to be just another form of "entity" (just like objects), then I guess my definition boils down to something similar to Frank's definition above (which looks an awful lot like Occam's Razor): It's minimizing the number of entities and unknowns (where "interaction relationships" are a kind of entity). My claim is that interaction relationships tend to dominate the resulting complexity of a system much more quickly then the number of objects.

Emergence in complex adaptive systems arise from rich interaction, but they are dense and local (which is another way of saying loose coupling and high cohesion). This is the meaning (or context) of the quote from Dee Hock that I included in the blog-entry.

Anonymous said...

One more:

I would not give a fig for the simplicity this side of complexity, but I would give my life for the simplicity on the other side of complexity.

Anonymous said...

Brad, a very stimulating piece, thanks. I particularly liked your observation that "Hiding complexity isn't the same as removing complexity". I've taken that as my lead to further the discussion a bit, and produce a few more soundbites, over at my blog.


homegrown said...

simplicity and complexity are perceived to be at odds with each, which gives rise to the debate. when you harmonise them tho, you can avoid the distraction of debate and proceed with the progress at hand.
complexity arises out of deep simplicity and in the non-linear system that software is, simplicity is how we manage complexity- not hide it, not remove it, not fight, but in a sense, nurture it and keep it on the slightly frozen edge of chaos.
if you embrace simplicity, you have to accept that you do it to manage complexity becos as the system grows, it just has to get complex...
and if get the right simplicity for the right project, well, right, it's much easier from there on out...

Raoul Duke said...

i have to echo the "great post" comments!

a quote that is stuck in my head from years back: tai chi is simple, but it's not easy. i don't at all mean to sound all hippy-dippy i just mean that the distinction between simple and easy appears in many ventures. so people might grok what it means for software by thinking of what it means in fields they already know (gardening, wood working, dancing, ...).