Code by Charles Petzold
I wish I had found this book earlier during my computer science degree. It felt like a crash course in the great ideas that led to computers, but for people with little to no background in the field. And amazingly, it does so without sacrificing too much technical rigor (in fact, I think Petzold is too heavy with the technicalities at time for a general reader).
What this book does is gives you feeling that, if you really wanted to, you could build a computer from scratch. It won’t be a great computer, and there will be hiccups and tinkering along the way, but all of the basic ideas on how to build what we would recognize as a personal computer are there.
Like nand2tetris, Petzold starts with some questions about how one might capture information with binary codes. Unlike nand2tetris, though, Petzold doesn’t start from an engineering context. Instead, it starts in a context completed removed from computers. I think this ultimately makes the ascent into logic gates, hardware, and software more approachable.
The main weakness of the book is that the first edition was printed in 2000. Lots has changed in the world of computing since then, and some of the older references are lost to younger readers like me. While the material is all correct, I imagine that some chapters would benefit from additional discussion on advancements made in various sub-fields of computing since 2000. A second edition was published recently, and so this weakness is likely addressed in that version.
I also was hoping for more discussion around the software models that power modern day computers. Petzold briefly touches on the fact that modern day computers typically run multiple programs at once (e.g. concurrently or in parallel).
What’s maybe missing are broader notes on the fact that lots of computing nowadays is distributed across multiple computers, and how the personal devices we have use are only one node amongst many. Again, this is a recent advancement, so I forgive the missing discussion and imagine that Petzold includes it in the second edition.
This book should be a must-read for freshmen electrical engineers, computer engineers, and computer scientists. Honestly, this book felt like what my intro to computer science course could’ve and should’ve been.
I also think that the first half of the book (chapters 1-12) are approachable for high schoolers and middle schoolers who are aspiring engineers and programmers. My little brother (10) is curious about programming and I’ll lend him the book and see if he bites. If it works for him, I’ll add a small update to this post in the future.