Fall 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 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 2019, Winter 2020, Spring 2020 · Sneha Narayan, Aaron Bauer, David Liben-Nowell, Layla Oesper, Tanya Amert
  • 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 2019, Winter 2020, Spring 2020 · Sam Tucker, Amy Csizmar Dalal, Anna Rafferty, David Musicant
  • 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 2019, Spring 2020 · Sneha Narayan, David Liben-Nowell
  • 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 2019, Spring 2020 · David Musicant, Anna Rafferty
  • 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 111 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202) 6 credits; Formal or Statistical Reasoning; offered Fall 2019, Winter 2020 · Anna Rafferty, Josh Davis
  • 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 2019, Winter 2020, Spring 2020 · 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 2019 · David Musicant
  • 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 credits; Formal or Statistical Reasoning; offered Fall 2019 · David Musicant
  • CS 362: Computational Biology

    Recent advances in high-throughput 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 2019 · 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 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 2019, Winter 2020 · Anna Rafferty, Layla Oesper, David Musicant, Sneha Narayan

Winter 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 2019, Winter 2020, Spring 2020 · Sneha Narayan, Aaron Bauer, David Liben-Nowell, Layla Oesper, Tanya Amert
  • 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 2019, Winter 2020, Spring 2020 · Sam Tucker, Amy Csizmar Dalal, Anna Rafferty, David Musicant
  • 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 credits; Formal or Statistical Reasoning; offered Winter 2020, Spring 2020 · Aaron Bauer
  • CS 232: Art, Interactivity, and Robotics

    In this hands-on 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 nuts-and-bolts 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 2020 · David Musicant, Stephen Mohring
  • 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 Winter 2020, Spring 2020 · David Liben-Nowell, 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 111 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202) 6 credits; Formal or Statistical Reasoning; offered Fall 2019, Winter 2020 · Anna Rafferty, Josh Davis
  • 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 2019, Winter 2020, Spring 2020 · Amy Csizmar Dalal
  • CS 312: Audio Programming

    Students will learn the basics of MIDI and Digital Audio programming using C++. In the MIDI portion of the course, you’ll learn to record, play, and transform MIDI data. During the Digital Audio portion of the course, you’ll learn the basics of audio synthesis: oscillators, envelopes, filters, amplifiers, and FFT analysis. Weekly homework assignments, two quizzes, and two independent projects.

    Prerequisites: Computer Science 201 or instructor permission 6 credits; Formal or Statistical Reasoning; offered Winter 2020 · John Ellinger
  • CS 330: Introduction to Real-Time Systems

    How can we prove that dynamic cruise control will brake quickly enough if traffic suddenly stops? How must a system coordinate processes to detect pedestrians and other vehicles to ensure fair sharing of computing resources? In real-time systems, we explore scheduling questions like these, which require provable guarantees of timing constraints for applications including autonomous vehicles. This course will start by considering such questions for uniprocessor machines, both when programs have static priorities and when priorities can change over time. We will then explore challenges introduced by modern computers with multiple processors. We will consider both theoretical and practical perspectives.

    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 2020 · Tanya Amert
  • 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 Winter 2020 · Amy Csizmar Dalal
  • CS 344: Human-Computer Interaction

    The field of human-computer 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 Winter 2020 · Sneha Narayan
  • 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 2019, Winter 2020 · Anna Rafferty, Layla Oesper, David Musicant, Sneha Narayan
  • 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 2020, Winter 2020, Spring 2020 · Anna Rafferty, Layla Oesper, David Musicant, Sneha Narayan
  • 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 2020, Winter 2020, Spring 2020 · Anna Rafferty, Layla Oesper, David Musicant, Sneha Narayan

Spring 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 2019, Winter 2020, Spring 2020 · Sneha Narayan, Aaron Bauer, David Liben-Nowell, Layla Oesper, Tanya Amert
  • 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 2019, Winter 2020, Spring 2020 · Sam Tucker, Amy Csizmar Dalal, Anna Rafferty, David Musicant
  • 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 2019, Spring 2020 · Sneha Narayan, David Liben-Nowell
  • 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 credits; Formal or Statistical Reasoning; offered Winter 2020, Spring 2020 · 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 2019, Spring 2020 · 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 Winter 2020, Spring 2020 · David Liben-Nowell, 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 2019, Winter 2020, Spring 2020 · Amy Csizmar Dalal
  • 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 on-screen clock ticks, a program keeps watch for incoming e-mail, 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 Spring 2020 · 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 Spring 2020 · Josh Davis
  • 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 2020, Winter 2020, Spring 2020 · Anna Rafferty, Layla Oesper, David Musicant, Sneha Narayan