1 Introduction
There is an important kind of infrastructure in the modern world that is not well known simply because it’s relatively new. You may well be familiar with other kinds of infrastructure. For example:
• Transportation infrastructure supports how people and goods move around. It consists of roads, bridges, tunnels, rail lines, airports, warehouses, and the like.
• Electrical infrastructure supports how electricity is generated and delivered. It consists of generating plants, transformers, distribution lines, meters, and the like.
• Water and sewage infrastructure supports how water and waste are handled. It consists of dams, reservoirs, aqueducts, pipes, treatment plants, and the like.
Anyone born after World War II takes all those kinds of infrastructure for granted. In contrast, this book explains some important aspects of the newest “plumbing” or “machinery” that underpins the modern world: what is usually called computational infrastructure. This infrastructure consists of elements that will seem to future generations as ordinary as roads, electricity, and running water, but at the moment they’re still developing and changing.
Even though you may not have a direct interest in the building or analysis of infrastructure, you have a stake in understanding it—both its capabilities and its limits. You have likely had some experience with devices and services that involve computers of some kind. You probably own a mobile phone, tablet, or laptop, for instance. You are probably comfortable doing online searches or looking on a social network to see what’s happening with friends. But you may be a bit fuzzy about how any of that really works. This book explains the ingredients that make it all possible.
Software, processes, computations—these are some of the conventional terms for the most important “stuff” in this domain. Regardless of the words we use, software has an intriguing dual nature. On one hand, software is something real that can affect the world directly; on the other hand, in some ways software is just the shadows cast by computational engines as they run. As other writers have observed, programming is more like the casting of magic spells than like writing literature or building machines. The effects of programs can take place without the participation of a reader, in contrast to the nature of literature; but the material of a program is more like the words of a novelist than like the physical materials of other engineering disciplines.
This book is divided into four parts:
• The first part introduces the world of a single process. That world is both surprisingly powerful and surprisingly limited, even when we assume that its computational machinery always works correctly.
• The second part builds on the first to look at what happens in a world with more than one process, and particularly what happens when those processes interact with each other. Processes interacting with each other are less capable in some ways and more capable in other ways than might be expected. By the end of the second part, we can outline a simple version of how browsing works on the web.
• The third part complicates the multiprocess world by considering processes and machinery that sometimes fail. Various cunning inventions nevertheless allow these interacting processes to surpass the limits of their underlying machinery.
• The final part takes up issues about processes that are attacking each other or defending themselves: how to keep secrets, whether to trust or not, and how to prevent cheating. By the end of the final part, we can explain the mechanisms that allow the Bitcoin system to accurately record money transfers in spite of attackers.
Now it’s time to actually begin the tour instead of just talking about it. An old saying is that a journey of a thousand miles begins with a single step. Our journey starts in the next chapter by thinking about a single step.