From Computer Science
Revision as of 18:37, 7 March 2017 by Peter Johnson (talk | contribs)

This page reviews the requirements for the Computer Science major at Middlebury College (including both the traditional and interdisciplinary tracks); outlines the expected schedule of course offerings; and, given individual interests and scheduling constraints, offers advice on which courses to take and when to take them.

This document is intended to answer frequently asked questions about navigating the major; for further insight, please talk to department faculty directly.

You may observe that much of this information is available (though without commentary) on the official department website; where there exist discrepancies, unless otherwise noted, the official website takes precedence.


The computer science major requires 11 courses in total. Students may follow the traditional track, for which all courses are taken within the Computer Science Department, or they may opt for the interdisciplinary track, in which students can explore courses in other departments that contain a significant computational component.

Please note that this page reflects changes in the major requirements that are not yet listed on the official department web page! The changes have, however, been approved. Additionally, the changes are a strict relaxation of requirements, so if you met them under the old rules, you are assured of meeting them under the new rules.

Traditional Track

These courses are required for completion of a Computer Science major:

  • any one 100-level course (101, 150, or 190) or AP computer science;
  • all three 200-level courses: Math Foundations of Computer Science (200), Data Structures (201), and Computer Architecture (202);
  • both core 300-level courses: Theory of Computation (301) and Algorithms and Complexity (302);
  • four computer-science electives numbered 300 and above; and
  • the senior seminar (701).

Two courses in the Math department may be counted as computer-science electives: Linear Algebra (MATH 0200) and Numerical Analysis (MATH 0228).

Students might be able to waive some courses required for the major. In all cases, students must discuss their situation with the department chair.

  • A student may waive the 100-level requirement if they have taken AP Computer Science or have significant previous programming experience.
  • A student may waive Data Structures (201) if they have exceptionally significant previous programming experience.
  • A student may waive Math Foundations (200) if they have taken Probability (MATH 310) or Operations Research (MATH 318) or both Linear Algebgra (MATH 200) and Graph Theory (MATH 247).

Separately, for any CS course with prerequisities, you may discuss with the professor whether your previous experience obviates the need for you to fulfill the prereq. If the professor decides you have otherwise fulfilled the prerequisites for their course, this does not mean you need to take one less course to fulfill the requirements for the major. In contrast, if the chair approves a waiver for the 100-level course or, eg, 201, you would indeed take fewer courses to fulfill the major.

Finally, of course, you are more than welcome (and encouraged!) to take more courses than are explicitly required.

Interdisciplinary Track

Students who wish to explore the application of computer science to other disciplines are welcome to propose an interdiscplinary focus. In this case, the student will take all the specific courses required for the traditional track, except for Theory of Computation (302), but will instead select *five* electives, which may be offered by other departments, that feature a significant computational component. As courses in other departments change in availability and content, these decisions will be made on a case-by-case basis. If you are interested in this track, please discuss your ideas with your major advisor.

As described in the officially-published major requirements, you will need to submit to the department a proposal for your plan by the end of your third semester. This should include the classes you want to take as well as a description of the overarching computational theme that connects them. Some of the electives may be CS courses numbered 300 and above.

TODO: examples


Students pursuing either track are eligible for honors. In all cases, a student must have

  • earned a grade of B or better in the senior seminar (CSCI 701), which entails a significant independent project;
  • taken an extra CSCI course numbered 300 or above in addition to the 11 courses required for the major; and
  • participated in department extra-curricular or service activities, such as tutoring, grading, sysadmin work, student-faculty research, programming competitions, or club management.

For honors, a student must earn a major GPA of 3.5.

For high honors, a student must earn a major GPA of 3.7 and complete a senior thesis (CSCI 702).

For highest honors, a student must earn a major GPA of 3.9 and complete a senior thesis (CSCI 702).

Course Offerings

Given the major requirements as outlined above, there are two major concerns in figuring out which course(s) to take in a particular semester: which courses are actually offered and which courses require you to have already completed others.


TODO: pretty graphical graph

All 100-level courses have no prerequisites of any kind.

