The Structure and Interpretation of Computer Programs is one of those books that gets recommended no matter which programming luminary you follow. Between the mystique of LISP, the reputation of MIT, and its large number of enthusiastic proponents (I found Peter Norvig, Paul Graham, and Uncle Bob in five minutes of googling) it's got serious programmer cred. In an industry that changes so fast, it's a reliable investment in fundamental ideas. Having read through it will leave some interesting thoughts bouncing around at the very least.
Even better, of course, is to work through the long list of exercises the book includes. Reading a few examples of recursion is interesting; implementing a few different prime-finding algorithms recursively is educational, and something you'll have done by the end of the first chapter. Though the requirements for working through it are minimal (at least from a software standpoint; it does assume a certain comfort with math) there are enough fiddly details that getting back into it after an absence can be a pain.
Those picky details are collected here, for convenience:
The book itself is easy to come by, and completely free. It can be found:
and in a ton of other places online; there are enough resources available that you'll have to choose one that works for you.
The exercises themselves are written in MIT-Scheme, a dialect of LISP. While the exercises have been translated into a number of different programming languages (LISPs and others), I've read that the later chapters tend to diverge (especially those concerning macros). Since MIT-Scheme is easy enough to come by I recommend not giving yourself the headache of dealing with a translation.
Note that it will be substantially harder to get this working in a Windows environment.
MIT-Scheme comes with a built-in editor which is similar to Emacs, and perfectly serviceable. If you're used to the comforts of a full-calibre editor, many options play nicely with Scheme.
My preference is for Emacs, which has a
scheme-mode installed by default (default file extension
.scm). Getting a REPL is as easy as
M-x run-scheme, and expressions can be sent from
scheme-mode buffers to be evaluated with
C-x C-e (calling
That's it. The rest is up to you. Go now, and learn!