One of the reasons that I believe communication between developers and non-developers is difficult is because developers must work in a world of specifics and details whereas a non-developer can casually neglect those details without even knowing they’ve been neglected.
For instance a non-developer says we need to allow users to log into this system. Easy enough, non-developer thinks his part is done. The developer looks at this requirement and thinks, is it a single users system? Will people register for this system? Is htaccess acceptable? Should it be a web based login? Etc. etc.
The above example is overly simplified and does not entirely show the mismatch. The only way to improve communications between the two groups is to ensure both groups understand how the other thinks. Without this understanding there will be tension that doesn’t necessarily need to exist.
The non-developer has most likely been educated in a less scientific and more abstract manner. This leads the non-developer to neglect details that are essential to any system designed to run on a computer that has to understand all paths through the system.
The developer on the other hand has to think about and understand all these paths to be able to build a system that fully functions. Always thinking about and contemplating whether or not the requirements are complete enough and whether they conflict with each other.
I believe the only way to resolve this mismatch is through educating both parties to be more understand of how the other must think. With this education maybe each party can move toward the others way of thinking enough to make the resulting system that much better.