Course Information
 2018–2019 Courses:
 Browse by Course Number
 Browse by Term
Fall 2018

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. Students may not simultaneously enroll for CS 108 and CS 111 in the same term. 6 credit; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2018, Winter 2019, Spring 2019 · Jeffrey R Ondich, Amy Csizmar Dalal, Titus H Klinge, Eric C Alexander, Sneha Narayan, Anna N 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 credit; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2018, Winter 2019, Spring 2019 · Titus H Klinge, Eric C Alexander, Sneha Narayan, Jeffrey R Ondich 
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 credit; Formal or Statistical Reasoning; offered Fall 2018, Spring 2019 · Anna N Rafferty, Jack Hessel 
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 credit; Formal or Statistical Reasoning; offered Fall 2018, Winter 2019, Spring 2019 · David LibenNowell, Titus H Klinge 
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 111 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202) 6 credit; Formal or Statistical Reasoning; offered Fall 2018, Winter 2019 · Josh Davis, Anna N Rafferty 
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 credit; Formal or Statistical Reasoning; offered Fall 2018, Spring 2019 · Jeffrey R Ondich, Eric C Alexander 
CS 298: Reading and Analysis Associated with External Computing Experience
An independent study course intended for students who require Curricular Practical Training (CPT) or Optional Practical Training (OPT) to go with an external activity related to computer science (for example, an internship or an externship). The student will choose and read academic material relating to a practical experience (e.g., internship), and write a paper describing what the student learned from the reading, and how it related to the practical experience.
Prerequisites: Instructor's permission 1 credit; S/CR/NC; Does not fulfill a curricular exploration requirement; offered Fall 2018 · David R Musicant 
CS 314: Data Visualization
Understanding the wealth of data that surrounds us can be challenging. Luckily, we have evolved incredible tools for finding patterns in large amounts of information: our eyes! Data visualization is concerned with taking information and turning it into pictures to better communicate patterns or discover new insights. It combines aspects of computer graphics, humancomputer interaction, design, and perceptual psychology. In this course, we will learn the different ways in which data can be expressed visually and which methods work best for which tasks. Using this knowledge, we will critique existing visualizations as well as design and build new ones.
Prerequisites: Computer Science 201 6 credit; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2018 · Eric C Alexander 
CS 328: Computational Models of Cognition
How are machine learning and human learning similar? What sorts of things can people learn, and how can we apply computer science ideas to characterize cognition? This interdisciplinary course will take a computational modeling approach, exploring how models can help us to better understand cognition and observing similarities between machine learning methods and cognitive tasks. Through in class activities and readings of both classic and contemporary research papers on computational cognitive modeling, we'll build up an understanding of how different modeling choices lead to different predictions about human behavior and investigate potential practical uses of cognitive models. Final collaborative research projects will allow you to apply your modeling skills to a cognitive phenomenon that you're interested in. Prerequisites: Computer Science 201 or instructor permission. Computer Science 202 strongly recommended 6 credit; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2018 · Anna N Rafferty 
CS 348: Parallel and Distributed Computing
As multicore machines become more prevalent, different programming paradigms have emerged for harnessing extra processors for better performance. This course explores parallel computation (programs that run on more than one core) as well as the related problem of distributed computation (programs that run on more than one machine). In particular, we will explore the two major paradigms for parallel programming, sharedmemory multithreading and messagepassing, and the advantages and disadvantages of each. Other possible topics include synchronization mechanisms, debugging concurrent programs, fork/join parallelism, the theory of parallelism and concurrency, parallel algorithms, cloud computing, and Map/Reduce.
Prerequisites: Computer Science 201 6 credit; Formal or Statistical Reasoning; offered Fall 2018 · David R Musicant 
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 credit; S/CR/NC; Does not fulfill a curricular exploration requirement; offered Fall 2018 · Jeffrey R Ondich, David R Musicant, Amy Csizmar Dalal
Winter 2019

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. Students may not simultaneously enroll for CS 108 and CS 111 in the same term. 6 credit; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2018, Winter 2019, Spring 2019 · Jeffrey R Ondich, Amy Csizmar Dalal, Titus H Klinge, Eric C Alexander, Sneha Narayan, Anna N 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 credit; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2018, Winter 2019, Spring 2019 · Titus H Klinge, Eric C Alexander, Sneha Narayan, Jeffrey R Ondich 
CS 208: Computer Organization and Architecture
Computer processors are extraordinarily complex systems. The fact that they work at all, let alone as reliably as they do, is a monumental achievement of human collaboration. In this course, we will study the structure of computer processors, with attention to digital logic, assembly language, performance evaluation, computer arithmetic, data paths and control, pipelining, and memory hierarchies. Prerequisites: Computer Science 111 or instructor permission 6 credit; Formal or Statistical Reasoning; offered Winter 2019, Spring 2019 · Amy Csizmar Dalal, Jeffrey R 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 credit; Formal or Statistical Reasoning; offered Winter 2019, Spring 2019 · David R 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 credit; Formal or Statistical Reasoning; offered Fall 2018, Winter 2019, Spring 2019 · David LibenNowell, Titus H Klinge 
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 111 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202) 6 credit; Formal or Statistical Reasoning; offered Fall 2018, Winter 2019 · Josh Davis, Anna N Rafferty 
CS 311: Computer Graphics
Scientific simulations, movies, and video games often incorporate computergenerated images of fictitious worlds. How are these worlds modeled inside a computer? How are they "photographed" to produce the images that we see? What performance constraints and design tradeoffs come into play? In this course we learn the basic theory and methodology of computer graphics, following the historical development of the field, from software implementations to fixedfunction hardware, shader programs, and recent lowerlevel interfaces. Familiarity with vectors, matrices, and the C programming language is recommended but not required.
Prerequisites: Computer Science 201 6 credit; Quantitative Reasoning Encounter, Formal or Statistical Reasoning; offered Winter 2019 · Josh Davis 
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 credit; Formal or Statistical Reasoning; offered Winter 2019 · David LibenNowell 
CS 364: Molecular Programming and Nanoscale SelfAssembly
Algorithms are ubiquitous in nature and are even present in biological and chemical processes. For example, cells receive molecular signals, execute procedures, and send signals of their own, and chemical reactions compute functions by transforming reactants into products according to molecular rules. In this course, we will investigate various mathematical models of chemistry, biology, and nanoscale selfassembly. We will use each model as a programming language to compute molecular algorithms, verify their correctness, and analyze their complexity and robustness. We will also discover that many of these models are algorithmically universal and are equivalent in power to modern programming languages.
Prerequisites: Computer Science 201 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202). No background in biology or chemistry is required, but it may be helpful 6 credit; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Winter 2019 · Titus H Klinge 
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 credit; S/NC; offered Winter 2019 · Jeffrey R Ondich, David R Musicant, Amy Csizmar Dalal
Spring 2019

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. Students may not simultaneously enroll for CS 108 and CS 111 in the same term. 6 credit; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2018, Winter 2019, Spring 2019 · Jeffrey R Ondich, Amy Csizmar Dalal, Titus H Klinge, Eric C Alexander, Sneha Narayan, Anna N 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 credit; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2018, Winter 2019, Spring 2019 · Titus H Klinge, Eric C Alexander, Sneha Narayan, Jeffrey R Ondich 
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 credit; Formal or Statistical Reasoning; offered Fall 2018, Spring 2019 · Anna N Rafferty, Jack Hessel 
CS 208: Computer Organization and Architecture
Computer processors are extraordinarily complex systems. The fact that they work at all, let alone as reliably as they do, is a monumental achievement of human collaboration. In this course, we will study the structure of computer processors, with attention to digital logic, assembly language, performance evaluation, computer arithmetic, data paths and control, pipelining, and memory hierarchies. Prerequisites: Computer Science 111 or instructor permission 6 credit; Formal or Statistical Reasoning; offered Winter 2019, Spring 2019 · Amy Csizmar Dalal, Jeffrey R 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 credit; Formal or Statistical Reasoning; offered Winter 2019, Spring 2019 · David R 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 credit; Formal or Statistical Reasoning; offered Fall 2018, Winter 2019, Spring 2019 · David LibenNowell, Titus H Klinge 
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 credit; Formal or Statistical Reasoning; offered Fall 2018, Spring 2019 · Jeffrey R Ondich, Eric C Alexander 
CS 304: Social Computing
The last decade has seen a vast increase in the number of applications that connect people with one another. This course presents an interdisciplinary introduction to social computing, a field of study that explores how computational techniques and artifacts are used to support and understand social interactions. We will examine a number of sociotechnical systems (such as wikis, social media platforms, and citizen science projects), discuss the design principles used to build them, and analyze how they help people mobilize and collaborate with one another. Assignments will involve investigating datasets from online platforms and exploring current research in the field.
Prerequisites: Computer Science 201 6 credit; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Spring 2019 · Sneha Narayan 
CS 321: Artificial Intelligence
How can we design computer systems with behavior that seems "intelligent?" This course will examine a number of different approaches to this question, including intelligent search computer game playing, automated logic, machine learning (including neural networks), and reasoning with uncertainty. The coursework is a mix of problem solving and computer programming based on the ideas that we discuss.
Prerequisites: Computer Science 201. Additionally Computer Science 202 is strongly recommended. 6 credit; Formal or Statistical Reasoning; offered Spring 2019 · Anna N Rafferty 
CS 322: Natural Language Processing
Computers are poor conversationalists, despite decades of attempts to change that fact. This course will provide an overview of the computational techniques developed in the attempt to enable computers to interpret and respond appropriately to ideas expressed using natural languages (such as English or French) as opposed to formal languages (such as C++ or Lisp). Topics in this course will include parsing, semantic analysis, machine translation, dialogue systems, and statistical methods in speech recognition.
Prerequisites: Computer Science 201 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202) 6 credit; Formal or Statistical Reasoning; offered Spring 2019 · Jack Hessel 
CS 334: Database Systems
Database systems are used in almost every aspect of computing, from storing data for websites to maintaining financial information for large corporations. Intrinsically, what is a database system and how does it work? This course takes a twopronged approach to studying database systems. From a systems perspective, we will look at the lowlevel details of how a database system works internally, studying such topics as file organization, indexing, sorting techniques, and query optimization. From a theory perspective, we will examine the fundamental ideas behind database systems, such as normal forms and relational algebra. Prerequisites: Computer Science 201 or consent of the instructor. 6 credit; Formal or Statistical Reasoning; offered Spring 2019 · David R Musicant