Building Software
Every software is built for a need. Bad software exists because the need is not translated correctly. Either the need was expressed incorrectly or translated incorrectly. That is why software goes through iterations. Software is changeable unlike building a house and hence we can iterate several times until we translate our need correctly. But like building a house without a proper plan and thinking if the software was built, every iteration will result in destroying what was built and end up rewriting it totally. That is where all the design principles, patterns, architecture etc. come into play. Even if 80% of the need was correctly specified, without a proper thinking on how to translate the need in software in terms of an extensible modular design it will require a rewrite every now and then or it will become a patched ball of mud over time.
How do we get the need right ? Often software is written by developers or programmers for businesses in other domains. The developers have to be paired with domain specialists and they have to come out with the specification of the need by repeated questioning and expanding the thoughts around the need. The developer should be able to structure the need into software modules and be able to clearly identify the bunch of modules and the flow of the computation across them that handles a need. Thus every need, small or big, low or high priority should be traceable to the design on paper and overall if the domain specialist can understand what the software takes in and what it gives out on each of the need and the developer can ensure that every new challenge brought in as the needs are elaborated can be handled in the software without a lot of adjustments or a rewrite, then the core of the software begins to stabilise for addressing the broader problem.
This is the time when an iterative model of development should be employed to start developing end-to-end features that has the capability to see the product in parts and allow it to incrementally evolve into a pliable monster.