# 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
- the senior seminar (701).

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

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

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), 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

*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).

Advanced Algorithms (441) requires, unsurprisingly, Algorithms (302).

Both 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

#### 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!

#### 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), 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).

#### Thesis

TODO: what? why? how? who?

#### Traveling Abroad

TODO: receiving major credit for courses taken abroad

TODO: approval process

## 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.