Take classes from people on these lists: http://cte.illinois.edu/teacheval/ices/exc_teach.html. Make sure you go back at least a few years because there are several good teachers who don't teach every semester or were on sabbatical. Prof Bailey comes to mind as someone who was on sabbatical.
When you register for a class go to every single office hour and figure out which TAs know their stuff. Only go to those office hours.
Figure out how much the Professor actually loves the textbook. If he really likes it, problems on homeworks and exams will be of the same theme as the textbook. In classes like that you benefit immensely from taking notes out of the book. Note most textbooks are on reserve at Grainger, no need to buy if you dont want to.
If you haven't taken 241 already, just get through it. The department is still figuring out how to teach that class.... it's not the teachers fault. It just doesn't quite fit right and probably should be two classes.
Use 242 as an opportunity to meet good programmers and continue to work with them afterwords. The actually increase in programming ability from the course itself is questionable. Although again, not the teacher's fault. It's a really hard thing to do.
Get involved in undergraduate research. A great starting point is Lawrence's CS498la (undergraduate research lab). Professors are a lot more tolerant and welcoming than you'd think (but be ready to work hard). Note that research doesn't have to be crazy hardcore theoretical stuff. It can be both cool and relevant (studying some sort of HCI problem on mobile devices?).
Figure out who the competent Math professors are for those classes that are required. I didn't do my research here and got bitten by it. My impression is that there aren't very many good sections for Math.
Take a graduate level course in the subject you are interested in. One of the unique things about top tier programs is that you pretty much can take a course in whatever you want. So for example if dbases are your thing, taking 511 after 411 is the way to go. People who have to scale Rails applications to massive sizes need to know data bases very well... you might as well take the opportunity now to get ahead of the game.
Oh and don't leave freshman physics until your last semester. That was a major fail :P
I don't really have any big secrets, but a lot of people manage to miss most of the above. Apologies if you already know it all. :P
Thanks! That was really helpful. I took 241 last semester and 242 this one. How much more work intensive are the graduate level courses compared to the undergrad equivalents?
They're a ton of work, more so if you're not used to reading technical papers. It's also easy to get behind on the project, which is a very independent activity. Graduate students themselves usually only register for 2 courses a semester. That being said, if you make it through you'll be familiar with what is essentially state of the art. I'm finishing up the networking grad class this semester and I'm very pleased with it. Although I'm not exactly the best person to listen to when it comes to balancing work because I constantly overextend myself.
That's awesome, I have the same tendency to overextend myself. Also, I am considering taking 565 next semester. Any tips you find in keeping up with a considerable workload?
Sorry, just saw this reply. One this is that professors will be pretty forgiving if you fail. Just show that you are working really hard and people will understand if you over extend yourself. That type of flexibility goes away in grad school I think, but for now it is there. Otherwise just make sure you graduate on time. :P