NavigatingTheMajor
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; if you notice any discrepancies, please let us know.
Requirements
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.
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
- one additional Responsible Computing course. A list of pre-approved Responsible Computing courses is maintained by the department.
Outside the department, one of Linear Algebra (MATH 0200) and Numerical Analysis (MATH 0228) may be taken as an elective.
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 (by permission only)
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 (301), 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
Honors
Matriculated in or after Fall 2020
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);
- taken a 5th CSCI elective numbered 300 or above and a GPA of 3.5 or higher (for honors);
- completed a two-semester (fall-winter or winter-spring) thesis (CSCI 702) in addition to four electives and a GPA of 3.7 or higher (for high honors);
- completed a two-semester (fall-winter or winter-spring) thesis (CSCI 702) in addition to four electives and a GPA of 3.9 or higher (for highest honors)
Matriculated before Fall 2020
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 elective 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), which counts as the 12th course.
For highest honors, a student must earn a major GPA of 3.9 and complete a senior thesis (CSCI 702), which counts as the 12th course.
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.
Prerequisites
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) and Embedded Systems (435) require previous completion of Computer Architecture (202).
The advanced systems electives, Operating Systems (4xx) and Networks (431), require previous completion of Systems Programming (315).
Advanced Algorithms (441) requires, unsurprisingly, Algorithms (302).
Image Processing (452), Computer Vision (453), and Computer Graphics (461) require Linear Algebra (MATH 200).
Most topic electives require completion of some combination of the three 200-level courses
Here is a link to a diagram that shows you the different prerequisites.
Advice
Based on these pre-requisites, if, in the semester after taking your intro course 1xx, you are considering taking two CS courses, we suggest you continue with 200 and 201 (see sample schedules below). If instead you are thinking of taking only one CS course, then we suggest you take 201. This is because 201 is a strict prerequisite for 202 so, if you take 201 and then decide you want to continue with CS, you can take 200 and 202 the following semester.
Schedule
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.
- One of Operating Systems (CSCI 4xx) and Networks (CSCI 431) will be offered every Spring Semester.
The availability of all other electives depends on staffing; schedules for a given academic year will usually be set in the summer preceding.
Advice
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, 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!
Substituting CS courses
There are some courses that you can use to substitute for CS courses if you decide to do so. Please refer to the table below.
Matriculated | Can use to substitute for CSCI 200 | Can use ONE as CS elective |
---|---|---|
Before Fall 2020 | MATH 310
MATH 318 MATH 200 and MATH 247 |
MATH 200
MATH 216 MATH 218 MATH 228 |
In or after Fall 2020 | Only with approval of dept. chair | MATH 216 (not MATH 118)
MATH 218 MATH 228 |
In or after Fall 2022 | Only with approval of dept. chair | MATH 218
MATH 228 |
Notes:
- Double dipping courses: From the handbook: "A course will meet the requirements of more than one major for the same student if that specific course is listed by number and name, in the departments' course listings, as specifically required for both majors. Up to two courses implicitly or explicitly listed as generic or categorical requirements of both majors will also meet the requirements of more than one major for the same student. A course may count toward a student's major or minor, but not toward both. A course counted toward one minor may not be counted toward an additional minor".
If you have any doubts about what class you can substitute, double-check with your CS advisor or ask a CS faculty.
Theory
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).
Applications
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), Image Processing (452), Computer Vision (453), Bioinformatics Algorithms (321), Programming Languages (313), Functional Programming (413), Information Visualization (465), Usable Mobile Interfaces (466), Biometrics (454).
Systems
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), Embedded Systems (435).
Thesis
TODO: what? why? how? who?
Traveling Abroad
See StudyAbroad
Scheduling
Due to the frequency with which the core courses are offered, there is significant flexibility in the particular schedule any student may adopt to meet the major requirements. That said, we do recommend you...
- Finish an intro course (1xx) as well as the three 200-level courses by the end of your second year, and possibly either Theory of Computation (301) or Algorithms (302) as well.
- Finish both 301 and 302 by the end of your third year.
- Take either Software Development (312) or Systems Programming (315), ideally by the end of your third year.
- If you take multiple CS courses in a single semester, try to balance a theory-heavy course (eg, 200, 301, 302) with a more applied course.
Scheduling constraints like traveling abroad, completing a senior thesis, or getting a late start on the major may introduce some complications. Talk with your advisor for further advice specific to your situation.
Sample Schedules
Following are some sample schedules to help you get started.
Q: are these useful?
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.
Thesis
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.