Computer Science
Overview
The computer science major welcomes students with any background and interests. In a world shaped by computation, our major explores fundamental problems and focuses on algorithmic and critical thinking, abstraction and problem solving. The major is designed to balance theory with applications of theory to the development of software systems. It blends a strong “core” (data structures, algorithms and foundations of systems) with a wide variety of electives, such as artificial intelligence, theory of computation, human-computer interaction, financial machine learning, deep learning for computer vision, computational creativity, social and economic networks, game theory, distributed systems, operating systems, computational geometry, theory of complexity, spatial data structures and geo-computation, cybersecurity and quantum computing.
Computational thinking as taught in our curriculum is readily transferable across the natural sciences, the humanities and the arts. and provides foundational skills to approach complex problems in other disciplines through the lenses of computation. We encourage students to pair computer science with their other interests as either a double major, an interdisciplinary major or a minor.
Learning Goals
A student graduating from Bowdoin with a computer science major will:
-
Formulate computational problems and design and analyze algorithms to solve them.
-
Create, implement, debug and test solutions to complex problems using a programming language.
-
Practice working on a large computer science project.
-
Apply and connect the use of computational tools to other disciplines and practice working on at least one project that does this directly.
-
Practice working as part of a team.
-
Recognize, interpret, analyze and debate the social and ethical issues that arise from the use of computer science techniques in society.
-
Practice communicating and presenting technical material in oral and written form.
Options for Majoring or Minoring in the Department
Students may elect to major in computer science, the computer science and mathematics interdisciplinary major, or to coordinate the computer science major with digital and computational studies, education, or environmental studies. Students pursuing a coordinate or interdisciplinary major may not normally elect a second major. Non-majors may elect to minor in computer science.
Sean K. Barker, Department Chair
Suzanne M. Theberge, Senior Department Coordinator
Professor: Laura I. Toma‡
Associate Professor: Sean K. Barker, Sarah M. Harmon, Mohammad T. Irfan (Digital and Computational Studies)
Assistant Professors: David Byrd*, Jeova Farias, Cibele Freire, Bobak Kiani, Jeffrey Knockel
Visiting faculty: Christopher Braun, Christopher Martin
Adjunct Lecturer: Stephen Houser (fall semester)
Computer Science Major
Students majoring in computer science must complete the four courses in the core sequence (CSCI 2100 or CSCI 2101; CSCI 2102; CSCI 2200; and CSCI 2330), five additional electives 2000-level or above and one mathematics course 1300-level or above. The electives must satisfy the following distribution requirements: at least one in theory, at least one in systems, at least one in artificial intelligence, at least one projects course, and at least two 3000-level courses. An elective course may be used to satisfy multiple requirements (for e.g. CSCI 3325 Distributed Systems checks 3000-level, projects and systems). Each of the courses required for the major must be taken for a regular letter grade (not Credit/D/Fail) with a minimum earned grade of C-. Independent Studies and Honors Projects do not count towards the required courses for the major. Students who place in CSCI 1101 must take CSCI 1101 before starting the core sequence.
Code | Title | Credits |
---|---|---|
Core Courses | 4 | |
Accelerated Data Structures and Advanced Programming I | ||
or CSCI 2101 | Data Structures and Advanced Programming I | |
Data Structures and Advanced Programming II | ||
Algorithms | ||
Foundations of Computer Systems | ||
Elective Courses in Algorithms/Theory b | 1 | |
Theory of Computation | ||
Computational Game Theory | ||
CSCI 3225 Algorithms for GIS | ||
Algorithms for GIS | ||
Computational Complexity Theory | ||
Computational Geometry | ||
Quantum Computation | ||
Elective Courses in Artificial Intelligence b | 1 | |
Artificial Intelligence | ||
Financial Machine Learning | ||
Computational Creativity | ||
Deep Learning for Computer Vision | ||
Elective Courses in Systems b | 1 | |
Principles of Programming Languages | ||
Operating Systems | ||
Distributed Systems | ||
Cybersecurity | ||
Elective Courses that fulfill the "projects" requirement b | 1 | |
Human-Computer Interaction | ||
Algorithms for GIS | ||
Distributed Systems | ||
Financial Machine Learning | ||
Deep Learning for Computer Vision | ||
Computational Creativity | ||
Other Elective Courses b | 1 | |
Social and Economic Networks | ||
CSCI 2510 Computing, Ethics and Society | ||
CSCI 2715 Human-Computer Interaction | ||
Mathematics Requirement | 1 | |
Select one mathematics course number 1300 or higher |
- a
Students with a placement in CSCI 2101 Data Structures and Advanced Programming I are exempt from taking CSCI 1101 Introduction to Computer Science or CSCI 1103 Accelerated Introduction to Computer Science
- b
At least two of these courses must be at the 3000-level
Computer Science Minor
Interdisciplinary Major
The department participates in an interdisciplinary major program in computer science and mathematics. See the Interdisciplinary Majors.
Additional Information and Department Policies
- Students interested in majoring in computer science must complete CSCI 2102 Data Structures and Advanced Programming II with a letter grade of C- or better by the end of their sophomore year. Prospective majors are also encouraged to satisfy their mathematics requirement as early as possible (ideally in their first two years).
-
Each of the courses required for the major or minor must be taken for a regular letter grade (not Credit/D/Fail) with a minimum earned grade of C-.
-
For all CSCI courses, a grade of C- or better must be earned in the course for it to serve as a prerequisite for another computer science course.
-
Independent Studies and Honors Projects do not count towards the required courses for the major.
-
At most two of the ten computer science courses required for the major, or one of the four computer science courses required for the minor, can be transfer credit from other institutions. Transfer credit cannot be used to fulfill the 3000-level requirement.
-
Majors may double-count one course with another department or program. Minors may not double-count any courses with another department or program.
-
Advanced Placement and International Baccalaureate scores, in addition to the computer science placement survey, are only used for placement.
-
Students—particularly those who intend to do graduate work in computer science—are encouraged to collaborate with faculty on research projects through independent studies, honors projects, and fellowship-funded summer research.
Information for Incoming Students
Students interested in computer science start with one of two courses, based on the computer science and mathematics placement surveys:
- CSCI 1101 Introduction to Computer Science or
- CSCI 2100 Accelerated Data Structures and Advanced Programming I
CSCI 1101 Introduction to Computer Science is the entry point for students with no prior background in computer science. It is an introduction to programming, computational thinking and problem solving using the Python programming language.
CSCI 2100 Accelerated Data Structures and Advanced Programming I is the entry point for students with a background in computer science (e.g. from AP classes), which usually includes some knowledge of data structures and Java. CSCI 2100 covers the same materials as CSCI 1101 Introduction to Computer Science + CSCI 2101 Data Structures and Advanced Programming I at an accelerated pace. It starts with a crash course into Python (which is used in the upper level AI electives), followed by the standard data structures and Java curriculum from CSCI 2101.
These two classes are the entry points for the two pathways into the computer science curriculum:
- CSCI 1101 --> CSCI 2101 --> CSCI 2102: Start with CSCI 1101 Introduction to Computer Science, continue with CSCI 2101 Data Structures and Advanced Programming I and CSCI 2102 Data Structures and Advanced Programming II
- CSCI 2100 --> CSCI 2102: Start with CSCI 2100 Accelerated Data Structures and Advanced Programming I and continue with CSCI 2102 Data Structures and Advanced Programming II
Placements are binding and may not be overridden without permission of the department.
Students with a placement of CSCI 2100 should note that this course is normally offered only in the fall; CSCI 1101 Introduction to Computer Science and CSCI 2101 Data Structures and Advanced Programming I are offered every semester.
Math placements:
- Students with a placement of of MATH 1050 Quantitative Reasoning should complete MATH 1050 Quantitative Reasoning before taking a computer science course.
- Students with a placement of MATH 1600 Differential Calculus should complete MATH 1600 Differential Calculus before taking CSCI 2100 Accelerated Data Structures and Advanced Programming I or CSCI 2101 Data Structures and Advanced Programming I.
CS + X:
Can you live in today's world without understanding computational problem solving and basic programming? Students are strongly encouraged to take their first computer science course during their first year, when they have priority registration. Students who intend to pursue a computer science major are required to complete CSCI 2102 Data Structures and Advanced Programming II with a letter grade of C- or above by the end of their sophomore year.
Prior knowledge of computer science is used for placement only and does not count as credit towards the major. Students with any questions about appropriate placement should talk to a member of the department prior to registration.
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. (Same as: DCS 1300)
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.