As emphatic as it may sound, software projects rarely live up to expectations. In the industry, software has often been assimilated to civil engineering; but, if civil engineers are set out to build a bridge, then a bridge gets built. Chances of success are well over 90% and, more, the bridge almost always functions correctly and is built fairly close to budget. (Notable exception is Italy, but that’s not going to be a valid test case :))
What if we talk about software engineers?
If a team of developers is set out to develop a software application, then it is very uncertain whether anything of use will be delivered at all. And often budget is exceeded and any deliverables are likely to be quite different from expectations.
There are many reasons for this, but organizational culture is probably the one that summarizes well all the aspects involved. Mentality is also part of the organizational culture. For example, if a civil engineer under estimates the load bearing beam to cut costs, he would be sent to jail. (Again, Italy is notable exception here.) But if a software engineer cuts testing or development time to cut costs, he gets promoted. And, worse yet, this is just what most managers often ask for.
The mechanics of relationships between managers and development team should be refactored well before than refactoring code.
To be continued.