Today's world of parallel and distributed computing poses hard new challenges for software development. A rapidly increasing number of developers now have to deal with races, deadlocks, non-determinism, and we are ill-equipped to do so. How can we keep things simple, in spite of the complexity of the underlying runtimes?