Software tends to suck when either you build the wrong thing or you bit off more than you could chew and the implementation of a good thing ends in disaster. Or both.
Generally the "lean startup" credo holds true here: Build an MVP fast, get feedback and iterate.
However, there is one technique which doesn't get enough airtime in my view and that is paper prototyping. It gives you a surprising amount of quality feedback with a fraction of the effort of coding something up (and no bugs!), and allows you to iterate there and then.