When I design programs, I first design the user interface using paper prototyping. I test the UI prototype that the users can reach their goals with it. Having something concrete/visible to show to the users and clients makes it easier to explore the requirements and to find out what the users really need.
In the UI design (requirements analysis) phase, I always try to design the ideal solution. I don't take into consideration that how hard some feature would be to implement. Then when the design has stabilized enough to be implemented (usually it takes a week or two), we discuss with clients and programmers about how much it would take to implement the things and which things are the most important.
Because we first designed the ideal solution, we can see the whole picture of what is needed, and we can begin to adjust the scope of the project, so that first only the most important features are implemented. Also if some of the ideal UI designs would be too expensive to implement, we can make a compromised design which has slightly lower usability, but is much cheaper to implement. The UI designer is always the person who designs the compromise (i.e. not the programmers), so that it fulfills all the requirements and that it's usability will be good enough.