To understand something sufficiently well to be able to program it for a computer does not mean to understand it to its ultimate depth. There can be no such ultimate understanding in practical affairs. Programming is rather a test of understanding. In this respect it is like writing; often when we think we understand something and attempt to write about it, our very act of composition reveals our lack of understanding even to ourselves. Our pen writes the word 'because' and suddenly stops. We thought we understood the 'why' of something, but discover that we don't. We begin a sentence with 'obviously,' and then see that what we meant to write is not obvious at all. Sometimes we connect two clauses with the word 'therefore,' only to then see that our chain of reasoning is defective. Programming is like that. It is, after all, writing, too. But in ordinary writing we sometimes obscure our lack of understanding, our failures in logic, by unwittingly appealing to the immense flexibility of a natural language and to its inherent ambiguity... An interpreter of programming-language-texts, a computer, is immune to the seductive influence of mere eloquence... A computer is a merciless critic.
— Joseph Weizenbaum
damn