Distributed computation systems are becoming increasingly common, even within the domain of small embedded devices. These systems are characterized by a number of processing elements asynchronously executing software that must interact. In fact, the most difficult part of distributed computation is managing the complex interactions between components. This involves coordinating the activity of multiple concurrent but interacting threads executing asynchronously. It can be very difficult for many developers to think about these problems in a reasonable way, and also very difficult to debug these systems. This paper describes the causes, the problem, and several approaches aimed at fixing the problem for distributed software developers.