First, see my page on general advice
Now for the CS-specific stuff:
Learn and re-learn the most important programming skills.
Programming is without a doubt one of the central
and distinguishing skills of our discipline, and one
that is a guarantee of employment and often
a source of instant-grat satisfaction. There
are many aspects to this complex skill that you
need to pay attention to:
- Programming in the small.
This is the kind of skill you acquire in the
intro courses and more or less master by the
third course. Think of this as the code you
write inside classes and methods, knowing
which type of loop to use, how to debug,
writing clean, well-documented code.
Relevant courses: 1111, 1112, 2113.
- Language mastery.
You need to know at least two languages cold.
In our curriculum, the natural choices are Java and C.
C is a particularly good choice because it's the
only language for low-level programming
and much of open-source code. Java is good because
it's in demand for server applications and has
a rich development library. It's a good idea to
also have passing familiarity with at least
one web-scripting language (e.g., PHP) and one
OS scripting language (e.g., a Unix shell-script).
Relevant courses: 1111, 1112, 2113, 2441, 3411.
- OS knowledge. Being familiar with
at least one OS (e.g. Unix) will help you in
developing sophisticated applications. Of all the
programming skills, this is one you can postpone
until you start working. But it helps to at least
get acquainted during your program of study.
Relevant courses: all the programming courses.
- Algorithmic programming.
This is the kind of skill you need in building
data structures, in coding up a complicated
algorithm. Usually, the actual lines of code are
few, but the code can be quite intricate. And it
can be difficult translating a high-level algorithmic
idea into actual code.
Relevant courses: 3212, 4341, as well as
a variety of elective courses.
Beyond these, you ought to consider learning
more about algorithms beyond the standard
algorithms course - see
this page for more details.
- Designing and building a substantial application.
You need to experience building a large application,
with at least 3000 lines or more of code. You can't
treat this like a standard 2-week programming assignment
and start hacking at the keyboard. It needs thinking,
planning, understanding what data structures to use -
typical elements of design
Relevant courses: 2441, 4243/4244.
- Managing a large project.
This is a skill you are unlikely to get in school,
because we simply don't have the time for this.
That's OK, because employers don't expect you to
have this skill.
You might get an opportunity if you work on a
long-term research project with a professor.
Take CS theory seriously.
We know that many CS majors aren't particularly
fond of math, especially the calculus-based math.
But CS majors should at least take the CS theory
course seriously, even if the style of learning
makes copious use of proofs. The fact is, much
of the core material, automata and grammars,
is very useful - it keeps surfacing in applications
in all kinds of ways.
Learn at least some CS-relevant math.
I find it convenient to categorize math that's
relevant to CS into the following categories:
disrete-math, logic, linear-algebra, probability,
algebra, and calculus.
The standard CS curriculum leaves calculus to the
math requirements (avoiding the most important
calc topic, differential equations) and covers
only discrete-math in-house.
You ought to consider getting at least one of
these other areas through an elective course.
This is classic, timeless material that's best
absorbed now. Ten years from now, when you typically
learn by yourself on the job, you may be
afraid of even looking at math books.
Take on a major project and start early.
There is no substitute for the kind of learning
that occurs while working on a large project.
Start at the end of the sophomore year and try
and commit to a project that lasts two years.
You can arrange to take a few independent studies
as electives to get course credit as well.
Take the non-technical skills seriously: teamwork,
presentation, writing, ethics.
Amongst all the engineering and science disciplines,
CS is the one discipline in which you are most
likely to need these skills early in life. I find
that our students get into management or project
leadership early, often within two years.
And that's when you start needing the "soft" skills.
(Teamwork of course starts on day one.) So, don't
blow this off or merely do the minimum to satisfy
course requirements, contrived though they are.
Get involved in department activities.
Join the ACM chapter, organize an event. It's fun,
and a good experience.