What is Computer Science?
David B. Held
dheld at codelogicconsulting.com
Sun Apr 29 15:42:31 PDT 2007
Since many people (including me) hate deeply nested threads, I decided
to start a new one on a slightly off-topic subject. IMO, "Computer
Science" is a slight, but not complete, misnomer. On the one hand,
students who take CS at a university expect to be taught Software
Engineering, and that is what universities tend to teach them. On the
other, the professors themselves, who actually do research, do a lot
more than Software Engineering, and often tend to actually be bad at
both doing and teaching SE (because they don't do it professionally, of
course).
Do Computer Scientists actually conduct experiments worthy of calling
them scientists? Well, when I was going to school, we knew there were
certain times when it was not wise to attempt to build your project on
the department minicomputer because one of the professors was running
his genetic algorithm to solve the Busy Beaver problem. He ran his
program as often as possible and regularly wrote papers on progress he
made on this and other topics in CS. Given that his hypothesis was that
a certain fitness function or selection rule or crossover strategy would
produce better results than what was currently known, and that the only
way this could be demonstrated was by running the simulations, I would
call this "experimentation" and "science" just as surely as growing
something in a petri dish or smashing molecules in an accelerator.
The reason most people don't associate CS with "science" is that they
don't end up in the academic world, where most science is actually
conducted. But if they did, they would see that all good papers involve
an implementation to demonstrate (or fail to demonstrate) some new claim
about how computers do or should or could behave. Whether it's about
"computers" or just "software" seems like a pedantic point, especially
considering that "softness" runs a continuum that is being updated every
day (for instance, the kilocore architecture is really a bunch of PGAs
for which the notion of "running software" is more like "reconfiguring
hardware").
Agreed that much of what computer scientists do is heavily mathematical,
but to call it an extension of mathematics would be like calling physics
an extension of mathematics because it is heavily mathematical. While
there is a field called "Mathematical Physics" which explores that realm
between pure math and pure physics where it's not obvious which you are
more of, it is generally recognized that math is a *tool* used by
physics, and not physics itself. In the same way, CS uses math as a
*tool* to make statements about computation without the math itself
*being* the computation (despite the overlap in symbology).
The *field* of Mathematics is about making statements about the *tool*
of math, independently of any *application* of that tool. And
interestingly enough, there are lots of interesting (and obscure) such
things to say. Whereas, the *application* of mathematics is about
making statements about *another field*, using mathematical concepts and
notation. This is why CS was originally considered a form of "Applied
Math". But it is no more useful to say that than to reduce physics,
chemistry, and biology to "Applied Math". There is a certain strict
sense in which that is probably true, but there is no practical value to
it. The way you can tell is that a pure mathematician would make a
lousy computer scientist because there is lots in CS that is irrelevant
to pure math that such a person would not necessarily have learned and
become proficient in.
So it then comes down to the question of: "Do you need CS to be a
software engineer?" Well, that's like asking if you need Physics to be
a good mechanical engineer. And in both cases, I would say: "No, unless
you want to be a *good* engineer." Plenty of people who have not
studied CS make up the majority of the SE "working class". But when an
SE does not understand the basics of algorithmic complexity and tends to
select data structures based on whether they provide the particular
method or interface they need at the moment, you begin to see the
difference between CS-educated SEs and non-CS-educated SEs. If you
think there are no such SEs in the world, try screening candidates for
any large tech firm. Even more disappointing is that going to school
and "studying" CS does not make you a CS-educated SE, as many folks
prove with alarming regularity.
Proficiency in a task depends on having a strong mental model of that
task, and such models are built up through examples. You can acquire
examples through experience, or through education; but ultimately, your
neural network needs *lots* of examples to build solid models of the
Software Engineering discipline. The point of education is to expose
you to a regular set of examples so that your resulting model is more
likely to be useful and more refined than random sampling (i.e.: the
self-taught route). Of course, education does not always succeed at
this task, and highly motivated individuals will tend to expose
themselves to more examples than unmotivated individuals. However, if
selection biases cause them to fail to consider examples that they would
be exposed to in an educational setting (because they just code what's
"fun"), then there is a hole in their knowledge that differs from
standard education.
That's a long-winded way of saying that school is good because it forces
you to learn stuff that you don't really want to learn, which ultimately
makes you a more well-rounded person. Learning networks learn the best
when they are able to sample the largest subset of the state space. So
being exposed to stuff that doesn't really interest you otherwise
exposes your brain areas of the state space that help you generalize
your mental models more appropriately. And when a school fails to do
this, then they aren't adding any value at all. But odds are, most
students judge a school by how boring their classes were, failing to
recognize that some of those boring classes are exactly what they need
to learn to fill in gaps in their knowledge.
I can't say that I learned most of what I know from school, because I
probably didn't. On the other hand, I think I learned a lot more having
studied CS at school than I would have on my own, because of the whole
formal-education-enforces-discipline effect.
Anyway, CS is relevant to D because getting the kind of knowledge
necessary to design a good language is very difficult to do by inventing
*lots and lots* of languages. It's much easier to just learn the theory
behind PLs and apply that to features being considered for D (and to fix
features already in D). And whenever you have a theory, you have a
science. ;)
Dave
More information about the Digitalmars-d
mailing list