Graham’s starting point is that not all languages are equal. Few readers of this article would dispute this, I think, though many of us would qualify such comments with questions about context: What problem are you trying to solve?
Lisp is a multi-paradigm language. So too is C++, but the most powerful C++ paradigm, generic programming, is problematic. Generic C++ takes too long to compile, and what’s worse, when it won’t compile, all too often the compiler spouts nonsense. And often generic C++ looks clumsy: we want to write high level abstractions, but we end up holding down the shift key to punch in angle brackets, colons, and #defines to work around compiler limitations.
When I found out how simple generic code was in Python (in a dynamically-typed language all code is generic), and how nicely Python supported every C++ paradigm I cared about, and more besides, I adopted it as my hobby-project language. At the same time, I wondered if there wasn’t another step I could take: as C++ is to Python, perhaps so Python is to some other, yet more powerful language?
Graham argues Lisp is that language, the language which other languages are slowly catching up with.
Why does Graham rate Lisp so highly? “Hackers and Painters” provides the authorative answer, but I’ll attempt to summarise the main arguments here:
Lisp is good because of its power. Lisp is a high-level language which enables you to write concise, beautiful code. Programmers need a language which allows them to express themselves clearly and to constantly revise and test their code. Why, then, isn’t everyone using Lisp? Partly because programming language choices are made by managers, not hackers, and partly because Blub programmers can only think in terms of Blub, and therefore cannot begin to appreciate what Lisp can do2.
I found these arguments provocative and entertaining, but what really impressed me was the quotation Graham cites as the single most important thing for people to remember when writing programs:
Programs should be written for people to read, and only incidentally for machines to execute.
Initially, this statement seems radical—isn’t the whole point of programs that a computer can execute them?—but on reflection, I agree. I believe this principle should guide every aspect of our programming. It turns out that the quotation appears in the preface to “Structure and Interpretation of Computer Programs”.
2 This is the Blub paradox. Blub is a hypothetical programming language, whose name has been chosen so as not to offend (or prejudice) users of a real programming language.