Well said. I have to agree.
The education system has stopped turning out developers who can construct a solution that is thoughtfully-designed, well-engineered, efficient, elegant, understandable and maintainable. Sadly, as time marches on, I see more and more code in the flavor-of-the-month language which does the job but makes use of few of the language's features and has all of the appeal of a stomach pump. Sure, it's OO because the environment dictates it, but what's inside is still procedural in nature, and a lot of what I see in those procedures is of pretty low quality.
Part of the problem is that our tool boxes have much more complex tools in them than when I started writing software (23 years ago). I've been fortunate in that I've been able to grow along with the industry and absorb new concepts gradually. Maybe in our zeal to turn out programmers who can get a job using the latest language, we're trying to cram in too many things too early on. Maybe because of the amount of material, it should take six years to get a CS degree instead of four.
The solution? Don't use Java as an introductory language. I don't think someone who's never written a program in his life is ready for it. Start with a nice, strict procedural language that's good for introducing the foundation concepts. And don't forget a little assembly, so students can understand what's going un underneath all of those calls to system.out.println(). I find that few do these days. (Wow! You mean the machine actually has to send out one character at a time? Whoa!)