Introduction

Computer Science has always been about solving problems. Modern Computer Science is not only still about solving problems, but doing so in a way that the resulting programs can be run on thousands or even hundreds of thousands of processors, often spread across the world in very distant locations. Often the cost of running these programs is so high that it isn’t possible to exhaustively test them by running them. Programmers and designers need to get it right the first time.

Foundations of Computer Science focuses on learning the key tools and concepts to do this. The single most important tool available to us is abstraction, that is, the ability to think in terms of ideas rather than concrete evidence in front of us. Real Computer Scientists don’t hack away at a program as soon as they’re given a task, they think about it, they mull it over, drink lots of coffee and listen to music. They might even look at funny pictures of cats on the Internet, but while they’re doing all these things, they are thinking in the abstract: How do I design my program so that it will work first time?

Once they have it figured out, and only then, do they hack away at the program. And their programs are beautiful, efficient and fast. Everything software should be. Then, while the guys who started hacking away right at the start without a proper design are sitting looking at their screens wondering where it all went wrong, Real Computer Scientists are out snowboarding, mountain climbing and doing all sorts of adventurous things.

Well, probably not. As one of these people, I can attest to the fact that they’re more likely to being drinking coffee, listening to music and looking at picture of cats on the Internet, but they’re also thinking. Thinking about the next problem they will tackle, or the next language they’ll learn, or the next fun project they will be hired to do because they’re so good.

This book teaches you the fundamentals of Computer Science using λ (Lambda) calculus. It’s a way of programming without language or syntax that will change your approach to programming no matter what language you end using, because it is clean and efficient and lets you think about about the problem you’re trying to solve and worry about implementing it until you have it figured out.