I don't think it's any of the reasons that you listed.
To a large extent, I blame management - they push sub-optimal solutions because it's generally the fastest way to resolve the immediate problem.
This generally results in poor solutions being piled up on top of each other that becomes progressively more impossible to maintain.
This despite the fact that if additional time were allocated to come up with a better solution, tomorrow's software would be easier to integrate on top of today's, and with a higher quality of code.
But the reason that managers behave like this is because they can - and this I think has more to do with the ethereal and timeless nature of software than anything else.
In the real world it simply is not possible to put together a physical artifact with the sort of compromised constructs that appears in software.
There are costs of material to consider; costs of production.
There's degradation over time.
All of these aspects of physical constructs provide a strong motivation to produce a quality product - not out of beneficence, but because (quality engineers aside) it's cheaper and it's really the only feasible option.
This despite the fact that if additional time were allocated to come up with a better solution, tomorrow's software would be easier to integrate on top of today's, and with a higher quality of code.
But the reason that managers behave like this is because they can - and this I think has more to do with the ethereal and timeless nature of software than anything else.
In the real world it simply is not possible to put together a physical artifact with the sort of compromised constructs that appears in software.
There are costs of material to consider; costs of production. There's degradation over time.
All of these aspects of physical constructs provide a strong motivation to produce a quality product - not out of beneficence, but because (quality engineers aside) it's cheaper and it's really the only feasible option.