I believe we should do away with Computer Science as a field of undergraduate study - at least, the way it's implemented right now.
It's a given that, generally, a Geology major is studying to be a geologist. Likewise, a Biology major is training to become a biologist, and an Art major will probably end up an artist of some kind.
Computer Science students, however, don't go to college to become computer scientists. They go to learn "programming."
Theoretical computer science involves complex math and theory that is useful and interesting and takes a sharp mind to fully comprehend; most undergrads don't care and increasingly are not being exposed to it. Instead, popular languages are being taught in undergraduate courses, with the intention of preparing students for future work (see Joel Spolsky's The Perils of JavaSchools for another take on this phenomenon.)
The sad thing is, having worked one-on-one with several recent Computer Science graduates, I don't believe that they're learning much about programming, either. Students with a passion for programming study it in their free time, work on their own projects, and do most of their learning outside of the classroom. Fresh graduates with a BS in Computer Science and no real experience programming just don't have the skills they need to do anything but grunt work. As an undergraduate Biology student, my first CS course was on bioinformatics algorithms and had several Masters students, and when I was able to implement the algorithms quicker and more efficiently than CS students, I saw how lacking my school's curriculum was.
Solutions thus far have been to dumb down the CS degree by using higher level ("easier") programming languages and teaching less theory and advanced math. I think that aiming to dumb down the curriculum in order to prepare students for a corporate programming career is killing off the pool of intelligent academic computer scientists. The solution? Accept that there's a difference and offer two distinct majors: Computer Science and Programming.
The immediate result would probably be a huge shift of students from CS to Programming. Maybe some CS departments would cease to exist due to lack of interest. Programming students would learn the basics they need to succeed in the corporate world (similar to some "Information Systems Management" programs, but with a more straightforward focus on the technical aspects of development.) But smart CS students wouldn't be hampered by the dumbing down of their programs of study. They'd be exposed to more current topics in research and have the opportunity to take more advanced courses. They'd be allowed to choose from emphasis areas more in line with the current directions of academia. The Computer Science department would be a fraction of its current size but the per capita ability and motivation would go up, and these students would go on to be the brilliant researchers of the future. Their peers in the Programming department could get the high-paying job at the corporation of their choice, or start their own companies.
Let's accept that there's a difference between the two types of student, and start treating them differently.
Edit: Based on comments from several readers, I think "Software Engineering" is a much better name for my proposed vocational split-off than "Programming." Also, this pattern has already been implemented at some Universities, including Purdue (see CS vs. Computer and Information Technology) although as of yet it's hardly pervasive.