One problem is that junior and mid level developers have a lot of trouble figuring out good coupling because they are not experienced in the ways things can change.
I was reviewing some code yesterday and the developer had a bunch of interfaces for everything so she could swap out implementations and she was very proud of how modular everything was. The problem was that all of her interfaces accepted a File object instead of a stream so we could change what the behavior is but not what it acts on which is really the opposite of what we needed.
It's hard even if you're not a beginner. One of the hardest aspects of good design is choosing the appropriate level and location for coupling.
I find that most developers who think that they can predict what kind of coupling they will need for future requirements tend to be wrong, too, no matter how experienced. Only backwards-facing refactoring really works at producing a good result, coupling-wise.
Loose coupling (which implies getting rid of global state) is at least equally important, as is failing fast.