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