As part of a program of study wherein I am working my way through the materials recommended by Oz Nova and Myles Byrne, today I finished reading the first three chapters of The Structure and Interpretation of Computer Programs. Put simply, it is a trip. I have taken several courses over the years which purport to explain computer programming by reveal the more fundamental aspects of computer processes. However, this is the first book I have ever read which constructs the mentality behind modern program design in such an iterative and thorough fashion. The authors start by helping the student to construct powerful language features from a small handful of operations. This book has the potential to fundamentally alter how a person approaches systems design.
The following quotes summarize my experience with the book, as well as those ideas which I believe to be most valuable.
Programs must be written for people to read, and only incidentally for machines to execute. (Preface)
This one, also in the preface, caught my eye:
Underlying our approach to [programming] is our convition that "computer science" is not a science and that its significance has little to do with computers. The computer revolution is a revolution in the way we think and in the way we express what we think. The essence of this change is the emergence of what might be best called procedural epistemology - the study of the structure of knowledge from an imperative point of view, as opposed to the more declarative point of view taken by classical mathematical subjects. (Preface)
This point was made in a footnote. However, it carries serious implications for those of us who have grown up in an environment championing a single coding paradigm. How many people take introductory coding courses with OOP languages and procedures, only hazily realizing that there is more to it than what they are being told?
In view of [the complexity of imperative procedures], it is ironic that introductory programming is most often taught in a highly imperative style. This may be a vestige of a belief, common throughout the 1960s and 1970s, that programs that call procedures must inherently be less efficient than programs that perform assignments ... Whatever the reason, it often saddles beginner programmers with "should I set this variable before or after that one" concerns that can complicate programming and obscure the important ideas."