Let's start with the obvious. Part of the sin of the school curriculum is omission. There are really, a lot of relevant subjects that the university does not teach to the students. For example, Jeff Atwood pointed that the important topics such as source control and software deployment are conspicuously absent from the curriculum. Leaving those things out, he said, will not be able to give the future programmer the necessary experience of the real software development world.
Another part of the sin, is the inclusion of too many dry, useless topics such as, hmm, lambda calculus. These topics are great for PhD dissertation, but are useless to build a working software.
There is a saying that in quantitative finance, the more rigorous a paper is the less applicable it is to the real world, maybe the same is true for CS curriculum.
There are a lot more things the school does not teach that are absolutely critical for a career in software development, here are some of them:
And what about the nasty people relationship? For a school project you can shine all the way you want and I bet your groups won't mind ( in fact, some of them even hope that you are so goal oriented that you are willing to cover their work because they won't do a better job than you). If your colleagues are incompetent, fine, you can easily do their part and pass up the work as if it is a collaborative effort. But in real life you can't. You are not expected, neither encouraged to do other people's work.
- Software development and maintenance skill
- Survival skills
Programmers are usually introvert and poor at political maneuvering. But technical abilities can only get you so far. Those who are widely successful are usually those who can work with people very well and know a great deal of politicking. Those who are only good at technical things, or are too shy to protect they own interest, sooner or latter they will sink to the bottom of the food chain.
We all like to believe that people would naturally recognize us if we were real good. Not so. People dynamics are much more complicated than that.
Suppose that you are a superstar programmer, and your team members are generally a class lower than you, then does it naturally follow that they will obey your technical superiority and worship you, cooperate with you and propel you to the top?
Most unlikely, especially if you don't humble yourself.
If you display a kind of "better than thou" attitude, it's going to backfire, even if you don't mean to hurt them and don't mean to convey that impression. Human is very sensitive. Your working relationship will never be smooth once you pique your coworker's ego.
Einstein once said that "a scientist is a mimosa when he himself made a mistake, and a roaring lion when he discovers the mistakes of others". For programmers, we are a mimosa when we made a mistake, and a roaring lion when our mistakes got discovered. What if someone accused us of a mistake we didn't commit? A roaring lion won't turn into a miewing cat.
And don't expect your managers or your boss to promote you just because you are technically good. There are a lot factors determining whether a person deserves promotion, coding skills is just one of them.
Your boss can't promote you if you don't perform well in your job.
Your boss can't promote you if you can't relate well with him or your colleagues.
Your boss can't promote you if he doesn't have the vacant for you to fill in.
Your boss won't promote you if he doesn't have to. Why should he? Keeping you in your current position works just fine, but elevating you to a higher status incurs uncertainties.
Your boss won't promote you if you display too much ego because who knows you will embarrass him in the future.
So there are really a lot of things for a programmer to master if he want to shine when he comes out from a school. Jesus' advice 2000 years ago is always timely and all programmers must take it to their heart:
be shrewd as serpents and innocent as doves