Concurrent programming isn't hard especially if concurrency was taken into account when the system was designed. Adding concurrency to a non-concurrent system though is a huge, difficult and trouble-prone process. Especially once bit-rot has set in and you find 10 different ways of getting at the variable.
This. I find it utterly baffling that in this day and age (and I mean in the last approx 15-20 years when multi-threading support in commercial operating systems has been available, if not quite perfect), there are still computer programmers who have trouble grokking it.
I was talking to someone about how they were saying the next version of a rather large Java application was going to be a lot faster.
me: How's that going to happen?
him: Because they're going to add multi-threading.
me: Why in the world didn't they make it, a large Java application, multi-threaded in the first place?
him: They said they were kinda new to Java and multi-threading is really hard to get right.
me: (once I picked up my jaw) They're about to discover an entirely new level of "really hard"