I was at university for a fairly long time. Well, I think it was a long time anyway. Don't misunderstand me, I wasn't one of these people who started three different courses and finished none. My bachelor degree was four years, which included a placement, then I went on to do another degree. Now I often wonder, was it a good use of my time in terms of what I learnt and how it has helped my career?
What's so important that I didn't get taught? Let's start with code construction. When I left university I could write the basic components of a program, methods and classes, but I had no appreciation how they should fit together. It's like being taught a few words, but not being taught how to string them together to form a meaningful sentence. I had heard the term 'modular' and I knew that's what I was aiming for, but could I do it? No. I'm pretty sure the principles of loose coupling weren't covered, which is frustrating because it is so key to writing good software. Add to this nothing about design patterns, unit testing, why and when to use inheritance, the importance of using conventions, refactoring, and you've got a serious hole in your knowledge.
I could bang on about other aspects of code construction that were lacking, but I'd be here all day, so I'll move on to another subject: software. What is the one piece of software that all programmers will use daily? The integrity of their work depends on it, being able to isolate their partially finished work from other team members depends on it, and their ability to roll back the code if they mess up depends on it. Of course I'm talking about source control. The importance of source control really cannot be overstated, it's absolutely unbelievable that this wasn't covered. Subsequently I ended up using Source Safe [shudder] for several years using a checkout, lock, check in type work flow, none the wiser that there was considerably better software and work flows available. What is another piece of software that programmers use daily? If it's good it will make sure they know what has to be done and by when. It will contain details of the work to be done and the progress. Obviously I mean some kind of bug/feature tracking database. You could say that there are so many that it's pointless teaching one. I would argue that you should have exposure to at least one, if only to underline the importance of it's use. As with source control I struggled for several years using less that adequate bug tracking software (e.g. a freebie or a spreadsheet) before using some commercial software and really grasping the benefits.
So far I've concentrated on the technical aspects of my course that were lacking, but there were other things which are just as important that were missed. I'm referring to things that can't really be taught but need to be discussed. Not one lecturer ever encouraged me to read about software development. Nobody ever said read Code Complete or any number of other books which are, to my mind, essential reading. There seems to be an assumption that you should stay within the confines of the course material. Either that or the lecturer wasn't capable of teaching material outside of the course. Anyway my point is you should always encourage people to find out information for themselves and read around a subject, and I don't feel this was the done.
So, what are the alternatives to university? Are they any better? Off the top of my head I can only think of two; some kind of intensive programming course or on the job training. Both of these would be more focused and therefore increase your skills much more quickly than a university course. One disadvantage is that you'd probably be exposed to less technologies and languages. But would that matter? I learned a whole load of stuff at university that I've never needed. Ever heard of VRML? No? Don't worry, nobody else has either. My preference would be on the job training, as the experience is guaranteed to be applicable to a job. And the most obvious statement award goes to....me! Seriously though, I've found that knowledge gained on a course can be difficult to apply to a real life situation. The flip side is that many see a degree as a passport to a job. Ever seen a job spec that said "relevant degree required"? I've seen a few.
My point with all this waffling is that based on my experience I don't think university is the be all and end all. It will teach you the basics, but it won't necessarily make you a good software developer. But, having said all that, university is a good laugh.