Skip to main content

Completed the book How to Design Programs

– projects

A few hours ago I finished reading the epilogue of the book How to Design Programs, after reading all its chapters and completing all of its exercises in the span of 7 weeks. It was completely worth it.

In my previous blog post I explained my decision of not continuing with SICP and to instead complete the HTDP book, starting on August 12th. I admit that I actually started on August 13th, but not only did I succeed in my own challenge, but I did so much faster than I anticipated. I expected to finish the book by mid-to-late October, in the worst case scenario, which would have been problematic because I have to go back to the university on October 7th. Needless to say, I have a free week instead.

All this doesn’t mean that the book was all filler or that it was too easy to be useful. To the contrary, the authors of the book did an excellent job in the order and structure of each topic, the writing of the explanations and examples, the selection of the exercises, and just about everything. They fulfill their claim of improving upon the seemingly aimless and endless SICP book by explicitly teaching the fundamentals of systematic program design, and reinforcing those lessons with exercises that are challenging enough for each level of knowledge.

Unlike reading SICP, which felt like a chore, reading HTDP was rather enjoyable. The ordering of the chapters and sections seemed very natural and the usefulness of each topic is evident. The exercises are not focused on domain knowledge, and those that use it are more accessible (besides, the authors provide it); instead, the exercises focus on the basic theme of the book: designing programs systematically to solve problems.

My solutions to all the 528 exercises are publicly available in this Github repository. If you plan on reading the book, I strongly advise you to solve the exercises by yourself and only checking my solutions (or anyone else’s) if you’re truly stuck. Also, some exercises use DrRacket’s inline image embedding feature, so they can only be read in DrRacket.

Now, what will I do next? Before answering, let’s see what the authors of HTDP recommend in their epilogue, which is titled “Moving On”. For developers and computers scientists, the authors say:

As a student of program design, your next task is to learn how the design process applies in the setting of a full-fledged programming language.

Then they hint at object-oriented programming, which is their recommendation for a second course in a computer science curriculum, as explained in one of their publications. They continue:

As a student of computing, you will also have to expand your understanding of the computational process. […] In order to function as a real software engineer, you need to learn what the process costs, at both a theoretical level and a practical one. […] Above and beyond these basic ideas, you will also need knowledge about hardware, networking, layering of software, and specialized algorithms in various disciplines.

As mentioned in another post, I’m following the Teach Yourself Computer Science guide. Looking at the guide’s subject list, you can see that there’s some overlap with the aforementioned recommendations. Specifically, the next topic in the guide is computer architecture, followed by algorithms and data structures. Also, computer networking is another big topic.

Back to the question, what will I do next? As I will have less free time because of the university, I’ll probably do a course about Android app development (ideally with Kotlin) and create some app ideas that I’ve been thinking about (that’s the only promise broken from my previous post). Perhaps I’ll move on to the computer architecture topic during the December break. No matter what, I’ll always be doing something.