How do you teach computational thinking? In terms of how to do programming, it’s an interesting question. Take nanotechnology. How did we achieve nanotechnology? Answer: We took technology as we understand it on a large scale and we made it very small. How to make a CPU chip on the atomic scale? Fundamentally, we use the same architecture as the CPU chip we know and love. That isn’t the only approach one can take. Looking at what simple programs can do suggests that you can take even simple impoverished components and with the right compiler you can make them do interesting things. We don’t do molecular-scale computing yet, because the ambient technology is such that you’d have to spend a decade building it. But we’ve got the components that are enough to make a universal computer. You might not know how to program with those components, but by doing searches in the space of possible programs, you’d start to amass building blocks, and you could then create a compiler for them. The surprising thing is that impoverished stuff is capable of doing sophisticated things, and the compilation step is not as gruesome as you might expect. Just searching the computational universe and trying to find programs—building blocks—that are interesting is a good approach. A more traditional engineering approach—trying by pure thought to figure out how to build a universal computer—is a harder row to hoe. That doesn’t mean it can’t be done, but my guess is that we’ll be able to do some amazing things just by finding the components and searching the possible programs we can make with them. Then it’s back to the question about connecting human purposes to what is available from the system. One question I’m interested in is, What will the world look like when most people can write code? We had a transition, maybe five hundred years ago or so, when only scribes and a small set of the population could read and write natural language. Today, a small fraction of the population can write cod