Vviewpoints
DOI: 10.1145/1629175.1629192
Viewpoint
what should we teach new
software Developers? why?
Fundamental changes to computer science education
are required to better address the needs of industry.
CoMpUteR sCienCe MUst be at the center of software systems development. If it is not, we must rely on indi- vidual experience and rules
of thumb, ending up with less capable, less reliable systems, developed
and maintained at unnecessarily high
cost. We need changes in education to
allow for improvements of industrial
practice.
The Problem
In many places, there is a disconnect
between computer science education
and what industry needs. Consider the
following exchange:
Famous CS professor (proudly): “We
don’t teach programming; we teach computer science.”
Industrial manager: “They can’t program their way out of a paper bag.”
In many cases, they are both right,
and not just at a superficial level. It is not
the job of academia just to teach run-of-the-mill programmers and the needs of
industry are not just for “well-rounded
high-level thinkers” and “scientists.”
Another CS professor: “I never code.”
Another industrial manager: “We
don’t hire CS graduates; it’s easier to
teach a physicist to program than to
teach a CS graduate physics.”
Both have a point, but in an ideal
world, both would be fundamentally
misguided. The professor is wrong
in that you can’t teach what you don’t
practice (and in many cases, never have
practiced) and therefore don’t under-
stand, whereas the industrial manager
is right only when the requirements for
software quality are set so absurdly low
that physicists (and others untrained
in CS) can cope. Obviously, I’m not referring to physicists who have devoted
significant effort to also master computer science—such combinations of
skills are among my ideals.
CS professor (about a student): “He
accepted a job in industry.”
Another CS professor: “Sad; he
showed so much promise.”
This disconnect is at the root of
many problems and complicates attempts to remedy them.
Industry wants computer science
graduates to build software (at least
initially in their careers). That software
is often part of a long-lived code base
and used for embedded or distributed
systems with high reliability requirements. However, many graduates have
essentially no education or training in
software development outside their
hobbyist activities. In particular, most
see programming as a minimal effort
to complete homework and rarely take
a broader view that includes systematic
testing, maintenance, documentation,
and the use of their code by others. Also,
many students fail to connect what they
learn in one class to what they learn in
another. Thus, we often see students
with high grades in algorithms, data
structures, and software engineering
who nevertheless hack solutions in an
operating systems class with total disregard for data structures, algorithms,
and the structure of the software. The
result is a poorly performing unmaintainable mess.
For many, “programming” has
become a strange combination of
unprincipled hacking and invoking
other people’s libraries (with only the
vaguest idea of what’s going on). The
notions of “maintenance” and “code
quality” are typically forgotten or poorly understood. In industry, complaints
about the difficulty of finding graduates who understand “systems” and
“can architect software” are common
and reflect reality.
But my computer Hasn’t
crashed lately
Complaining about software is a pop-