Computer Science

Chair: Janet Davis

William Bares

John Stratton

Jordan Wirfs-Brock

 

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 well-defined 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 non-majors 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

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 high-level, object-oriented 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 in-class 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 general-purpose computer system from ground up: from the low-level 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 trade-offs and future trends.

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.

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 object-oriented 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 higher-order programming. We consider applications useful in computer science, particularly counting sets. May be elected as Mathematics 220.

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 N-body, finite difference, discrete event, and actor-based modeling. Students who have already completed Computer Science 270 are strongly encouraged to concurrently enroll in Computer Science 355.

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 semester-long 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 object-oriented 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 higher-level 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 energy-efficient. 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, push-down automata, and Turing machines, as well as formal languages such as context-free 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.

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, worst-case, average-case 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. 

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.

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 n-armed bandit, projections and linear regression, data clustering (k-means, 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 Barnes-Hut spatial data structures, Next-Reaction methods for discrete event simulations, and distributed computing.

An introduction to computer graphics covering 2-D and 3-D 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 hands-on 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 object-oriented design principles, code quality metrics, and design patterns. Students will learn design techniques such as Class-Responsibility-Collaborator (CRC) cards and the Unified Modeling Language (UML), and gain experience with tools to support large-scale software development such as a version control system and a test framework. Students will apply these concepts, techniques, and tools in a semester-long, 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

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. 

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.

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.  

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.