Computer Science
Chair: Janet Davis
William Bares
John Stratton
Jordan WirfsBrock
About the Department
Students of computer science gain insight into a technology on which we increasingly rely, while learning new ways of thinking and tools to solve problems in many domains. Central to computer science is the concept of an algorithm—a precise, repeatable procedure for solving a welldefined problem. Computer scientists discover, define and characterize computational problems; they design, implement, and evaluate algorithmic solutions. Studying computer science in the context of a liberal arts education enables graduates to approach problems from multiple perspectives and communicate effectively with diverse colleagues and stakeholders.
Computer Science 167 is suitable for both potential majors and nonmajors who have no prior computer science experience. Students with prior experience should discuss their placement with a computer science faculty member.
Learning Goals
Upon graduation, a student majoring in Computer Science will be able to:
 Understand and apply fundamental algorithms and data structures.
 Understand the abstractions supporting modern software systems, and how the construction of those mechanisms affects the supported systems.
 Apply mathematical techniques to justify computational solutions and explore the limitations of computers.
 Communicate computational ideas through speech, writing, diagrams, and programs.
 Work with a team to design and implement a substantial, integrative project.
 Propose and compare multiple solutions to computational challenges, with consideration for the context and impact of each solution on the creators, maintainers, and users of that solution.
Distribution
For students who started at Whitman College prior to Fall 2024, selected courses in Computer Science count toward the quantitative analysis distribution area.
For students who start at Whitman College in Fall 2024 or later, please refer to the General Studies section for a full list of courses that count toward each distribution area.
Programs of Study

