I think the repeated maxim "put yourself in your user's shoes", is very hard to try to accomplish in practice, for some reasons.
But for complex functionality I think two reasons are foremost:
- You really may not know enough of your users everyday tasks related with it, and how they are used to deal with it, but as you are being paid to develop something new, probably they aren't happy with it anyway, and they are waiting for you to come with some breakthrough, so they are only the best sources to gather "hints" on what should be designed, but not the "reference" for it. So as some have said, you need to cross those hints with ideas from other realms. This mindset is hard to come by, or develop: to keep your mind open to many influences/ideas and look out for the 'hidden' connections that could be explored to come up with an innovative solution.
- Complex UIs need to be simplified, and that means putting most important features in front of the user's nose (or mouse pointer), and hiding what can be guessed by the code. But here the problem is if you have a single user it is somewhat simple to figure out, what it really NEED to do, and find some good guesses from usage stats, but normally you are faced with a variety of users, maybe approaching your UI with different needs, so you'd end up with an 'averaged' solution that's dissatisfies more than satisfies most of your users. Cloning the UI in per-user-profile fine-tuned simplifications yields better results, but navigation and maintenance become harder. Another approach is to make the UI adaptive and then customizable, first keeping more frequently/recently used things on the 'top' and allowing the user to pin/unpin things and defining default values and such.