NavigatingTheMajor - middcs/csinfo GitHub Wiki

Navigating the major

This page reviews the requirements for the Computer Science major at Middlebury College, 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 the department faculty directly.

You may observe that much of this information is available (though without commentary) on the department website. That department website represents the official requirements and will prevail in the case of a discrepancy (if you do notice a discrepancy let us know so we can fix it immediately).

Requirements

If you matriculated in Fall 2022 or later, the following courses are required to complete a Computer Science major (check here for prior requirements):

  • Any one of CSCI145 "Introduction to Computing", CSCI146 "Intensive Introduction to Computing";
  • All three of CSCI200 "Math Foundations of Computer Science", CSCI201 "Data Structures", and CSCI202 "Computer Architecture";
  • Both of CSCI301 "Theory of Computation" and CSCI302 "Algorithms and Complexity";
  • Four (4) computer-science electives numbered CSCI303 and above; and
  • One additional Responsible Computing course, that involves significant learning related to the social/societal impacts of computing. A list of pre-approved Responsible Computing courses is maintained by the department.

One (1) of MATH228 or MATH328 may be substituted for a CS elective. Depending on when you started at Middlebury, other MATH courses may be substituted for CS electives (check here for details).

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 A or have significant previous programming experience.
  • A student may waive CSCI201 "Data Structures" if they have exceptionally significant previous programming experience.
  • A student may waive CSCI200 "Math Foundations" if they have significant experience with mathematical proofs, as well with several of the other topics covered in the course (e.g. combinatorics, probability, graph theory). Please discuss your prior mathematical experience with the current 200 instructor to determine if you can waive CSCI200.

The above list of waiver scenarios reduces the number of courses required for the major.

Separately, a faculty member may waive the prerequisites for a course they are teaching. If you think your previous experience satisfies the prerequisites, we encourage you to discuss your background with the professor teaching the course. A prerequisite waiver does not change the courses required for the CS major.

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

Honors

Honors designations are based on outstanding work in several electives or in a thesis.

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 any sequencing required by prerequisites.

Course Scheduling and Prerequisites

Note that the following is a goal not a guarantee. Due to staffing fluctuations not all courses will be taught on the schedule listed below. Always consult the catalog for the current course offerings.

All required courses will be offered every semester. Electives are generally offered every 2 years, except for the following, which are offered more frequently:

  • CSCI312 "Software Development" will be offered 3 out of every 4 semesters.
  • CSCI315 "Systems Programming" will be offered every Fall Semester.
  • One of CSCI414 "Advanced Operating Systems" and CSCI431 "Computer Networks" will be offered every Spring Semester.
  • CSCI311 "Artificial Intelligence", CSCI451 "Machine Learning" and CSCI457 "Natural Language Processing" will each be offered once per year.

Winter Term

Historically one or more CS electives have been offered during Winter term. However, those offerings can be highly variable. We would not suggest depending on completing electives during Winter term.

Elective courses prerequisites

Always review the catalog and the course page on the CS Department website, for the most up-to-date information.

Course CS prerequisites Other prerequisites
311 - Artificial Intelligence 200, 201
312 - Software Development 200, 201
313 - Programming Languages 200, 202
315 - Systems Programming 202
318 - OOP & GUI Application Development 202
321 - Bioinformatics Algorithms 201
333 - Quantum Computing 200 or MATH 0200
390 - Spatial Agent-Based Modeling 201
401 - Computational Complexity 301
414 - Advanced Operating Systems 315
416 - Parallel Computing 202
422 - Geometric Modeling 202 MATH 0200
425 - Computational Geometry 200, 201
431 - Computer Networks 200, 315
433 - Compiler Design 202, 301
435 - Embedded Systems 202
442 - Network Science 302 MATH 0200
451 - Machine Learning 200, 201 MATH 0200
452 - Image Processing 201 MATH 0200
455 - Drone Robotics 200, 201
457 - Natural Language Processing 102? or 200, 201
461 - Computer Graphics 200, 202
465 - Information Visualization 201
466 - Usable Mobile Interfaces 312
467 - Generative Art 201
1050 - Crash Course in System Security 202
1051 - Deep Learning 200, 201 MATH 0200
1052 - Randomized Algorithms 200, 302 MATH 0200

Advice for Picking Courses

Core courses in the CS major

Immediately after CSCI 1XX

Both of CSCI 200 "Math Foundations of Computing" and CSCI 201 "Data Structures" are required for the CS major and are a good next step. It is not uncommon for students to take both at the same time.

