Computer Science (CSCI)
What is computer science, what are its applications in other disciplines, and what is its impact in society? A step-by-step introduction to the art of problem solving using the computer and programming. Provides a broad introduction to computer science and programming through real-life applications. Weekly labs provide experience with the concepts presented in class. Assumes no prior knowledge of computers or programming. Students with prior programming experience may instead be placed into CSCI 1103. Final grade must be C- or better to serve as a prerequisite for Computer Science 2101.
Terms offered: 2021 Fall Semester; 2022 Spring Semester; 2022 Fall Semester; 2023 Spring Semester; 2023 Fall Semester; 2024 Spring Semester; 2024 Fall Semester; 2025 Spring Semester; 2025 Fall Semester
Covers the same introductory material as CSCI 1101, but at an accelerated pace and without an associated lab section. Appropriate for students with prior programming experience, though not necessarily in any specific programming language. Final course grade must be C- or better to serve as a prerequisite for CSCI 2101. This course originates in Computer Science and is crosslisted with: Digital and Computational St.
Terms offered: 2021 Fall Semester; 2022 Fall Semester; 2023 Fall Semester; 2024 Fall Semester
Combines and covers the same material as CSCI 1101 and CSCI 2101, but at an accelerated pace. Appropriate for students with prior computational and programming experience. Final course grade must be C- or better to serve as a prerequisite for CSCI 2102.
Terms offered: 2025 Fall Semester
Builds on the computational and programming skills acquired in the introductory course, focusing on efficient ways of storing and accessing data using essential data structures. Explores the design of linear data structures such as dynamic arrays, linked lists, stacks, and queues as well as their practical applications within complex computer programs. Also emphasizes object-oriented program design and the development of clear, modular programs that are easy to read, modify, and debug. Regular and significant programming assignments in Java provide the opportunity to apply the principles studied. Prior experience in a high-level programming language such as Python or Java is assumed, but no experience with Java specifically is required.
Terms offered: 2021 Fall Semester; 2022 Spring Semester; 2022 Fall Semester; 2023 Spring Semester; 2023 Fall Semester; 2024 Spring Semester; 2024 Fall Semester; 2025 Spring Semester; 2025 Fall Semester
Continues the study of data structures and program design begun in CSCI 2101. Focuses on nonlinear data structures such as trees and graphs and the use of advanced programmatic techniques such as recursion. Also studies algorithms for foundational problems such as searching and sorting and introduces techniques for the formal analysis of program efficiency such as asymptotic analysis. Assignments include the development of complex programs in Java as well as theoretical algorithm analysis and design. Prior programming experience in Java comparable to that gained in CSCI 2101 is assumed.
Terms offered: 2025 Spring Semester; 2025 Fall Semester
An introductory course on the design and analysis of algorithms. Introduces a number of basic algorithms for a variety of problems such as searching, sorting, selection, and graph problems (e.g., spanning trees and shortest paths). Discusses analysis techniques, such as recurrences and amortization, as well as algorithm design paradigms such as divide-and-conquer, dynamic programming, and greedy algorithms.
Terms offered: 2021 Fall Semester; 2022 Spring Semester; 2022 Fall Semester; 2023 Spring Semester; 2023 Fall Semester; 2024 Spring Semester; 2024 Fall Semester; 2025 Fall Semester
Studies the nature of computation and examines the principles that determine what computational capabilities are required to solve particular classes of problems. Topics include an introduction to the connections between language theory and models of computation, and a study of unsolvable problems.
Terms offered: 2021 Fall Semester; 2022 Fall Semester; 2023 Fall Semester; 2024 Fall Semester
Studies design principles and paradigms of programming languages. Different paradigms of languages correspond to distinct ways of thinking about problem solving. For example, functional languages (such as Haskell) focus attention on the behavioral aspects of a problem; object-oriented languages (such as Ruby) focus attention on data--how to model and manipulate it. Despite their differences, a common set of principles often guide language design. Covers principles of language design and implementation including syntax, semantics, type systems, control structures, and compilers. Also covers various paradigms of languages including imperative, object-oriented, web, and functional languages.
Terms offered: 2022 Spring Semester; 2023 Fall Semester; 2024 Spring Semester; 2025 Spring Semester
A broad introduction to how modern computer systems execute programs, store information, and communicate. Examines the hardware and software components required to go from a program expressed in a high-level programming language like C to the computer actually running the program. Topics include concepts of program compilation and assembly, machine code, data representation and computer arithmetic, basic microarchitecture, the memory hierarchy, processes, and system-level I/O. Regular, programming-intensive projects provide hands-on experience with the key components of computer systems.
Terms offered: 2021 Fall Semester; 2022 Spring Semester; 2022 Fall Semester; 2023 Spring Semester; 2023 Fall Semester; 2024 Spring Semester; 2024 Fall Semester; 2025 Spring Semester; 2025 Fall Semester
A Java-based introduction to the processes of software engineering. How to design, implement, and test small-to medium-sized object-oriented systems, including the use of appropriate design notation to create a design before implementation. Closed-box and open-boxed testing, including writing and executing system test plans, writing unit tests, and using code coverage. An introduction to the best practices of software engineering, including pair programming, test-first development, static analysis, version control, and continuous integration. An introduction to project management. Class will feature several multi-week, hands-on projects; some projects will require students to work together in small teams (three to four members). Time permitting, we may also cover an introduction to full-stack web development, including HTML, JavaScript, and Databases.
Terms offered: 2022 Fall Semester; 2023 Spring Semester; 2024 Spring Semester
Examines the social and economic aspects of today's connected world from a multitude of perspectives; namely, network science, computer science, sociology, and economics. The fundamental questions to be addressed are: What are the properties of real-world networks? What are the effects of networks on our behavioral choices like quitting smoking or eating healthy? How do cascades in networks lead to outcomes like videos going viral? How does Google search the Internet and make money doing so? Debates issues around centrality in networks. Uses game theory to study strategic interactions in networks and markets. This course originates in Digital and Computational Studies and is crosslisted with: Computer Science. (Same as: DCS 2350)
Terms offered: 2022 Spring Semester; 2023 Fall Semester; 2024 Fall Semester; 2025 Fall Semester
Explores the principles and techniques involved in programming computers to do tasks that would require intelligence if people did them. State-space and heuristic search techniques, logic and other knowledge representations, reinforcement learning, neural networks, and other approaches are applied to a variety of problems with an emphasis on agent-based approaches.
Terms offered: 2021 Fall Semester; 2022 Fall Semester; 2023 Fall Semester; 2024 Fall Semester; 2025 Spring Semester; 2025 Fall Semester
An important aspect of the expressiveness of a programming language, concerns what kinds of things it can manipulate as data. This course introduces programming in a dependently typed functional language. In such a language both functions and types are ordinary data. This enables features such as higher-order and generic functions, as well as data whose type depends on the value of other data. One benefit of working in this setting is that properties of programs can be both expressed and proved within the language itself, providing much stronger guarantees of correctness than is possible using testing.
Terms offered: 2024 Spring Semester
How can we design technologies that result in positive and valuable (instead of ineffective and frustrating) experiences? Introduces key principles of user interface development by way of theory and hands-on practice. Topics include design principles (as informed by human perception and cognition) and prototyping techniques, as well as how to inspect and measure usability. Culminates in a final project, which is presented at the end of the term.
Terms offered: 2023 Spring Semester; 2024 Spring Semester; 2025 Spring Semester
Advanced algorithms course with a focus on game theory. Topics include computational complexity, linear programming, approximation algorithms, and algorithms for solving games. Game theory, also known as the mathematical theory of strategic interactions, rose to prominence due to its applicability to a variety of strategic scenarios ranging from markets and auctions to kidney exchanges to social influence. These scenarios often involve complex interactions in large-scale systems, giving rise to many computational questions, including: how algorithms for certain games are devised; how local interactions lead to global outcomes; how individual choices, such as selfishness, impact outcomes.
Terms offered: 2021 Fall Semester; 2024 Spring Semester; 2025 Fall Semester
A course on logic and its connections to computer science. The course starts by describing what propositional and first-order logics are and discussing related computational problems, among them the SAT problem. From there, we explore how logic relates to other areas in computer science. Topics may include logic programming, SAT and SMT solvers, and automated theorem proving.
Studies key algorithms and data structures for geographical data. Topics include modeling processes on terrain such as drainage, watersheds, flooding, sea level rise and visibility, line and terrain simplification, spatial data structures such as B-trees, quad-trees and R-trees, space-filling curves, Delaunay triangulations, and Voronoi diagrams. Students gain exposure to algorithmic modeling of spatial processes, transferring algorithms into practice and working with large spatial datasets through programming-intensive projects.
Terms offered: 2023 Fall Semester
An advanced course on how to classify problems based on the computational resources (usually time and space) necessary to solve them. Computational complexity provides a framework for analyzing the efficiency and feasibility of algorithms, as well as understanding the limits of what can be computed in practice. This course prepares students with the theoretical tools to perform these analyses and covers time and space complexity, classic complexity classes (e.g. P, NP, PSPACE), reducibility, and hardness results. May include topics like approximation algorithms, randomized algorithms, parameterized complexity, and interactive proofs.
Terms offered: 2025 Spring Semester
Computational Geometry refers to the study of geometric problems from a computational point of view, with focus on the design and analysis of algorithms for problems involving collections of points, lines and polygons. Computational Geometry emerged as a field driven by geometric problems in graphics and robotics, and its list of applications has continued to grow to areas such as pattern recognition, graph drawing, surface simplification and meshing, crystallography, molecular simulation, planning and autonomous vehicles. Class covers some of the basic concepts and fundamental geometric problems, such as: convex hulls, art gallery and visibility problems, geometric searching with range trees and kd-trees, intersection problems, proximity problems, point and polygon triangulation, and motion planning. Requirements include regular, programming-intensive projects.
Terms offered: 2021 Fall Semester; 2023 Spring Semester; 2024 Fall Semester
An emerging paradigm in computation is the advent of quantum computers, which harness quantum phenomena to solve problems beyond the reach of classical computers. The course introduces the core concepts behind quantum information and computation. We will overview the physics of information processing and detail how quantum algorithms are designed and analyzed. We will cover seminal quantum algorithms such as the factoring algorithm and Grover’s search algorithm. We will also explore more advanced topics such as quantum simulation and error correction. This course hopes to give students working knowledge of one of the fastest growing research frontiers of computer science and physics. No prior quantum mechanics experience required.
Terms offered: 2025 Fall Semester
Explores the design and implementation of computer operating systems, which provide a well-known, convenient, and efficient interface between user programs and the underlying computer hardware. The operating system is responsible for sharing resources such as processors, memory, and disks, as well as providing common services needed by many different programs. Topics include process and thread management, synchronization and concurrency, memory management, I/O and file systems, and virtual machines. Intensive programming projects involve implementing key components of operating systems and provide exposure to design principles used in many different types of computer systems.
Terms offered: 2022 Fall Semester; 2024 Spring Semester
Studies the key design principles and implementation challenges of distributed systems, which are collections of independent, networked machines functioning as single systems. Topics include networking and communication protocols, naming, synchronization, consistency and replication, fault tolerance, and security. Students gain exposure to real-world distributed systems through programming-intensive projects, as well as critiques of research papers covering a variety of real-world systems ranging from the Internet to file systems.
Terms offered: 2022 Spring Semester; 2023 Fall Semester; 2025 Fall Semester
Offers an introduction to cybersecurity principles with a focus on attacks targeting cryptography, network security, and web technologies. Students will actively engage in ethical hacking, learning not only how to identify and exploit vulnerabilities in systems but also how to design resilient systems capable of withstanding various attack methods. By the end of the course, students will gain a deep understanding of the core principles that unify different attack techniques and their respective defenses. Additionally, the course covers legal and ethical issues in cybersecurity, including how to engage in the responsible disclosure process.
Terms offered: 2025 Fall Semester
Advances in computer science, psychology, and neuroscience have shown that humans process information in ways that are very different from those used by computers. Explores the architecture and mechanisms that the human brain uses to process information. In many cases, these mechanisms are contrasted with their counterparts in traditional computer design. A central focus is to discern when the human cognitive architecture works well, when it performs poorly, and why. Conceptually oriented, drawing ideas from computer science, psychology, and neuroscience. No programming experience necessary. This course originates in Computer Science and is crosslisted with: Digital and Computational St. (Same as: DCS 3400)
Terms offered: 2022 Fall Semester; 2024 Spring Semester
Machine learning (ML) is the study of computer programs that can autonomously improve performance by exposure to additional data, and it is increasingly central to financial research and the finance industry. Both established firms and “FinTech” startups use ML to determine creditworthiness, allocate investment resources, and predict the future of company, sector, or national equities. These efforts raise interesting technical and ethical questions. Course content is divided between advanced technical topics like deep neural networks, deep reinforcement learning, and multi-agent simulation, and financial topics like the efficient markets hypothesis, capital assets pricing model, and mean-variance portfolio optimization. Emphasis is on empirical machine learning applied to financial topics, careful analysis of the results, and the need for responsible approaches to ML. Programming-heavy, project-heavy course. Strong CS background is needed. No prior finance knowledge is expected.
Terms offered: 2022 Spring Semester; 2023 Spring Semester; 2024 Spring Semester
Computer vision has become ubiquitous in our society, from image searches to self-driving cars. On the other hand, deep learning has shaken the world of artificial intelligence in recent years. Most of these developments greatly advanced the performance of state-of-the-art visual recognition systems, which put computer vision at the epicenter of most technological progress from the past decade. In this context, this course aims at providing a consistent exploration of how deep learning began to its most recent achievements, always using computer vision tasks as their main application, historically or practically. During the course, we'll also understand many of the main computer vision problems and use them as cases for the introduction of various deep learning-related problems. Finally, this course hopes to give students working knowledge of one of the main deep learning frameworks, such as PyTorch, and prepare them for future industrial and academic careers in the field.
Terms offered: 2023 Fall Semester; 2024 Fall Semester; 2025 Spring Semester
Does your brain treat writing a program more like writing a poem or more like solving an equation? What does the psychology of perception say about user interface design? Covers the intersection of software topics (e.g., reading, writing and debugging programs) and human factors (e.g., perception, bias, cognition). Will explore classic topics in psychology (e.g., Asch's conformity experiment, zero-risk bias, functional magnetic resonance imaging, mental rotation, Hick's law, etc.) in a manner that is approachable to students without prior psychology experience. Will relate these topics to activities in computer science and discuss the resulting implications. Group discussions will focus on constructive conversations that summarize the work, analyze its strengths, and brainstorm ways in which it might be improved in the future.
Terms offered: 2024 Spring Semester
Introduces theoretical foundations of modeling and evaluating creativity. Students learn techniques to assess creative systems and implement, analyze, and extend algorithms relevant to the latest state of the art. Special topics may include augmented creativity, hybrid systems, narrative intelligence, and algorithmic composition. Culminates in a final report that describes a novel creative technique or framework.
Terms offered: 2022 Fall Semester; 2023 Fall Semester; 2024 Fall Semester; 2025 Fall Semester
Play is a powerful medium that can foster cognitive growth and social development at any age. This course presents theoretical and practical foundations of play and serves as an introduction to game design and development. We will study major examples in the field, examine the relationship to prosocial behaviors and otherwise beneficial impacts, and explore topics such as AI techniques, game analysis frameworks, generative methods, and player-experience modeling. Students will engage in critique, analyze how playable media intersects with society and culture, and practice technical skills associated with developing a digital playable experience for the common good from start to finish. Prior experience in art, music, or narrative is highly recommended.