Joel Spolsky wrote some Advice for Computer Science College Students last Sunday. It’s all well and good, but it assumes (perfectly reasonably) that you’re going to take the same path into the computer world that he did. I find myself needing to write something for those who may take a more “non-traditional” approach.
First, Joel’s advice:
- Learn how to write.
- Learn C.
- Learn Micro-econ.
- Don’t blow off non-CS classes.
- Take programming-intensive courses.
- Stop worrying about all the jobs going to India.
- Get a good summer internship.
I agree with Joel on learning how to write. Even if you’re not a great writer, being able to string some words together in a coherent fashion will serve you well, no matter what you end up doing. If you can’t send an email to your manager explaining what it is you’re doing, and why you should keep getting a paycheck for it, you’ll end up working in a job where you don’t have to explain what you’re doing, and most of those jobs just aren’t that interesting.
Learning C and micro-econ. Well yeah, they’re useful, but I wouldn’t say that you have to take a course in either. They’re both simple enough in concept that a good book and a bunch of time spent experimenting or thinking will get you through the basics.
Non-CS classes. Again, I mostly agree with Joel. But I won’t disqualify you if you haven’t taken any CS classes. If you’re not a well-rounded person who shows an ability to stick with something other than programming, the best you can hope for is a job where you’ll do nothing but programming, 80 hours per week, 50 weeks per year (two off for good behavior) until you turn 65 and find out that Social Security has no money left for you and you end up greeting people at Wal-Mart.
I don’t entirely agree on programming-intensive courses, either. Spend your time working on something of your own. I’ll be mildly impressed if you wrote a compiler from scratch for some class, but I’ll be a lot more impressed if you developed some software that does something useful and sold enough in shareware to pay your own way through college. I’m more impressed by independent-study and the ability to come up with cool ideas on your own than the ability to grind out assignments. Yes, you’ll need to grind out assignments when you start working for a living, but I’d also like you to have ideas and not just be a code-monkey.
Jobs in India? Go ahead an worry about it if that makes you feel better, but as Joel says, the good programmers still have jobs. If you’re overly concerned about this sort of thing, you’re probably too nervous to work for me.
Internships? Don’t get a good internship for just a summer. Get one that goes year-round and will provide you with income while you’re also working through your degree. Or take the summer off and bike across America, or do something interesting. Frankly, you’ll have plenty of time to work in the computer business, and if you’ve done nothing but work in the computer business, I’ll figure you need more experience in “the real world”.
Now my advice:
- Learn how to write.
- Learn how to program.
- Show you know how to program. And release. And support.
- Get a life.
I’ve already covered learning how to write, but let me repeat the main point, in case you missed it. You have to be able to write to communicate in today’s world. If you can’t communicate why I should hire you, why should I hire you?
If you want to work in the computer business, you should obviously learn how to program. But I’m not as restrictive as Joel in saying that you need to learn C. You’ll need to know enough C to read other people’s code, but if there’s another language that does the job better, and you can prove that to me by hooking code you wrote in Visual-Python-for-Workgroups into my existing mess of Mac code, I’m hip to that. I don’t claim to know everything, and I look for people who have skills I don’t. Being on top of the latest languages is one of the skills I don’t have (though I know that Perl, Python, and PHP are all useful). Just remember that no matter how cool your project is, it’s going to need to work with older code at some point. If you can’t glue the pieces together, I’ll have to redo everything in a language where we can. That probably won’t lead to long-term employment for you.
Show what you know. Release a product and support it. Even better if it pays part of your way through college, but what I’m looking for here are two things. The first is the ability to finish something so you can release it. The second is the ability to support the thing and survive that first round of bug-reports you’re going to get and that you actually wrote something that can be supported. Both are important, and both are valuable software development skills. And it doesn’t have to be a huge project. Find one thing that bugs you about your computer, and set out to fix it. It doesn’t have to be something as glaring as one of Tog’s 10 Most Persistent Design Bugs – there are plenty of things wrong with computers. Find one that bothers you and fix it.
Finally, get a life. Life is not all about work, and while socially-inept employees who do nothing but sit and grind code may be useful, I don’t hire them. I’d rather have someone who has a wider range of experience to draw on and can come up with ideas from areas that aren’t computers. If nothing else, it’ll make those times when we’re sitting around waiting for a client to show up more interesting. In the larger scheme, solving problems in real life, like figuring out what to do when you missed your train in Bulgaria and had to find a hotel at three in the morning without speaking the language shows me that you can deal with the snags that will come up in life. There are snags aplenty out there, especially for a small business like the one I run, and employees who can help me navigate past those snags are worth their weight in gold.
That leaves me with a mostly-finished essay. The problem at this point is that I don’t think I’ve explained the title yet. The reason I directed this essay at non-Computer-Science students is that I generally believe that computer science isn’t what I do. I do software engineering (on a good day) or computer programming (on a bad day). Computer Science graduates, in my experience, often fall into the trap of thinking they’re still in college, and spend weeks optimizing a function that takes less than a percent of the time in an application that runs once a year (thanks for that one on NYE, DaveR), spend three weeks designing a module that needs to be completed in a month, re-implement QuickSort when there’s a perfectly good sort in the standard library and a bogo-sort would be fast enough anyhow, or any of a number of other traits that don’t work out very well in the business world.
It’s not that I won’t hire a CSci grad (as was the case at Control Data and ETA Systems when I started in the computer biz), but I’ll probably start looking for people who studied in other areas. It’s like my “Get a Life” paragraph above—I’m looking for someone who can solve problems. I can help you learn programming in the environment we need to work in, but I’m not so sure I can help you learn how to solve problems.
And like Joel, I have no idea what I’m talking about, but that’s never stopped me before….