Courses
Gain computational understanding and skill through our many course offerings. Majors complete eight courses in the department and two in mathematics
Computer Science Courses
CSCI 102 (S) TUT The Socio-Techno Web This course introduces many fundamental concepts in computer science by examining the social aspects of computing. As more and more people use the technologies and services available via the Internet, online environments like Facebook, Instagram, Amazon, Google, Twitter (or X), YouTube, and blogs are flourishing. However, several of the problems related to security, privacy, and trust that exist in the real world transfer and become amplified in the virtual world created by the ubiquity and pervasiveness of the Internet. In this course, we will investigate how the social, technological, and natural worlds are connected, and how the study of networks sheds light on these connections. Topics include the structure of the Social Web and networks in general; issues such as virtual identity, personal and group privacy, trust evaluation and propagation, and online security; and the technology, economics, and politics of Web information and online communities. No background in computer science or programming is required or expected. Taught by: Bill Jannen | Catalog details CSCI 104 (F, S) LEC Data Science and Computing for All Many of the world’s greatest discoveries and most consequential decisions are enabled or informed by the analysis of data from a myriad of sources. Indeed, the ability to wrangle, visualize, and draw conclusions from data is now a critical tool in the sciences, business, medicine, politics, other academic disciplines, and society as a whole. This course lays the foundations for quantifying relationships in data by exploring complementary computational, statistical, and visualization concepts. These concepts will be reinforced by lab experiences designed to teach programming and statistics skills while analyzing real-world data sets. This course will also examine the broader context and social issues surrounding data analysis, including privacy and ethics. Taught by: Stephen Freund | Catalog details CSCI 134 (F, S) LEC Introduction to Computer Science This course introduces students to the science of computation by exploring the representation and manipulation of data and algorithms. We organize and transform information in order to solve problems using algorithms written in a modern object-oriented language. Topics include organization of data using objects and classes, and the description of processes using conditional control, iteration, methods and classes. We also begin the study of abstraction, self-reference, reuse, and performance analysis. While the choice of programming language and application area will vary in different offerings, the skills students develop will transfer equally well to more advanced study in many areas. In particular, this course is designed to provide the programming skills needed for further study in computer science and is expected to satisfy introductory programming requirements in other departments. Taught by: Rohit Bhattacharya, Jeannie R Albrecht, Lucas Anton Rosenblatt | Catalog details CSCI 136 (F, S) LEC Data Structures and Advanced Programming This course builds on the programming skills acquired in Computer Science 134. It couples work on program design, analysis, and verification with an introduction to data structures. The study of data structures captures efficient methods in which to store and manipulate data, and they are important in the construction of high-performance computer programs. The course introduces the most commonly used data structures: files, lists, stacks, queues, trees, hash tables, and graphs. Students will be expected to write many programs: small programs at first, culminating in more elaborate systems by the end of the semester. Emphasis will be placed on the development of clear, modular programs that are easy to read, debug, verify, analyze, and modify. Taught by: James Bern, Daniel Barowy | Catalog details CSCI 237 (F, S) LEC Computer Organization This course studies the basic instruction set architecture and organization of a modern computer. It provides a programmer’s view of how computer systems execute programs, store information, and communicate. Over the semester the student learns the fundamentals of translating higher level languages into assembly language, and the interpretation of machine languages by hardware. At the same time, a model of computer hardware organization is developed from the gate level upward. Taught by: Kelly Shaw, Bill Jannen | Catalog details CSCI 256 (F, S) LEC Algorithm Design and Analysis This course investigates methods for designing efficient and reliable algorithms. By carefully analyzing the structure of a problem within a mathematical framework, it is often possible to dramatically decrease the computational resources needed to find a solution. In addition, analysis provides a method for verifying the correctness of an algorithm and accurately estimating its running time and space requirements. We will study several algorithm design strategies that build on data structures and programming techniques introduced in Computer Science 136. These include greedy, divide-and-conquer, dynamic programming, and network flow algorithms. Additional topics of study include algorithms on graphs and strategies for handling potentially intractable problems. Taught by: Shikha Singh, Aaron Williams | Catalog details CSCI 270 (F, S) LEC Foundations of Artificial Intelligence Computer science has increasingly set its sights on problems with no obvious prescriptive solution, such as image classification, natural language understanding, and game playing. As it is infeasible to prescriptively identify a cat from a set of pixels, or a winning move from the state of a chess board, tools from the traditional computer science canon of algorithms and system building are often insufficient. Artificial intelligence (AI) techniques have increasingly been leveraged to fill this gap. Rather than explicitly specifying how to solve a task, AI techniques typically take an indirect approach: first describing the task using a standardized representation (e.g., labeled data for supervised machine learning and state spaces for heuristic search), and then employing general-purpose algorithms that operate on the task description. The goal of this course is to introduce the theoretical and practical foundations that will enable students to add AI methodologies to their computational toolbox. It provides the fundamentals for more advanced study of artificial intelligence and machine learning. Taught by: Mark Hopkins, Nate Chambers | Catalog details CSCI 315 (S) LEC Computational Biology This course will provide an overview of Computational Biology, the application of computational, mathematical, statistical, and physical problem-solving techniques to interpret the rapidly expanding amount of biological data. Topics covered will include database searching, DNA sequence alignment, clustering, RNA structure prediction, protein structural alignment, methods of analyzing gene expression, networks, and genome assembly using techniques such as string matching, dynamic programming, hidden Markov models, and statistics. Taught by: Daniel Aalberts | Catalog details CSCI 317 (S) LEC Foundations of Computational Neuroscience How does the brain process information? Despite the continuous scientific pursuits to understand the brain, many questions about brain function remain unanswered. In this course, we take an interdisciplinary, hands-on approach to understanding the brain, focusing on how neural systems encode, transmit, and decode information. Students will learn foundational techniques in computational neuroscience as it pertains to simulating neuronal dynamics with canonical models such as the integrate-and-fire, Hodgkin-Huxley, and Wilson-Cowan equations, performing statistical analysis of neurological data, and examining biological neural networks and their parallels to artificial intelligence. Taught by: TBA | Catalog details CSCI 319 LEC Integrative Bioinformatics, Genomics, and Proteomics Lab Last offered Fall 2025 What can computational biology teach us about cancer? In this lab-intensive experience for the Genomics, Proteomics, and Bioinformatics program, computational analysis and wet-lab investigations will inform each other, as students majoring in biology, chemistry, computer science, mathematics/statistics, and physics contribute their own expertise to explore how ever-growing gene and protein data-sets can provide key insights into human disease. In this course, we will take advantage of one well-studied system, the highly conserved Ras-related family of proteins, which play a central role in numerous fundamental processes within the cell. The course will integrate bioinformatics and molecular biology, using database searching, alignments and pattern matching, and phylogenetics to reconstruct the evolution of gene families by focusing on the gene duplication events and gene rearrangements that have occurred over the course of eukaryotic speciation. By utilizing high through-put approaches to investigate genes involved in the inflammatory and MAPK signal transduction pathways in human colon cancer cell lines, students will uncover regulatory mechanisms that are aberrantly altered by siRNA knockdown of putative regulatory components. This functional genomic strategy will be coupled with independent projects using phosphorylation-state specific antisera to test our hypotheses. Proteomic analysis will introduce the students to de novo structural prediction and threading algorithms, as well as data-mining approaches and Bayesian modeling of protein network dynamics in single cells. Flow cytometry and mass spectrometry may also be used to study networks of interacting proteins in colon tumor cells. Taught by: Lois Banta | Catalog details CSCI 331 LEC Introduction to Computer Security Last offered Spring 2026 This class explores common vulnerabilities in computer systems, how attackers exploit them, and how systems engineers design defenses to mitigate them. The goal is to be able to recognize potential vulnerabilities in one’s own software and to practice defensive design. Hands-on experience writing assembly language and C code to inspect and modify the low-level operation of running programs is emphasized. Finally, regular reading and writing assignments round out the course to help students understand the cultural and historical background of the computer security “arms race.” Taught by: Daniel Barowy | Catalog details CSCI 333 (F) LEC Storage Systems This course will examine topics in the design, implementation, and evaluation of storage systems. Topics include the memory hierarchy; ways that data is organized (both logically and physically); storage hardware and its influence on storage software designs; data structures; performance models; and system measurement/evaluation. Textbook readings will be supplemented by readings from recent technical literature. An emphasis will be placed on identifying and evaluating design trade-offs. Taught by: Bill Jannen | Catalog details CSCI 334 (F) LEC Principles of Programming Languages This course examines the concepts and structures governing the design and implementation of programming languages. It presents an introduction to the concepts behind compilers and run-time representations of programming languages; features of programming languages supporting abstraction and polymorphism; and the procedural, functional, object-oriented, and concurrent programming paradigms. Programs will be required in languages illustrating each of these paradigms. Taught by: Daniel Barowy | Catalog details CSCI 335 LEC Database Systems Last offered Spring 2026 This course provides an introduction to the systematic management of data. Topics will include the design and implementation of relational databases, data modeling, data normalization, indexing, query processing, and transaction management. There will be significant use of SQL throughout. The course will also explore the use of different database systems in commercial settings. Class discussion will be based on readings from the textbook and papers. The goals of this course are to understand how large quantities of data are stored, updated, and queried and to provide students with the tools necessary to design and use databases effectively. Taught by: Kelly Shaw | Catalog details CSCI 337 (S) TUT Advanced Computer Architecture This tutorial course considers topics in the low-level design of modern computer architectures. Course meetings will review problems in the design, analysis, and optimization of high-performance computer systems, moving beyond basic principles to explore modern processor, memory, and parallel systems. Topics may include Reduced Instruction Set Computer (RISC) principles, pipelining, cache optimization, branch prediction, multicore systems, and accelerators. Taught by: Kelly Shaw | Catalog details CSCI 338 LEC Parallel Processing Last offered Spring 2025 This course explores different parallel programming paradigms used for writing applications on today’s parallel computer systems. The course will introduce concurrency (i.e. multiple simultaneous computations) and the synchronization primitives that allow for the creation of correct concurrent applications. It will examine how a variety of systems organize parallel processing resources and enable users to write parallel programs for these systems. Covered programming paradigms will include multiprogramming with processes, message passing, threading in shared memory multiprocessors, vector processing, graphics processor programming, MapReduce, and other forms of programming for the cloud. Class discussion is based on assigned readings. Assignments provide students the opportunity to develop proficiency in writing software using different parallel programming paradigms. Taught by: Kelly Shaw | Catalog details CSCI 339 (F) LEC Distributed Systems This course studies the key design principles of distributed systems, which are collections of independent networked computers that function as single coherent systems. Covered topics include communication protocols, processes and threads, naming, synchronization, consistency and replication, fault tolerance, and security. Students also examine some specific real-world distributed systems case studies, including Google and Amazon. Class discussion is based on readings from the textbook and research papers. The goals of this course are to understand how large-scale computational systems are built, and to provide students with the tools necessary to evaluate new technologies after the course ends. Taught by: Jeannie R Albrecht | Catalog details CSCI 341 (S) LEC Computer Graphics This course explores the mathematical and algorithmic foundations of computer graphics, with an emphasis on prototyping graphical applications from scratch in C and OpenGL. Possible topics include rasterization, ray tracing, forward and inverse kinematics (FK/IK), physics-based animation, and immediate-mode graphical user interface (IMGUI). Examples will be drawn from video games, animated movies, and robotics. Taught by: James Bern | Catalog details CSCI 345 LEC Robotics and Digital Fabrication Last offered Spring 2025 This course is a hands-on exploration of topics in robotics and digital fabrication. We will experience firsthand how ideas and methods from computer science can be applied to make physical objects, including robots and other machines. The emphasis will be on creative, hands-on experimentation. Along the way, students will learn the basics of embedded systems programming (Arduino), breadboarding, soldering, printed circuit board (PCB) design, mechanical computer-aided design (CAD)–both conventional (OnShape) and programmatic (OpenSCAD)–as well digital fabrication (3D-printing, laser cutting). Students will learn both how to build their own prototypes and how to send out designs to have parts machined professionally. Students will work in teams throughout. The course will culminate in a team robotic design competition testing both functionality and creativity. Taught by: James Bern | Catalog details CSCI 357 (S) LEC Algorithmic Game Theory This course focuses on topics in game theory and mechanism design from a computational perspective. We will explore questions such as: how to design algorithms that incentivize truthful behavior, that is, where the participants have no incentive to cheat? Should we let drivers selfishly minimize their commute time or let a central algorithm direct traffic? Does Arrow’s impossibility result mean that all voting protocols are doomed? The overarching goal of these questions is to understand and analyze selfish behavior and whether it can or should influence system design. Students will learn how to model and reason about incentives in computational systems both theoretically and empirically. Topics include types of equilibria, efficiency of equilibria, auction design and mechanism design with money, two-sided markets and mechanism design without money, incentives in computational applications such as P2P systems, and computational social choice. Taught by: Shikha Singh | Catalog details CSCI 358 LEC Applied Algorithms Last offered Fall 2025 This course is about bridging the gap between theoretical running time and writing fast code in practice. The course is divided into two basic topics. The first is algorithmic: we will discuss some of the most useful tools in a coder’s toolkit. This includes topics like randomization (hashing, filters, approximate counters), linear and convex programming, similarity search, and cache-efficient algorithms. Our goal is to talk about why these efficient algorithms make seemingly difficult problems solvable in practice. The second topic is applications: we will discuss how to implement algorithms in an efficient way that takes advantage of modern hardware. Specific topics covered will include blocking, loop unrolling, pipelining, as well as strategies for performance analysis. Projects and assessments will include both basic theoretical aspects (understanding why the algorithms we discuss actually work), and practical aspects (implementing the algorithms we discuss to solve important problems, and optimizing the code so it runs as quickly as possible). Taught by: Samuel McCauley | Catalog details CSCI 359 LEC Gray Codes: Proofs, Programs, and Puzzles Last offered Spring 2026 Binary strings, permutations, partitions, combinations, and graphs are all examples of simple combinatorial objects. If the objects of a particular size and type are listed so that successive objects differ by a small amount, then the list is a Gray code. Humans have been creating Gray codes or hundreds of years. For example, bell-ringers first discovered and rang the “plain changes” order of permutations in the 17th century.
We cover the foundations of creating and working with Gray codes including greedy constructions, global and local recursion, successor rules, and ranking/unranking formulae. We will discuss modern results in the area including the middle levels and sigma-tau theorems. We also consider the famous Lovász conjecture and the computational complexity of determining the existence of Hamilton paths within flip graphs.
A primary application area is combinatorial generation. This refers to the efficient generation of objects by a computer program iterator. Gray codes can lead to simpler and faster loopless algorithms that solve these very common programming tasks. A secondary application area is sequential puzzles. We will discuss classic Gray code puzzles including the Towers of Hanoi and Spin-Out, as well as a new series of puzzles including Ziggurat and Zigguflat. Taught by: Aaron Williams | Catalog details CSCI 361 (S) LEC Theory of Computation This course introduces a formal framework for investigating both the computability and complexity of problems. We study several models of computation including finite automata, regular languages, context-free grammars, and Turing machines. These models provide a mathematical basis for the study of computability theory–the examination of what problems can be solved and what problems cannot be solved–and the study of complexity theory–the examination of how efficiently problems can be solved. Topics include the halting problem and the P versus NP problem. Taught by: Samuel McCauley | Catalog details CSCI 374 LEC Machine Learning Last offered Spring 2025 Machine learning is a field that derives from artificial intelligence and statistics, and is concerned with the design and analysis of computer algorithms that “learn” automatically through the use of data. Computer algorithms are capable of discerning subtle patterns and structure in the data that would be practically impossible for a human to find. As a result, real-world decisions, such as treatment options and loan approvals, are being increasingly automated based on predictions or factual knowledge derived from such algorithms. This course explores topics in supervised learning (e.g., random forests and neural networks), unsupervised learning (e.g., k-means clustering and expectation maximization), and possibly reinforcement learning (e.g., Q-learning and temporal difference learning.) It will also introduce methods for the evaluation of learning algorithms (with an emphasis on analysis of generalizability and robustness of the algorithms to distribution/environmental shift), as well as topics in computational learning theory and ethics. Taught by: Rohit Bhattacharya | Catalog details CSCI 375 (F, S) LEC Natural Language Processing Natural language processing (NLP) is a set of methods for making human language accessible to computers. NLP underlies many technologies we use on a daily basis including automatic machine translation, search engines, email spam detection, and automated personalized assistants. These methods draw from a combination of algorithms, linguistics and statistics. This course will provide a foundation in building NLP models to classify, generate, and learn from text data. Taught by: Nate Chambers, Katie Keith | Catalog details CSCI 379 (S) LEC Causal Inference Does X cause Y? If so, how? And what is the strength of this causal relation? Seeking answers to such causal (as opposed to associational) questions is a fundamental human endeavor; the answers we find can be used to support decision-making in various settings such as healthcare and public policy. But how does one tease apart causation from association–early in our statistical education we are taught that “correlation does not imply causation.” In this course, we will re-examine this phrase and learn how to reason with confidence about the validity of causal conclusions drawn from messy real-world data. We will cover core topics in causal inference including causal graphical models, unsupervised learning of the structure of these models, expression of causal quantities as functions of observed data, and robust/efficient estimation of these quantities using statistical and machine learning methods. Concepts in the course will be contextualized via regular case studies. Taught by: Rohit Bhattacharya | Catalog details CSCI 381 (S) LEC Deep Learning This course is an introduction to deep neural networks and how to train them. Beginning with the fundamentals of regression and optimization, the course then surveys a variety of neural network architectures, which may include multilayer feedforward neural networks, convolutional neural networks, recurrent neural networks, and transformer networks. Students will also learn how to use deep learning software such as PyTorch or Tensorflow. Taught by: Mark Hopkins | Catalog details CSCI 382 (F, S) LEC Responsible Artificial Intelligence Responsible Machine Learning/Artificial Intelligence is the science and practice of designing algorithms and deploying AI systems in ways that are socially sustainable. This course introduces students to core technical and socio-technical objectives in responsible AI, with an emphasis on algorithmic fairness, transparency and interpretability, (differential) data privacy, and bias/risk factors for LLMs.
This course is socio-technically grounded. We study how and why machine learning systems can produce harmful or inequitable outcomes, and how different stakeholders (e.g., impacted communities, developers, institutions, regulators) define “responsible” in different, sometimes conflicting, ways. Students learn to evaluate these trade-offs, implement mitigation techniques, and communicate technical results clearly.
The course will include both conceptual frameworks (ethics, governance, legal and policy constraints) and technical/algorithmic solutions (models with fairness/privacy constraints, explainability toolkits, etc.). Students work in Python to analyze datasets and models, apply bias mitigation methods, generate explanations for model decisions, and explore privacy-preserving data releases. Students will also be asked to work through a limited number of problems that require light proofs and pre-requisite knowledge of probability/statistics to deepen their understanding. Students will also be assessed on their ability to present their work coherently and demonstrate understanding of the material. Taught by: Lucas Anton Rosenblatt | Catalog details CSCI 397 (F) IND Independent Reading: Computer Science Directed independent reading in Computer Science. Taught by: Jeannie R Albrecht | Catalog details CSCI 398 (S) IND Independent Reading: Computer Science Directed independent reading in Computer Science. Taught by: Jeannie R Albrecht | Catalog details CSCI 432 LEC Operating Systems Last offered Fall 2025 This course explores the design and implementation of computer operating systems. Topics include historical aspects of operating systems development, systems programming, process scheduling, synchronization of concurrent processes, virtual machines, memory management and virtual memory, I/O and file systems, system security, os/architecture interaction, and distributed operating systems. Taught by: Jeannie R Albrecht | Catalog details CSCI 434 (F) TUT Compiler Design This tutorial covers the principles and practices for the design and implementation of compilers and interpreters. Topics include all stages of the compilation and execution process: lexical analysis; parsing; symbol tables; type systems; scope; semantic analysis; intermediate representations; run-time environments and interpreters; code generation; program analysis and optimization; and garbage collection. The course covers both the theoretical and practical implications of these topics. Students will construct a full compiler for a simple object-oriented language. Taught by: Stephen Freund | Catalog details CSCI 441 LEC Information Theory and Applications Last offered Fall 2021 What is information? And how do we communicate information effectively? This course will introduce students to the fundamental ideas of Information Theory including entropy, communication channels, mutual information, and Kolmogorov complexity. These ideas have surprising connections to a fields as diverse as physics (statistical mechanics, thermodynamics), mathematics (ergodic theory and number theory), statistics and machine learning (Fisher information, Occam’s razor), and electrical engineering (communication theory). Taught by: Richard De Veaux | Catalog details CSCI 493 (F) HON Research in Computer Science This course provides highly-motivated students an opportunity to work independently with faculty on research topics chosen by individual faculty. Students are generally expected to perform a literature review, identify areas of potential contribution, and explore extensions to existing results. The course culminates in a concise, well-written report describing a problem, its background history, any independent results achieved, and directions for future research. Taught by: Jeannie R Albrecht | Catalog details CSCI 494 (S) HON Senior Thesis: Computer Science Computer Science thesis; this is part of a full-year thesis (493-494). Taught by: Jeannie R Albrecht | Catalog details CSCI 497 (F) IND Independent Reading: Computer Science Directed independent reading in Computer Science. Taught by: Jeannie R Albrecht | Catalog details CSCI 498 (S) IND Independent Reading: Computer Science Directed independent reading in Computer Science. Taught by: Jeannie R Albrecht | Catalog details
Curriculum & Required Courses
Find the right course for you, whether you’re exploring computer science through an elective or declaring your major.