Rahul Simha
Professor of Computer Science


Department homepage
GW homepage

First, see my page on general advice for undergrads.

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.