To me, the hardest bugs aren't those that are errors in functionality (something that is simply not implemented correctly). The toughest bugs are the "unintended consequences". These are the bugs that come from implementing a feature and not thinking through how it fits in to the product as a whole.
Sometimes unintended consequences are small: I now have this setting in two places and I need to refresh one place when the user updates the other.
Other times unintended consequences are large: We store files on a file system and the website pulls directly from that file system. However, files below a certain size are stored in the record - too bad the website can't get to them, even if everything else can.
Either way, these are the bugs that almost always get to QA before they're discovered. These are the bugs that bite you right before release.
Preventing unintended consequences is really simple: have a system design and walk through every feature with that design in mind. Preventing unintended consequences is also very hard: you'll never think of everything a user will try. In the end, having an updated, written design is a good first step, even if it doesn't solve the problem entirely.
Down with unintended consequences!