How to teach software development
Software development is teamwork. The most important techniques you learn for project success -- or get wrong otherwise -- are about working in teams. The methods that have made the biggest improvements in development success rates are not tools or technical stuff, they're about how people work together -- most notably, the agile methods. Tools are useful to support good ways of working, once you've sorted out what they are.
So it's unfortunate that most computing degrees, in most parts of the world, don't teach these teamwork aspects. If you're lucky, you get some stuff about agility, but actually running a project -- with all the practical stuff that entails -- not much.
Sheffield University in the UK is different. There, Professor Mike Holcombe has been running a course for some years in which the undergraduates get to work on real agile projects in a real company for real customers. He uses group assessment methods, as applied in other disciplines where teamwork is a necessary part of the curriculum. His students are in great demand by industry, and “more Sheffield CS students than from any other UK University made it to the finals of the 2004 Microsoft Imagine Cup”.
Why don't we see more courses like this? A big factor is that academics haven't often worked in a commercial environment. Lecturers are chosen for the number of papers they've written, so it's difficult (though not by any means unknown) for anyone to move from an industrial into a decent academic job. This is unfortunate in an engineering discipline -- one that owes its existence to the industrial activity. Even though very many academics have close ties with industry -- well, it isn't quite like actually being on the job.
So Mike's methods haven't spread through Universities like the wildfire they should. Which is sad.