All 200-level courses require you to have completed a 100-level course or AP computer science. (In the case of the latter, see the department chair.)

Computer Architecture (202) requires previous completion of Data Structures (201).

Both Theory of Computation (301) and Algorithms and Complexity (302) require previous completion of Mathematical Foundations of Computer Science (200).

Software Development (312) requires previous completion of Data Structures (201) and either previous completion of or concurrent enrollment in Mathematical Foundations of Computer Science (200).

Systems Programming (315) requires previous completion of Computer Architecture (202).

The advanced systems electives, Operating Systems (4xx) and Networks (431), require previous completion of Systems Programming (315).

Most topic electives require completion of both Mathematical Foundations of Computer Science (200) and Data Structures (201).

The current exception is Crash Course in System Security (1005), which requires completion of Computer Architecture (202).


Please note that the contents of this section are not guarantees, they are expectations. It is entirely likely that, due to staffing issues, some courses may not be taught on precisely the schedule described below. As always, check with your advisor before depending on it!

All required courses, plus thesis work, will be offered every semester. Specifically:

  • CSCI 101: Introduction to Computing
  • CSCI 150: Computing for the Sciences
  • CSCI 200: Mathematical Foundations of Computer Science
  • CSCI 201: Data Structures
  • CSCI 202: Computer Architecture
  • CSCI 301: Theory of Computation (but not Spring 2017)
  • CSCI 302: Algorithms and Complexity
  • CSCI 701: Senior Seminar
  • CSCI 702: Senior Thesis

The following electives are considered sufficiently important that we intend to offer them on a regular schedule. Again, this is our intended schedule, and is subject to staffing issues.

  • Software Development (CSCI 312) will be taught every Spring Semester.
  • Systems Programming (CSCI 315) will be taught every Fall Semester.
  • Operating Systems (CSCI 4xx) will be taught in the Spring Semester of even-numbered years.
  • Networks (CSCI 431) will be taught in the Spring Semester of odd-numbered years (but not Spring 2017).

The availability of all other electives depends on staffing; schedules for a given academic year will usually be set in the summer preceding.


Beyond the seven specific courses required for the major, the department offers many electives by which students can tailor their computer science education. Broadly speaking, computer science is often broken up into three major categories: theory, applications, and systems. Descriptions of each follow, including lists of classes that usually fall under each, as well as some commentary that might help you decide where to focus. As always, please refer to your advisor for more detailed, personal recommendations and advice (that's why they're called "advisors").

Please note that some courses may "fit" under multiple categories under different situations. For example, Programming Languages (313) could be considered either Theory or Applications; Cryptography (463) could be considered either Theory or Systems; and Compiler Design (433) could be considered either Theory, Applications, or Systems, all depending on who is teaching the course in question.

Please also note that you are free to choose any electives from any category to fulfill the elective requirement. You need not focus on any one category!


Theoretical computer science asks questions like what is computable? and what are the limits of computation? Generally speaking, theoretical computer science features much more math than either applications or systems. If you enjoy asking (and answering) existential, philosophical questions about computer science, this is likely the category for you.

If you particularly enjoy Theory of Computation (301) and Algorithms and Complexity (302), you should consider electives in this category.

Electives: Advanced Algorithms (441), Cryptography (463), Artificial Intelligence (311), Machine Learning (451).


If you are interested in writing programs that people can use, you should considering electives in this category. This may include writing web applications, mobile phone applications, games, and so on. By taking courses in this category, you will write a great deal of code, in the process of learning new programming languages, new development environments, and new application domains (eg, mobile, web, scientific computing).

If you particularly enjoy Data Structures (201) and just writing code, you should consider electives in this category.

Electives: Software Development (312), Computer Graphics (461), Computer Vision (453), Bioinformatics Algorithms (321), Programming Languages (313), Functional Programming (413), Information Visualization (465), Usable Mobile Interfaces (466).


