Fall 2020

  • 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 object-oriented 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 2020, Winter 2021, Spring 2021 · Sneha Narayan, Eric Alexander, David Liben-Nowell, Layla Oesper, David Musicant, James Ryan
  • 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 2020, Winter 2021, Spring 2021 · Anya Vostinar, Anna Rafferty, Aaron Bauer, Sneha Narayan
  • 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 111 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2020, Spring 2021 · Aaron Bauer
  • 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 2020, Winter 2021, Spring 2021 · David Musicant, Anna Rafferty
  • 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 2020, Winter 2021, Spring 2021 · 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 finite-state automata, pushdown automata, and Turing machines; formal languages, including regular expressions and context-free grammars; computability and uncomputability; and computational complexity, particularly NP-completeness.

    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 2020, Winter 2021 · 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 medium-sized programming projects, we will investigate code construction techniques, debugging and profiling tools, testing methodologies, UML, principles of object-oriented design, design patterns, and user interface design. Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2020, Winter 2021, Spring 2021 · Jeffrey Ondich, Amy Csizmar Dalal
  • 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 2020 · Layla Oesper
  • 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 socio-technical 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 credits; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Fall 2020 · Sneha Narayan
  • CS 318: Computational Media

    How does computation enable new forms of creative expression? What kinds of media artifacts and experiences can only happen on computers? In this course, we’ll explore these notions through a hands-on survey of various forms of computational media, such as: computer simulation, computer-generated visual art, poetry generation, story generation, chatbots, Twitter bots, explorable explanations, and more. For each topic in the survey, students will learn about the past, present, and future of a given form through short readings and direct engagement with major works. Assignments and a final project will center on the creation of novel media artifacts and also reimplementations of lost or defunct historical programs.

    Prerequisites: Computer Science 111 or 201 6 credits; Does not fulfill a curricular exploration requirement; offered Fall 2020 · James Ryan
  • CS 320: Machine Learning

    What does it mean for a machine to learn? Much of modern machine learning focuses on identifying patterns in large datasets and using these patterns to make predictions about the future. Machine learning has impacted a diverse array of applications and fields, from scientific discovery to healthcare to education. In this artificial intelligence-related course, we’ll both explore a variety of machine learning algorithms in different application areas, taking both theoretical and practical perspectives, and discuss impacts and ethical implications of machine learning more broadly. Topics may vary, but typically focus on regression and classification algorithms, including neural networks.

    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 2020 · Anna Rafferty
  • CS 331: Computer Networks

    The Internet is composed of a large number of heterogeneous, independently-operating computer networks that work together to transport all sorts of data to points all over the world. The fact that it does this so well given its complexity is a minor miracle. In this class, we’ll study the structure of these individual networks and of the Internet, and figure out how this “magic” takes place. Topics include TCP/IP, protocols and their implementations, routing, security, network architecture, DNS, peer-to-peer networking, and Wi-Fi along with ethical and privacy issues. Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2020 · Amy Csizmar Dalal
  • 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 faculty-specified 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 2020, Winter 2021 · Amy Csizmar Dalal, Aaron Bauer, Sneha Narayan, Jeffrey Ondich

Winter 2021

  • 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 object-oriented 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 2020, Winter 2021, Spring 2021 · Sneha Narayan, Eric Alexander, David Liben-Nowell, Layla Oesper, David Musicant, James Ryan
  • 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 2020, Winter 2021, Spring 2021 · Anya Vostinar, Anna Rafferty, Aaron Bauer, Sneha Narayan
  • 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 Winter 2021, Spring 2021 · Eric Alexander, Layla Oesper
  • 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 2020, Winter 2021, Spring 2021 · David Musicant, Anna Rafferty
  • 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 2020, Winter 2021, Spring 2021 · 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 finite-state automata, pushdown automata, and Turing machines; formal languages, including regular expressions and context-free grammars; computability and uncomputability; and computational complexity, particularly NP-completeness.

    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 2020, Winter 2021 · 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 medium-sized programming projects, we will investigate code construction techniques, debugging and profiling tools, testing methodologies, UML, principles of object-oriented design, design patterns, and user interface design. Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2020, Winter 2021, Spring 2021 · Jeffrey Ondich, Amy Csizmar Dalal
  • CS 311: Computer Graphics

    Scientific simulations, movies, and video games often incorporate computer-generated images of fictitious worlds. How are these worlds represented inside a computer? How are they “photographed” to produce the images that we see? What performance constraints and design trade-offs come into play? In this course we learn the basic theory and methodology of three-dimensional computer graphics, including both triangle rasterization and ray tracing. Familiarity with vectors, matrices, and the C programming language is recommended but not required.

    Prerequisites: Computer Science 201 6 credits; Quantitative Reasoning Encounter, Formal or Statistical Reasoning; offered Winter 2021 · Josh Davis
  • 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, human-computer 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 credits; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Winter 2021 · Eric Alexander
  • CS 348: Parallel and Distributed Computing

    As multi-core 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, shared-memory multi-threading and message-passing, 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 credits; Formal or Statistical Reasoning; offered Winter 2021 · David Musicant
  • CS 361: Evolutionary Computing and Artificial Life

    An introduction to evolutionary computation and artificial life, with a special emphasis on the two way flow of ideas between evolutionary biology and computer science. Topics will include the basic principles of biological evolution, experimental evolution techniques, and the application of evolutionary computation principles to solve real problems. All students will be expected to complete and present a term project exploring an open question in evolutionary computation. Prerequisites: Computer Science 201 6 credits; Formal or Statistical Reasoning; offered Winter 2021 · Anya Vostinar
  • 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 faculty-specified 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 2020, Winter 2021 · Amy Csizmar Dalal, Aaron Bauer, Sneha Narayan, Jeffrey Ondich
  • 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 2021, Spring 2021 · Amy Csizmar Dalal, Aaron Bauer, Sneha Narayan, Jeffrey Ondich

Spring 2021

  • 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 object-oriented 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 2020, Winter 2021, Spring 2021 · Sneha Narayan, Eric Alexander, David Liben-Nowell, Layla Oesper, David Musicant, James Ryan
  • 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 2020, Winter 2021, Spring 2021 · Anya Vostinar, Anna Rafferty, Aaron Bauer, Sneha Narayan
  • 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 Winter 2021, Spring 2021 · Eric Alexander, Layla Oesper
  • 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 111 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2020, Spring 2021 · Aaron Bauer
  • 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 2021 · 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 2020, Winter 2021, Spring 2021 · David Musicant, Anna Rafferty
  • 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 2020, Winter 2021, Spring 2021 · 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 medium-sized programming projects, we will investigate code construction techniques, debugging and profiling tools, testing methodologies, UML, principles of object-oriented design, design patterns, and user interface design. Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Fall 2020, Winter 2021, Spring 2021 · Jeffrey Ondich, Amy Csizmar Dalal
  • 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 credits; Formal or Statistical Reasoning, Quantitative Reasoning Encounter; offered Spring 2021 · James Ryan
  • 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 two-pronged approach to studying database systems. From a systems perspective, we will look at the low-level 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 credits; Formal or Statistical Reasoning; offered Spring 2021 · Aaron Bauer
  • 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 2021, Spring 2021 · Amy Csizmar Dalal, Aaron Bauer, Sneha Narayan, Jeffrey Ondich