From: potts@itl.itd.umich.edu (Paul Potts)
Subject: Re: Computer Science Programs
Organization: Instructional Technology Laboratory, University of Michigan
Date: Mon, 17 Aug 1992 20:30:53 GMT

I thought I'd throw my two cents' worth in as well.

My degree was in English, not Computer Science, but I took a minor in Computer
Science at the College of Wooster in Wooster, OH. *I do not recommend going
to Wooster for Computer Science! The program was weak when I attended, and
has gone downhill since then.*

The first programming course I took was CS151, introduction to Pascal
programming. I had a fairly wide hobbyist-level knowledge of programming
(BASIC, a little Pascal, some Z-80 and 6502 assembly language, some 
experimentation with Forth and other languages) before that, so I
coasted through 151 pretty easily. I asked the instructor if I could skip
classes as long as I handed in assignments and showed up for exams. He agreed,
so that's what I did. The important lessons from 151 were the beginnings of
structured programming, data structures, and beginning to work with such
concepts as abstract data types and hiding implementation. That much was
useful.

CS152, the following semester, was the "weeding-out" semester where we learned
how to design reasonable-sized programs. Half the class failed or dropped. 
The rest of us worked our asses off. The instructor graded based on design
considerations, style, and whether your code actually functioned. As I recall,
a good top-down design was worth more than a fully debugged piece of crap.
We got the rudiments of algorithms, data structures, linked lists, trees, and
recursion; brute-force methods, stacks, queues, etc. We had a great deal of
fun writing programs to solve the "Knight's Tour" chess problem on various-
sized grids, and then running them simultaneously to bring the school's
VAX 11-750 to its knees. We learned a lot that semester: one of the lessons
was "here's how to stay up for 72 hours straight." Unfortunately I can't do
that anymore; fortunately I generally don't need to.

A word on languages: I am very suspicious of courses that claim to teach
*just* a language. That seems rather useless. CS151 taught Pascal and
some of the basics of programming; after that semester, it was presumed
that we were bright enough to learn new computer languages on our own. I
believe that approach paid off well. Instead of being taught languages,
we were given various assignments which required us to learn a language
and development environment as a matter of course. This is more realistic.

At the time, on my own I was discovering the campus Macintosh network, just
being put into place, and the joys of hacking PostScript code by connecting
a terminal directly to our dorm LaserWriter. Programming languages for the
Mac were still scarce, but I eventually got into THINK C on my own and learned
C. My ability to learn things on my own was encouraged and strengthened by
my academic work. *This ability has been far more valuable to me than the
actual content of anything I learned in a computer science class; coupled
with the general principles of how computers actually work, it formed the
real value of my undergraduate work in Computer Science.*

From there, I took assembly language. This was, on the theoretical side, a
basic introduction to machine architectures, registers, floating-point, 
etc.; on the hands-on side, we wrote code, culminating in an assembler
(in assembly language) for the VAX 11-750. This was a rather large project: 
my final code was quite a bundle of printout (during punchy late-night
debugging sessions we once tore off all the tractor edges to our printouts,
tied them together, and created a giant spiderweb around the computer atrium).
The combination of theoretical and hands-on experience was what made this 
worthwhile for me. As in the other languages, the instructor took something
of a hands-off role in our actual code. We learned that from the documentation
and a text. It was interesting spending half the night debugging assembly
code, and then realizing that we had to spend the next half of the night
cramming to study for a test, which was on the more theoretical aspects
of machine-level programming.

The next course was Operating Systems. This was a textbook class on how
Operating Systems work; the hands-on part consisted of learning MC68000
assembly language and writing a preemptive scheduler and basic I/O services
for a single-board computer, using a cross assembler on the VAX. We got
occasional technical assistance from the instructor, but for the most part
we were on our own with the 68000 documentation. The instructor was aware
of the Macintosh and so the mechanism we used was the A-line trap-dispatching
mechanism. This gave us hands-on experience with the 68000, and also an
undertanding of interrupts, supervisor and user modes, priorities, etc.
Again, we studied theory by day and practice by night. It was a great
course.

