This document discusses programming with MapReduce and proposes a calculational approach for systematic parallel programming over MapReduce. It begins with background on MapReduce and examples of MapReduce programming. It then discusses issues with directly mapping sequential algorithms to MapReduce. The document proposes expressing computations as list homomorphisms, which can be automatically implemented as MapReduce jobs. It presents an interface for defining sequential functions as fold and unfold and discusses implementing list homomorphisms in MapReduce by representing lists and intermediate data. It evaluates the performance of the homomorphism-based approach.