I recently downloaded Abelson and Sussman’s 1986 “video lectures”:http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/ based on their “famous textbook”:http://mitpress.mit.edu/sicp, and we’ve been watching them over brown bag lunches at work. Great stuff and good to be reminded. Last week, they covered higher-order functions, which is very straightforward in Lisp. “Why can’t we have that?”, whinged one of the developers watching.
This week there were a couple of nice lines. Sussman talked about _Wishful Thinking_ as a valuable programming technique: write your code as if it had the supporting functionality it needs, then fill in the rest later. That’s how you get good abstractions, each with its own coherent language. One of the studio audience asked Sussman what he thought about people who say that systems should be fully designed before you start developing. Well, says he, the good side of programming is wizardry (making things happen), the bad side is religion (believing unprovable things). Chances are, he said, that the people who make such claims haven’t built large systems. Ouch.
The other point was his justification for what looks like the overhead of introducing abstraction. What we really want is to be able to take decisions without having to live with the consequences but we can’t, so we break systems into abstractions. To abstract a concept we have to give it a name which, as every sorcerer knows, means we can control it. So we can think of a _name_ as a _deferred decision_, it represents something that we can change later. So, the more names, the more flexible the system?