I would add to this a couple things, from personal experience.
First, make sure to get a breadth of exposure to CS concepts. A computer science department is an unholy abomination glued together from fragments of math and electrical engineering, and you want to understand both. Learn to speak in terms of Turing and Von Neumann as well as Church and McCarthy). Understand both the gritty details of digital logic families and the transcendent beauty of Y, the fixed-point combinator.
Second, learn something else, too. And I don’t mean math—CS alone makes for interesting toys, but the true power occurs when you apply CS concepts to solving problems in other fields. Learn the ropes in some other domain, and then apply what you’ve learned from CS to it. Learn and apply aggressively the Three Great Virtues of a programmer in everything you do.
I would add to this a couple things, from personal experience.
First, make sure to get a breadth of exposure to CS concepts. A computer science department is an unholy abomination glued together from fragments of math and electrical engineering, and you want to understand both. Learn to speak in terms of Turing and Von Neumann as well as Church and McCarthy). Understand both the gritty details of digital logic families and the transcendent beauty of Y, the fixed-point combinator.
Second, learn something else, too. And I don’t mean math—CS alone makes for interesting toys, but the true power occurs when you apply CS concepts to solving problems in other fields. Learn the ropes in some other domain, and then apply what you’ve learned from CS to it. Learn and apply aggressively the Three Great Virtues of a programmer in everything you do.