|Think about Loose Coupling|
While it's hard for me to say how useful a CS degree would be (high school dropout 'cause of Math of all things... ), I don't think by any means it's a necessity. I've met plenty of CS Majors that were bigger hacks than Danielle Steele.
I don't think anything is a replacement for experience (and books). With the abundance of computing power today, it's really easy to churn out bloated code that merely functions. This has it's place in some limited situations, but it's also why even though PC's are 20 times faster than 6 years ago, the actual performance gains lag far behind. (Windoze anyway). On the other hand, "Premature optimization is the root of all evil."
Slightly OT, I think the fundamental picture of PC Computing is lost on many a college student. I think a great project for someone new to computing would be to have write a game or some similarly complex simulation on an old 386/486 (or something with constraints) that was way too ambitious to actually run on such an old system.
They would get their hands dirty. Once they got it running (slowly), they'd be forced to look at the efficiency of their algorithms. Once that was tweaked, they'd have to turn to look at the operation of the system itself for further speed, then finally, compromise features. I can only speak from my own experience but these are issues that come up quite routinely in the programmers line of work and are hard to teach from a book.
I also think every programmer should do some assembler, at least for awhile. While it's tedious as hell, it gives you a great feel for what is actually going on under the hood.
my $two_cents && 'Happy Holidays';