Situating computer programming within the context of a liberal arts programme, the authors describe programming as structured problem-solving thereby extending the appeal of programming beyond the usual "hacker" culture to a broader audience of interested lay-persons. The gist of the book is two-fold: on the one hand, the reader learns how to program in PLT-Scheme (a powerful and robust off-spring of LISP widely used in AI); on the other hand, the reader is being taught simultaneously how to think and reason through problems. Teaching people how to think is not as easy as it sounds, and the authors make a sterling effort to weave this goal into the book almost without the reader being aware of them doing so. In Chapter 2, for example, they teach how to calculate the area of a disk ... which is not too difficult (and actually, Scheme makes this surprisingly easy with just two lines of code unlike C which require data typing, etc); however, from this base, the authors then introduce the concept of a ring. The sleight-of-hand is that the concept of a ring doesn't require another calculation but rather requires the reader to think about what a ring is - it is two areas of disks - one subtracted from the other (an inner disk is subtracted from an outer disk). The point of this example is to illustrate how the authors encourage the reader to think through problems, and in so doing, how to arrive at algorithms, which are at the heart of any programming endeavour. In short, the authors encourage the reader to think (and learn) about How to Design Programs ... and along the way, the reader (almost incidentally!) learns Scheme. PLT Scheme offers a structured, step-by-step programming environment, with all the libraries required, and runs on Linux and Mac and Windows platforms. Also, it has been my experience that the authors are very amenable to contact from readers who have questions and are helpful ... which is a welcome change. The reason that I did not rate this with 5 stars is because the answers to some of the exercises are not freely available to anyone outside of those using the text to teach. This is a draw-back because it makes it difficult to check the accuracy of one's answers to exercises. However, there are several discussion lists to which one can post questions and exercises and it has been my experience that the participants on that list are only too happy to offer feedback and useful suggestions. I also know that this book has the thumbs-up from almost all of the Scheme user group, which must count for something! In conclusion, my recommendation is that irrespective of whether or not you are a seasoned hacker or a wet-behind-the-ears-newbie, this is a great didactic book and by the end of the first chapter, the reader will easily see why this is considered to be the de facto text book for 1000s of students at Rice University who then later go on to study computer science. It is a gentle and enjoyable introduction to programming design that builds progressively upon layers of knowledge established earlier in the text. Highly recommended for anyone who wants to not only learn programming, but for those who want to learn how to think logically and methodically through complex problems.
The authors of this book once wrote an article discussing how the content that is taught in the seminar Structure and Interpretation of Computer Programs (SICP) makes students confuse domain knowledge with programming knowledge. Thus, they set out and correct this. Instead of basic familiarity with mathematics, you now get to manipulate circles on screen, and other quite trivial things. You feel as if you learn absolutely nothing. Frankly, I was shocked how absurdly slow the pace of this book was, about how little you learnt per page, and that there were still some instances where the instructions were ambiguos. This book certainly does not replace SICP.