hrapof wrote:The Structure and Implementation of Computer Programs is also very nice as an introduction to programming (via Scheme). First chapters of Paradigms of Artificial Intelligence Programming can be used as a Common Lisp textbook with exercises.
And of cource, as I started to learn Common Lisp through ANSI Common Lisp by Paul Graham, I wholeheartedly recommend it!
SICP is a great book, but it assumes a lot. I first read it when I was a junior in one of the better CS programs in the US, and.. I remember thinking that MIT's Freshmen must be awfully bright to be able to follow it in their first semester. Then I met a few of MIT's best and brightest, and realized that very few of them had.
SICP is a great book, but it's the kind of book you keep coming back to. It's also the kind of book that intimidates people who are trying to learn to program. I'd recommend it, but with the proviso that it's OK if you find it gibberish after a certain point. If I had started to learn to program by reading SICP I would have given up on the whole enterprise, and assumed that I was just not bright enough to be a programmer.
I started learning to program back in the dark ages, when you couldn't look things up on the web. I was alternately selling things and working in kitchens at the time. My next door neighbor's father gave her a really antiquated machine with Borland's DOS C compiler installed, and gave her the Borland manuals as well. She had no idea how to even invoke the compiler, but I wound up over there a few nights later, with some friends, all of us hilariously drunk. It took me an hour or two with those terrible manuals, but i eventually managed to write a program that asked for the name of the user and replied "Dharma, you stupid slut" if the user put in the name "Dharma"- I hard-coded similar endearments for our entire circle of ruffians, and everyone got a good laugh from it- most of us had never seen a PC before (though I had- I had taught myself MS BASICA a few years earlier, but the entire write/compile/execute cycle was foreign to me at that time.)
So Dharma ignored the horribly misogynist output of my first program and asked me to come over and help her decipher the C tutorial her Dad had printed for her from some bulletin board (again, this was pre-web). She held up pretty well until we got to the section on recursion, and then she decided that she wasn't cut out for programming (she went on to study EE, against the wishes of her social worker, and last I heard she was checking the work of board designers.) But by that time I was hooked. I wrote a program that played tic-tac-toe, and used the Borland graphics library to display the board nicely under DOS. Dharma told her Dad that she had given up, but that I was writing programs like that, and he told her that I might actually be able to get paid to write programs- I thought that was nonsense at the time. The idea that someone would pay me to program a computer... well, it was a different time.
A few years later I wound up a student in a good CS program. It turned out that having written some programs the "wrong" way was very useful. It made it so much easier to see why the "right" way was better.
So my advice is to pretend that you are living back in the dark ages and actually write some programs. Back then we had nothing else to keep us occupied
. We didn't bitch about the libraries available, because we didn't know that there could be better ones. We didn't imagine serious programs that could make us rich, because we'd never really heard of people making money from computer programs. And when we did get exposed to people doing things more sophisticated than what we were doing we soaked it up, because we had been pondering the problems they were solving for so long.
PCL is a fine book. SICP is another fine book. But you're not really asking for advice about books. You're asking how to learn to program. Let me ask you: how many dumb little programs have you written? You have to write a lot of those dumb little programs before the books are even all that useful, and the sheer amount of information available these days can be a defect, if you wind up reading more than coding. Write a lot of dumb little programs. Then you'll have a basis for understanding what the good books are getting at. That's my advice, at least.