There are a lot of good points here, but I think the most important reason is being overlooked: not grokking the needs of the users. In my Fortune 150, all of the internal software is developed by teams of outsourced developers. Whether it's over the wall, or halfway around the world, the effect is the same: the developers don't truly understand how the users will use the software. So it winds up being crap, regardless of how carefully some middle manager -- who also will not use the software -- writes the specs.<p>I've made a career out of being a mechanical engineer who writes software for other engineers, <i>while being embedded in the group</i>, and not spirited away in some dusty development group in another building or another continent. As an engineer, I understand precisely how the other engineers will be trying to use my software, and it makes for a better overall product. Of course, I'm biased, but I think my software has had much more success than competing projects, because of this. If I had the time, I could name at least 2 large, direct examples where this has proven true, and several more smaller ones.<p>TL;DR: Programmers need domain-specific understanding of the problem they are trying to solve with the software.