There are very few really good books about general computer science and programming. There are plenty of good books about particular languages, platforms, or techniques, but few on the fundamentals. And most of those good general books are written for experienced programmers (for example, The Pragmatic Programmer). One of the really big problems with our whole industry is that introductory books—the books we use to teach new programmers—are so poor.
Three or four years ago I read Structure and Interpretation of Computer Programs (SICP) by Abelson and Sussman, and was really impressed. But it moves very quickly, and I don’t think many college freshmen could keep up.
Just in the past two or three weeks I’ve learned about two exciting books. I haven’t done more than skim them, but the first impressions are really strong. The first is How to Design Programs (HtDP), by Felleisen, Findler, Flatt, and Krishnamurthi. Here’s the first paragraph from the back cover (emphasis mine):
This introduction to programming places computer science in the core of a liberal arts education. Unlike other introductory books, it focuses on the program design process. This approach fosters a variety of skills—critical reading, analytical thinking, creative synthesis, and attention to detail—that are important for everyone, not just future computer programmers. We’ve needed a book like that for a long time. Like SICP, HtDP uses Scheme as its teaching language, and it manages to be a fairly general, practical introduction while grounding students in a language and concepts that should ease the transition to more advanced topics. (Unlike most introductory texts which leave students stuck in concrete, procedural thinking.)
The other book I’ve learned about is Concepts, Techniques, and Models of Computer Programming, by Peter Van Roy and Seif Haridi. Like SICP, it is aimed at future programmers and computer scientists. But like HtDP, it has a broader scope in both primary and secondary subject matter: it presents a more general view of computer science than SICP, and its examples aren’t so focused on electrical engineering problems. This book uses Oz as its teaching language, but also includes good discussion of other languages. (And Oz is a multiparadigm language, so the choice of Oz is not restrictive.) The book is very long, and likely to be longer before it’s finally published sometime next year. But I’m looking forward to reading it over the next few months.