|  
  
  
  
|  **Want to start a startup?** Get funded by Y Combinator.  
  
---  
  
March 2005  
  
 _(Parts of this essay began as replies to students who wrote to me with
questions.)_  
  
Recently I've had several emails from computer science undergrads asking what
to do in college. I might not be the best source of advice, because I was a
philosophy major in college. But I took so many CS classes that most CS majors
thought I was one. I was certainly a hacker, at least.  
  
**Hacking**  
  
What should you do in college to become a good hacker? There are two main
things you can do: become very good at programming, and learn a lot about
specific, cool problems. These turn out to be equivalent, because each drives
you to do the other.  
  
The way to be good at programming is to work (a) a lot (b) on hard problems.
And the way to make yourself work on hard problems is to work on some very
engaging project.  
  
Odds are this project won't be a class assignment. My friend Robert learned a
lot by writing network software when he was an undergrad. One of his projects
was to connect Harvard to the Arpanet; it had been one of the original nodes,
but by 1984 the connection had died.  Not only was this work not for a
class, but because he spent all his time on it and neglected his studies, he
was kicked out of school for a year.  It all evened out in the end, and now
he's a professor at MIT. But you'll probably be happier if you don't go to
that extreme; it caused him a lot of worry at the time.  
  
Another way to be good at programming is to find other people who are good at
it, and learn what they know. Programmers tend to sort themselves into tribes
according to the type of work they do and the tools they use, and some tribes
are smarter than others. Look around you and see what the smart people seem to
be working on; there's usually a reason.  
  
Some of the smartest people around you are professors. So one way to find
interesting work is to volunteer as a research assistant. Professors are
especially interested in people who can solve tedious system-administration
type problems for them, so that is a way to get a foot in the door. What they
fear are flakes and resume padders. It's all too common for an assistant to
result in a net increase in work. So you have to make it clear you'll mean a
net decrease.  
  
Don't be put off if they say no. Rejection is almost always less personal than
the rejectee imagines. Just move on to the next. (This applies to dating too.)  
  
Beware, because although most professors are smart, not all of them work on
interesting stuff. Professors have to publish novel results to advance their
careers, but there is more competition in more interesting areas of research.
So what less ambitious professors do is turn out a series of papers whose
conclusions are novel because no one else cares about them. You're better off
avoiding these.  
  
I never worked as a research assistant, so I feel a bit dishonest recommending
that route. I learned to program by writing stuff of my own, particularly by
trying to reverse-engineer Winograd's SHRDLU. I was as obsessed with that
program as a mother with a new baby.  
  
Whatever the disadvantages of working by yourself, the advantage is that the
project is all your own. You never have to compromise or ask anyone's
permission, and if you have a new idea you can just sit down and start
implementing it.  
  
In your own projects you don't have to worry about novelty (as professors do)
or profitability (as businesses do). All that matters is how hard the project
is technically, and that has no correlation to the nature of the application.
"Serious" applications like databases are often trivial and dull technically
(if you ever suffer from insomnia, try reading the technical literature about
databases) while "frivolous" applications like games are often very
sophisticated. I'm sure there are game companies out there working on products
with more intellectual content than the research at the bottom nine tenths of
university CS departments.  
  
If I were in college now I'd probably work on graphics: a network game, for
example, or a tool for 3D animation. When I was an undergrad there weren't
enough cycles around to make graphics interesting, but it's hard to imagine
anything more fun to work on now.  
  
**Math**  
  
When I was in college, a lot of the professors believed (or at least wished)
that computer science was a branch of math. This idea was strongest at
Harvard, where there wasn't even a CS major till the 1980s; till then one had
to major in applied math. But it was nearly as bad at Cornell. When I told the
fearsome Professor Conway that I was interested in AI (a hot topic then), he
told me I should major in math. I'm still not sure whether he thought AI
required math, or whether he thought AI was nonsense and that majoring in
something rigorous would cure me of such stupid ambitions.  
  
In fact, the amount of math you need as a hacker is a lot less than most
university departments like to admit. I don't think you need much more than
high school math plus a few concepts from the theory of computation. (You have
to know what an n^2 algorithm is if you want to avoid writing them.) Unless
you're planning to write math applications, of course. Robotics, for example,
is all math.  
  
But while you don't literally need math for most kinds of hacking, in the
sense of knowing 1001 tricks for differentiating formulas, math is very much
worth studying for its own sake. It's a valuable source of metaphors for
almost any kind of work. I wish I'd studied more math in college for that
reason.  
  
