A lot of programmers spend so much time dealing with problems in the "plumbing" (functional) level that they neglect interface, so in effect, using the program is like plugging together wires and hoses in a box full of moving gears and grease. Unix pipes are great for getting stuff done, but a lot of people don't want to deal with things at that level.
Good design is more than just pretty graphics, but companies don't see it that way. And more often than not, programmers, who have no visual or usability training are put in a position where they must come up with a good interface and interaction design themselves.
For many companies that is the reality.
> And more often than not, programmers, who have no visual or usability training...
It's not just that; the elements that affect usability during development, debugging, etc. are often completely unrelated to elements affecting usability for end users, so you get interfaces like this: http://www.ok-cancel.com/comic/4.html That's a great interface for ... figuring out if endian-ness is affecting a music player. Or something. Certainly not for using it to play music.
(that doesn't make your statement any less true, just sayin...)