Threads are a seemingly straightforward adaptation of the dominant sequential model of
computation to concurrent systems. Languages require little or no syntactic changes to support
threads, and operating systems and architectures have evolved to efficiently support them.
Many technologists are pushing for increased use of multithreading in software in order to take
advantage of the predicted increases in parallelism in computer architectures. In this paper, I
argue that this is not a good idea. Although threads seem to be a small step from sequential
computation, in fact, they represent a huge step. They discard the most essential and appealing
properties of sequential computation: understandability, predictability, and determinism.
Threads, as a model of computation, are wildly nondeterministic, and the job of the programmer
becomes one of pruning that nondeterminism. Although many research techniques improve
the model by offering more effective pruning, I argue that this is approaching the problem
backwards. Rather than pruning nondeterminism, we should build from essentially deterministic,
composable components. Nondeterminism should be explicitly and judiciously introduced
where needed, rather than removed where not needed. The consequences of this principle are
profound. I argue for the development of concurrent coordination languages based on sound,
composable formalisms. I believe that such languages will yield much more reliable, and more
concurrent programs.