This is a response to CS undergrads asking for advice about what to do in college.
To get good at programming, work a lot, and work on hard problems. The best way to do this is to find some engaging project. This project probably won’t be a class assignment.
Another way to get good at programming is to find other people who are good at it, and learn what they know. Some of the smartest people around are the professors, so consider volunteering as a research assistant. Beware though - although they’re usually smart, a lot of them don’t work on interesting stuff. You should avoid these professors.
The amount of math that you need to know for programming is pretty small. It’s certainly less than what CS departments will admit.
But math is still worth studying because it’s a valuable source of metaphors for other types of work.
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.
Language courses are an anomaly. I think they're better considered as extracurricular activities, like pottery classes.
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.
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.
The languages you should learn to get a job depends on the kind of job you want (big companies want different things than small ones and research labs).
You often learn things in college that are more advanced than what you’ll need at a job, and a big reason for this is that it gives your brain a workout.
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.
You don’t have to wait to graduate before you start writing real world applications - start contributing to open-source projects while you’re still in college.
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. Don’t be deterred from going if you just want to learn more. But be warned - you’ll have to do a lot of things you don’t like (eg. your dissertation).
Aside from the dissertation, most people love grad school.
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.
On the whole, grad school is probably better than most alternatives. You’ll learn, meet a lot of smart people, and get a degree.
As far as getting in, 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.