ANSI Common Lisp

Paul Graham

p 229

If programming were an entirely mechanical process—a matter of simply translating specifications into code—it would be reasonable to do everything in a single step. But programming is never like that.

No matter how precise the specifications, programming always involves a certain amount of exploration—usually a lot more than anyone had anticipated.

It might seem that if the specifications were good, programming would simply be a matter of translating them into code. This is a widespread misconception. Programming necessarily involves exploration, because specifications are necessarily vague. If they weren't vague, they wouldn't be specifications.

In other fields, it may be desirable for specifications to be as precise as possible. If you're asking for a piece of metal to be cut into a certain shape, it's probably best to say exactly what you want.

But this rule does not extend to software, because programs and specifications are made out of the same thing: text. You can't write specifications that say exactly what you want. If the specification were that precise, then they would be the program.