PostHole
Compose Login
You are browsing eu.zone1 in read-only mode. Log in to participate.
rss-bridge 2026-03-01T21:54:49.388467797+00:00

Undergraduation


****

| Want to start a startup? Get funded by
Y Combinator. |

****

| Want a summer job? Why not be a
Summer Founder? |

-->
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. [1] 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. [2] 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.[3] 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. [4]

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.

I'm not saying that literature is bogus, by the way, just that the
way to study it is the way its practitioners do. Novelists work
honestly on hard problems. Indeed, it's precisely because this
work is so hard that literary theory happens. Most literary
theorists would be writers if they could, just as most art critics
would be artists. -->

[...]


Original source

Reply