Lambda the Ultimate recently had a nice summary of a paper titled, "Is Transactional Programming Actually Easier?" In it, Rossbach, Hofmann, and Witchel report a study in which 147 undergrads in an operating systems course solved problems using traditional concurrency control mechanisms and newfangled memory transactions. The result? Students reported that transactions were harder to use, but actually had fewer errors in their synchronization code when using them.
At the risking of sounding like a curmudgeon (yes, David, I'm looking at you), why the hell don't we do more of this? Why don't we apply usability testing techniques to programming language features? It's easyto do in small cases, and as Microsoft's Steven Clarke discusses in his chapter in Making Software, when done systematically, it can make programmers' lives a lot better.