 2021–2022 Courses:
 Browse by Course Number
 Browse by Term
Fall 2021

CS 100: Ethics of Technology
What should technology know about us? What actions should technology be allowed to conduct on our behalf? Who makes these decisions, and whose voices are excluded from these conversations? Can algorithms ever be truly fair, just, and unbiased, or are they forever doomed to perpetuate existing inequities? We’ll address these questions, and many more, as we explore the history, present, and possible futures of the design, implementation, deployment, and usage of algorithms, apps, systems, devices, and all things tech. This course will equip you to perform the complex ethical reasoning required of living in a technicallyfocused society.
6 credits; Argument and Inquiry Seminar, Writing Requirement; offered Fall 2021 · Amy Csizmar Dalal 
CS 111: Introduction to Computer Science
This course will introduce you to computer programming and the design of algorithms. By writing programs to solve problems in areas such as image processing, text processing, and simple games, you will learn about recursive and iterative algorithms, complexity analysis, graphics, data representation, software engineering, and objectoriented design. No previous programming experience is necessary. Students who have received credit for Computer Science 201 or above are not eligible to enroll in Computer Science 111.
6 credits; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2021, Winter 2022, Spring 2022 · James Ryan, Aaron Bauer, David LibenNowell, David Musicant, Anna Rafferty 
CS 201: Data Structures
Think back to your favorite assignment from Introduction to Computer Science. Did you ever get the feeling that “there has to be a better/smarter way to do this problem”? The Data Structures course is all about how to store information intelligently and access it efficiently. How can Google take your query, compare it to billions of web pages, and return the answer in less than one second? How can one store information so as to balance the competing needs for fast data retrieval and fast data modification? To help us answer questions like these, we will analyze and implement stacks, queues, trees, linked lists, graphs, and hash tables. Students who have received credit for a course for which Computer Science 201 is a prerequisite are not eligible to enroll in Computer Science 201.
Prerequisites: Computer Science 111 or instructor permission 6 credits; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2021, Winter 2022, Spring 2022 · Anya Vostinar, Layla Oesper, Aaron Bauer, Eric Alexander, Anna Rafferty 
CS 202: Mathematics of Computer Science
This course introduces some of the formal tools of computer science, using a variety of applications as a vehicle. You’ll learn how to encode data so that when you scratch the back of a DVD, it still plays just fine; how to distribute “shares” of your floor’s PIN so that any five of you can withdraw money from the floor bank account (but no four of you can); how to play chess; and more. Topics that we’ll explore along the way include: logic and proofs, number theory, elementary complexity theory and recurrence relations, basic probability, counting techniques, and graphs. Prerequisites: Computer Science 111 and Mathematics 111 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · Layla Oesper, Eric Alexander 
CS 208: Introduction to Computer Systems
Are you curious what’s really going on when a computer runs your code? In this course we will demystify the machine and the tools that we use to program it. Our broad survey of how computer systems execute programs, store information, and communicate will focus on the hardware/software interface, including data representation, instruction set architecture, the C programming language, memory management, and the operating system process model.
Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · Aaron Bauer, Jeffrey Ondich 
CS 251: Programming Languages: Design and Implementation
What makes a programming language like “Python” or like “Java”? This course will look past superficial properties (like indentation) and into the soul of programming languages. We will explore a variety of topics in programming language construction and design: syntax and semantics, mechanisms for parameter passing, typing, scoping, and control structures. Students will expand their programming experience to include other programming paradigms, including functional languages like Scheme and ML.
Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · James Ryan, Anya Vostinar, David Musicant 
CS 252: Algorithms
A course on techniques used in the design and analysis of efficient algorithms. We will cover several major algorithmic design paradigms (greedy algorithms, dynamic programming, divide and conquer, and network flow). Along the way, we will explore the application of these techniques to a variety of domains (natural language processing, economics, computational biology, and data mining, for example). As time permits, we will include supplementary topics like randomized algorithms, advanced data structures, and amortized analysis.
Prerequisites: Computer Science 201 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202) 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · David LibenNowell, Layla Oesper 
CS 257: Software Design
It’s easy to write a mediocre computer program, and lots of people do it. Good programs are quite a bit harder to write, and are correspondingly less common. In this course, we will study techniques, tools, and habits that will improve your chances of writing good software. While working on several mediumsized programming projects, we will investigate code construction techniques, debugging and profiling tools, testing methodologies, UML, principles of objectoriented design, design patterns, and user interface design. Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · Jeffrey Ondich, Amy Csizmar Dalal, Anya Vostinar 
CS 321: Making Decisions with Artificial Intelligence
There are many situations where computer systems must make intelligent choices, from selecting actions in a game, to suggesting ways to distribute scarce resources for monitoring endangered species, to a searchandrescue robot learning to interact with its environment. Artificial intelligence offers multiple frameworks for solving these problems. While popular media attention has often emphasized supervised machine learning, this course instead engages with a variety of other approaches in artificial intelligence, both established and cutting edge. These include intelligent search strategies, game playing approaches, constrained decision making, reinforcement learning from experience, and more. Coursework includes problem solving and programming.
Prerequisites: Computer Science 201. Additionally Computer Science 202 is strongly recommended. 6 credits; Formal or Statistical Reasoning; offered Fall 2021 · David Musicant 
CS 362: Computational Biology
Recent advances in highthroughput experimental techniques have revolutionized how biologists measure DNA, RNA and protein. The size and complexity of the resulting datasets have led to a new era where computational methods are essential to answering important biological questions. This course focuses on the process of transforming biological problems into well formed computational questions and the algorithms to solve them. Topics include approaches to sequence comparison and alignment; molecular evolution and phylogenetics; DNA/RNA sequencing and assembly; and specific disease applications including cancer genomics.
Prerequisites: Computer Science 201 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202) 6 credits; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2021 · Layla Oesper 
CS 399: Senior Seminar
As part of their senior capstone experience, majors will work together in teams (typically four to seven students per team) on facultyspecified topics to design and implement the first stage of a project. Required of all senior majors.
Prerequisites: Senior standing. Students are strongly encouraged to complete Computer Science 252 and Computer Science 257 before starting Computer Science 399. 3 credits; S/CR/NC; Does not fulfill a curricular exploration requirement; offered Fall 2021, Winter 2022 · Jeffrey Ondich, David Musicant, Anya Vostinar, Aaron Bauer, Amy Csizmar Dalal
Winter 2022

