Computer Science

Computer Science studies the computational structures and processes that appear throughout the natural and human worlds. The study of those processes (known as algorithms) can lend insight into the functioning of our brains, the structure of our genes, the mechanisms by which people form communities, and many other questions in a wide range of disciplines. At the same time, an understanding of algorithms and the structure of data can help us create a tremendous variety of useful software tools. Carleton's computer science curriculum is designed to provide students with a balance between theoretical study and the practical application of theory to the design and construction of software.

Since computer science plays a key role in our world, we recommend Introduction to Computer Science (CS 111) for all Carleton students. We also offer introductory-level courses on specific topics, such as Life in the Age of Networks (CS 108).

Those who choose to major in computer science find many opportunities following graduation. Carleton Computer Science graduates who pursue employment in the computing industry find jobs in a many different roles and at a wide variety of companies. In addition to graduate programs in computer science, Carleton CS majors seeking further education have pursued graduate study in areas such as bioinformatics, linguistics, cognitive science, and law.

Requirements for the Computer Science Major

The course requirements are Mathematics 111; Computer Science 111, 201, 202, 208, 251, 252, 254, and 257; and twelve additional credits from Computer Science courses numbered 200 or above (excluding independent study, senior seminar and comps). (Because the content of CS 202 and Math 236 have sufficient overlap, we will accept Math 236 in lieu of the CS 202 requirement).  Majors must complete a capstone experience (CS 399 and 400): during fall and winter terms of the senior year, the student will participate on a team of four to seven students working on a faculty-specified project. This means students ordinarily must plan to be on campus fall and winter of the senior year. Potential majors should take Computer Science 111, Mathematics 111, and at least one of Computer Science 201, 202, and 208 by the end of the sophomore year.

Although only one mathematics course is required for the CS major, we encourage our students to take mathematics and statistics courses beyond Mathematics 111. Students contemplating graduate study should consider taking the full Calculus sequence plus Mathematics 215 and 232, and additional computer science electives. Those interested in computer engineering should consider taking physics courses through Electricity & Magnetism and Electronics.

Computer Science Courses

