Thursday, 28 June 2012
Computer science: neither a science nor about computers.
Since I'm a computer scientist I decided to write my first "real" blog entry about computer science. Specifically about the name and nature of the "discipline" (the quotes are intentional, specially if you've seen the code written by some of my former students).
"Computer science". What a strange name. The field was so named by George Forsythe in 1961. What a bad choice of name. It is neither about computers, nor is it a science. Dijkstra once said "computer science is no more about computers than astronomy is about telescopes". Computer science studies "computing", "algorithms" and "information", but not computers per se. Well, sort of. The theoretical side of computer science studies abstract, idealized computing machines. And some sub-field of computer science, namely computer architecture, studies hardware. But to the general public, the name suggests only working with a real desktop computer (how many times have we, computer scientists, been asked for help with some computer problem by a relative or friend?), while the field is concerned with more abstract concepts.
The second word in the name is perhaps even more contentious. "Science". Is it really a science? I do not mean to be disparaging towards my field or fellow computer scientists here. In spite of what some Sheldon-like physicists, mathematicians, chemists or biologists think, computer science is every bit as rigorous as those disciplines. It's just that science is not exactly what we do. Neither is mathematics by the way. Science is explanatory. Science is about observing the world, offering explanations and theories about phenomena in the real world, that can be tested, validated or falsified. That is not what we do in computer science or in mathematics.
Mathematicians create and study abstract concepts such as numbers, geometric figures, vector spaces, groups, rings, categories, etc. Using logic, mathematicians reason about those abstract entities and deduce any conclusions that may be drawn from basic concepts. Theoretical computer science can be seen as a branch of mathematics: we also create abstract concepts, such as automata, languages, etc. and use logic to explore and deduce any conclusions that we may draw from those basic concepts.
A "theory" in mathematics and theoretical computer science is, roughly speaking, a collection of basic definitions and axioms and the set of statements deduced from them. Any such theory is concerned with fundamentally abstract entities (numbers, automata, etc.) irrespective of any resemblance or relation they may bear with "reality". The consistency of a mathematical theory is an inherently internal characteristic. Whether mathematical concepts correspond to physical, biological, sociological or economical phenomena, is the concern of the respective sciences, not of mathematics. Hence a "theory" in mathematics is not the same as a "theory" in physics. The same could be said of computer science. Mathematics is a tool of science (and engineering). It is also an inspiring tool, in that it sometimes helps scientists develop new insights. But in itself it is not a science. As a friend of mine used to say "mathematics is not a science; it is the successful branch of philosophy". Once could argue the same of computer science.
But computer science is not just concerned with theoretical concepts. There is also another side which is concerned with building things (usually software, but sometimes hardware too). This is the "engineering" side (a proper engineering, in spite of what some ring-wearing snobs might say). It relies, or at least it should rely on the theoretical foundation. But engineering is not science. Sometimes it involves scientific aspects, such as observation and experimentation. But the ultimate goal is different: building things, not explaining phenomena. It just happens that in order to build things you need to understand and explain phenomena.
So there is a theoretical side of computer science which is mathematical in nature (e.g. proving theorems). There is an "engineering" side as well, concerned with designing and building computing systems (usually software). But the real picture is even more complex than this. For many sub-fields of computer science the distinction is not clear. Many areas involve both applied and theoretical aspects. For example, in bio-informatics computer scientists design algorithms to find patterns in genes. This may involve, 1) designing an abstract algorithm (which is design, but also theory as it deals with an *abstract* problem, worked out in abstract steps), 2) proving its correctness (theoretical), and 3) implementing it (engineering). The whole process may itself resemble a scientific process where we find an issue (e.g. a bug), develop a hypothesis, propose a solution, implement it, and test it. However the overall goal is still not explanatory in nature. The same goes for many other areas of computer science such as networks reseatch, parallel and distributed computing, artificial intelligence, etc.
Just like mathematics, computer science as a whole, including its theoretical and engineering sides, is not explanatory per se, and instead plays a supporting role to science. Saying that computer science and mathematics play a supporting role to science should not be interpreted as dismissive. Computer science and mathematics may be the means rather than the ends, but they are enabling means. It is hard, if not impossible to imagine physics without mathematics. Computer science, despite being the new kid in town, has begun to grow from being merely a tool, to influencing not only the way science is done, but also some of the fundamental concepts in scientific disciplines. Computational and systems biology are perhaps the most visible example. Biologists are beginning to think about living beings and biological phenomena in terms of information and computational processes. Similarly, physicists are thinking about cause-and-effect between events in terms of transfer of information. Scientists are starting to think about the world in computational terms.
So, whether we are talking about theoretical computer science, system-building computer science, or any kind of computer science in between, we are not talking about a science strictly speaking. We are talking about a tool, but not just any tool. It is a tool that is becoming an integral part of science.