In early 1986, one of us (D.M.S.) was constructing an artificial intelligence system to design algorithms, and the other (A.P.A.) was getting started in program transformations research. We shared an office, and exchanged a few papers on the systematic development of algorithms from specifications. Gradually we realized that we were trying to solve some of the same problems. And so, despite radical differences between ourselves in research approaches, we set out together to see what we could learn from these papers. That's how this book started: a couple of graduate students trying to cope with The Literature. At first, there was just a list of papers. One of us (D.M.S.) tried to cast the papers in a uniform framework by describing the problem spaces searched, an approach used in artificial intelligence for understanding many tasks. The generalized problem space descriptions, though useful, seemed to abstract too much, so we decided to compare papers by different authors dealing with the same algorithm. These comparisons proved crucial: for then we began to see similar key design choices for each algorithm.