Search This Blog


Monday, January 14, 2008

What A Programmer must Know before left School

University curriculum is really doing a bad job preparing CS students for software development careers.

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:
  • Collaboration
Modern software development is very complicated. It requires multiple talents and collaboration efforts among developers, testers, customers and management. But how does the school prepare us for that? Only term projects that require at most 2 or 3 developers. There is no need for those projects to face customers. OK, you might argue that the lecturers are the customers; they are the one who give grades, after all. But the pressure facing your lecturers and picky customers are two different experiences. Your lecturers can give you a hand if you can't complete your projects. But if you can't complete your real world projects, the projects that your company has a financial stake in it, you are in trouble.

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
Yup, writing a couple programs does not make you a good software developer. A person who can churn out features at amazing speed is not necessarily a good software developer. Unfortunately a lot of developers (mostly fresh graduates and even some managers) don't understand this. Those coders would tend to write code that are only readable to themselves and don't do the unit tests. So when they left the company, or when they revisited their code, the maintenance work became insanely difficult.
  • Survival skills
This is the most important of all.

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


Anonymous said...

The number one thing that must be taught to anyone who wishes to work with computers:

The difference between "computer science" and "software engineering".

It's surprising how few people are smart enough to understand something so fundamental.

Andy said...

A programmer must know how to conjugate verbs properly, and how to capitalize. So for example, the title of this blog should be "What a Programmer Must Know Before Leaving School". Important stuff.

Jason said...

I have to disagree with several of the assertions here, especially regarding the lambda calculus. Computer Science is a science and like all of academia, CS education prepares the student best for further education.

However I agree with your overall intent: CS students are entering the workforce woefully unprepared for even the most basic of tasks even after completing the most top-notch curriculum available.

Anonymous said...

You say one should know these topics before they leave school, i certainly agree, but you also imply that they should be taught in school. I disagree, wholeheartedly.

Disclaimer, i'm a lazy underachiever that never got past high school.

University is where, i think, you should be working on mental masturbation issues as much as possible. More likely than not, you will never get the chance to devote so much time to knowledge acquisition, it shouldn't be wasted on crackerjack knowledge. Don't get me wrong, collaboration, SCM and personnal skills are absolutely vital, but not worth X grand a semester, nor a scholars time.

Teach me about AI, lambda calculus, GIS, statistics, P!=NP

SCM is something you can have no trouble learning on the spot. Your employer very well expects you not to be aware of their specific work method, and the intricacies of other methodologies. AFAIK, knowing of the concept of SCM before getting a job is enough, check in, check out, branch, merge ... That's enough. You can learn the tools when you need them, and that won't be until you work with others.

Lets not forget your first job will NOT be as a project manager, team leader, or anything that implies you need to know about the details, pros and cons about methodologies.

Collaboration, that's what kindergarden is for, learn to play well with others. Of course, the collaboration you allude to is perhaps more complex, but the concepts are the same. Be nice, learn the language and procedures, adapt, rinse and repeat.

Alot of programmers lack life skills indeed. Ask your dad, a friend, get a self-help book. Chances are, a family member is going to give you much better advice than a teacher with 100 nameless students ever could.

I found your blog via a post about NNPPs. This post is inconsistent with your ideal that we should behead NNPP's, and bring in accountability in the workplace.
I'm rather for that, and hope for my life.

People who didn't program before going into university, do it for fun, contribute to OSS (SCM experience!) are likely to be NNPPs. NNPPs have no room in the workforce, so training them is a waste!