CS 111: Introduction to Computer Science
This course will introduce you to computer programming and the design of algorithms. By writing programs to solve problems in areas such as image processing, text processing, and simple games, you will learn about recursive and iterative algorithms, complexity analysis, graphics, data representation, software engineering, and objectoriented design. No previous programming experience is necessary. Students who have received credit for Computer Science 201 or above are not eligible to enroll in Computer Science 111.
6 credits; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2021, Winter 2022, Spring 2022 · James Ryan, Aaron Bauer, David LibenNowell, David Musicant, Anna Rafferty 
CS 201: Data Structures
Think back to your favorite assignment from Introduction to Computer Science. Did you ever get the feeling that “there has to be a better/smarter way to do this problem”? The Data Structures course is all about how to store information intelligently and access it efficiently. How can Google take your query, compare it to billions of web pages, and return the answer in less than one second? How can one store information so as to balance the competing needs for fast data retrieval and fast data modification? To help us answer questions like these, we will analyze and implement stacks, queues, trees, linked lists, graphs, and hash tables. Students who have received credit for a course for which Computer Science 201 is a prerequisite are not eligible to enroll in Computer Science 201.
Prerequisites: Computer Science 111 or instructor permission 6 credits; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2021, Winter 2022, Spring 2022 · Anya Vostinar, Layla Oesper, Aaron Bauer, Eric Alexander, Anna Rafferty 
CS 202: Mathematics of Computer Science
This course introduces some of the formal tools of computer science, using a variety of applications as a vehicle. You’ll learn how to encode data so that when you scratch the back of a DVD, it still plays just fine; how to distribute “shares” of your floor’s PIN so that any five of you can withdraw money from the floor bank account (but no four of you can); how to play chess; and more. Topics that we’ll explore along the way include: logic and proofs, number theory, elementary complexity theory and recurrence relations, basic probability, counting techniques, and graphs. Prerequisites: Computer Science 111 and Mathematics 111 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · Layla Oesper, Eric Alexander 
CS 208: Introduction to Computer Systems
Are you curious what’s really going on when a computer runs your code? In this course we will demystify the machine and the tools that we use to program it. Our broad survey of how computer systems execute programs, store information, and communicate will focus on the hardware/software interface, including data representation, instruction set architecture, the C programming language, memory management, and the operating system process model.
Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · Aaron Bauer, Jeffrey Ondich 
CS 232: Art, Interactivity, and Robotics
In this handson studio centered course, we’ll explore and create interactive three dimensional art. Using basic construction techniques, microprocessors, and programming, this class brings together computer science, sculpture, engineering, and aesthetic design. Students will engage the nutsandbolts of fabrication, learn to program microcontrollers, and study the design of interactive constructions. Collaborative labs and individual projects will culminate in a campus wide exhibition. No prior building experience is required.
Prerequisites: Computer Science 111. Not open to students who taken previous offering of Art, Interactivity and Robotics 6 credits; Arts Practice; offered Winter 2022 · David Musicant 
CS 251: Programming Languages: Design and Implementation
What makes a programming language like “Python” or like “Java”? This course will look past superficial properties (like indentation) and into the soul of programming languages. We will explore a variety of topics in programming language construction and design: syntax and semantics, mechanisms for parameter passing, typing, scoping, and control structures. Students will expand their programming experience to include other programming paradigms, including functional languages like Scheme and ML.
Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · James Ryan, Anya Vostinar, David Musicant 
CS 252: Algorithms
A course on techniques used in the design and analysis of efficient algorithms. We will cover several major algorithmic design paradigms (greedy algorithms, dynamic programming, divide and conquer, and network flow). Along the way, we will explore the application of these techniques to a variety of domains (natural language processing, economics, computational biology, and data mining, for example). As time permits, we will include supplementary topics like randomized algorithms, advanced data structures, and amortized analysis.
Prerequisites: Computer Science 201 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202) 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · David LibenNowell, Layla Oesper 
CS 254: Computability and Complexity
An introduction to the theory of computation. What problems can and cannot be solved efficiently by computers? What problems cannot be solved by computers, period? Topics include formal models of computation, including finitestate automata, pushdown automata, and Turing machines; formal languages, including regular expressions and contextfree grammars; computability and uncomputability; and computational complexity, particularly NPcompleteness.
Prerequisites: Computer Science 201 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202) 6 credits; Formal or Statistical Reasoning; offered Winter 2022, Spring 2022 · James Ryan 
CS 257: Software Design
It’s easy to write a mediocre computer program, and lots of people do it. Good programs are quite a bit harder to write, and are correspondingly less common. In this course, we will study techniques, tools, and habits that will improve your chances of writing good software. While working on several mediumsized programming projects, we will investigate code construction techniques, debugging and profiling tools, testing methodologies, UML, principles of objectoriented design, design patterns, and user interface design. Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · Jeffrey Ondich, Amy Csizmar Dalal, Anya Vostinar 
CS 332: Operating Systems
If you’re working in the lab, you might be editing a file while waiting for a program to compile. Meanwhile, the onscreen clock ticks, a program keeps watch for incoming email, and other users can log onto your machine from elsewhere in the network. Not only that, but if you write a program that reads from a file on the hard drive, you are not expected to concern yourself with turning on the drive’s motor or moving the read/write arms to the proper location over the disk’s surface. Coordinating all this hardware and software is the job of the operating system. In this course we will study the fundamentals of operating system design, including the operating system kernel, scheduling and concurrency, memory management, and file systems.
Prerequisites: Computer Science 201 and 208 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Winter 2022 · Aaron Bauer 
CS 358: Quantum Computing
Quantum computing is a promising technology that may (or may not) revolutionize computer science over the next few decades. By exploiting quantum phenomena such as superposition and entanglement, quantum computers can solve problems in a fundamentally different way from that of conventional computers. This course surveys the computer science and mathematics of quantum algorithms, including Shor’s and Grover’s algorithms, error correction, and cryptography. No prior experience with quantum theory is needed.
Prerequisites: Computer Science 201, Mathematics 232, and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202) 6 credits; Formal or Statistical Reasoning; offered Winter 2022 · Josh Davis 
CS 399: Senior Seminar
As part of their senior capstone experience, majors will work together in teams (typically four to seven students per team) on facultyspecified topics to design and implement the first stage of a project. Required of all senior majors.
Prerequisites: Senior standing. Students are strongly encouraged to complete Computer Science 252 and Computer Science 257 before starting Computer Science 399. 3 credits; S/CR/NC; Does not fulfill a curricular exploration requirement; offered Fall 2021, Winter 2022 · Jeffrey Ondich, David Musicant, Anya Vostinar, Aaron Bauer, Amy Csizmar Dalal 
CS 400: Integrative Exercise
Beginning with the prototypes developed in the Senior Seminar, project teams will complete their project and present it to the department. Required of all senior majors. Prerequisites: Computer Science 399 3 credits; S/NC; offered Winter 2022, Spring 2022 · Jeffrey Ondich, David Musicant, Anya Vostinar, Sneha Narayan, Aaron Bauer, Amy Csizmar Dalal
Spring 2022

