First is code that is statistically correct, in other words, the chances of the combination of factors that bring it down is acceptable small. The most common kind is multi-threaded, wherein a simple example it takes longer to read a file over the network than to perform some calculation. Inexperienced and crap managers. Want to hear solutions not problems and care more about delivery soon than quality delivery later. I know that’s not what they say, doesn’t stop it being true. An amount of good this month is worth a lot more than next. This is not always a sign of crap management. If you’re a startup the clock is ticking loudly. And it is much better to have revenue from a product.
That acts a slowly leaking wound in terms of maintenance. I’m not going to spend too much time on internal politics here though it has sucked up a big chunk of my life as a programmer. Officially or unofficially pieces of code are owned by managers or groups. And not only will you be prevented from changing it but often from even using it. And rarely are they explicitly documented, in fact, one-way software. Development cultures go bad is where people who’ve been there a long time where long may be as short as 18 months use it as a way to deny newbies an understanding of the way things should be done so as to make the long-timers look good in meetings.