Computer Science/PreEngineering Major 
GeologyComputer Science Major 
Computer Science Major 
Computer Science Minor 
Data Science Minor
Courses
A course which examines special topics in computer science at the introductory level. See course schedule for any current offerings.
Students will learn to design, document, implement, test, and debug algorithmic solutions to computational problems in a highlevel, objectoriented programming language. We introduce core concepts: algorithms, data structures, and abstraction. We apply foundational constructs common to all programming languages: data types, variables, conditional execution, iteration, and subroutines. Students will gain experience with exploratory and structured approaches to problem solving through collaborative inclass exercises. Frequent programming projects will address applications of computing to problems arising from other disciplines.
A course which examines special topics in computer science at the introductory level. See course schedule for any current offerings.
This course integrates key ideas from digital logic, computer architecture, compilers, and operating systems, in one unified framework. This will be done constructively, by building a generalpurpose computer system from ground up: from the lowlevel details of switching circuits to the high level abstractions of modern programming languages. In the process, we will explore software engineering and algorithmic techniques used in the design of modern hardware and software systems. We will discuss fundamental tradeoffs and future trends.
Computer Science 167 or 270.
An introduction to the approaches and tools of exploratory data analysis and visualization. Through a series of projects, we explore large data sets through methods like cleaning, filtering, sorting, boolean selections and merging. As large amounts of data typically are stored in lists, we use algorithmic thinking to transform raw data into usable form. We develop hypotheses and supporting visualizations to tell the story of the data. We learn and practice technical communication in both oral and written form. Through a series of readings and discussions, we learn best practices for the ethical use of data and how to identify problematic uses of data in society. May be elected as Mathematics 215.
Computer Science 167 or 270; and Mathematics 124 or 125.
This course provides a mathematical foundation for formal study of algorithms and the theory of computing. It also introduces functional programming, a powerful computing paradigm that is distinct from the imperative and objectoriented paradigms introduced in Computer Science 167. Students will practice formal reasoning over discrete structures through two parallel modes: mathematical proofs and computer programs. We will introduce sets and lists, Boolean logic, and proof techniques. We will explore recursive algorithms and data types along with mathematical and structural induction. We consider relations and functions as mathematical objects and develop idioms of higherorder programming. We consider applications useful in computer science, particularly counting sets. May be elected as Mathematics 220.
Computer Science 167 or 270; and Mathematics 124 or 125.
From the earliest days of electronic computers, some of the most pressing applications involved not just organization and processing of data, but digital replication of scenarios in the physical world to improve our understanding or make decisions. Computer simulation allows us to conduct virtual experiments that would be impossible, expensive, or unethical to conduct in the physical world, but answer critical questions that could arise from almost any academic discipline. This course will examine a range of simulation methods, such as Nbody, finite difference, discrete event, and actorbased modeling. Students who have already completed Computer Science 270 are strongly encouraged to concurrently enroll in Computer Science 355.
Computer Science 167 or 270.
How do people interact with computers? And how can we design computer systems that make people’s lives better? Students will learn to critique user interfaces using principles based on psychological theories of perception, memory, attention, planning, and learning. Through a semesterlong team project, students will practice iterative design including stages of contextual inquiry, task analysis, ideation, prototyping, and evaluation. We will also explore current research on new application areas, design techniques, or interaction paradigms, as well as social implications of computing.
This course addresses the representation, storage, access, and manipulation of data. We discuss appropriate choices of data structures for diverse problem contexts. We consider abstract data types such as stacks, queues, maps, and graphs, as well as implementations using files, arrays, linked lists, tree structures, heaps, and hash tables. We analyze and implement methods of updating, sorting, and searching for data in these structures. We develop objectoriented programming concepts such as inheritance, polymorphism, and encapsulation. We consider implementation issues including dynamic memory management, as well as tools for programming in the large.
A course which examines special topics in computer science at the intermediate level. See course schedule for any current offerings.
How does data move from a hard drive to memory to a CPU? How does a computer deal with input from a mouse and keyboard? How does one computer communicate with another, or many others? This class examines how operating systems interact with computer hardware to provide higherlevel programming abstractions. Students will use the C programming language to explore topics such as processes, virtual memory, concurrency, threads, and networking.
Computers do not execute programs with equal speed, even when theoretical analyses indicate that two programs perform approximately the same amount of work. At the same time, software power efficiency affects the size of mobile devices and the energy consumption of data centers. This course examines current trends in computer system architecture and draws out insights for developing software that is fast and energyefficient. Students will work problem sets, write programs, conduct experiments, read and analyze technical articles, and carry out a team project of their choice. Throughout the course, we shall consider how computer system designs affect program structure, and in particular the tensions between efficiency and principled software organization.
Which problems can be solved computationally? Which cannot? Why? We can prove that computers can perform certain computations and not others. This course will investigate which ones, and why. Topics will include formal models of computation such as finite state automata, pushdown automata, and Turing machines, as well as formal languages such as contextfree grammars and regular expressions. May be elected as Computer Science 320 and must be elected as Computer Science 320 to apply toward the total credit requirement in Computer Science.
Computer Science/Mathematics 220 or Mathematics 260.
How can we be confident that an algorithm is correct before we implement it? How can we compare the efficiency of different algorithms? We present rigorous techniques for design and analysis of efficient algorithms. We consider problems such as sorting, searching, graph algorithms, and string processing. Students will learn design techniques such as linear programming, dynamic programming, and the greedy method, as well as asymptotic, worstcase, averagecase and amortized runtime analyses. Data structures will be further developed and analyzed. We consider the limits of what can be efficiently computed. May be elected as Mathematics 327, but must be elected as Computer Science 327 to apply toward the total credit requirement in Computer Science.
Computer Science 270; and Computer Science/Mathematics 220 or Mathematics 260.
Operations research is a scientific approach to determining how best to operate a system, usually under conditions requiring the allocation of scarce resources. This course will consider deterministic models, including those in linear programming (optimization) and related subfields of operations research. May be elected as Mathematics 339.
Mathematics 240; and Computer Science 167 or 270.
This course explores the process of machine learning through the lens of empirical modeling. We will develop the theory and algorithms that underpin the process of learning interesting things about data. Algorithms we’ll develop typically include: singular value decomposition and eigenfaces, the narmed bandit, projections and linear regression, data clustering (kmeans, Neural Gas, Kohonen’s SOM), linear neural networks, optimization algorithms, autoencoders and deep networks. The course will involve some computer programming, so previous programming experience is helpful. May be elected as Mathematics 350.
This course extends Computer Science 255, Computer Simulation Methods, with a focus on algorithms and data structures for improving the efficiency of computer simulations. Techniques may include BarnesHut spatial data structures, NextReaction methods for discrete event simulations, and distributed computing.
An introduction to computer graphics covering 2D and 3D rendering pipelines and diverse user interaction techniques for graphics applications. Topics will include coordinate systems, geometric shapes, transformations, projection, color, lighting, shading, data visualization, and animation. Interaction techniques may include Web interfaces, immersive displays, vision systems, spatial interaction, music/sound, gesture, and tangible interfaces. We will apply these topics through a combination of handson and written exercises and programming with a current computer graphics library. We will read and analyze a selection of research publications that apply computer graphics in different application domains. We will analyze the societal impacts of select applications. We will implement and present a project that applies computer graphics and interaction techniques in a selected domain.
What makes code beautiful? We consider how to design programs that are understandable, maintainable, extensible, and robust. Through examination of moderately large programs, we will study concepts including objectoriented design principles, code quality metrics, and design patterns. Students will learn design techniques such as ClassResponsibilityCollaborator (CRC) cards and the Unified Modeling Language (UML), and gain experience with tools to support largescale software development such as a version control system and a test framework. Students will apply these concepts, techniques, and tools in a semesterlong, team software development project. Students enrolling in Computer Science 370 also will be required to enroll in an associated laboratory course (Computer Science 370L). Weekly laboratory sessions will include time for design critiques, code reviews, and supervised teamwork
Includes a required corequisite lab, Computer Science 370L.
A course which examines special topics in computer science at the advanced level. See course schedule for any current offerings.
An introduction to numerical approximation of algebraic and analytic processes. Topics include numerical methods of solution of equations, systems of equations and differential equations, and error analysis of approximations. May be elected as Mathematics 467.
Mathematics 240.
Computer Science 167 or 270.
Directed study or research in selected areas of computer science. A curriculum or project is designed by the student(s) with the advice and consent of an instructor in the department. Inquiry may emerge from prior course work or explore areas not covered in the curriculum.
Consent of instructor.
First semester of a team project integrating skills and concepts from across the computer science curriculum. Students will develop project management and communication skills. In writing and documenting software, students will consider their responsibilities to future users or developers. Open only to senior Computer Science majors.
At least one 300level Computer Science course.
Second semester of a team project integrating skills and concepts from across the computer science curriculum. Students will develop project management and communication skills, culminating in a public presentation. In writing and documenting software, students will consider their responsibilities to future users or developers. All course work will be completed by the second Friday in March.
Students will individually design and implement a project of their choice as a personal integrative project. Students may choose to implement an individual extension of their team capstone project or some other appropriate summative and integrative project, with instructor approval. Open to all senior Computer Science majors with instructor consent.
Students will individually design and implement a project of their choice as a personal integrative project. Students may choose to implement an individual extension of their team capstone project or some other appropriate summative and integrative project, with instructor approval. Students will prepare a short technical report on their work suitable for deposit at Penrose Library. Required of and limited to senior honors candidates in computer science.