CS 099 Summer Computer Science Institute Computer science is a rich academic field that seeks to systematically study the processes for solving problems and untangle the complexities in the concrete physical world and the abstract mathematical world. The Summer Computer Science Institute (SCSI) at Carleton focuses on understanding how to think about these processes, how to program computers to implement them, and how to apply computer science ideas to real problems of interest. Students at SCSI will learn how to systematically approach problems like a computer scientist as they engage in classroom learning, hands-on lab activities, and collaborative guided research. 6 credits; S/CR/NC; Summer; David R Musicant
CS 102 Art, Interactivity, and Robotics In this hands-on studio centered course, we'll explore and create interactive three dimensional art. Using basic construction techniques, microprocessors, and programming, this class brings together the fundamentals of computer science, sculpture, engineering, and aesthetic design. Students will engage the nuts-and-bolts of fabrication, learn to program computers, and study how robots think. Collaborative labs and individual projects will culminate in a campus wide exhibition. No prior building or programming experience is required. Prerequisite: Not open to students who have taken IDSC 120, Studio Arts 120, Computer Science 201 or any course for which Computer Science 201 is a prerequisite. 6 credits; ARP; Not offered 2018-19
CS 108 Life in the Age of Networks This course investigates how the social, technological, and natural worlds are connected, and how the study of networks sheds light on these connections. A network is a collection of entities linked by some relationship: people connected by friendships (e.g., Facebook); web pages connected by hyperlinks; species connected by the who-preys-on-whom relationship. We will explore mathematical properties of networks while emphasizing the efficient processing and analysis of network data drawn from a variety of fields. Topics include: how Google works; "six degrees of separation"; the spread of fads through society. No background in computer science or programming is required or expected. Prerequisite: Students may not simultaneously enroll in Computer Science 108 and Computer Science 111 in the same term, and students who have received credit for Computer Science 111 or above are not eligible to enroll in Computer Science 108. 6 credits; FSR, QRE; Not offered 2018-19
CS 111 Introduction to Computer Science This course will introduce you to computer programming and the design of algorithms. By writing programs to solve problems in areas such as image processing, text processing, and simple games, you will learn about recursive and iterative algorithms, complexity analysis, graphics, data representation, software engineering, and object-oriented design. No previous programming experience is necessary. Students who have received credit for Computer Science 201 or above are not eligible to enroll in Computer Science 111. Students may not simultaneously enroll for CS 108 and CS 111 in the same term. 6 credits; FSR, QRE; Fall, Winter, Spring; Jeffrey R Ondich, Amy Csizmar Dalal, Titus H Klinge, Eric C Alexander, Sneha Narayan, Anna N Rafferty
CS 201 Data Structures Think back to your favorite assignment from Introduction to Computer Science. Did you ever get the feeling that "there has to be a better/smarter way to do this problem"? The Data Structures course is all about how to store information intelligently and access it efficiently. How can Google take your query, compare it to billions of web pages, and return the answer in less than one second? How can one store information so as to balance the competing needs for fast data retrieval and fast data modification? To help us answer questions like these, we will analyze and implement stacks, queues, trees, linked lists, graphs, and hash tables. Students who have received credit for a course for which Computer Science 201 is a prerequisite are not eligible to enroll in Computer Science 201. Prerequisite: Computer Science 111 or instructor permission. 6 credits; FSR, QRE; Fall, Winter, Spring; Titus H Klinge, Eric C Alexander, Sneha Narayan, Jeffrey R Ondich
CS 202 Mathematics of Computer Science This course introduces some of the formal tools of computer science, using a variety of applications as a vehicle. You'll learn how to encode data so that when you scratch the back of a DVD, it still plays just fine; how to distribute "shares" of your floor's PIN so that any five of you can withdraw money from the floor bank account (but no four of you can); how to play chess; and more. Topics that we'll explore along the way include: logic and proofs, number theory, elementary complexity theory and recurrence relations, basic probability, counting techniques, and graphs. Prerequisite: Computer Science 111 and Mathematics 111 or instructor permission. 6 credits; FSR; Fall, Spring; Anna N Rafferty, Jack Hessel
CS 208 Computer Organization and Architecture Computer processors are extraordinarily complex systems. The fact that they work at all, let alone as reliably as they do, is a monumental achievement of human collaboration. In this course, we will study the structure of computer processors, with attention to digital logic, assembly language, performance evaluation, computer arithmetic, data paths and control, pipelining, and memory hierarchies. Prerequisite: Computer Science 111 or instructor permission. 6 credits; FSR; Winter, Spring; Amy Csizmar Dalal, Jeffrey R Ondich
CS 231 Computer Security Hackers, phishers, and spammers--at best they annoy us, at worst they disrupt communication systems, steal identities, bring down corporations, and compromise sensitive systems. In this course, we'll study various aspects of computer and network security, focusing mainly on the technical aspects as well as the social and cultural costs of providing (or not providing) security. Topics include cryptography, authentication and identification schemes, intrusion detection, viruses and worms, spam prevention, firewalls, denial of service, electronic commerce, privacy, and usability. Prerequisite: Computer Science 201 or 202 or 208. 6 credits; FSR; Not offered 2018-19
CS 251 Programming Languages: Design and Implementation What makes a programming language like "Python" or like "Java"? This course will look past superficial properties (like indentation) and into the soul of programming languages. We will explore a variety of topics in programming language construction and design: syntax and semantics, mechanisms for parameter passing, typing, scoping, and control structures. Students will expand their programming experience to include other programming paradigms, including functional languages like Scheme and ML. Prerequisite: Computer Science 201 or instructor permission. 6 credits; FSR; Winter, Spring; David R Musicant
CS 252 Algorithms A course on techniques used in the design and analysis of efficient algorithms. We will cover several major algorithmic design paradigms (greedy algorithms, dynamic programming, divide and conquer, and network flow). Along the way, we will explore the application of these techniques to a variety of domains (natural language processing, economics, computational biology, and data mining, for example). As time permits, we will include supplementary topics like randomized algorithms, advanced data structures, and amortized analysis. Prerequisite: Computer Science 201 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202). 6 credits; FSR; Fall, Winter, Spring; David Liben-Nowell, Titus H Klinge
CS 254 Computability and Complexity An introduction to the theory of computation. What problems can and cannot be solved efficiently by computers? What problems cannot be solved by computers, period? Topics include formal models of computation, including finite-state automata, pushdown automata, and Turing machines; formal languages, including regular expressions and context-free grammars; computability and uncomputability; and computational complexity, particularly NP-completeness. Prerequisite: Computer Science 111 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202). 6 credits; FSR; Fall, Winter; Josh Davis, Anna N Rafferty
CS 257 Software Design It's easy to write a mediocre computer program, and lots of people do it. Good programs are quite a bit harder to write, and are correspondingly less common. In this course, we will study techniques, tools, and habits that will improve your chances of writing good software. While working on several medium-sized programming projects, we will investigate code construction techniques, debugging and profiling tools, testing methodologies, UML, principles of object-oriented design, design patterns, and user interface design. Prerequisite: Computer Science 201 or instructor permission. 6 credits; FSR; Fall, Spring; Jeffrey R Ondich, Eric C Alexander
CS 298 Reading and Analysis Associated with External Computing Experience An independent study course intended for students who require Curricular Practical Training (CPT) or Optional Practical Training (OPT) to go with an external activity related to computer science (for example, an internship or an externship). The student will choose and read academic material relating to a practical experience (e.g., internship), and write a paper describing what the student learned from the reading, and how it related to the practical experience. Prerequisite: Instructor's permission. 1 credit; S/CR/NC; NE; Fall, Winter, Spring; David R Musicant
CS 304 Social Computing The last decade has seen a vast increase in the number of applications that connect people with one another. This course presents an interdisciplinary introduction to social computing, a field of study that explores how computational techniques and artifacts are used to support and understand social interactions. We will examine a number of socio-technical systems (such as wikis, social media platforms, and citizen science projects), discuss the design principles used to build them, and analyze how they help people mobilize and collaborate with one another. Assignments will involve investigating datasets from online platforms and exploring current research in the field. Prerequisite: Computer Science 201. 6 credits; FSR, QRE; Spring; Sneha Narayan
CS 311 Computer Graphics Scientific simulations, movies, and video games often incorporate computer-generated images of fictitious worlds. How are these worlds modeled inside a computer? How are they "photographed" to produce the images that we see? What performance constraints and design trade-offs come into play? In this course we learn the basic theory and methodology of computer graphics, following the historical development of the field, from software implementations to fixed-function hardware, shader programs, and recent lower-level interfaces. Familiarity with vectors, matrices, and the C programming language is recommended but not required. Prerequisite: Computer Science 201. 6 credits; QRE, FSR; Winter; Josh Davis
CS 314 Data Visualization Understanding the wealth of data that surrounds us can be challenging. Luckily, we have evolved incredible tools for finding patterns in large amounts of information: our eyes! Data visualization is concerned with taking information and turning it into pictures to better communicate patterns or discover new insights. It combines aspects of computer graphics, human-computer interaction, design, and perceptual psychology. In this course, we will learn the different ways in which data can be expressed visually and which methods work best for which tasks. Using this knowledge, we will critique existing visualizations as well as design and build new ones. Prerequisite: Computer Science 201. 6 credits; FSR, QRE; Fall; Eric C Alexander
CS 321 Artificial Intelligence How can we design computer systems with behavior that seems "intelligent?" This course will examine a number of different approaches to this question, including intelligent search computer game playing, automated logic, machine learning (including neural networks), and reasoning with uncertainty. The coursework is a mix of problem solving and computer programming based on the ideas that we discuss. Prerequisite: Computer Science 201. Additionally Computer Science 202 is strongly recommended. 6 credits; FSR; Spring; Anna N Rafferty
CS 322 Natural Language Processing Computers are poor conversationalists, despite decades of attempts to change that fact. This course will provide an overview of the computational techniques developed in the attempt to enable computers to interpret and respond appropriately to ideas expressed using natural languages (such as English or French) as opposed to formal languages (such as C++ or Lisp). Topics in this course will include parsing, semantic analysis, machine translation, dialogue systems, and statistical methods in speech recognition. Prerequisite: Computer Science 201 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202). 6 credits; FSR, QRE; Spring; Jack Hessel
CS 324 Data Mining How does Google always understand what it is you're looking for? How does figure out what items you might be interested in buying? How can categories of similar politicians be identified, based on their voting patterns? These questions can be answered via data mining, a field of study at the crossroads of artificial intelligence, database systems, and statistics. Data mining concerns itself with the goal of getting a computer to learn or discover patterns, especially those found within large datasets. We'll focus on techniques such as classification, clustering, association rules, web mining, collaborative filtering, and others. Prerequisite: Computer Science 201. Additionally, Computer Science 202 is strongly recommended. 6 credits; FSR, QRE; Not offered 2018-19
CS 328 Computational Models of Cognition How are machine learning and human learning similar? What sorts of things can people learn, and how can we apply computer science ideas to characterize cognition? This interdisciplinary course will take a computational modeling approach, exploring how models can help us to better understand cognition and observing similarities between machine learning methods and cognitive tasks. Through in class activities and readings of both classic and contemporary research papers on computational cognitive modeling, we'll build up an understanding of how different modeling choices lead to different predictions about human behavior and investigate potential practical uses of cognitive models. Final collaborative research projects will allow you to apply your modeling skills to a cognitive phenomenon that you're interested in. Prerequisite: Computer Science 201 or instructor permission. Computer Science 202 strongly recommended. 6 credits; FSR, QRE; Fall; Anna N Rafferty
CS 331 Computer Networks The Internet is composed of a large number of heterogeneous, independently-operating computer networks that work together to transport all sorts of data to points all over the world. The fact that it does this so well given its complexity is a minor miracle. In this class, we'll study the structure of these individual networks and of the Internet, and figure out how this "magic" takes place. Topics include TCP/IP, protocols and their implementations, routing, security, network architecture, DNS, peer-to-peer networking, and Wi-Fi along with ethical and privacy issues. Prerequisite: Computer Science 201 or instructor permission. 6 credits; FSR; Not offered 2018-19
CS 332 Operating Systems If you're working in the lab, you might be editing a file while waiting for a program to compile. Meanwhile, the on-screen clock ticks, a program keeps watch for incoming e-mail, and other users can log onto your machine from elsewhere in the network. Not only that, but if you write a program that reads from a file on the hard drive, you are not expected to concern yourself with turning on the drive's motor or moving the read/write arms to the proper location over the disk's surface. Coordinating all this hardware and software is the job of the operating system.  In this course we will study the fundamentals of operating system design, including the operating system kernel, scheduling and concurrency, memory management, and file systems.   Prerequisite: Computer Science 201 and 208 or instructor permission. 6 credits; FSR; Not offered 2018-19
CS 334 Database Systems Database systems are used in almost every aspect of computing, from storing data for websites to maintaining financial information for large corporations. Intrinsically, what is a database system and how does it work? This course takes a two-pronged approach to studying database systems. From a systems perspective, we will look at the low-level details of how a database system works internally, studying such topics as file organization, indexing, sorting techniques, and query optimization. From a theory perspective, we will examine the fundamental ideas behind database systems, such as normal forms and relational algebra. Prerequisite: Computer Science 201 or consent of the instructor. 6 credits; FSR; Spring; David R Musicant
CS 341 History of Computing in England Program: Cryptography Modern cryptographic systems allow parties to communicate in a secure way, even if they don't trust the channels over which they are communicating (or maybe even each other). Cryptography is at the heart of a huge range of applications: online banking and shopping, password-protected computer accounts, and secure wireless networks, to name just a few. In this course, we will introduce and explore some fundamental cryptographic primitives. Topics will include public-key encryption, digital signatures, code-breaking techniques (like those used at Bletchley Park during WWII to break the Enigma machine's cryptosystem), pseudorandom number generation, and other cryptographic applications. Prerequisite: Computer Science 201 and 202. (Mathematics 236 will be accepted in lieu of CS 202). 6 credits; FSR, QRE; Not offered 2018-19
CS 342 Mobile Application Development Software used to stay on the desktop where you put it. Now, we carry multi-purpose computational devices in our pockets. Mobile computers raise a host of software design challenges, with constrained visual spaces, touch screens, GPS sensors, accelerometers, cellular access, and cameras all in one device. More challenges come from the idea of an "app store," a five-year-old experiment that has changed the way developers and computer users think about software. In the context of a few app development projects, this course will focus on mobile computing's design patterns, user interface principles, software development methodologies, development tools, and cultural impact. Prerequisite: Computer Science 257. 6 credits; FSR; Not offered 2018-19
CS 344 Human-Computer Interaction The field of human-computer interaction addresses two fundamental questions: how do people interact with technology, and how can technology enhance the human experience? In this course, we will explore technology through the lens of the end user: how can we design effective, aesthetically pleasing technology, particularly user interfaces, to satisfy user needs and improve the human condition? How do people react to technology and learn to use technology? What are the social, societal, health, and ethical implications of technology? The course will focus on design methodologies, techniques, and processes for developing, testing, and deploying user interfaces. Prerequisite: Computer Science 201 or instructor permission. 6 credits; FSR, QRE; Not offered 2018-19
CS 348 Parallel and Distributed Computing As multi-core machines become more prevalent, different programming paradigms have emerged for harnessing extra processors for better performance. This course explores parallel computation (programs that run on more than one core) as well as the related problem of distributed computation (programs that run on more than one machine). In particular, we will explore the two major paradigms for parallel programming, shared-memory multi-threading and message-passing, and the advantages and disadvantages of each. Other possible topics include synchronization mechanisms, debugging concurrent programs, fork/join parallelism, the theory of parallelism and concurrency, parallel algorithms, cloud computing, and Map/Reduce. Prerequisite: Computer Science 201. 6 credits; FSR; Fall; David R Musicant
CS 352 Advanced Algorithms A second course on designing and analyzing efficient algorithms to solve computational problems. We will survey some algorithmic design techniques that apply broadly throughout computer science, including discussion of wide-ranging applications. A sampling of potential topics: approximation algorithms (can we efficiently compute near-optimal solutions even when finding exact solutions is computationally intractable?); randomized algorithms (does flipping coins help in designing faster/simpler algorithms?); online algorithms (how do we analyze an algorithm that needs to make decisions before the entire input arrives?); advanced data structures; complexity theory. As time and interest permit, we will mix recently published algorithmic papers with classical results. Prerequisite: Computer Science 252 or instructor permission. 6 credits; FSR; Winter; David Liben-Nowell
CS 358 Quantum Computing Quantum computing is a promising technology that may (or may not) revolutionize computer science over the next few decades. By exploiting quantum phenomena such as superposition and entanglement, quantum computers can solve problems in a fundamentally different way from that of conventional computers. This course surveys the computer science and mathematics of quantum algorithms, including Shor's and Grover's algorithms, error correction, and cryptography. No prior experience with quantum theory is needed. Prerequisite: Computer Science 201, Mathematics 232, and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202). 6 credits; FSR; Not offered 2018-19
CS 361 Evolutionary Computing and Artificial Life An introduction to evolutionary computation and artificial life, with a special emphasis on the two way flow of ideas between evolutionary biology and computer science. Topics will include the basic principles of biological evolution, experimental evolution techniques, and the application of evolutionary computation principles to solve real problems. All students will be expected to complete and present a term project exploring an open question in evolutionary computation. Prerequisite: Computer Science 201. 6 credits; FSR; Not offered 2018-19
CS 362 Computational Biology Recent advances in high-throughput experimental techniques have revolutionized how biologists measure DNA, RNA and protein. The size and complexity of the resulting datasets have led to a new era where computational methods are essential to answering important biological questions. This course focuses on the process of transforming biological problems into well formed computational questions and the algorithms to solve them. Topics include approaches to sequence comparison and alignment; molecular evolution and phylogenetics; DNA/RNA sequencing and assembly; and specific disease applications including cancer genomics. Prerequisite: Computer Science 201 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202). 6 credits; FSR, QRE; Not offered 2018-19
CS 364 Molecular Programming and Nanoscale Self-Assembly Algorithms are ubiquitous in nature and are even present in biological and chemical processes. For example, cells receive molecular signals, execute procedures, and send signals of their own, and chemical reactions compute functions by transforming reactants into products according to molecular rules. In this course, we will investigate various mathematical models of chemistry, biology, and nanoscale self-assembly. We will use each model as a programming language to compute molecular algorithms, verify their correctness, and analyze their complexity and robustness. We will also discover that many of these models are algorithmically universal and are equivalent in power to modern programming languages. Prerequisite: Computer Science 201 and Computer Science 202 (Mathematics 236 will be accepted in lieu of Computer Science 202). No background in biology or chemistry is required, but it may be helpful. 6 credits; FSR, QRE; Winter; Titus H Klinge
CS 399 Senior Seminar As part of their senior capstone experience, majors will work together in teams (typically four to seven students per team) on faculty-specified topics to design and implement the first stage of a project. Required of all senior majors. Prerequisite: Senior standing. Students are strongly encouraged to complete Computer Science 252 and Computer Science 257 before starting Computer Science 399. 3 credits; S/CR/NC; NE; Fall; Jeffrey R Ondich, David R Musicant, Amy Csizmar Dalal
CS 400 Integrative Exercise Beginning with the prototypes developed in the Senior Seminar, project teams will complete their project and present it to the department. Required of all senior majors. Prerequisite: Computer Science 399. 3 credits; S/NC; Winter; Jeffrey R Ondich, David R Musicant, Amy Csizmar Dalal