I just finished reading Brain Rules by John Medina. The last page of the book inspired this post, but let me first tell you what the book is about.
The book examines different aspects of our brain and derives from them some principles and suggestions on how to improve better behaviors. None of these suggested behaviors are surprising at all, but Medina (very entertainingly) explains why they are good for us given the brain's structure and describes some research that validates these claims. For example, chapter 1 tells you that doing aerobic exercise actually improves your mental capacities. Another chapter talks about the need for sleep and another on why stress is bad. Two chapters talk about memory (short term and long term), explaining why repetition of new knowledge can greatly improve its recall. Another chapter explains (finally!) that men and women are different (women are apparently much more complex than men, in case you need another shocker), and another stresses that we never stop learning in life (or at least, we have the capacity to).
At the end of every chapter, Medina asks how we can apply these nuggets of knowledge to develop new methods for education. In the last chapter, he explains why the unique aspect of medical schools make for well-trained doctors as well as curious researchers. The point is that in medical school students are learning the theory of medicine at the same time they are practicing it (in increasing doses as they advance in the program). Hence, they are able to apply their knowledge immediately and, after observing patients, ask novel questions that lead to new research and discoveries. Medina suggests that the same principle can be possibly applied in other disciplines.
I think Computer Science education can really benefit from such a model. I obviously don't have all the details worked out here, but imagine that every Computer Science department (or set of departments) had a software company on the side. As students go through the program, they start getting tasks from that company to build software for it, participate in designs, see how product decisions affect engineering processes, and even see some company politics at work. These companies will be real (they'll need to pay for these services) -- they'll generate real software for real customers.
I even have an initial idea of what these companies can do. Given that these companies are likely to have challenges competing in the market, they need to address a niche of customers who are willing to put up with lousy service, mediocre products and delays in software release cycles. I.e., customers who have nowhere else to go!
These customers are called scientists. Scientists are always complaining that they don't have the right software tools to do their science. Real companies typically don't find scientists to be an appealing set of customers because, well, they don't really want to pay up and they often have very specialized needs. There are huge challenges in creating good software tools for scientists, and university-affiliated companies could be an excellent place to develop this software, while preparing the next generation of computer scientists for the real world.