Information for Majors and Non-majors
The Undergraduate Computer Science Major
The field of computer science studies the process of computing, using ideas drawn from the fields of system design, mathematics, and engineering. The mathematical ideas are reflected in the courses on formal languages, algorithms, and the theory of computation; ideas from system design and engineering are reflected in the courses on data structures, computer structure and organization, and compilers. Upon completing the major, we expect students to be well-versed in:
- Understanding abstraction
- At its heart, Computer Science is the study of abstractions for the purpose of understanding computation, and as such students must learn appropriate levels of abstraction for solving computational problems. All courses in the curriculum contribute to this goal.
- Students must learn how to program in a high-level language, as such programming is the primary tool in Computer Science. This is typically how students are first exposed to the field, and our majors achieve this goal in the freshman or sophomore year by taking the gateway sequence COMP 211—212.
- Students must learn how to reason about computation; this includes analyzing algorithms and proving properties such as correctness and complexity and requires an understanding of appropriate mathematical tools. The courses that focus primarily on this goal are COMP 312 (Design and analysis of algorithms) and COMP 321 (Design of programming languages).
- Students must learn how to create original computational structures; this requires an understanding of fundamental techniques in algorithm and data structure design and an ability to combine established techniques in novel ways. All courses in the curriculum contribute to this goal.
- Students must understand not only how to analyze and create computational structures, but also the limits of computation itself; this requires an understanding of the mathematical foundations and formalisms of Computer Science. This goal is primarily addressed in COMP 301 (Automata theory and formal languages).
The various courses in the computer science curriculum are discussed below; for additional details, consult the catalog descriptions of the courses. Students may also consult the department's advisory committee (CADCOM).
Computer Science I and II (COMP 211, 212) constitute the introductory sequence. These courses focus on algorithmic problem-solving (as embodied in programming) and the role of data structures in supporting the development of algorithms and software systems. Computer Structure and Operation (COMP 231) studies the organization and operation of computers. The course on discrete mathematics (MATH 228) is typically taken concurrently with COMP 212. These four courses are typically taken in the first two years of study.
Core CoursesFormal Languages and Automata Theory (COMP 301) studies formal models of computing devices and the the foundations of complier technology. Algorithms and Complexity (COMP 312) studies the design of algorithms and analyzes time and space requirements. Programming Languages (COMP 321) studies various types of programming languages and language issues such as data abstraction, modules, and concurrency while Compilers (COMP 322) studies grammars, parsing, syntax-directed translation, and code generation.
In addition to the core courses, the program provides several advanced courses as well as a selection of topics courses under the heading COMP 360. For example, in the last few years courses have been offered on cryptography, networking, databases, bioinformatics, software development, and graphics. In addition, exceptionally well prepared majors can enroll in graduate courses in computer science.
Research opportuntiesWe strongly encourage students to get involved in research with faculty, and all the faculty are happy to have students doing research. Please visit the Faculty by research area page to learn more about individual faculty member's research interests, or just stop by our offices! Typically research starts by enrolling in COMP 401 or 402 (Individual Tutorial) or COMP 403 or 404 (Department Project). The former courses are usually for more theoretical topics, the latter for more applied topics, though there is no strict division. Students can often start thinking about research as early as the freshman year, though some topics require more course background than others.
All Computer Science students are encouraged to write a Senior Thesis under the direction of one of the faculty. Students wishing to complete a Senior thesis must sign up for COMP 409 and COMP 410 in their Senior year. A student who plans to write a thesis must find a faculty advisor in their Junior year, and will typically do a individual tutorial or project with that advisor before the Senior year. Recent theses include:
- Jason Kabel '05: The Formalization and Analysis of Security Protocols.
- Brendan Dolan-Gavitt '06: Timing Attacks in Anonymity Systems.
- Daniel Hore '07: Implementation and Type-checking for Affine Tiered Recursion.
- Bach Dao '08: A Simulation Study of Protein Family Degree Distribution.
- Jesse Farnham '08: Equivalence Criteria for Tumor Simulation.
- Jonathan Gillick '09: A Clustering Algorithm for Recombinant Jazz Improvisations.
- Juan Mendoza '10: Dynamical Systems-based Navigation: Modeling and Verification.
- Foster Nichols '10: Constructing Maps for Navigating Agents Using Line Segments.
- William Boyd '11: A Simulation of Circuit Construction in Tor.
- Sam DeFabbia-Kane '11: Analyzing the Effectiveness of Passive Correlation Attacks on the Tor Anonymity Network.
- Eli Fox-Epstein '11: Forbidden Pairs Make Problems Hard.
- Jennifer Paykin '12: Automated Cost Analysis of a Higher-Order Language in Coq.
- Jeff Ruberg '12: Charming Python with Static Typechecking.
- Micah Wylde '12: Safe Motion Planning for Autonomous Driving.
Many Wesleyan students may want to take some computer science courses without necessarily completing a computer science major. The following courses provide this opportunity; none of them have programming prerequisites.
- Introduction to Programming (COMP 112) provides a detailed introduction to programming and data structures using an imperative programming language.
- Bioinformatics Programming (COMP 265) is similar to COMP 112, but the focus of the examples is topics in informatics such as sequence matching and database access.
- Computer Science I (COMP 211) is an intensive introduction to programming and Computer Science. Although intended for likely majors, non-majors also take the course. It is a significantly more challenging course than COMP 112.
- We offer several first-year initiative (FYI) courses that are taken by majors and non-majors alike; please see the Undergraduate Computer Science Courses page for more information.