# What Should be in a CS Curriculum?

I came across Dan Zambonini's blog posting ["What would you put in a
Computer Science Curriculum?"][1] recently. Definitely interesting,
but I think he misses the point of a CS degree. It's not meant to
teach all sorts of low-level, specific, real-world tasks. The
problem is that for every list of skills Dan can come up with (and a
few are heavily slanted towards his specialties, I noticed), I can
come up with another that would arguably be just as useful to
someone in the "real world" who was trying to get a programming
job.

The true point of a CS degree is to teach the underlying theory of
computation, algorithms, networks, etc. Also don't forget the Math -
all the aforementioned topics require a good understanding of
mathematics. Once the erstwhile grad starts working, they can apply
what they learned and will pick up what they need over time (and
will do it much more quickly then if they went to a "trade school"
CS program like Dan describes).

Let's face it - some real-world skills need an understanding of
theory, for example algorithm optimization, or crafting a parser
while writing a domain-specific language. If you are looking for
real-world experience in a college grad, your hiring practices need
adjustment, or go ahead and hire someone with an MIS degree, who
learned very little math and theory, but plenty of Java - just know
that you are getting someone who might be incapable of venturing
outside of the domain you hired them for.

As one who graduated from a CS program myself (UMASS Amherst), years
later I am glad my curriculum included plenty of theory. That's not
to say that I didn't program - I did plenty of that while I was
there, also. My Senior course on compiler design included theory
(itself presumed discrete math, the theory of languages and
grammars, and algorithm design), but also included a semester-long
project crafting a real compiler. It was built up in pieces as the
semester progressed, and we learned the parts we needed to
continue.

To be fair, Dan's list of topics does include some good basics -
like database theory and writing skills. I would be less worried
about having experience with language "X", again, someone
well-versed in theory can pick up a new computer language very
quickly ([This article][2] talks about the flawed way in which many
students are taught to "program" - by learning a specific language's
syntax, rather than actually learning to solve problems with
computers).


If I were hiring a programmer fresh out of a CS program, here is
what I would like to see at a minimum:

* Calculus, discrete math, statistics
* Technical writing
* Algorithm design and analysis
* Computer architecture
* Theory of Networks
* Theory of computer languages
* Theory of computation
* Some experience with the various types of languages by domain -
  functional, logic, procedural
* Database theory
* Software engineering
* Computer Security

## Comments

**[Bill Wright](#146 "2008-01-01 05:44:00"):** After going through
the excellent CS + Math program at Grove City College, it's telling
when I find people impressed by API's and or stuck particular
languages - look at all the 500 page books on XML, MVC
implementations, scripting techniques - stuff a properly prepared
person of average intelligence can intuit/learn in an afternoon and
sort of hone over time on their own as needed. Can we find anyone
who regrets going through a real CS program including foundational
maths e.g. discrete, calc, plus computing theory, i.e. how to reduce
complexity through computing? Undergrads can pick up current coding
tricks at their internships, so they can go into their 1st job
saying:(1) I have demonstrated by ability to pick up current
technology (2) My education equips me to solve one real problem in
my first six months on the job. Who cares about how many lines of
..NET code you wrote in college? Or how many proprietary computing
methods you have acquired? Bare coding ability is available
wholesale overseas at under $5/hr.Back to calc - obviously that's a
real sore topic for some people. To the person who thinks that the
avg calc professor doesn't convey enough enthusiasm - the fact that
freshman calc class is often the first academic situation in which a
student is expected to be self-motivated rather than being
entertained into learning should not place the instructor under an
obligation to impart a love of learning for the first time into each
and every student. Educators try their best, but once someone
arrives in calc class they either do or do not already have what it
takes to acquire and enjoy the material. Students who succeed have a
previous love of learning that started when they were young, 9-12
years old! They are also persistent (fail once? Try again, and
whatever it takes, make it through the second time around, it's your
last chance!)

[1]: https://web.archive.org/web/20060629070800/http://www.onlamp.com/pub/wlg/7757
[2]: https://web.archive.org/web/20060718223944/http://www.trollope.org/scheme.html