This is an amazing paper by EW Dijkstra. Please go and read it ASAP.
Here's a quotation:
"Again, I have to stress this radical novelty because the true believer in gradual change and incremental improvements is unable to see it. For him, an automatic computer is something like the familiar cash register, only somewhat bigger, faster, and more flexible. But the analogy is ridiculously shallow: it is orders of magnitude worse than comparing, as a means of transportation, the supersonic jet plane with a crawling baby, for that speed ratio is only a thousand."
He's arguing a few things in this paper. My favourite is that people throw analogies around these days like they actually mean something; you can't just compare something and then assume you've made an insight. Analogies are only helpful if you verify first that they do mean something. I've done this a lot myself in the last few years (oh, X is like Y, and Y has property A so X must have it too!) (that is, the relationship between the USA and China is like the relationship between Germany and Britain before the world wars; therefore there must be another war on the horizon!!!).
Another great idea is that programs are not works of craft that you iteratively "build up" that "need maintenance" from a "programmer's toolbox". Programs are mathematical theorems, almost. They are correct or incorrect. This is pretty stringent and in the real world often expedience demands making these crappy analogies, but he's right; our programs would be better if we thought about them more rigorously.
There is a counterargument to Dijkstra hidden in that last paragraph but I haven't pulled it out yet.