Programs accept data and produce data. Designing a program requires a thorough understanding of data; a good program reflects the shape of the data it deals with.
Ah, the good ol' preface for The Little Schemer has always been a strong source of inspiration for the way I think about programs and, well, about data too. It is a broadly accepted truth, with a lot of nuances within. The key being to what degree with model the world around us.
The goal of this book is to teach the reader to think recursively and concurrently. To do this, we must choose a language to communicate with each other. We could use a natural language, like Swedish; we could use some formal mathematics, and speak TLA+; or we could use a programming language, like Erlang.
In the spectrum from natural languages to formal mathematics, it seems that a programming language would fall in the right place: it can be succint without being cryptic, and, while it has rules to see its outcomes, we have compilers and interpreters to help us understand what these outcomes in fact are. What is more, these tools become our assistants and allies in the learning of the language and exploring of solutions to problems.
Perhaps the best programming language for learning to think concurrently is Erlang.
This book expects you to be comfortable reading and understanding English, recognizing words, letters, and visual patterns. That's all, really. And to be patient.
You may feel the need to rush through the frames in this book. Instead, try to read slowly. If you don't fully understand one chapter, you will understand the next one even less.
First of all, to Daniel P. Friedman for his work on The Little Schemer series, which has been foundational to me as a programmer in a number of ways.
I'd like to also thank everyone that took time out of your days to read these drafts and share your honest feedback with me.