Computer Science is an oddity on a liberal arts campus, and in most cases it is also a novelty. Since we are both odd and new, we get a lot of questions about the role of Computer Science at a liberal arts college, the definition of Computer Science as an intellectual discipline, and the relationship between the CS program and the use of computers as tools in other fields.
The following are a few thoughts on the topic, organized as a FAQ -- answers to Frequently Asked Questions.
Written by Allen Downey, with contributions from Batya Friedman and Dale Skrien.
1) Is CS part of Mathematics?
CS programs at many colleges began in Math departments, but the majority them have now split into separate departments. The primary reason for the split is the realization that Computer Science as a discipline is simply not a category of mathematics (or vice versa). It is as distinct from Mathematics as Physics, maybe even more so.
Evidence of the distance between the fields is that there is no overlap in the professional associations for Math and Computer Science, little overlap in the publications, and only occasional overlap in personnel. It is becoming increasingly rare for Math professors to teach computer science classes, and vice versa.
2) Isn't CS a branch of engineering? Why do we have a CS program and no other engineering programs?
At some schools the CS program is in the school of engineering; at others it is in the school of science. At Berkeley, some CS majors are in the school of arts and letters. Each of these organizations reflects a different approach to CS as an academic discipline (or at least a different historical path for the department).
In the context of an engineering school, CS programs tend to emphasize software engineering (the practice of building large software systems) and applications (the use of computers as tools to solve specific problems; for example databases, graphics or networks). But in the minds of many computer scientists, these topics do not comprise the "core" of CS.
3) Then what _is_ the core of CS?
The core of Computer Science is the same as the core of the other sciences --- empiricism and critical thinking. In that sense, CS is just one of many intellectual disciplines that lead to the same goal: well-trained minds.
In many fields there is a conflict between teaching specific skills that are applicable immediately and teaching fundamental thinking skills that provide a framework for details learned later. This conflict is particularly acute in CS because specific skills become obsolete so quickly. It is a constant challenge for us to identify the right frameworks to teach and the right examples to use to flesh out those frameworks.
4) What are the profound theoretical ideas in computer science?
Ok, to make things a little more concrete, here are some of the concepts that I think are central to Computer Science as an intellectual disipline: (a) abstraction, (b) the relationship between nested structure, recursion, and induction, (c) emergent properties, and (d) computability and complexity.
Abstraction is the process of describing a complex component with a simplified model of its externally-visible behavior. Abstraction is the primary tool used by engineers to manage the complexity of large systems.
Nested structure is a common feature of all natural and most formal languages. An example in English grammar is a noun phrase, which can contain (among other things) an adjectival clause that contains, in turn, another noun phrase. Thus, there is a small noun phrase nested within the larger one. With few exceptions, the grammatical rules that apply to the outer phrase also apply to the nested phrase.
Recursion is a problem-solving technique that is used when a programming task can be broken down into smaller tasks so that the smaller tasks are similar to the original task. If they are similar enough, then the same program that is processing the original task can also be used to process the subtasks.
Induction is a method of proof that is conceptually similar to recursion. Although the relationship between induction, recursion and nested structure is probably not obvious from these descriptions, it is one of the more interesting and fruitful ideas in CS. For a nice presentation of these ideas, see Douglas Hofstadter's book "Godel, Escher and Bach".
Emergent properties are behaviors in complex systems that we cannot predict or explain in terms of the properties of the system's components. Examples include collective behavior among insects, traffic patterns (on highways and computer networks), and possibly intelligence (natural and artificial).
Computability and complexity are mathematical properties that describe functions and algorithms. You may not be surprised to learn that any computer can compute any computable function, but you might be surprised to learn that there are functions that cannot be computed by any computer.
4a) Does everyone agree about what the "core" of CS is?
Yes and no. There is some material that is probably on everyone's list, and is included in almost every CS curriculum. Considering how young the field is, it is sometimes suprising how standardized the curriculum has become (although we are always re-evaluating it).
On the other hand, it is certainly true that different computer scientists put emphasis on different material. In response to my list (above), Batya suggested some additional topics from her "core": formalism, design, and communication.
Formalism is the representation of a real-world problem using symbols, usually including ways of manipulating those symbols to generate a solution. Examples are formal logic (p & (p->q)) -> q and formal languages (including programming languages, but also including the meta-languages computer scientists use to talk about programming languages).
Design speaks for itself, although it means different things in different areas of computer science. For example, if you are building a processor (CPU), design means system architecture and the relevant criteria are things like speed, power consumption, etc. If you are writing software, design often means usability engineering, and the relevant criteria are ease-of-use, reliability, etc.
Finally, communication refers not just to the study of networks (although that becoming an increasingly important field), but also communication among programs, among agents, between people and computers, and between people.
5) Isn't CS primarily about good programming?
The first course in CS usually includes lots of programming, but the majority of the CS curriculum is not about programming per se. Although we teach the Java programming language as part of the intro series, our upper division classes are much less focused on programming. It is understood that once students have mastered their first language, they have the tools to pick up other languages on their own.
We offer a class that surveys the range of programming paradigms, including the most well-known procedural languages (like C and Fortran) as well as object-oriented, functional, and logical programming languages. These other languages don't show up in the New York Times as often as Java, but studying them leads to a profound understanding of programming languages as engineering artifacts and provides insights about the limitations of current technology and the needs for the next generation of languages.
Almost all computer scientists learn to program, in part because we often write programs to help us accomplish other tasks, and in part because the process of learning to program is an important part of the intellectual development of a computer scientist. But for most computer scientists, programming is not a major component of our research work, and in the majority of cases, we never produce a software product that is sold or used by many other people (although researchers often share code).
6) Is there much overlap between the Computer Science department and IS?
Almost none. IS has expertise in existing technology, and detailed knowledge of the computers and software that are commonly used by faculty, staff and students.
Computer scientists often know very little about the hardware and software currently on the market, and we are generally not especially competent at setting up new computers or networks, installing software, or maintaining systems. Of course, we work with computers a lot, so we do tend to pick up a few tricks, but strictly speaking system administration is not in our job description. In that regard, we are no different from the faculty in English or Classics.
What we do know about is the sort of conceptual material I was talking about before and, of course, each of us has detailed knowledge of our area of research.
7) What kind of research do computer scientists do?
Most generally, we create new knowledge about computers and related technology. In some cases, that means developing the next generation of processors, compilers, operating systems, whatever. In other cases, the research is more basic and more speculative.
The research faculty at Wellesley study theory of computation (Randy), computer and natural vision (Ellen), programming languages (Lyn), parallel computing (Takis), artificial intelligence (Scott) and networks (Allen). Other areas within CS include operating systems, graphics, databases, computer architecture, and algorithms.
8) What's the difference between computer science, software engineering, and computational science?
Computer science is the intellectual discipline this FAQ is trying to define. Software engineering is a branch of engineering that deals with the design and implementation of large software systems. Scientific computing is the use of computers in other areas of science, like chemistry or physics.
Many CS curricula, including ours, do not cover very much software engineering, in part because many academics do not feel qualified to teach it, and in part because there are so many other, intellectually rich topics that we think are more important.
For the most part, responsibility for teaching software engineering has fallen on industry. Industry doesn't always appreciate that, and often calls on academia to prepare students "better" for work in the code mine. Many academics, though, think that industry is wrong, and that the best preparation for a programmer, or anyone else, is a liberal education that is broad and enlightening.
As for scientific computing, it is not clear whether it is a branch of computer science at all. Most of the people in the field are not computer scientists; they are computational chemists or computational physicists, etc. Also computational scientists are generally trying to create new knowledge about another branch of science, not computer science.
Nevertheless, computational science often serves as a driving force for the development of computer technology, like supercomputers, massive storage systems, and software tools for data analysis and visualization. Thus, some computer scientists have an interest in the area, and we offer a class on the topic: cs249, Computational Science.
9) What are the best books about computer science?
Well, I already mentioned "Godel, Escher and Bach". Another book I liked, Stephen Pinker's "The Language Instinct" is not actually about computer science, but it does talk about nested structure in natural language as well as other topics related to artificial intelligence.
Dennis Shasha and Cathy Lazere's "Out of their Minds: the Lives and Discoveries of 15 Great Computer Scientists" is excellent.
My most recent recommendation is Mitchel Resnick's "Turtles, Termites and Traffic Jams: Explorations in Massively Parallel Microworlds". Using a simple programming language, the author constructs models of dynamic systems like ant hills and traffic jams, and shows how some complex behaviors can emerge from interactions among simple components.
I still haven't ready Tracy Kidder's Soul of a New Machine, but I have heard enough good things that I will recommnend it anyway.
If you want to understand the Open Source Software movement (which is the origin of Linux), the standard work is Eric S. Raymond's The Cathedral and the Bazaar.