Maybe a failure is actually necessary to be able to acknowledge these facts and then that failure contains the seeds of success in a second attempt. The failure becomes a discarded prototype. What is perhaps worse is something that is "made to work" because of costs already committed, but which then is a nightmare for ongoing refinement (maintenance is a bad term from waterfall). This is what Domain Driven Design is aimed specifically at preventing I understand.