There have always been four identifiable groups, or participants that use computers: the end user, the application programmer, the system software designer (including the compilers, libraries, and operating systems), and the hardware engineer. In many scientific environments, the end user and the application programmer are the same person; the end user is also expected to be the author and maintainer of the source code. In other environments, such as business computing and personal computing, the end users are distinct from and far more numerous than the application programmers.
But mostly because of performance motivations, there has been a trend to blur roles and responsibilities for one another's traditional tasks. The tendency to ``pass the buck'' between the four participants regarding who should make performance higher has led to problems that were never anticipated or intended by the computing community. Part of our solution will be to redefine and disentangle the roles using definitions given in Section 3. We propose that the roles of each participant be made explicit via a three-stage contract, described in Section 4, as an approach to solving these problems. Section 4 also steps the reader through a simple but nontrivial example. This is followed by a section containing concluding remarks, along with our long-term vision of future research. To summarize, this technical report presents the problems with the current use of computers that have arisen, why they have arisen, and what might be done to solve them.