Like a lot of people, I was mathematically abused as a child. I learned to
think of math as a collection of formulas that were neither beautiful nor had
any relation to my life (despite attempts to translate them into "word
problems"), but had to be memorized in order to do well on tests.  
  
One of the most valuable things you could do in college would be to learn what
math is really about. This may not be easy, because a lot of good
mathematicians are bad teachers. And while there are many popular books on
math, few seem good. The best I can think of are W. W. Sawyer's. And of course
Euclid.   
  
**Everything**  
  
Thomas Huxley said "Try to learn something about everything and everything
about something." Most universities aim at this ideal.  
  
But what's everything? To me it means, all that people learn in the course of
working honestly on hard problems. All such work tends to be related, in that
ideas and techniques from one field can often be transplanted successfully to
others. Even others that seem quite distant. For example, I write essays the
same way I write software: I sit down and blow out a lame version 1 as fast as
I can type, then spend several weeks rewriting it.  
  
Working on hard problems is not, by itself, enough. Medieval alchemists were
working on a hard problem, but their approach was so bogus that there was
little to learn from studying it, except possibly about people's ability to
delude themselves. Unfortunately the sort of AI I was trying to learn in
college had the same flaw: a very hard problem, blithely approached with
hopelessly inadequate techniques. Bold? Closer to fraudulent.  
  
The social sciences are also fairly bogus, because they're so much influenced
by intellectual fashions. If a physicist met a colleague from 100 years ago,
he could teach him some new things; if a psychologist met a colleague from 100
years ago, they'd just get into an ideological argument. Yes, of course,
you'll learn something by taking a psychology class. The point is, you'll
learn more by taking a class in another department.  
  
The worthwhile departments, in my opinion, are math, the hard sciences,
engineering, history (especially economic and social history, and the history
of science), architecture, and the classics. A survey course in art history
may be worthwhile. Modern literature is important, but the way to learn about
it is just to read. I don't know enough about music to say.  
  
You can skip the social sciences, philosophy, and the various departments
created recently in response to political pressures. Many of these fields talk
about important problems, certainly. But the way they talk about them is
useless. For example, philosophy talks, among other things, about our
obligations to one another; but you can learn more about this from a wise
grandmother or E. B. White than from an academic philosopher.  
  
I speak here from experience. I should probably have been offended when people
laughed at Clinton for saying "It depends on what the meaning of the word 'is'
is." I took about five classes in college on what the meaning of "is" is.  
  
Another way to figure out which fields are worth studying is to create the
_dropout graph._ For example, I know many people who switched from math to
computer science because they found math too hard, and no one who did the
opposite. People don't do hard things gratuitously; no one will work on a
harder problem unless it is proportionately (or at least log(n)) more
rewarding. So probably math is more worth studying than computer science. By
similar comparisons you can make a graph of all the departments in a
university. At the bottom you'll find the subjects with least intellectual
content.  
  
If you use this method, you'll get roughly the same answer I just gave.  
  
Language courses are an anomaly. I think they're better considered as
extracurricular activities, like pottery classes. They'd be far more useful
when combined with some time living in a country where the language is spoken.
On a whim I studied Arabic as a freshman. It was a lot of work, and the only
lasting benefits were a weird ability to identify semitic roots and some
insights into how people recognize words.  
  
Studio art and creative writing courses are wildcards. Usually you don't get
taught much: you just work (or don't work) on whatever you want, and then sit
around offering "crits" of one another's creations under the vague supervision
of the teacher. But writing and art are both very hard problems that (some)
people work honestly at, so they're worth doing, especially if you can find a
good teacher.  
  
**Jobs**  
  
Of course college students have to think about more than just learning. There
are also two practical problems to consider: jobs, and graduate school.  
  
In theory a liberal education is not supposed to supply job training. But
everyone knows this is a bit of a fib. Hackers at every college learn
practical skills, and not by accident.  
  
What you should learn to get a job depends on the kind you want. If you want
to work in a big company, learn how to hack Blub on Windows. If you want to
work at a cool little company or research lab, you'll do better to learn Ruby
on Linux. And if you want to start your own company, which I think will be
more and more common, master the most powerful tools you can find, because
you're going to be in a race against your competitors, and they'll be your
horse.  
  
There is not a direct correlation between the skills you should learn in
college and those you'll use in a job. You should aim slightly high in
college.  
  
In workouts a football player may bench press 300 pounds, even though he may
never have to exert anything like that much force in the course of a game.
Likewise, if your professors try to make you learn stuff that's more advanced
than you'll need in a job, it may not just be because they're academics,
detached from the real world. They may be trying to make you lift weights with
your brain.  
  
The programs you write in classes differ in three critical ways from the ones
you'll write in the real world: they're small; you get to start from scratch;
and the problem is usually artificial and predetermined. In the real world,
programs are bigger, tend to involve existing code, and often require you to
figure out what the problem is before you can solve it.  
  
You don't have to wait to leave (or even enter) college to learn these skills.
If you want to learn how to deal with existing code, for example, you can
contribute to open-source projects. The sort of employer you want to work for
will be as impressed by that as good grades on class assignments.  
  
In existing open-source projects you don't get much practice at the third
skill, deciding what problems to solve. But there's nothing to stop you
starting new projects of your own. And good employers will be even more
impressed with that.  
  
What sort of problem should you try to solve? One way to answer that is to ask
what you need as a user. For example, I stumbled on a good algorithm for spam
filtering because I wanted to stop getting spam. Now what I wish I had was a
mail reader that somehow prevented my inbox from filling up. I tend to use my
inbox as a todo list. But that's like using a screwdriver to open bottles;
what one really wants is a bottle opener.  
  
**Grad School**  
  
What about grad school? Should you go? And how do you get into a good one?  
  
In principle, grad school is professional training in research, and you
shouldn't go unless you want to do research as a career. And yet half the
people who get PhDs in CS don't go into research. I didn't go to grad school
to become a professor. I went because I wanted to learn more.  
  
So if you're mainly interested in hacking and you go to grad school, you'll
find a lot of other people who are similarly out of their element. And if half
the people around you are out of their element in the same way you are, are
you really out of your element?  
  
There's a fundamental problem in "computer science," and it surfaces in
situations like this. No one is sure what "research" is supposed to be. A lot
of research is hacking that had to be crammed into the form of an academic
paper to yield one more quantum of publication.  
  
So it's kind of misleading to ask whether you'll be at home in grad school,
because very few people are quite at home in computer science. The whole field
is uncomfortable in its own skin. So the fact that you're mainly interested in
hacking shouldn't deter you from going to grad school. Just be warned you'll
have to do a lot of stuff you don't like.  
  
Number one will be your dissertation. Almost everyone hates their dissertation
by the time they're done with it. The process inherently tends to produce an
unpleasant result, like a cake made out of whole wheat flour and baked for
twelve hours. Few dissertations are read with pleasure, especially by their
authors.  
  
But thousands before you have suffered through writing a dissertation. And
aside from that, grad school is close to paradise. Many people remember it as
the happiest time of their lives. And nearly all the rest, including me,
remember it as a period that would have been, if they hadn't had to write a
dissertation.   
  
The danger with grad school is that you don't see the scary part upfront. PhD
programs start out as college part 2, with several years of classes. So by the
time you face the horror of writing a dissertation, you're already several
years in. If you quit now, you'll be a grad-school dropout, and you probably
won't like that idea. When Robert got kicked out of grad school for writing
the Internet worm of 1988, I envied him enormously for finding a way out
without the stigma of failure.  
  
On the whole, grad school is probably better than most alternatives. You meet
a lot of smart people, and your glum procrastination will at least be a
powerful common bond. And of course you have a PhD at the end. I forgot about
that. I suppose that's worth something.  
  
The greatest advantage of a PhD (besides being the union card of academia, of
course) may be that it gives you some baseline confidence. For example, the
Honeywell thermostats in my house have the most atrocious UI. My mother, who
has the same model, diligently spent a day reading the user's manual to learn
how to operate hers. She assumed the problem was with her. But I can think to
myself "If someone with a PhD in computer science can't understand this
thermostat, it _must_ be badly designed."  
  
If you still want to go to grad school after this equivocal recommendation, I
can give you solid advice about how to get in. A lot of my friends are CS
professors now, so I have the inside story about admissions. It's quite
different from college. At most colleges, admissions officers decide who gets
in. For PhD programs, the professors do. And they try to do it well, because
the people they admit are going to be working for them.  
  
Apparently only recommendations really matter at the best schools.
Standardized tests count for nothing, and grades for little. The essay is
mostly an opportunity to disqualify yourself by saying something stupid. The
only thing professors trust is recommendations, preferably from people they
know.   
  
So if you want to get into a PhD program, the key is to impress your
professors. And from my friends who are professors I know what impresses them:
not merely trying to impress them. They're not impressed by students who get
good grades or want to be their research assistants so they can get into grad
school. They're impressed by students who get good grades and want to be their
research assistants because they're genuinely interested in the topic.  
  
So the best thing you can do in college, whether you want to get into grad
school or just be good at hacking, is figure out what you truly like. It's
hard to trick professors into letting you into grad school, and impossible to
trick problems into letting you solve them. College is where faking stops
working. From this point, unless you want to go work for a big company, which
is like reverting to high school, the only way forward is through doing what
you love.  
  
  
  
  
  
**