Directions in Computer Science Education
Eric Roberts, Stanford University
Before offering my recommendations on appropriate directions for
computer science education, it is important for me to outline the
assumptions on which those recommendations are based:
-
Exposure to programming and the discipline of computer science
is valuable for a wide variety of students and not just for those
who choose to major.
In my experience, learning the basics of programming is a valuable
component of a general education today.
Computing has become a part of almost every discipline, and students
benefit from even a modest understanding of what goes on inside the
black box.
If nothing else, allowing students to learn for themselves that
programming is difficult gives them a more mature perspective on the
potential and limitations of computing technology.
- The demand for well-trained computer scientists will continue
to be strong well into the next century.
Although my perspective may be colored by being in Silicon Valley in a
season of significant hiring, I see no evidence that demand for computer
science graduates will diminish in the foreseeable future.
- The engineering aspect of our discipline has matured to the
point that students need a greater understanding of specific
methodologies, platforms, and tool sets.
The discipline of programming has changed in recent years.
In the modern world, programming often requires starting with a huge
infrastructure -- an application generator, a rich class library,
or simply an existing browser -- and adding small amounts of new
functionality on top.
Industry today has a growing need for computer science graduates who can
manage this type of complexity and who have been exposed to leading-edge
technologies and practices.
- Computer science will continue to evolve rapidly.
The pace of change in computer science places enormous pressure on the
educational system.
The overall curriculum and individual courses must change every few
years.
- Most computer science education will continue to occur at the
college level.
High schools are unlikely to provide much more computer science
education than they currently do.
Given the salary and status that accrue to precollege teachers, it is
difficult to attract and retain teachers with the necessary skills.
- Computer science education will remain people-intensive.
While it is tempting to imagine that the fact that computers and the
information superhighway would be well suited as a medium for the
delivery of education, my suspicion is that it will work less well for
teaching programming than it does in most other domains.
In my experience, teaching people to program effectively requires a
large number of contact hours, particularly between students and
teaching assistants who can answer their questions in the laboratory.
These assumptions lead me to make the following recommendations:
- Colleges should seek to offer a wide-spectrum introduction to basic
programming concepts.
Because high-school computer science is often so weak, many students
enter college with little understanding of what computer science is and
why it might be interesting.
Offering computer science courses to a wide audience -- our
department, for example, enrolls between 70 and 75 percent of Stanford
undergraduates -- gives students who choose other disciplines an
exposure to programming while simultaneously encouraging more students
to consider computer science as a major.
- Computer science students need exposure to the breadth of the
discipline, but not at the very beginning.
The emphasis in Curriculum '91 on early exposure to breadth is an
important goal.
Unfortunately, the approach of putting this material in the first course
has not been very successful, primarily because students do not yet know
they are interested in those topics; in most cases, they enrolled to
learn about programming and see other topics as diversionary.
I've recently been promoting a "breadth-second" strategy, in which
students first take a programming course that piques their interest and
then follow that up with a broad survey of the field.
- Students need exposure to modern software development
practices.
It is no longer acceptable to teach programming by having students write
small, self-contained programs from scratch.
Even though we cannot predict exactly what toolkits and programming
environments students will use when they graduate, it is essential that
they learn to work with some modern programming environment that
forces them to add small amounts of special-purpose code on top of a
large existing infrastructure.
Moreover, this experience should come early in the curriculum so that
students can apply these techniques in summer internships and their more
advanced courses.
- Some classical topics must be deemphasized to make room for
the new material.
In most programs, the restrictions of a four-year degree make it
difficult to add new topics without taking others away.
It is impossible to cover such critical topics as software engineering,
human-computer interaction, networks, and graphics without reducing the
amount of time devoted to classical topics whose importance has faded
with time, such as assembly language programming, compiler construction,
automata theory, and complexity.
These topics must be included somewhere in the curriculum, but it is no
longer practical to require entire courses in these areas.
- There should be a national effort to encourage the development
and distribution of good curricular materials.
Given the pace of change in the field and the difficulty of developing
effective materials, many colleges and universities are not in a
position to undertake extensive curriculum-development efforts locally.
Curriculum '91 -- for all its good ideas -- has had less
impact than Curriculum '78, mostly because the 1991 document offers much
less guidance to institutions that wish to adopt a more modern
curriculum but lack the resources to do so.
It is therefore critical to encourage institutions that have these
resources to devote more time to developing materials that can be
exported to other colleges and universities.
Moreover, it is important to foster educational innovation in a variety
of institutions along several different lines to increase the likelihood
that effective educational strategies emerge from the individual
efforts.