Systems deals with how the computers we use on a daily basis actually work. From the hardware that deals with zeroes and ones, to the operating systems that allow a bunch of different programs to share that hardware, to the networks that allow zeroes and ones to represent reliable worldwide communication, you'll learn about those in systems courses. In many ways, systems are more complex than applications: generally, systems need to balance the needs of many possible applications (and even application domains) and often the benefits of systems are not as readily apparent as a brand new phone app. But the systems are what making writing that brand new phone app as quick, easy, and reliable as it is. (For those interested, this area is about as close to "engineering" as we get at Midd.)

If you particularly enjoy Computer Architecture (202) and learning about the deep, dark guts of systems, you should consider electives in this category.

Electives: Systems Programming (315), Operating Systems (4xx), Networks (431), Crash Course in System Security (1005), Compiler Design (433).


TODO: what? why? how? who?

Traveling Abroad

TODO: receiving major credit for courses taken abroad

TODO: approval process

Sample Schedules

Following are some ideas for how to structure your major. There are, of course, a huge number of variables in play, but these may help you get started planning. They are by no means proscriptive! There are many ways to take the courses required for the major; these schedules are intended only to provide some guidance and to serve as fodder for discussing tradeoffs.

Note that we strongly encourage all students to take either Software Development (312) or Systems Programming (315), as they provide a much more intensive exposure to writing reasonably ambitious software.

Note also that the current curriculum features only one winter-term course eligible to count as an elective: Crash Course in System Security (CSCI 1005). It is a very popular course, enrollment is strictly limited, and it may not be offered every winter term, so depending on being able to take it is unwise.

Basic, early start

Some students arrive at Middlebury knowing they want to study computer science, or they take an intro course in their first semester and become convinced it's for them. Here's one route such a student could take through the major:

Year Fall Spring
Fr 101 or 150 200 and 201
So 202 302 and an elective
Ju 301 and an elective 312
Sr 701 elective

A 12th course for honors could be taken any of the final three semesters.

Basic, late start

Some students don't accept the full glory that is computer science until later in their college careers. That's okay! We've got a plan for you, too!

Year Fall Spring
Fr none none
So 101 or 150 200 and 201
Ju 202 and 301 302 and an elective
Sr 701 and an elective 312 and an elective

Unfortunately, to get the 12th course required for honors, you would have to take three CS courses in a single semester, which might be tough. If you are considering this, consult with your advisor over which three courses to take: some combinations will be extraordinarily strenuous!

Systems focus

Should you wish to concentrate on systems, the scheduling of systems electives complicates issues somewhat. Systems Programming (315), which is required by both Operating Systems (4xx) and Networks (431), is taught every Fall semester, and therefore you should probably take it as soon after Computer Architecture as you can.

Year Fall Spring
Fr 101 or 150 200 and 201
So 202 302 and an elective
Ju 301 and 315 Networks (431) or Operating Systems (4xx)
Sr 701 Networks (431) or Operating Systems (4xx)

A 12th course for honors could be taken Senior fall.


As described above, students interested in research or who wish to consider graduate school, are strongly recommended to write a thesis. (Such students should also strongly consider spending a summer on-campus doing research with a faculty member, as well!) The following schedule therefore includes CSCI 702.

Year Fall Spring
Fr 101 or 150 101 or 150
So 200 and 201 202 and an elective
Ju 301 302 and 312
Sr 701 and an elective 702

Note that you may also choose to take 701 in the spring of your Junior year and then 702 in the fall of your Senior year. A 12th course for honors could be taken Junior fall or Senior spring.

Traveling abroad

Students who travel abroad usually (but not always) do so in their junior year. The following schedules assume no courses taken abroad count towards the major (though they can: see above).

Year Fall Spring
Fr 101 or 150 101 or 150
So 200 and 201 202 and 302
Ju abroad two electives
Sr 301 and an elective 701 and 312

Alternatively, to travel Junior spring:

Year Fall Spring
Fr 101 or 150 101 or 150
So 200 and 201 202
Ju 302 and an elective abroad
Sr 301 and an elective 701 and 312

In either case, scheduling a 12th elective required for honors might entail taking three CS courses in a single semester. As above, check with your advisor before choosing courses, because particular combinations could be especially onerous.