If you are planning on only taking one CS courses, we suggest you take CSCI 201 "Data Structures". CSCI 201 is a strict prerequisite for CSCI 202 "Computer Architecture" so, if you take CSCI 201 and then decide you want to continue with CS, you can take CSCI 200 and CSCI 202 the following semester. Further, CSCI201 will "unlock" more electives (check the "Navigating the CS major" handout here).

Constructing your CS Path

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!

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 (e.g., 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), and Machine Learning (451).

Theory

If you are interested in writing good (efficient/correct) programs, you should consider courses in this category. Theoretical computer science asks questions like what are the minimal resources needed to solve a problem? and 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 Algorithms and Complexity (302) or Theory of Computation (301), you should consider electives in this category.

Electives: Advanced Algorithms (441), Cryptography (463), Artificial Intelligence (311), Machine Learning (451), Quantum Computing (333), Computational Complexity (401).

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 (414), Networks (431), Crash Course in System Security (1005), Compiler Design (433), Embedded Systems (435).

Thesis

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. See past theses in computer science and see Theses-in-computer-science for more details.

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 (e.g., 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. In all cases, "elective" should be taken to mean an elective or a Responsible Computing course.

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 145 or 146 200 and 201
So 202 302 and an elective
Ju 301 and an elective 312
Sr elective elective

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 145 or 146 200 and 201
Ju 202 and 301 302 and an elective
Sr two electives 312 and an elective

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 145 or 146 200 and 201
So 202 302 and an elective
Ju 301 and 315 Networks (431) or Operating Systems (414)
Sr elective Networks (431) or Operating Systems (414)

Data science focus

Data science is the study and application of methods for learning insight from data. Data science intersects topics in artificial intelligence, statistics, machine learning, mathematics, and algorithms. Although Middlebury does not currently offer a major or minor in data science, it is possible to focus on data science within the CS major by selecting certain electives. Regularly-offered Middlebury CS courses relevant to data science include:

  • CSCI 311: Artificial Intelligence
  • CSCI 321: Bioinformatics Algorithms
  • CSCI 451: Machine Learning
  • CSCI 457: Natural Language Processing

Each of these courses is typically offered at least once every 2-3 years. There may be additional electives related to data science offered on an irregular basis during the semester or Winter Term.

In addition to the CS requirements, students interested in data science are strongly advised to prioritize courses in mathematics and statistics:

  • MATH 121 (Calculus I) and MATH 200 (Linear Algebra) are required for several CS electives, including CS 451: Machine Learning.
  • MATH 122 (Calculus II), MATH 223 (Calculus III), and MATH 310 (Probability) are all recommended courses which provide useful insight for understanding the workings of algorithms in AI and machine learning. None of these courses, however, are prerequisites for courses in the CS major.
  • STAT 116 (Introduction to Statistical Science) or STAT 201 (Advanced Introduction to Statistical and Data Sciences) are highly recommended for students interested in focusing in data science. Other recommended courses include STAT 211 (Regression) and STAT 219 (Time Series Analysis). STAT 218: Statistical Learning is not recommended for students who intend to take CSCI 0451: Machine Learning due to content overlap.

Two notes on CSCI 0451: Machine Learning:

  • This course is usually only accessible for students in their senior year.
  • The most recent instructor of CS 451 (Phil Chodrow) enforces the MATH 200 (Linear Algebra) prerequisite without exception. Students who have been waived out of CS 200 can use their waiver in CS 451, but MATH 200 is still required.

The following sample schedule assumes an early start in both math and CS.

Year Fall Spring
Fr 145 or 146 and Calculus I (Math 121) 200 and 201
So 202 and Linear Algebra (Math 200) 302 and Advanced Introduction to Statistical and Data Sciences (STAT 201)
Ju 301 and Artificial Intelligence (311) Bioinformatics Algorithms (323) and Natural Language Processing (457)
Sr 312 Machine Learning (451)

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 145 or 146 145 or 146
So 200 and 201 202 and an elective
Ju 301 and an elective 302 and 312
Sr 702 and an elective elective

While not shown in the above table, 702 would also need to be taken in Senior winter to finish the thesis.

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 145 or 146 145 or 146
So 200 and 201 202 and 302
Ju abroad two electives
Sr 301 and an elective 312 and an elective

Alternatively, to travel Junior spring:

Year Fall Spring
Fr 145 or 146 145 or 146
So 200 and 201 202
Ju 302 and an elective abroad
Sr 301 and an elective 312 and an elective

As above, check with your advisor before choosing courses, because particular combinations could be especially onerous.