CS 111: Introduction to Computer Science
This course will introduce you to computer programming and the design of algorithms. By writing programs to solve problems in areas such as image processing, text processing, and simple games, you will learn about recursive and iterative algorithms, complexity analysis, graphics, data representation, software engineering, and objectoriented design. No previous programming experience is necessary. Students who have received credit for Computer Science 201 or above are not eligible to enroll in Computer Science 111.
6 credits; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2021, Winter 2022, Spring 2022 · James Ryan, Aaron Bauer, David LibenNowell, David Musicant, Anna Rafferty 
CS 201: Data Structures
Think back to your favorite assignment from Introduction to Computer Science. Did you ever get the feeling that “there has to be a better/smarter way to do this problem”? The Data Structures course is all about how to store information intelligently and access it efficiently. How can Google take your query, compare it to billions of web pages, and return the answer in less than one second? How can one store information so as to balance the competing needs for fast data retrieval and fast data modification? To help us answer questions like these, we will analyze and implement stacks, queues, trees, linked lists, graphs, and hash tables. Students who have received credit for a course for which Computer Science 201 is a prerequisite are not eligible to enroll in Computer Science 201.
Prerequisites: Computer Science 111 or instructor permission 6 credits; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2021, Winter 2022, Spring 2022 · Anya Vostinar, Layla Oesper, Aaron Bauer, Eric Alexander, Anna Rafferty 
CS 202: Mathematics of Computer Science
This course introduces some of the formal tools of computer science, using a variety of applications as a vehicle. You’ll learn how to encode data so that when you scratch the back of a DVD, it still plays just fine; how to distribute “shares” of your floor’s PIN so that any five of you can withdraw money from the floor bank account (but no four of you can); how to play chess; and more. Topics that we’ll explore along the way include: logic and proofs, number theory, elementary complexity theory and recurrence relations, basic probability, counting techniques, and graphs. Prerequisites: Computer Science 111 and Mathematics 111 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · Layla Oesper, Eric Alexander 
CS 208: Introduction to Computer Systems
Are you curious what’s really going on when a computer runs your code? In this course we will demystify the machine and the tools that we use to program it. Our broad survey of how computer systems execute programs, store information, and communicate will focus on the hardware/software interface, including data representation, instruction set architecture, the C programming language, memory management, and the operating system process model.
Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · Aaron Bauer, Jeffrey Ondich 
CS 231: Computer Security
Hackers, phishers, and spammers–at best they annoy us, at worst they disrupt communication systems, steal identities, bring down corporations, and compromise sensitive systems. In this course, we’ll study various aspects of computer and network security, focusing mainly on the technical aspects as well as the social and cultural costs of providing (or not providing) security. Topics include cryptography, authentication and identification schemes, intrusion detection, viruses and worms, spam prevention, firewalls, denial of service, electronic commerce, privacy, and usability. Prerequisites: Computer Science 201 or 202 or 208 6 credits; Formal or Statistical Reasoning; offered Spring 2022 · Jeffrey Ondich 
CS 251: Programming Languages: Design and Implementation
What makes a programming language like “Python” or like “Java”? This course will look past superficial properties (like indentation) and into the soul of programming languages. We will explore a variety of topics in programming language construction and design: syntax and semantics, mechanisms for parameter passing, typing, scoping, and control structures. Students will expand their programming experience to include other programming paradigms, including functional languages like Scheme and ML.
Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · James Ryan, Anya Vostinar, David Musicant 
CS 252: Algorithms
A course on techniques used in the design and analysis of efficient algorithms. We will cover several major algorithmic design paradigms (greedy algorithms, dynamic programming, divide and conquer, and network flow). Along the way, we will explore the application of these techniques to a variety of domains (natural language processing, economics, computational biology, and data mining, for example). As time permits, we will include supplementary topics like randomized algorithms, advanced data structures, and amortized analysis.
Prerequisites: Computer Science 201 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202) 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · David LibenNowell, Layla Oesper 
CS 254: Computability and Complexity
An introduction to the theory of computation. What problems can and cannot be solved efficiently by computers? What problems cannot be solved by computers, period? Topics include formal models of computation, including finitestate automata, pushdown automata, and Turing machines; formal languages, including regular expressions and contextfree grammars; computability and uncomputability; and computational complexity, particularly NPcompleteness.
Prerequisites: Computer Science 201 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202) 6 credits; Formal or Statistical Reasoning; offered Winter 2022, Spring 2022 · James Ryan 
CS 257: Software Design
It’s easy to write a mediocre computer program, and lots of people do it. Good programs are quite a bit harder to write, and are correspondingly less common. In this course, we will study techniques, tools, and habits that will improve your chances of writing good software. While working on several mediumsized programming projects, we will investigate code construction techniques, debugging and profiling tools, testing methodologies, UML, principles of objectoriented design, design patterns, and user interface design. Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2021, Winter 2022, Spring 2022 · Jeffrey Ondich, Amy Csizmar Dalal, Anya Vostinar 
CS 338: Computer Security
When hackers can disable gas pipelines, national hospital systems, and electrical grids, and data brokers can create a largely unregulated worldwide surveillance system, there’s a clear need for people who understand the mechanisms of computer security and insecurity. Towards that end, in this course we will study technical and social aspects of computer and network security. Topics will include threat modeling, cryptography, secure network protocols, web security, ethical hacking and penetration testing, authentication, authorization, historical hacking incidents, usability, privacy, and securityrelated law.
Prerequisites: Computer Science 201 6 credits; Formal or Statistical Reasoning; offered Spring 2022 · Jeffrey Ondich 
CS 344: HumanComputer Interaction
The field of humancomputer interaction addresses two fundamental questions: how do people interact with technology, and how can technology enhance the human experience? In this course, we will explore technology through the lens of the end user: how can we design effective, aesthetically pleasing technology, particularly user interfaces, to satisfy user needs and improve the human condition? How do people react to technology and learn to use technology? What are the social, societal, health, and ethical implications of technology? The course will focus on design methodologies, techniques, and processes for developing, testing, and deploying user interfaces. Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Spring 2022 · Eric Alexander 
CS 352: Advanced Algorithms
A second course on designing and analyzing efficient algorithms to solve computational problems. We will survey some algorithmic design techniques that apply broadly throughout computer science, including discussion of wideranging applications. A sampling of potential topics: approximation algorithms (can we efficiently compute nearoptimal solutions even when finding exact solutions is computationally intractable?); randomized algorithms (does flipping coins help in designing faster/simpler algorithms?); online algorithms (how do we analyze an algorithm that needs to make decisions before the entire input arrives?); advanced data structures; complexity theory. As time and interest permit, we will mix recently published algorithmic papers with classical results. Prerequisites: Computer Science 252 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Spring 2022 · David LibenNowell 
CS 400: Integrative Exercise
Beginning with the prototypes developed in the Senior Seminar, project teams will complete their project and present it to the department. Required of all senior majors. Prerequisites: Computer Science 399 3 credits; S/NC; offered Winter 2022, Spring 2022 · Jeffrey Ondich, David Musicant, Anya Vostinar, Sneha Narayan, Aaron Bauer, Amy Csizmar Dalal