A metaphor is an analogy between ideas. We use metaphors to explain or understand something in terms of something else. Some metaphors are implied by everyday phrases, e.g. “the foot of the mountain”, “raining cats and dogs” and “time runs fast”. The latter one is particularly interesting. Time is a concept that can be hard to grasp, at least compared to mountains and rain. The expression “time runs fast” implies that we think of time as physical movement or a journey. This will make us think of not only time but our lives as a journey.
The tendency for us to think in terms of metaphors is so widespread that Jonathan Haidt, a professor of psychology at the University of Virginia, claims in The Happiness Hypothesis: Finding Modern Truth in Ancient Wisdom that humans need metaphors:
Human thinking depends on metaphor. We understand new or complex things in relation to things we already know.
all theory is metaphor
On the very same page of that book Gareth Morgan goes on to state a very important fact:
Metaphor stretches imagination in a way that can create powerful insights, but at the risk of distortion
Although metaphors can help us gain new insight, all metaphors are incomplete, biased and skewed. A metaphor helps us see certain things, but makes us blind to other things. Gareth’s advice is to use a number of metaphors collectively so that the different metaphors can complement each other. Allowing multiple metaphors to complement each other may not be an easy task but according to Gareth it is well worth our time.
So what metaphors can we find that are relevant for software development? I have gathered some of my favorite metaphors in this post. They complement each other in that they see the same phenomenon (software development of course) with very different eyes (remember that’s where the beauty is). Armed with these metaphors we can understand and focus on multiple different and important aspects of software development.