This article is published in the March 2014 issue.

Computer Science for Non-Majors

The following is a special contribution to the CCC blog by Ran Libeskind-Hadas, R. Michael Shanahan Professor and Department Chair of Computer Science at Harvey Mudd College, currently on sabbatical at Massachusetts Institute of Technology (MIT). Ran is a member of the Computing Community Consortium (CCC) Council and Co-Chair of the Computing Research Association’s Education Committee (CRA-E).

ran(1)I’m on sabbatical this year and have been visiting computer science departments at colleges and universities, small and large. One of the recurring stories that I hear is that a growing number of non-majors are choosing to take introductory CS courses. And, some of these students get so excited that they choose to take a second CS course. Although this results in large courses and staffing headaches, it is generally viewed as a good “problem” to have.

I believe that this is an ideal moment to develop new computing courses and curricula for non-majors. This sounds crazy given that we’re drowning in students and have little precious time to do much more than tread water. Here’s my case.

College students across all fields are quickly recognizing two important facts: Every well educated citizen should understand something about the computationally-pervasive world in which we live. Second, computing skills are likely to be useful across virtually all disciplines including the arts, humanities, and social sciences.

Many of these students discover computing late in their college lives and/or have other constraints that prevent them from taking more than one or two computing courses. Those students, I believe, are not ideally served by traditional CS 1 and 2 courses which are often designed as the stepping stones of a computer science major. While implementing a queue as a doubly-linked list is probably important for a CS major (although one could reasonably argue that it still doesn’t have to be presented in CS 1), it’s almost certainly not the highest priority for a social scientist or a biologist.

What then should be taught in courses for non-majors? I don’t believe that there’s one right answer, but I do believe that some of the ingredients are the following:

* Programming. Building interesting computational artifacts is incredibly exciting and compelling and helps demystify the otherwise magical software that a college student uses everyday.

* Programming at a “high level of abstraction”. Specifically, using a language with low syntactic overhead and with built-in abstract data types in order to concentrate on building interesting computational tools.

* Demonstrating a breadth of applications. Depending on the design of the course, this breadth might be a range of applications across many fields of studies, just in one domain (e.g., sciences, social sciences, arts), or a specific discipline (e.g., biology).

* Giving students the tools to write programs that they actually want to use. Here are two simple litmus tests: Will students spend at least as much time using their programs to explore something new as they did writing them (e.g., using a program to align biological sequence and make inferences from those alignments, building their own music recommender system, etc.)? And, does the assigned work offer creative avenues for students to invent and implement their own ideas (e.g., in the form of innovative features above-and-beyond the minimum requirements)?

* Discussing big ideas such as efficiency and intractability or how computers work.

Many departments have recently started developing and offering courses in this spirit. Some examples include the “Data Programming” course at the University of Washington (, “The Beauty and Joy of Computing” at Berkeley ( , “Computer Science for All” at Harvey Mudd (, among others.

It’s hard to allocate resources to this endeavor, but it’s an investment worth making, both for the well-being of society in general and to cultivate more computationally sophisticated future colleagues across all disciplines.