Things I Learned at University|
Posted May 5, 2003
Usually, when I tell people that I have a degree in computer science, they change the subject pretty quickly. Sometimes they ask me about it. Here is some of the stuff I tell them, if they let me. ("How do you turn this thing off?")
What is it like to study computer science?
I did computer science at the University of Toronto. It's fascinating stuff. The biggest surprise for me was that it turned out to be mostly about math; fortunately it turned out that I liked math. University math was very different than high school math (which is a good thing). More difficult and way more interesting.
I'm told that U of T "places more emphasis on theory" than other U's; but in general, computer science is pretty theoretical stuff. You have to appreciate the aesthetic value of math in order to like CS.
I thought I would learn how to write really complicated programs if I went to university. Instead I learned how to write simple programs that work better than complicated ones. How to prove that a program cannot be written (e.g. will this program crash, is it a trojan horse, does it do the same thing as this other program). How to tell which programs will still run fast if you give them a thousand times as much data, without actually running them. Why the clock is always wrong, and how to deal with it. Why computer hardware breaks, and how to make a machine that still works when it does. How programmable ICs work. How microprocessors work. How to prove that the rational numbers can't be counted. How to prove derivatives. How heat works. How the theory of natural selection came about. What stars are made of. How to write like an educated person without being one. When not to bother.
One practical use of computer science was discovering, from circumstantial evidence, why Microsoft's implementation of the standard C++ ostrstream class in Windows 95 was so inefficient that it took several hours to copy a 10 megabyte chunk in memory. Evidently, somebody at Microsoft wrote:
if (size == max_size) reallocate(max_size = max_size+1)
Anyone in my data structures class would have written this instead, and my program would have run a million times as fast:
if (size == max_size) reallocate(max_size = max_size*2)
(It would have been a much more practical discovery if I'd had their source code, or even the email address of the person in charge of that code, but at least I knew what was happening. In the end I just had to bypass their code and rewrite it myself. I haven't bothered to check whether they've fixed it yet.)
What's good about university?
You're away from home. You're surrounded by smart people. Like you, they are happy to have smart people to talk to about smart things (and stupid things). Keep in touch; someday you'll probably work for them, or hire them. Everyone's studying different things for different reasons. There's no drudgery; every day is different because the whole point is to learn stuff. If you live in residence, it's twice as good because you don't have to commute back to "the real world." If you're lucky, you never even have to go to work (I don't recommend having a job while in school; you're probably better off borrowing, and making the most of your tuition fees by learning stuff while you have the chance).
You can take courses in a hundred different subjects. The teachers aren't just teachers; they *are* the subject (they have the ideas and they write the books). Eventually you realize that you are the subject too.
It's good for your career: you can tell which jobs are interesting, and you will have a chance to get those jobs. You'll still have to learn some new stuff when you start - they don't teach Product X at university - but people will invest in you because they know that you can learn.
Or, in the case of the Kootenays, because "I have a degree in computer science" sounds a lot like "I have an IQ of 700". Meaningless but impressive.
How do I make the most of university?
As often as possible, choose your courses based on the teachers rather than the subjects. If you find a teacher who works for you, sign up for all the courses you can with that teacher, whether or not you think you're interested in the subjects. (I wish I had figured that out before 3rd year.)
(My favourite professor was James Stewart.)
Don't go to university to qualify for a job. An engineer once told me (and I now believe) that a B.Sc. doesn't prove that you know how to do any particular job; it just proves that you can learn. CS does have some applications to programming jobs, but you're probably better off forgetting about that while you're there. Don't ask, "why do I need to know this?" - ask "why is this interesting?"
Don't try too hard to get high marks. Find insight, and GPA will follow. Either way, it's a game, so learn the rules as you go and enjoy it.
Which subject should I pursue?
Don't choose a specialty until you've finished your first year. You'll probably encounter a bunch of interesting topics that you never knew existed. The course calendar doesn't do them justice.
Specialize in whatever is taught by your favourite teachers.
Get a B.Sc., then think about a specialty.
Anything else I should know?
Sometimes you'll feel like you aren't learning anything worthwhile. That's normal. Years later, you'll think about the great stuff you learned, and how ironic it is that you thought it was useless at the time.