We all learned to program in a non-concurrent manner and we're trying to reuse knowledge from that. Instead, we should focus on re-learning programming, namely what it means to have side-effects and global memory and what we should use instead to operate on those things in a safe way.
Concurrent programming isn't hard, debugging concurrent programming is hard. Eliminate side effects, use Software Transactional Memory, and figure out how easy concurrent programming _can_ be.
obvious Clojure plug