Reading Gödel, Escher, Bach
opened my eyes to the idea that a huge amount of life is based off of this
simple idea, and what a beautiful one it is -- the idea that something can be composed
of itself.
I've since been on a kick trying to learn Scheme, which is a dialect of of Lisp known for its minimal standard library which IMO makes learning its fundamentals easier. I've tried starting off with Peter Siebel's Practical Common Lisp, but I found it as more of a book about learning the Lisp language than learning the underlying philosophy of Lisp.
My first serious run in with Lisp was due to me being a fan of Paul Graham's essays
for awhile, and especially his book
Hackers and Painters
, and more recently because of Steve Yegge's blog posts and his strong advocacy of the Lisp
language. I was also trying to work through Daniel Friedman's
Essentials of Programming Languages
and it assumes a working knowledge of Scheme in addition to being pretty academic,
so I figured I'd try and start off learning the fundamentals of Scheme before
I tried to get any further.
With that said, what I'm reading now is
The Little Schemer,
also by Daniel Friedman. This book's style is a complete turnaround from Essentials; it
assumes no experience programming, and does a great job of going through
recursive problems step by step. It's also a pretty short read. I'd highly recommend it
to anyone that feels they're missing some background in solving recursive problems.
On a side note: It's a shame that a lot CS schools have either not advocated learning a Lisp to begin with or are phasing them out (MIT, I'm looking at you). I've never really understood the argument that Python is the best language for people that have never programmed before; I've found in practice that Python has as many quirks ("closures", etc) as most other languages I enjoy programming in, but I would agree it has a strong resemblance to pseudocode, which implies something good about it I suppose.
If I could be taught over again, I'd much rather have someone teach me the core CS concepts in an extremely pure language like Scheme than trying to teach that concurrently with the syntax and quirks of C/C++, which is what for the most part went on at the University of Michigan. I believe this is a result of trying to serve many needs at once (practicality, abundance of EE/CE majors). Ideally these would be taught separately.