Distributed systems form the foundation of our society's infrastructure. Unfortunately, they suffer from a number of problems. First, they are time-consuming to develop because it is difficult for the programmer to envision all possible deployment environments and design adaptation mechanisms that will achieve high performance in all scenarios. Second, the code is complex due to the numerous outco ...