The goal is to paint a picture for college-level students of what I feel underlies computer science as a
field, what its goals might be, and how it might relate to other fields. It is
not finished, and I may append it over time -- as a result, many loose threads
and repeated points may still exist.
Many students enter or regard from outside the field of computer science
thinking (as I did) that programming is the distinguishing feature, if not
overall goal, of computer science. This is an unfortunate misconception. It
trivializes an interesting and deep academic field to the status of ``specialty
training." Many mathematicians and science students in other fields imagine
computer science classes as consisting mainly of programming, never imagining
that the insights and principles of computer science can make invaluable
contributions to their ability to answer questions in their own fields in an
informed and perhaps innovative manner. The extent to which a physics student,
who may have already earned his graduate degree, is unfamiliar with basic
concepts regarding algorithms is absurd. The many models of languages which a
linguistics student might encounter might be understood with far more clarity
when the tools of language design and semantics are available to her. The
student of social analysis or history might benefit greatly both from the
interpretation of large-scale processes as large-scale computations and from the
more formal, organized, consistent, and easily straightforward paradigms
and models which she may learn to build thanks to an understanding of basic
principles one finds in computer science. Moreover, many students who dislike
the process of programming in a particular paradigm, such as the
imperative language paradigm to which belong languages like C, have no idea that
this has nothing to do with computer science -- there exist many
paradigms, all of them with appropriate domains. There exist also many avenues
of inquiry outside of this which require no unpleasant programming whatsoever,
and allow, often even require, an incredible amount of creativity, freedom, and
critical thought.
It is important at this point to distinguish ``theoretical" computer science
from engineering -- I will focus my discussion almost entirely on the former, as
its distinction from the latter is one the main motivations in writing this. I
hope it has become apparent that I don't view ``theoretical" (if such a prefix
is to the reader's liking, she may insert it at every instance henceforward)
computer science as some sort of applications-driven endeavour, nor do I feel
that everything done must be scrutinized for its applicability in the
development of hardware, software, or other solutions to ``real-world" problems. In many
respects, computer science is of its own accord an entity which will allow us to
understand better the universe and its behaviour and structures, and which will
teach us to think in a more careful and fundamentally well-organized and, consequently,
effective
manner. These benefits are not only useful, but are arguably quite pleasant
aesthetically.
If computer science is to serve such a grand purpose, the first fundamental issue, then, must be the place of computer science within the larger context; namely, that of the discipline of science in general, and the closely-related disciplines in particular. I suggest that computer science is not an exclusive pursuit which can serve a narrow purpose completely -- mathematics, philosophy, and physics, as well as fields lying just outside their periphery, are just as vital to the discipline of computer science; likewise, the applicability of the discipline to problems regarding ``macro" (less tractable at the current time) observable behaviours, problems which fields such as biology and social analysis grapple, should not be trivialized. Computer science cannot be separated from any or all of these easily, nor can anyone argue that computer science cannot inform on a fundamental level all of these fields. In fact, our separation of groups of fields such as social analysis and biology from the fields such as mathematics and physics can often, if not always, be explained by the underlying differences between the computational size and complexity of the problems considered in the respective groups of fields.
Internal Structure of the Field
I feel that the parts of the field with which I am familiar can be arranged on a hypersphere or two or three dimensions in a fairly reasonable manner. If I were hard-pressed to separate the field into areas, I would make the list something like this: algorithms, complexity theory, combinatorics, algebra, semantics and logic, artificial intelligence. Foundational topics like graph theory underlie and pervade all of these, and topics such as category theory can, though this is often difficult to see, help us in all of these, and thus would also need to lie adjacent to every one of these subdivisions. It is unclear whether or not artificial intelligence could be included in one of the other subdivisions, and I happen to include all of computational statistics under artificial intelligence while excluding more heuristic artificial intelligence algorithms, instead claiming they are in fact examples of algorithms. I feel that it's important for undergraduates to get a sense of how these subdivisions relate to real-world applications of computer science and engineering as well as how they relate computer science to other fields. This is often obscured by the existing walls in the curricula available in most universities as a result, in my opinion, of historical inertia.
Instruction: Engineering or Theory
At the curricular level, it feels like computer science still suffers from a kind of schizophrenia, a malady it has inherited from the circumstances surrounding its historical development. In some introductory courses, the boundaries between programming, engineering, and theoretical computer science are often made woefully unclear, effectively muddling these three very distinct fields into an unsatisfying experience for the novice theoretical computer scientist, effectively obscuring the aesthetic qualities which may very well appeal to certain students much more than arbitrary, pedantic details or forced, uncomfortable interaction with silly automats. In others, they are strictly separated, creating a sense of mild animosity between those interested in each area. It is discouraging to see that a related issue has been addressed [1] well over a decade ago (I consider the article referenced an illustration of the aesthetic appeal of computer science in general, rather than the narrow notion of ``programming," to students who may potentially be interested in the material), and yet on the whole the problem persists. In fact, with the introduction of Java into many curricula, this problem is exacerbated to the point of absurdity. It is possible that my rather small frame of reference (ten years, at best, is arguably not even a single human generation) reveals my impatience -- I expect too much, too quickly. In many ways, the atmosphere in the '90s was not generally conducive to the development of a cohesive image of computer science, either. However, the choice of improvements, in my opinion, is not difficult to address -- the difficulty lies in deciding who is responsible for implementing such improvements, and in convincing these parties that it is worth the effort. Such a discussion is not my purpose in this article, nor is it of particular interest to me. It is, however, something any prospective students should keep in mind.
The Purpose -- Impractical Discussion
It is very unclear exactly what theoretical computer science should be. The name ``computer science" is a term which is both misleading and confusing in this regard. Some might argue that it is not a science in the same way as physics, others might think that perhaps there is some need for a computer or computer-like object in the treatment of computer science. We might call it the study of mathematics using the language or algorithms, including what can be described using this language. We could as easily call it the study of algorithms of mathematics (its underlying structure), as well as the mathematics of algorithms (the languages available to us when we wish to describe an algorithm are all forms of mathematics). This all sounds very confusing and circular, and suggests that perhaps we should not try to distinguish certain things in a traditional manner, but should attempt to redefine the topic of our discussion in a more useful manner.
No doubt, a question regarding the overall purpose of the field might have many answers which vary from one person to another. I present a mixture -- this is neither the explicitly-stated purpose of any particular authority in the field, nor the ideal purpose one might see, nor the underlying motivation, but rather a combination of all of these interpreted from my perspective. Instead of presenting the idea explicitly, I will outline a progression of thoughts on the matter which might better represent the nature of the ostensible ``purpose."
One potential simple and relatively non-ambitious purpose for computer science involves mathematics as a naturally occurring phenomenon in the universe, the result of a dynamic process where matter governed by physical laws is able to produce things we might call instances of ``mathematics." Mathematics proper is not often too concerned with the underlying process of mathematics -- the structure of mathematical thought, the rules governing the development of thoughts and objects which we interpret as ``mathematics." It instead relies on intuition and practice to achieve ever more interesting or insightful mathematical constructs. Studying mathematics and even fields like applied mathematics and economics might leave an individual with the sense that there exist static models which we can construct, and there are opportunities to apply them or test them in the physical world. However, there is something more to the static models -- they themselves are the result of a dynamic process. The principles and processes which underlie the development of these mathematical constructs, the reasons that mathematical thought has the characteristics which it does, are not well understood. The attempts made by mathematics proper to study the structure and development of mathematics are more concerned with static underlying concepts, perhaps general concepts of existing constructs. But mathematics is a naturally occurring phenomenon in the universe, it developed in the universe by some set of rules and for some collection of reasons. It did not develop because set theory exists, set theory itself developed as a result. A result of what? The computational properties of physical objects, perhaps? (Would Feynman agree here?) The observation, then, is that we can try to understand the rules governing any naturally occurring phenomenon which we recognize as ``mathematics," much like we study naturally occurring physical phenomenon and try to find rules governing our observations.
There is an equivalent goal here. Much like the study of physical phenomenon can be accomplished through the construction of physical ``machines" to perform experiments, our study of ``mathematics" or ``consequences of the computational properties of objects in the universe" can be accomplished through the construction of ``machines" to perform experiments in computation. In essence, this means the creation of ``machines" which could automate the process of ``mathematics." If such is done (and to a small degree, such has already been accomplished), it necessarily suggests that we must have obtained some insight into the structure of ``mathematics" as it naturally occurs in the universe. So in view of this parallel, the goal might be, in the short run, to construct a machine which can do human-quality research in mathematics.
We must then grapple with some questions. How do we make these machines? Using what processes and principles? In what ways does language and interpretation play a role in this? The linguistics of mathematics begins to rear its head at this point. Notice that the very definition of what is and is not ``mathematics" arises when we take such a route -- we must decide what we recognize as ``mathematics." All the machines we have built have been mathematical in nature, have been governed by mathematical rules, and it's noteworthy that perhaps any machine we could potentially build will be such. Obviously this is heavily biased towards the von Neumann machines with which we are familiar in our particular time and circumstances, but there must be some reason that the easiest human-like thought process to model is the process of mathematics -- it suggests that what we generally recognize as ``mathematics" is perhaps fundamental to any more complex construct which might rival our complexity, (naturally, by our definition of complexity). In fact, perhaps the potential of any machines we construct can be considered the entirety of what was might call ``mathematics." In this pursuit of studying the computational properties of physical objects, then, it is quite natural to consider the computational properties of the human mind (a strict superset of mathematics proper) as well as the computational properties of other objects (stars, computers, etc). Whether something is indeed a ``computational" property will quickly lead us to circular definitions. Of course, there's nothing wrong with that, but we will cut this particular thread of the discussion short. The point is that we want to study computational properties of objects in general, and especially of objects resembling humans in particular (arguably the computational objects of most interest at the current time). Also, remember that the easiest subset to immediately model using machines is what we intuitively consider ``mathematics."
Let us assume the purpose is at least some subset of the above, and that we want to study how humans arrive at mathematical constructions by simulating this process in machines. This is quite difficult, and might very well be more psychology than anything. Luckily, we are able to construct machines which, very much like humans, can arrive at constructs in a similar manner, and of a similar complexity (not yet human-quality research, but certainly in terms of computation). Thus, we can study these simpler machines, their properties, and the rules governing their operation. Perhaps this will inform us about our own operation. What does any of this have to do with computers or computer science? The machines are merely mini-simulations which allow us to study our own thought process, much like a level may be a mini-simulation of the way our arm and elbow operate. In physics, the physical world as the testing ground. Here, you go back to the physical world to test your hypothesis by building a machine using the laws we think may hold and seeing whether we are closer to what we would like to model. The innate computational and informational properties of physical objects is the ``physical world" in this case. The act of programming is the construction of one of these simulations, the construction of an object with specific computational properties -- in essence, it is equivalent to a mathematical theorem, being an abstract construct which describes a set of ``physical" behaviours. A program, an algorithm, is then not different from any abstract mathematical concept, and given the vague notion of a ``mathematical concept," it is not unreasonable to adopt the notion of ``program" as the definition for the ``mathematical concept" we would like to pin down -- once again, one can easily introduce circularity, but the point is that these things are all one and the same.
Regardless of what we call our mathematics, programs, algorithms, thought processes, or languages, we can certainly study their innate properties. In general, at the most common level of abstraction one encounters, computer science is concerned with the innate properties of an algorithm which will hold true regardless of the engineering implementation. Engineering should be addressed as a slightly separate pursuit, though the two must overlap at the border. The algorithm is usually somewhat applicable (much like an axiom which must somehow correspond to our intuition to be interesting, an algorithm must somehow model reality or be applicable to be interesting to us), and this relates somewhat to the engineering potential of the algorithm, though not always.
We return to a point we mentioned earlier regarding what exactly constitutes ``mathematics." I claim that there is no reason to answer this question -- mathematics is a subset of human thought, and it happens that it is, given our machines, relatively easy to model when compared to the other processes in the human mind. A much more ambitious goal of computer science, therefore, might be the study of human thought as a naturally occurring phenomenon in the universe. We may go a step further, and suggest that it is the study of any thought or thought-like process as a naturally occurring phenomenon in the universe. Based on one's definition of thought and process, these may very well all be one and the same. Regardless, this gives us some intuition, if not a clear answer, regarding the possible purpose.
But then, one may ask, is this like psychology or linguistics? After all, we're trying to model a human thought process, which is also inextricably tied to language and representation. Arguably, the ultimate goal of these fields may be the same, but computer science might be described as a much more conservative approach. Instead of trying to encompass the tremendously complex human thought process as a whole and model it from the top down, we focus on a small subset. This subset is specifically that set of behaviours which has been easy to simulate, as I mentioned earlier, and we might even hypothesize it is fundamental to all processes which are more complex. This hypothesis may very well prove false, but if such is the case, we will know why, and this would also be of some value. In either case, while there is great value in modeling things from the top down in terms of prediction, very little is gained in terms of an understanding of why, the underlying principles which result in the observed and modelled behaviours. One need only consider the models of Newtonian mechanics, which are quite useful for prediction in some cases, but tell us little about why bodies behave the way they do at the sub-atomic level. Naturally, models at any level exhibit this property, but given the sheer scale of something like a human brain and the overwhelming simplicity required for us to understand anything with any amount of clarity (Newtonian mechanics was created with fairly small and simple systems when compared to a human brain), it will no doubt prove more productive to begin at a small scale which we can grasp, and once that small scale has been grasped sufficiently well, it can be abstracted away and we may focus on larger models in which we know the simpler components are accurate and exact.
I should note that none of this is to suggest that artificial intelligence (which I don't believe I even mentioned in the above) is seen by me as the end-all purpose of computer science. In fact, artificial intelligence is a fraction of the work done in computer science; it just constitutes an area which perhaps is more conscious of the eventual results of furthering our understanding of computer science than other, more applications-driven and short-term goal-oriented areas of the field. Whether one should conflate eventual result with purpose depends on whether or not one believes the universe to be deterministic, and so I leave it to the reader to decide whether I have been reasonable.
The Field -- Practical Discussion
If you're a student interested in the more theoretical aspects of the field, it's important to gain an understanding of which areas are most appealing and how they may relate to what you want to accomplish. The existing trends are important as well, and understanding the nature of contemporary problems. Obviously, gaining a feel for what is most appealing takes a few years.
Computer science is often misunderstood by students of mathematics. To learn to program, it is best to simply buy a good C book and spend a few weeks doing the exercises, taking an introductory computer science course is probably not a good use of time if this is all you want to do. There are two big reasons why you might want to take computer science courses at all: (1) you already know what computer science is about and want to investigate how a particular set of mathematical concepts can be better understood from a slightly different perspective -- in this case, you can readily take a graduate-level course in the topic of you choice, or (2) you don't yet know what the field can offer you and would like an introduction to the general goals and methodologies in the field. In the latter case, most introductory-level computer science courses are useless, and you should skip one level and take a more advanced course, perhaps first speaking to a computer science major or consulting literature to determine for what classes you're best suited.
Speaking to an applied mathematics major who was fairly
comfortable writing proofs, I was surprised to hear him say that he does not
like to program. One important thing I think people should realize is that anyone who knows
arithmetic and what a function is already knows how to "program," in
some sense. If one is writing a proof,
one is programming. For some reason this parallel (I hesitate to call it a parallel, as
it is in fact identical) is not exploited to its full benefit in most, if not
all, introductory materials on the subject. This is largely a result of the fact
that introductory languages are, for historical reasons, always imperative -- I was struck also that one the teaching
fellows in a data structures and algorithms class I attended had never
programmed in a functional programming language. In addition,
there is the use of schizophrenic object-oriented paradigms in introductory
materials, which is both baffling in computer scientific terms and saddening in
historic terms -- it is a practice, nothing more, but is presented as either a
technology or a language paradigm on par (in terms of utility or sophistication)
with recursion or pointers.
[1]. The author of this article appears to have vanished into obscurity shortly
after its publication. I was somewhat disappointed.
This is not a completed article, and will be appended and modified as I see
fit.
Last modified: Thu Jan 26 2006