An increasing number of math majors are choosing to take courses in the computer science (COS) department. Students do this for a variety of reasons and approach computer science with a variety of interests: some go on to become programmers for Microsoft, Google, or other companies; some are fascinated by research problems in computer science, whether in complexity theory (think P vs. NP) or in artificial intelligence; some want to develop skills they hope to use in the world of finance; still others are just curious about the workings of the technology around us. No matter your specific interests, incorporating computer science into your academic program opens doors to internships, research opportunities, and new ways of thinking.
The Introductory (126/226/217) Sequence
COS 126: This is the COS department’s introductory course. It teaches the fundamentals of programming in the powerful modern programming language Java, as well as the basic principles of computer architecture and of theoretical computer science. Assignments teach the material while also introducing students to the many and exciting applications of computer science, exploring topics like planetary motion (physics), estimation of Avogadro’s number (chemistry), and, of course, the infamously tricky traveling salesman problem (mathematics and theoretical computer science). By the end, you will have gained substantial programming experience that can prove useful even if no further COS courses are taken. Absolutely no background is assumed, but this course should not be skipped unless you have extensive programming experience. This course can be taken at any time, but if you’re interested in computer science, seriously consider taking it in the fall of freshman year.
COS 226: This courses introduces students to the world of “data structures” and “algorithms,” the centerpieces of any programmer’s toolkit. It is designed to be taken after COS 126 and picks up where COS 126 leaves off. Taking this course allows you to develop an even higher proficiency in Java programming and leave with an understanding of data structures and algorithms, which is essential to further work in computer science. Although COS 226 and COS 217 may be taken in any order, most students choose to take COS 226 first. If you are interested in computer science, and enjoy COS 126, consider taking this course in the spring of freshman year, as it is a prerequisite for most upper-level computer science coursework.
COS 217: This is the department’s introductory “systems” course. While COS 226 focuses on the high-level, or algorithmic, side of programming, COS 217 dives deeper into the inner workings of the computer. Assignments are of a different sort than in COS 1/226 and are done in C, a “lower level” programming language than Java that gives the programmer more fine-grained control over the computer. This course is generally, though not always, taken the semester after taking COS 226. The reverse order is also possible, although many students find the programming maturity gained in COS 226 a useful asset in the class. COS 217 is a prerequisite for many, though not all, upper-level COS courses and for all COS courses in systems (including Operating Systems and Computer Networks).
Upper Level Courses
After the introductory sequence, the COS department offers a lot of flexibility in course selection. Broadly speaking, there are three areas to choose from: Theory, Systems, and Applications. Anyone planning to take these courses should remember that if a COS course has substantial mathematical background, the math department is usually keen on considering it a departmental.
Theory: Due to its more mathematical nature, this area is very popular among math majors. The courses under this heading require more mathematical maturity than typical COS classes, which for non-math majors is provided through COS 340 (Reasoning about Computation), sometimes uncharitably called “Baby Combinatorics.” Math majors rarely take COS 340, and usually delve straight into the advanced 300- and 400-level courses. These include COS 342/MAT 375 (Introduction to Graph Theory), COS 423 (Theory of Algorithms), COS 433/MAT 443 (Cryptography), COS 441 (Programming Languages), and COS 487 (Theory of Computation). COS 423 is probably the most popular among the theory courses, and is offered every spring. Other courses are not offered as regularly.
Systems: Courses in this group are designed for students who want to learn more about how computer systems and protocols work; they usually contain little mathematical content. From a computer scientist’s point-of-view, some of the most important classes in this category are: COS 306 (Introduction to Logic Design), COS 318 (Operating Systems), COS 320 (Compiling Techniques, or “Compilers” for short), COS 333 (Advanced Programming Techniques), COS 426 (Computer Graphics), and COS 461 (Computer Networks). Of these, COS 306 is perhaps the most widely taken among math majors, in part because it fulfills the STL (Science and Technology with Lab) distribution requirement. Apart from this one, these classes are of most value to students interested in a career in the software industry; if that is what you want, you should try to take at least some of them. COS 333 in particular is one of the most popular courses in the COS department and is extremely valuable as a way to be exposed to many different technologies in a single semester and a way to complete a significant software engineering project in an academic context. Systems courses are for the most part offered every year.
Applications: Courses in this group generally take problems and techniques with significant theoretical components and study the implementation of the software and algorithms that solve these problems and realize these techniques. Popular courses in this category include COS 402 (Artificial Intelligence); COS 424 (Interacting with Data), which complements COS 402; COS 429 (Computer Vision); and COS 432 (Information Security). Applications courses are not always offered yearly.
Graduate Level Courses
Undergraduates with appropriate preparation have the opportunity to take graduate courses in the computer science department. It’s particularly common for advanced undergraduates to take graduate courses on theoretical topics. These include COS 521 (Advanced Algorithm Design), a graduate-level introduction to the modern theory of algorithms intended to prepare students for research in the field, and COS 522 (Advanced Computational Complexity), a graduate-level introduction to the modern theory of computational complexity. On the applied side, COS 513 (Foundations of Probabilistic Modeling) is an excellent course introducing modern machine learning at a graduate level. Apart from these, the department offers COS 561 (Advanced Computer Networks) and COS 526 (Advanced Computer Graphics) regularly, and the regular offerings are supplemented with special topics courses listed as COS 597A-Z (fall) and COS 598A-Z (spring).
Note: undergraduates enrolling in graduate courses need to submit a Graduate Course Enrollment form to the Office of the Registrar. This requires the signature of the course instructor, an academic adviser in the math department (or your academic adviser if you’re an underclassman), and the dean of your residential college.
Broadly speaking, there are two paths a student interested in mathematics and computer science can follow: into industry and into research. In both cases, the sky is the limit.
Software companies and finance companies alike actively recruit Princeton students with a strong background in mathematics and computer science for internships and full-time jobs. This occurs in a variety of ways, including periodic recruitment events throughout the year, but it reaches its peak at the yearly career fairs, regularly attended by giants like Microsoft, Google, Facebook, Jane Street Capital, D.E. Shaw, and other titans. Salaries are highly competitive, and the long-term prospects are excellent. If you’re interested in internships, you should definitely attend these events (advertised through various listservs, like Career Services), and if you want to pursue an industrial career, you should ideally do internships the summers after sophomore and junior years.
The research track also presents numerous options. Problems in computer science range from the highly theoretical—again, think of the P vs. NP problem (one of the Clay Mathematics Institute’s Millenium Prize problems)—to the highly applied—industry giants generally keep teams of researchers to help them solve the toughest problems they run into in their operations, and research opportunities abound across the spectrum. If you’re interested in computer science research, you should take the basic courses as early as possible and do at least one junior paper, as well as your thesis, on a topic in computer science (remember, COS faculty can advise math junior papers!). Summer opportunities are plentiful, including Princeton’s Summer Programming Experience (SPE), an excellent option for freshmen and sophomores, and outside programs, including the National Security Agency’s Director’s Summer Program (DSP). Generally, anyone interested in a research career should go for a Ph.D. after graduation, though some students choose to spend some time working in industry before doing so.
COS faculty conduct research on a wide range of topics, so supervision is available for many different kinds of projects. For a math major, the most important constraint is the requirement that junior papers and senior theses, even if supervised by a COS faculty member, must include “substantial mathematical content.” As long as this is the case, applied and theoretical projects are both possible. Start thinking early about which faculty member you want to work with, and find out if they are taking students for the semester you want to work with them; this is especially important with popular faculty members who receive too many requests for supervision. Luckily, the COS department maintains an excellent Wiki on faculty research interests, available here.
The computer science department offers the Program in Applications of Computing, intended to provide an organized way for students outside of the department proper to include a significant computer science component in their undergraduate education. The requirements for the certificate are fairly flexible: mainly, students need to take four upper-level (300 or higher) COS courses that include a mixture of theory and programming and need to write a thesis with a significant computational component (whether theoretical or applied). Taking 126/226/217 is usually necessary, however. The details can be found here.
Take COS 126-COS 226-COS 217 in that order, one each semester, starting in the fall of freshman year. Do not take two at a time; doing so makes it hard to absorb the material. After that, depending on your level of interest, take one or two upper-level courses per semester, balancing theory and programming in semesters when you take two. Try to explore all of the basic areas (systems, theory, and applications) to some depth, since broad knowledge is a marketable skill in industry and an important quality for a computer scientist. Finally, and we cannot stress this enough, talk to your older peers—not just one or two, but a lot—to get an idea of what is possible and what has been done: the sky really is the limit, but your peers can help you find your way to where you want to go. Lastly, don’t forget the ever-present Rule of 12! (That’s “twelve,” not “twelve factorial.”)
Ilias Giechaskiel (igiechas@) ’13
Max Rabinovich (mrabinov@) ’13