This thread is just another version of "should we promote certificates". 🙂
Having spent 30+ years in the industry as a jack-of-all-trades (master of none I admit) I've seen great self-taught/horrible self-taught and great degree/horrible degree developers.
I've actually come to the conclusion that CS teaches the *wrong* stuff. Everyone who thinks CS teaches you underlying theory is only half right. CS teaches theory--but not *useful* theory.
I mean sure, learn a couple of sorting algorthythms in CS 101 but do it to teach the *important* stuff. Not how to sort--instead teach *why* bubble sort is such a horrible choice. (Because it works way too hard, that's why!)
I guess the true importance of theory can be boiled down to an appreciation for elegance. That's really what development is all about. Something that's simple, fast, *and* easy to maintain, that's the holy grail.
So the theory you should be teaching (beyond the basics of looping, branching, syntax etc) is how to recognize which technique will be better in a given situation, how to break down a problem into pieces, *why* we document, how to write user documentation that is actually helpful, principles behind UI design (why you don't use 15 colors on one screen 🙂 )...and all of that with emphasis on why one way is better, not just how to do x, y, and z.
You concentrate on elegance in CS and mix it with apprenticeships in the real world and you'll vastly improve the developer average skill--and halve the learning time.
Because when someone knows the why of a thing they tend to make fewer stupid mistakes...