Good design is built on a portfolio of psychological lessons. Why something works well is always because it works the way we expect it to. It doesn't surprise us. It delights us. As human beings are illogical creatures that do things in daft ways without spending very much thought on whether they're right, sensible, rational or even possible, makes designing for them hard. You have to step outside of neat, linear process-oriented thinking and start looking at what people actually do, not what they do in an idealised vacuum without fads, cultural biases, or whatever else is going to change someone's idea of 'right' today.
For a design to be something that really enchants the user it has to work the way they expect it to work. This is why I believe 'coders' find interface design extremely hard - building code is all about finding a logical solution to a problem that works every time with neat boundaries and exceptions for the edge cases. Designing a usable interface is all about finding out what a person thinks about when they're doing something, or, more often, how a person does something without actually thinking about it. If you can get an interface to the point where it essentially disappears by providing exactly what the user expects you'll have a beautiful experience.
That interface design necessesitates thinking in more human terms than logical doesn't mean that there aren't rules to be followed; it just means that the rules aren't born out of obvious processes but years of experience. Designers have been trying things and finding what does and doesn't work since people started making tools. Furthermore, if design wasn't complex enough already, the rules vary. There are factors that affect designs depending on who the user is, where they're from, how they're viewing the website and what they're looking for at the time.
Very occasionally people come along who manage to straddle both sides of the developer/designer divide.