writing correct programs is hard, but the addition of concurrency need not make it harder, and indeed if the problem includes concurrency (as with networks, file servers and interaction), having concurrency in the system and language can make it much easier to get it right, with structurally simpler solutions, compared to (say) the event driven schemes. of course, it depends on the approach taken to concurrency. there are several appealing models, but CSP's processes and channels model works well. Communicating Sequential Processes encourages the composition of sequential processes to solve concurrent problems. in its or Newsqueak/Alef/Limbo guises which all allow sending channels down channels, you can go a bit further. unfortunately, many `threads' designs tend by contrast to be stuck in the lock/sleep/wakeup model of the late 1960s. that java stuff is a nightmare.