"Computer science is as much about computers as astronomy is about
telescopes."
--- Edsger Dijkstra, 1930-2002
I. What is computer science?
There are lots of vague explanations of what computer science is.
To some, computer science revolves around the mathematical theory that
underlies computation. To others, it's about the computer itself...the
organization of electrical circuits that make a computer able to be
something more useful than a doorstop. To still others, computer science
is about software...the programs or collections of instructions that are
interpreted by those hardware circuits and respond with behavior that is
somehow meaningful to us.
A textbook we once used for this course gives as good an explanation
of the term "computer science" as anyone else's:
"Computer science revolves around computational processes, which are also
called information processes or simply processes. A process is a dynamic
succession of events---a happening." (This book was clearly written by
someone who spent too much time in the 1960s.) "When your computer is busy
doing something, a process is going on inside it."
Putting this into different words, a nice concise way of defining computer
science is this: computer science is the study of what computers do...not
of what they are. So in this class, we'll talk a whole lot about what
computers can do and how to make them do it, and very little (if at all)
about the nuts and bolts of the computer itself.
II. From processes to programs and back again
We can study computational processes independently of the physical entity
that runs those processes. For example, many computer scientists study
human intelligence from the perspective of a computational process that
just happens to run on a pile of meat as opposed to a pile of silicon.
They're not tied to thinking of computational processes only being
associated with digital computers, and neither are we.
However, since this is a first course in computer science and we
don't want to go way overboard with really abstract stuff just yet,
we're going to stay close to the world of digital computers and not
think a whole lot about processes that might exist on other, more
wet and squishy platforms.
Another way of describing a process is "a procedure in execution." What's
a procedure? That's a collection of instructions, hopefully in some
meaningful order that results in some useful behavior on behalf of the
device that executes the instruction. When that collection of instructions
is written in some symbolic language that can be executed by a computer,
we can call that collection a computer program. The notation or language
that we use in writing those instructions is called a programming language.
There are lots of programming languages in existence, and in this course
you'll be exposed to at least two of them: Scheme and Python. Others you
may have heard about include names like Fortran, Cobol (both very old), C,
Pascal, C++, Java, and Matlab. We'll mention those names on occasion
throughout this course.
Let's add just a little bit more vocabulary on your first day: Many times
when computer folks talk about procedures, they use the word "algorithm".
We'll use algorithm in this class too, and usually we'll use it
interchangeably with "procedure", but "algorithm" has a very specific
definition that goes like this (adapted from "The Advent of the Algorithm"
by David Berlinski...you should read it when you have lots of free time):
An algorithm is
a finite procedure,
written in a fixed symbolic vocabulary,
governed by precise instructions,
moving in discrete steps, 1, 2, 3, ...,
whose execution requires no insight, cleverness, intuition,
intelligence, or perspicuity,
and that sooner or later comes to an end.
So for our purposes, procedures and algorithms are pretty much the same:
collections of instructions intended to achieve some desired end when
followed explicitly. The language they're written in is not too important,
so long as the language is sufficiently unambiguous. If we want these
collections of instructions to be run on a computer, we use a programming
language to encode these instructions. Programming languages are very
(although not completely) unambiguous when compared to, for example,
a language like English. So in this class, even though at times we'll
be talking about high-level conceptual content instead of low-level
computer programming details, we're going to expect you to be able to
express your understanding of both high-level and low-level stuff
through the programming languages used in this course. English is often
too fuzzy and hand-wavy to be a good medium for you to tell us how well
you know what you're supposed to know, so expect to be writing lots
of computer programs in this class, even when you're answering test
questions without the benefit of a computer.
When our algorithm or procedure that's encoded in a programming language
is actually being executed by our Georgia-Tech-required computer, it
gives rise to a computational process that does interesting things that
we can talk see and talk about. And that's why there's so much emphasis
on programming in most introductory computer science courses---it's
not because we necessarily want you to become money-grubbing commercial
programmers (though there are worse fates), but it's a really good way
to explore computational processes, which is what we want you to do in
an introductory computer science course.
III. So why does every Tech student need to know this stuff?
This is a question that comes up frequently. As you may know,
introductory computing is part of the Georgia Tech core curriculum.
Every Georgia Tech student has to pass an introductory computing
course involving programming (or transfer the equivalent from somewhere
else). Why computer science and computer engineering students need to
take this course is obvious, I hope, but why should other majors worry
about this stuff? It's certainly the case that all the engineering
disciplines are becoming more dependent on computing technology, and
that any new engineer who doesn't graduate with a decent understanding
of computational processes isn't going to survive long out in the real
world. Right now, for example, while undergrad industrial engineering
majors are complaining about having to take computing, we have a backlog
of industrial engineering grad students who are begging to get into our
introductory CS courses because they're finding out that they can't continue
on in their chosen profession without computer programming skills.
In the sciences, it doesn't take more than a quick look at modern biology to
see that a lot of what's happening there relies more and more on computing.
The big human genome mapping project would have been impossible without
computers. And biologists now often describe biological processes as if
they were computational processes. The same sort of revolution is happening
in physics and chemistry. Medical diagnostic techniques like MRI
scanning can't exist without computing, and the behavior of new
pharmaceuticals is modeled first on computers because the folks who
invent the new drugs often look at how drugs work on the human body
and the nasties that crawl around in there in terms of computational
processes.
But it doesn't stop there. Economists use the process metaphor to
describe the behavior of financial institutions. Political scientists
use the process metaphor to describe the behavior of political groups.
We've heard stories of Tech's graduating International Affairs majors
being hired over their competitors from other universities because
they know something about computing above and beyond how to use
Microsoft Word. And why do architecture or management students have
to suffer through a course that requires them to write computer
programs so that they can explore computational processes? The
answer is that pretty much everyone on this planet (minus some rare
primitive cultures still moderately unaffected by modern society) is
strongly affected by computer software. In your immediate future, you
may make business decisions with the aid of computer-based management
decision tools. Knowing how those tools work helps you understand what
those tools are, and are not, capable of. And your architectural plans
that you've created with design software may be stolen by a competing
firm that knows more about your software than you do.
No matter what your major or career path, people who know computing have
significant power over those who don't. For example, financial transactions
may be monitored without your knowing it by an overly aggressive IRS or
law enforcement agency, using their software to examine your bank or
credit card transactions. Your electronic mail may be screened by the
FBI's nifty Carnivore software. When you browse the Web, the sites
you visit are busy recording all sorts of information about you that you
may not realize you're giving up. And those same web sites are sending
programs to you that you're running on your computer without realizing
it...who knows what those programs are doing. Computer-based polls are
influencing the behavior of your elected representatives. Some time in
your lifetime, especially after the recent presidential election debacle,
you'll probably be able to vote for senators and presidents on your
computer at home. Computing will affect the lives of your children: for
example, you may have to decide whether to send your kids to a school
that relies heavily on the use of computer-based instruction to
supplement real live human teachers. These are just a few examples of
how computer programs, or computational processes, are entwined in your
lives, regardless of your major. And if you still don't think that
everyone's lives are intimately intertwined with computers, think back
a couple of years to the Y2K panic. Turns out that most of the problems
were solved ahead of time, thanks to the infusion of lots of time and
money, but things could really have been very bad if folks hadn't taken
the potential for disaster seriously. Oh, and those billions of dollars
that were spent to make those problems go away?....Rest assured that
the cost is being passed along to you and yours even now, regardless of
your major.
So why should everyone know about how computer programs work? For Georgia
Tech students, the answer is really that computing technology is clearly
the most important technology of our time, and since this is an Institute
of Technology, we'd be remiss to let you graduate without some reasonably
deep understanding of what computers do, which you gain by practicing the
art of getting computers to do stuff. But whether you're a Tech student or
not, you can't be an informed citizen these days without understanding this
stuff. The folks who know how it works will always have the advantage over
the people who don't --- not to know means you're giving up control over
big chunks of your life to the people who do know.
IV. How is this course different from the other versions of CS 1321 that
other students are taking?
The primary difference between CS 1321X and the other sections of CS 1321
is that our section assumes that you have had some experience with
computer programming, while the other sections assume only that the
students are warm and breathing. That means we'll be able to move forward
a little bit faster and cover more ground than everyone else. Their
version might not be as challenging for you as this one will be, but
rest assured that they'll think it's plenty challenging as it is, and
they'll learn lots about computational processes and programming in Scheme
too. But they'll have a somewhat steeper learning curve at first than you
will, so we use different approaches (as well as different textbooks) in
the two versions.
So in this course, expect to work harder and do more than you would in the
other sections. If you don't want to work harder and do more, that's
ok...there's no shame in that. Tech keeps you busy, and we emphasize
that time management is something you should be practicing, so if you
decide to go to the mainstream 1321 course, that's great. But make
that decision now...after the first week of classes, you won't be able
to change to another section. Starting with the second week, if you
start to sense that you aren't doing well and decide that you want to
take the less strenuous version, you won't be able to make that change.
The best you'll be able to do is withdraw from 1321X and start the less
strenuous version in the spring, and you can do that only until
September 26. After that date, you're stuck in this course.
Copyright (c) 2003 by Kurt Eiselt. All rights reserved, with
the exception of stuff that belongs to somebody else.
Last revised: August 20, 2003