TITLE: Preparing to Study Computer Science
AUTHOR: Eugene Wallingford
DATE: September 27, 2005 7:10 PM
DESC: A high school student how best to prepare to study computer science at the university. I think that I learned more by trying to answer the question did than the student did.
-----
BODY:
Yesterday, our department hosted a "preview day" for
high school seniors who are considering majoring in
computer science here at UNI. During the
question-and-answer portion of one session, a student
asked, "What courses should we take in our senior year
to best prepare to study CS?" That's a good question,
and one that resulted in a discussion among the CS
faculty present.
For most computer science faculty, the almost reflexive
answer to this question is *math and science*.
Mathematics courses encourage abstract thinking, attention
to detail, and precision. Science courses help think
like an empiricist: formulating hypotheses, designing
experiments, making and recording observations, and
drawing inferences. A computer science student will
use all of these skills throughout her career.
I began my answer with math and science, but the other
faculty in the room reacted in a way that let me know
they had something to say, too. So I let them take the
reins. All three downplayed the popular notion that
math, at least advanced math, is an essential element
of the CS student's background.
One faculty member pointed out the students with
backgrounds in *music* often do very well in
CS. This follows closely with the
commonly-held view
that music helps children to develop skill at spatial
and symbolic reasoning tasks. Much of computing deals
not with arithmetic reasoning but with symbolic reasoning.
As an old AI guy, I know this all too well. In much
the same way that music might help CS students, studying
*language* may help students to develop facility
manipulating ideas and symbolic representations, skills
that are invaluable to the software developer and the
computing researcher alike.
We ended up closing our answer to the group by saying
that studying whatever interests you deeply -- and
really learning that discipline -- will help you prepare
to study computer science more than following any blanket
prescription to study a particular discipline.
(In retrospect, I wish I had thought to tack on one
suggestion to our conclusion: There can be great value
in choosing to study something that challenges you, that
doesn't interest you as much as everything else, precisely
because it forces you to grow. And besides, you may find
that you come to understand the something well enough to
appreciate it, maybe even like it!)
I certainly can't quibble with the direction our answer
went. I have long enjoyed
learning from writers,
and I believe that my study of language and literature,
however narrow, has made me a better computer scientist.
I have had many CS students with strong backgrounds in
art and music, including one
wrote about last year.
Studying disciplines other than math and science can
lay a suitable foundation for studying computer science.
I was surprised by the strength of the other faculty's
reaction to the notion that studying math is among the
best ways to prepare for CS. One of these folks was once
a high school math teacher, and he has always expressed
dissatisfaction with mathematics pedagogy in the US at
both the K-12 and university levels. To him, math teaching
is mostly memorize-and-drill, with little or no explicit
effort put into developing higher-order thinking skills
for doing math. Students develop these skills implicitly,
if at all, through sheer dint of repetition. In his mind,
the best that math courses can do for CS is to filter out
folks who have not yet developed higher-order thinking
skills; it won't help students develop them.
That may well be true, though I know that many math
teachers and math education researchers are trying to do
more. But, while students may not need advanced math
courses to succeed in CS -- at least not in many areas of
software development -- they do need to master some
basic arithmetical skills. I keep thinking back to
a relatively straightforward programming assignment
I've given in my CS II course, to implement
Nick Parlante's
NameSurfer nifty assignment
in Java. A typical NameSurfer display looks like this
image, from Nick's web page:
As the user resizes the window, the program should grow
or shrink its graph accordingly. To draw this image,
the student must do some basic arithmetic to lay out the
decade lines and to place the points on the lines and the
names in the background. To scale the image, the student
must do this arithmetic relative to window size, not with
fixed values.
Easy, right? When I assigned this program, many students
reacted as if I had cut off one of their fingers. Others
seemed incapable of constructing the equations needed to
do scaling correctly. (And you should have the reaction
students had when once, many years ago, I asked students
to write a graphical Java version of
Mike Clancy's
delicious
Cat And Mouse nifty assignment.
Horror of horror -- polar coordinates!)
This isn't advanced math. This is algebra. All students
in our program were required to pass second-year algebra
before being admitted to our university. But passing a
course does not require mastery, and students find themselves
with a course on their transcript but not the skills
that the course entails.
Clearly, mastery of basic arithmetic skills is essential
to most of computer science, even if more advanced math,
even calculus, are not essential. Especially when I think
of algebraic reasoning more abstractly, I have hard time
imagining how students can go very far in CS without
mastering algebraic reasoning. Whatever its other strengths
or weaknesses the
How to Design Programs
approach to teaching programming does one thing well, and
that is to make an explicit connection between algebraic
reasoning and programs. The result is something in the
spirit of
Polya's How to Solve It.
This brings us back to what is the weakest part of the
"math and science" answer to our brave high school
student's question. So much of computing is not theory
or analysis but **design** -- the act of
working out the form of a program, interface, or system.
While we may talk about the "design" of a proof or
scientific experiment, we mean something more complex
when we talk about the design of software. As a result,
math and science do relatively little to help students
develop the design skills which will be so essential
to succeeding in the software side of CS.
Studying other disciplines *can* help, though.
Art, music, and writing all involve the students in
creating things, making them think about how to make.
And courses in those disciplines are more likely to
talk explicitly about structure, form, and design
than are math and science.
So, we have quite defensible reasons to tell students
to study disciplines other than science and math. I
would still temper my advice by suggesting that students
study *both* math and science *and*
literature, music, art, and other creative disciplines.
While this may not be what our student was looking for,
perhaps the best answer is **all of the above**.
Then again, maybe success in computing is
controlled by aptitude,
than by learning. If that is the case, then many of us,
students and faculty alike, are wasting a lot of time.
But I don't think that's true for most folks. Like
Alan Kay, I think we just need to understand better
this new medium that is computing so that we can find
the right ways to empower as many people as possible
to create new kinds of artifact.
-----