# What CS Course Should I Take?

The CS Department offers seven introductory courses in Computer Science. Here's a quick guide on how to choose which one to take.

Those planning to **concentrate (major)** in Computer Science should take either
CSCI0150/0160,
CSCI0170/0180, or
CSCI0190.
To help you decide which course sequence to take, you might attend the first lectures of both CSCI0150 and CSCI0170.

Students interested in taking Linear Algebra from a Computer Science perspective might consider CSCI0530.

Students in the Social Sciences and the Humanities who would like a solid introduction to applied Computer Science that is relevant to their concentrations might consider taking CSCI0931.

Students who would like an introduction to using computers might consider CSCI0020.

Students who don't necessarily want to concentrate in Computer Science, but who would like an overview of the academic discipline, might consider CSCI0080.

Finally, students in Engineering and the Sciences who want a one-semester course on programming that's relevant to their disciplines might consider CSCI0040.

### csci0020

CSCI0020, offered in the fall, is for students who want an introduction to the use of computers that does not involve much programming. It is intended primarily for humanities concentrators and may not be used as part of a CS concentration. This course offers a broad view of the digital world and acquaints the student with a variety of applications and the underlying theory that drives them. Students can expect to get a broad perspective on computing history and future trends as it applies to many current day activities and issues.

### csci0040

CSCI0040, offered in the spring, is intended for students in engineering and the sciences who want to learn how to program (primarily in MatLab, but with a little C as well), but who do not necessarily want to be CS concentrators. Students will write a number of programs and complete several larger projects. The course introduces problem solving techniques that guide the thinking necessary to construct a program as part of the solution. It may not be used as part of a CS concentration.

### csci0080

CSCI0080 is a Spring course that introduces non-CS concentrators to the academic discipline of computer science and its relevance to other fields and modern life more generally. The target audience is students who are interested in learning more about what computer science is about and the ideas it has to offer tomorrow's citizens and scholars. Topics include the basics of computation and programming, a taste of theoretical computer science and algorithms, and an introduction to computing architectures and artificial intelligence. Although students will learn to read and understand short programs, the course will not teach or require advanced programming skills. Web page coming soon!

### csci0150 & csci0160

CSCI0150/0160 is a two-course sequence intended for those who might consider concentrating in Computer Science as well as for those who just want a strong background in programming practice (CSCI0150) and its theoretical foundations (CSCI0160). No prior background in programming is assumed or required. CSCI0150 is a challenging object-oriented programming course (using Java) in which students gain experience with object-oriented design techniques and the use of Swing, Java's 2D graphics library, through the design and implementation of a sequence of moderate to fairly lengthy interactive programs, including Tetris, a fascinating computer game. All programs use graphical user interfaces. In CSCI0160, students learn the theoretical tools used to analyze computation and make programs more efficient. A number of fundamental algorithms and data structures are covered, as well as their implementations. Students with questions about CS015 and CS016 are invited to email the professors teaching these courses in 2010-2011 (Andy van Dam, avd@cs.brown.edu (CSCI0150) and David Laidlaw, dhl@cs.brown.edu (CSCI0160)).

### csci0170 & csci0180

Computer science is a rich, diverse field, full of intellectual delights and challenges. The goal of the CSCI0170/0180 sequence is to put you on the path to mastery of computer science. One common thread is problem-solving; if you enjoy puzzles that require ingenuity and have elegant solutions, you will find this course deeply satisfying.

Programming is only a small part of computer science, but it is an essential one. Mastery requires that one fully understand one's tools. This sequence begins by teaching a lovely little programming language called Racket (formerly, Scheme), which is a dialect of LISP. The syntax and semantics of Racket can be learned in just a few days, making it an ideal first programming language.

CSCI0170 continues with a language in the ML family that exposes students to types and type-inference, pattern-matching, and modules. Both Scheme and ML exemplify the functional programming paradigm, which facilitates extremely concise and elegant solutions to many problems, although it lies out of the mainstream (e.g., it is rarely taught in high schools).

The follow-up course, CSCI0180, uses Java as a vehicle for teaching the object-oriented programming paradigm, which emphasizes modularity, flexibility, and extensibility. Halfway through the semester, students transition to Scala, where they can practice mutiple programming paradigms. The fact that CSCI0170/0180 is multilingual and multiparadigmatic helps students recognize that programming, and computer science more generally, transcends the syntax and idiosyncrasies of any one language.

How does one choose among the many possible approaches to solving a computational problem? It is impractical to program them all and then test them all against one another. Analysis of algorithms provides mathematical tools for predicting the computational performance of competing approaches. In CSCI0170/0180, analysis is interwoven with the study of programming (hence, the use of the term integration in the title of the sequence).

No prior programming experience is necessary for CSCI0170/CSCI0180. Beginners are just as likely to succeed as seasoned programmers. In a typical year, at least one of the very top-performing students has had no prior programming experience.

Studies show that CS students perform better in the long-run when their introductory CS experience is collaborative. Hence, collaboration on all assignments except exams---so-called, "pair programming"---is strongly encouraged in both CSCI0170 and CSCI0180.

### csci0190

CSCI0190 is offered in the fall. It compresses a year of introductory material into a single semester. You cannot register for CSCI0190. Instead, students who believe they are qualified to take CSCI0190 should register for and attend CSCI0170. During the first month of class, CSCI0170 will offer supplemental homeworks for those who are considering CSCI0190. Students who do well on them will be invited to take CSCI0190, which begins as a separate course a month later. (As a result, even students without prior computer science background are welcome to try CSCI0190 if their performance in the first month is good enough). Additional information is available on the csci0190 home page, and will be provided in CSCI0170.

### csci0530

CSCI 0530 (The CS Matrix Course) covers linear algebra and its applications to computer science problems. It satisfies the linear algebra requirement for the Sc.B. in Computer Science and the Sc.B. in Applied Math/Computer Science, and has no formal prerequisites; it is accessible to any student who is comfortable with mathematics and with programming. Students with some programming background may take this course concurrently with an introductory CS course.

The course is designed around a series of labs in which students carry out programming and data-analysis assignments, and homeworks in which they derive proofs for the fundamental results in linear algebra.

Some of the labs:

- Geometric Transformations: explore transformations for moving and rotating shapes (graphics)
- Perspective Rectification: Given a photo, synthesize a view from another angle
- Error-Correcting Codes: represent data so that single-bit errors can be corrected (storage and communication)
- Eigenfaces: heuristic for distinguishing faces from nonfaces (computer vision)
- Latent Semantic Indexing: categorize news stories (information retrieval)
- PageRank: rank Wikipedia articles by importance (web search)

Prospective students who have questions are encouraged to contact the instructor, Philip Klein.

### csci0931

This course, an Introduction to Computation in the Social Sciences and Humanities, introduces students to the use of computation for solving problems relevant to the humanities and social sciences. The course is broken down into a series of real-world problems taken from the news, from books such as Freakonomics, and from current research. For each problem, students discuss how one might actually test the hypothesis the problem poses using available data. Students then create and run experiments that actually perform such tests. The sorts of problems covered are drawn from such topics as:

- Analysis of Company 10-K reports as an indication of takeover/failure
- Analysis of State of the Union speeches
- Search queries as indicators of a flu outbreak
- Wiki analysis
- News bias
- Authorship of
*Federalist Papers*

Topics covered include

- data gathering
- data analysis
- web-based interfaces
- security
- algorithms
- scripting

We prefer students with no prior Computer Science background, though some familiarity with using computers, such as having created spreadsheets, is useful.