I have two University degrees in different engineering disciplines, but came to Software Engineering without any formal training in Computer Science. I learned how to use databases and shortly later how to write programs. I mostly learned from practical books and online resources. All my deeper knowledge of computer theory came years later. Understanding Computation: From Simple Machines to Impossible Programs by Tom Stuart seems to have been written for people like me: Thirsty for knowledge about computer theory, with explanations written in the language we use every day and without the mathematical notation1.
In the book, Stuart uses Ruby to great effect to show examples of basic computer science. He builds two interpreters for a toy language, uses finite automate to implement a bare-bones regular expression language, explores Turing machines, illustrates how lambda calculus can be used to solve FizzBuzz and much more.
The explanations throughout the book are thorough and the code samples numerous. It is not a fast read: For some sections, I had to put down the book and think about what I read every couple of pages. However, I believe I have a better understanding of computer science after reading it.
I recommend the book to those Rubyists lacking a background in Computer Science or those that have one, but want to gain a perspective of computation without the formalism.
I actually do like mathematics, but mostly as a tool to explore physics. My familiarity with the math underpinnings of computation is lacking. ↩