I Feel Sorry For Computer Science Departments
There's a popular meme that it takes
ten years of effortful study to become an expert at something. I'm
sure that in reality, the number of years varies a bit from subject
to subject and from one individual to the next, but one thing is
clear – expertise takes time.
Therein lies the problem. Most
students who enter college and decide to take computer science have
minimal, if any, prior exposure to computer science. Colleges have 4
years to try to instill some meaningful level of expertise in
students, but that's simply not enough time. Compounding the
problem, many students are hoping to go out and get internships after
their first year. This leads to a series of unfortunate, yet
inevitable compromises.
CS departments are forced to choose:
do we focus on foundational skills and the big picture of what
computer science is all about, or do we focus on technical training
to try to produce graduates who have skills with immediate appeal to
companies? Talk to any CS professor and you'll hear plenty of
stories of bitter, divisive debates about this very issue within
departments and across the entire community of computer science
educators.
The very best schools are constantly
reassessing this question and retooling their program. Matt Might published a great wishlist of topics that every computer science student should know.
I also have a special admiration for Carnegie Mellon in this regard.
Despite being consistently ranked as one of the very top
universities for computer science in the country, they refused to rest on their laurels and recently did a complete overhaul of their introductory classes.
My own two cents on the topic is that
if a choice has to be made, it is better to err on the side of
teaching foundational subjects. I admire curricula such as Program by Design,
which takes a bold stand, teaching introductory classes in a
non-mainstream programming language (Racket, a dialect of Scheme).
They do this because the language is a particularly good choice for
teaching design and program construction at a deep level. Knowledge
of this language isn't likely to be immediately useful for a summer
internship, but colleges who use this curriculum report that down the road, their students come out much stronger and much more sought after by companies.
But the sad truth is that no matter how
many times CS departments debate this issue and retool, there are no
good answers. Four years is simply not enough time to become an
expert in computer science. Colleges are stuck between a rock and a
hard place and it's a bad situation all around. Companies are
distinctly unimpressed and disappointed with the vast majority of
graduates that colleges are producing. Ideally, companies want to
hire someone with the exact skills for a given job (one can argue
that this is a bad hiring strategy for long-term growth, but often,
it's what makes the most short-term economic sense). However, there
aren't enough of those to go around, so companies try to make the
best of the situation by just trying to find the smartest students
they can, figuring the smart ones can hopefully compensate for their
lack of experience by picking things up quickly on the job. More
often than not, the knowledge gained from a CS education is viewed by
companies as being so insufficient as to be almost irrelevant –
nevertheless, graduating from a well-known school can be seen as a
kind of proxy for the kind of drive and innate smarts they really are
looking for.
Flipping this around and looking at it
from the perspective of students, many graduating students are
finding out the hard way that they lack the real-world skills
companies are seeking. If they can get that first job, sometimes
they discover that they lack the background necessary to keep up with
the tectonic shifts in the industry; when that first job goes away,
it can be very tricky to make the transition to something new. If
you don't have the exact skills companies are looking for, and you're
no longer in that bucket of entry-level, fresh-out-of-school
applicants that companies might be willing to take a chance on,
hunting for that second job can be especially tough.
How do other departments solve this
problem? Well, many domains are able to leverage the significant
number of years that students have already invested in grade school
in English, math, and science. For example, most students who go
into mechanical engineering have already had the opportunity to learn
math up through calculus and have learned physics as well. Imagine
how many years it would take to become a mechanical engineer with
absolutely no prior math or science instruction, and you'll begin to
appreciate the problem that CS departments face. Also, many other
disciplines require significant post-graduate study and
apprenticeships in a way that computer science does not. Arguably,
computer science has one of the greatest disparities between the
demand for expertise, and the level of expertise that is actually
attained before one goes into the business.
But wait a second... computer science
is an engineering discipline. Shouldn't computer science benefit
from kids' math and science education as much as any other
science/tech subject? Unfortunately, no. Calculus, the pinnacle of
grade school math education as it is currently structured, is the
least relevant type of math for computer scientists. Computer
scientists need a strong background in Discrete Math
and these topics are poorly covered in grade school, if at all.
To further illustrate the point, there
is not a single programming class offered in the elementary and
middle schools near my home. At the closest high school, most of the
tech ed classes are about how to use Microsoft Office and Powerpoint
to write reports; programming offerings are fairly lightweight. Keep
in mind that I live in a part of the country that is fairly rich with
tech companies, less than 30 miles from Microsoft, Amazon, Facebook,
Google, Nintendo, and Boeing. Despite my complaints about the meager
offerings in my school district, there's no doubt in my mind that
most places probably have it much worse in terms of providing kids
with early exposure to programming.
So for the most part, computer science
curricula start from scratch. However, Program by Design, the intro
CS curriculum I mentioned earlier, stands out from the pack. Unlike
most other approaches to teaching CS, they intentionally try to
leverage students' existing math knowledge by portraying programming
as a kind of executable algebra. This is a clever strategy for
trying to maximize how far students can get towards expertise in just
four years of college.
Once the problem has been laid bare
like this – four years provides insufficient preparation for a
career in computer science – it is obvious that there are only a
couple long-term solutions. One possibility is to extend the
duration of CS education, another possibility is to incorporate more
CS topics and exposure to programming into the grade school
curriculum.
I think a strong case can be made that
our society would benefit from more CS in grade school, so that's the
direction I would be inclined to go. Programming is rapidly becoming
a foundational skill that has value across a wide range of
disciplines. An understanding of data, functions, and algorithms can
play an important role, right alongside mathematics and the
scientific method, for developing problem-solving skills that are
essential in our modern world.
Another helpful change would be to
incorporate more discrete math into the grade school curriculum. A
stronger background in discrete math would make it much more feasible
for computer science students to make rapid progress in just four
years of college. Why should we make a change in the math curricula
that just benefits future computer science students? Well, the short
answer is that it wouldn't just benefit future computer science
students. Arthur Benjamin makes the case in his TED talk that discrete math (logic, statistics, etc.) is far more relevant to most walks of life than, say, calculus.
So in the abstract sense, it's
relatively clear what needs to change in order to solve the problem.
But we all know that implementing such a solution may well be
intractable. Even if grade schools were motivated to incorporate
more discrete math and programming into their classes, how do you go
about finding and recruiting qualified teachers?
Therefore, this is likely to remain a
problem for a long time to come. In the meantime, I feel sorry for
college CS departments, I feel sorry for CS students, I feel sorry
for the people who would love programming but never get exposed to
it, and I feel a sense of loss that there's so much more our society
could achieve if we could narrow the gap between supply and demand in
computer science expertise. My hat's off to everyone who works hard
at making the best out of this bad situation.
This is a really great statement of the fundamental issues facing CS education, thanks for taking the time to write it up! I'm glad to see someone else extolling the virtues of Program By Design. I've only taken a brief look at the material, but I really like how the authors focus on what can be done with programming, i.e. they have students writing code to animate images in the first or second chapter!
ReplyDeleteIf I could add one thing to your list it would be that schools really need to attempt to make CS more exciting for students. My experience in introductory CS courses at two universities was that the material was quite stiff. My physics and chemistry professors were able to weave the history of their fields into the lecture while the CS professors just taught us how to do X in language Y. I think this is at least partially due to the immense pressure on schools to produce competent C++/Java programmers in 4 years, which as you mention is a very tall order. I believe that if introductory courses were taught in Racket or Python instead, students would have much more room to experiment on their own, and truly learn how liberating programming can be!
Hello, can I forward this post on my blog and translate it into Chinese? I'm still a CS student, and think that what you say is exactly what I worry about.
ReplyDeleteMy blog: snowmantw.github.com
Sure! Feel free to forward/translate.
DeleteI agree with you on the importance of discrete math, but I beg to differ with your opinion that calculus is irrelevant: How, for example, is a computer scientist supposed to analyze the accumulation of round-off errors in a floating-point algorithm without a good grasp of basic calculus?
ReplyDeleteBesides, I think there is a lot of confusion in the academic world between computer science and software engineering. The former is about designing and analyzing algorithms. The latter is about writing and testing maintainable, modular, well-organized code to well-specified interfaces in order to coordinate with others' work to develop large, complex software systems. There is a business need for both, but there is definitely a distinction.