Supporting Coordination and Cooperation in Software Processes

Last year in this fom I have argued that in any attempt to formalize and enact software processes it is important to distinguish between what I called methods and laws. A method is a voluntary technique for performing a certain task, while a law is a mandatory regulation about the behavior of the entire process. I have also argued that laws are more fundamental than methods, for software development. That is, because the formulation and enactment of methods invariably relies on certain assumptions about the structure of the system at hand, and about the behavior of the various agents participating in the software process. Such assumptions can only be ensured by means of enforced laws. Here I will focus on one type of applications for such laws, which is the support of the great deal of coordination and cooperation which must take place among the participants of any complex software process. Let me illustrate the problem at hand by means of a very simple example. Suppose that we would like to ensure mutual exclusion with respect to a certain operation 0, which may be carried out by any of the agents participating in a given process. Consider the following informally specified protocol: (1) only an agent that possesses a certain token T may perform the operation 0; (2) initially only one agent possesses a token T; and, (3) token T may be transferred from one agent to another, but no agent may make its own copy of T. It is easy to see that this simple protocol guarantees mutual exclusion with respect to operation 0 (ignoring issues of faimess) but how does one make sure that the protocol itself is actually obeyed by all the agents? In particular, how does one make sure that no agent ever makes an extra copy of the token, and that no agent ever performs 0 without possessing this token?