Choosing Your First Computer Science Class

The Computer Science Department offers a variety of introductory classes.  The right one for you depends upon your background, your interests, and whether you intend to take additional computer science classes during your career at Williams.  Here’s a summary of your various options.

  • If you’d like a brief introduction to computer science with a focus on a particular application area, you may wish to take CSCI 102, CSCI 103, CSCI 104, or any other CSCI 10x course we offer at any time during your college career.
  • If you wish for an introduction more focussed on designing and implementing computer programs, we recommend taking CSCI 134, possibly followed by CSCI 136. Together these give a firm grounding and provide important skills in computing.
  • If you have previous computer science experience and wish to take more advanced classes in our discipline, you should begin in CSCI 136.  If you are not sure whether 134 or 136 would be better given your background, please get in touch with instructors for that class or any other member of the department — we’re more than happy to explore which option would be best for you.
  • If you have already learned the material covered in CSCI 136, you’re ready to dive right into some of our more advanced classes.  If this is the case, please see our major requirements for a description of those classes.

Note: If you intend to major in computer science, you should take CSCI 134 and CSCI 136, as well as Math 200, by the end of your sophomore year.

That Was Great!  What’s Next?

After your first computer science experience, you may be eager to sign up for more.  There are a number of ways to continue.  Those initially taking a CSCI 10x class often take CSCI 134 as their second course, and those completing CSCI 134 most often go on to CSCI 136 next, especially if they intend to take additional upper-level classes or major.  You may also continue taking CSCI 10x classes, even after completing CSCI 134.  However, if you are considering that, we suggest discussing that option with a member of the department to ensure it best fits your academic goals.

Introductory Course Descriptions

  • This course introduces many fundamental concepts in computer science by examining the social aspects of computing. As more and more people use the technologies and services available via the Internet, online environments like Facebook, Amazon, Google, Twitter, and blogs are flourishing. However, several of the problems related to security, privacy, and trust that exist in the real world transfer and become amplified in the virtual world created by the ubiquity and pervasiveness of the Internet. In this course, we will investigate how the social, technological, and natural worlds are connected, and how the study of networks sheds light on these connections. Topics include the structure of the Social Web and networks in general; issues such as virtual identity, personal and group privacy, trust evaluation and propagation, and online security; and the technology, economics, and politics of Web information and online communities. No background in computer science or programming is required or expected.

  • Digital data is being infused throughout the entire physical world, escaping the computer monitor and spreading to other devices and appliances, including the human body. Electronic textiles, or eTextiles, is one of the next steps toward making everything interactive and this course aims to introduce learners to the first steps of developing their own wearable interactive technology devices. After completing a series of introductory eTextiles projects to gain practice in necessary sewing, circuitry, and programming skills, students will propose and design their own eTextiles projects, eventually implementing them with sewable Arduino components, and other found electronic components as needed. The scope of the project will depend on the individual's prior background, but can include everything from a sweatshirt with light-up turn signals for bicycling, to a wall banner that displays the current air quality of the room, to a stuffed animal that plays a tune when the lights go on, to whatever project you can conceivably accomplish with sewable Arduino inputs, outputs, and development board in a semester context. This class will introduce students to introductory computer programming, circuitry, and sewing with the goal of creating novel wearable artifacts that interact with the world.

  • Many of the world's greatest discoveries and most consequential decisions are enabled or informed by the analysis of data from a myriad of sources. Indeed, the ability to organize, visualize, and draw conclusions from data is now a critical tool in the sciences, business, medicine, politics, other academic disciplines, and society as a whole. This course lays the foundations for reasoning about data by exploring complementary computational, statistical, and visualization concepts. These concepts will be reinforced by lab experiences designed to teach programming and statistics skills while analyzing real-world data sets. This course will also examine the broader context and social issues surrounding data analysis, including privacy and ethics.

  • This course introduces fundamental ideas in computer science and builds skills in the design, implementation, and testing of computer programs. Students implement algorithms in the Java programming language with a strong focus on constructing correct, understandable, and efficient programs. Students explore the material through specific application areas. Topics covered include object-oriented programming, control structures, arrays, recursion, and event-driven programming. This course is appropriate for all students who want to create software and have little or no prior computing experience.

  • This course builds on the programming skills acquired in CS 134. It couples work on program design, analysis, and verification with an introduction to the study of data structures. Data structures capture common ways in which to store and manipulate data, and they are important in the construction of sophisticated computer programs. Students are introduced to some of the most important and frequently used data structures: lists, stacks, queues, trees, hash tables, graphs, and files. Students will be expected to write several programs, ranging from very short programs to more elaborate systems. Emphasis will be placed on the development of clear, modular programs that are easy to read, debug, verify, analyze, and modify.