From there, I went into a somewhat disappointing course on programming
languages. This was a theory and overview course, looking at a numer of
languages, commonalities between them, efficiencies of implementation,
syntax and semantics, formal notations for semantics, etc. I don't remember
that much about it, except that we didn't do much programming.

My next course was Algorithms, which was a classic textbook course using
Sedgewick; it focused largely on sorts and searches. I was learning Macintosh
programming in C at the time, and implementing some of my assigments in C,
so in one case I handed in an assignment several months late, but with a 
complete graphical user interface, running as a Macintosh application rather
than a VAX executable or Mac Pascal program. 

That was about it for the minor; I also took a little 1/4 credit Fortran
course, and dropped it; I sat in on a more advanced computer architecture
course while working as an intern, but didn't get to finish it (this was
essentially a logic design class, where one of the projects involved
writing a simulation of a processor by constructing a microcode interpreter).

One of the main reasons that I didn't get a major was math. (Aside from
being indecisive about which I loved more, Computer Science or English; I'm
still debating that). The Computer Science program at Wooster required
differential equations, linear algebra, discrete math, two semesters
of calculus; I was barely able to make it through calculus. I attribute
this partially to a poor high school math education and partially to a
lack of ambition to do the work required. I did not have the drive or interest
to take all that math, or perhaps even the ability. I don't think that that
much math was necessary for me to make good use of my courses; I would prefer
to do software design than optimization, and user interfaces to simulation.
I couldn't model a Fourier transform or do a stress analysis of a bridge, but
I could figure out where an algorithm or piece of code was too slow, and make
it faster. In my job now I don't have a use for the math that I didn't take,
whereas the writing skills I developed have been very useful.

Today I have written a decent amount of code for the Mac, both XCMDs and
applications; I am learning C++ and writing code for the PC; I use Hypercard
and Toolbook to develop instrutional software. No one taught me C++; no
one taught me Toolbook; the skills I developed at learning new techniques
and languages have instead been very useful. If you get an education in
Computer Science now, your instructors can't know what language or 
architecture or processor or class library or operating system you will be
working with in ten years; you can't know. The importance lies in your ability
to learn and thus, be flexible and able to adapt.
  
I do have the urge to go back and take more computer science; I would like
to study AI, and I'd like to learn LISP. I would like to get into theory of
computation a bit as well, which I never took. My problem is that I am
somewhat happy where I am, and the University doesn't love to teach people
who aren't determined to get another degree. Also, to take more computer
science, I would probably be required to have more math, but it is
undergraduate-level math that I lack, and departments can be uptight about
letting post-graduates take undergraduate course work. I work full time, and
am not particularly interesting in getting into a degree-seeking program
where I would be competing with people with much stronger backgrounds, but
I would like to take certain courses. The next few years will be interesting.
Perhaps I cheated myself by being less competitive and focusing more on
real learning than on grades and deadlines, and perhaps there isn't a place
for me in a competitive graduate program in Computer Science. There is,
though, a lot more that I want to learn.

I would recommend looking for a program that has both theoretical and hands-
on experience. Talk to a couple of instructors: if they seem current, and
knowledgeable, ask to see the syllabus for a current course. Don't take
courses entitled "programming in C, part 1 through part five." Look for
some real meat; look around the department and see if you can find a room
with lots of unshaven young men (and women, if you are lucky enough to have
any in your program :) staring bleary-eyed at terminals, clearly lacking
in sleep. If they are guzzling coffee to stay awake and have sleeping bags
rolled up underneath the table for a catnap during long compiles - you've
found the right place!  
-- 
"It'sVerySad / toSeeTheAncientAndDistinguishedGameThatUsedToBe / aModelOf
DecorumAndTranquilityBecomeLikeAnyOtherSportABattlegroundForRivalIdeologies
toSlugItOutWithGlee." (from _Chess_). -potts@itl.itd.umich.edu-