ACM Computing Surveys
28A(4), December 1996,
http://www.acm.org/surveys/1996/Formatting/. Copyright ©
1996 by the Association for Computing Machinery, Inc. See the permissions statement below.
Thoughts on Computer Science Education
Kim Bruce
Williams college,
Department of Computer Science
Bronfman Science Center, Williamstown, MA 01267, USA
kim@cs.williams.edu,
http://www.cs.williams.edu/~kim
Introduction
It is difficult to look back and find a "golden era" of computer science
education. Curriculum '68 was widely praised for pointing the way to a
discipline of computer science, but the field was still so young that a
great deal of progress needed to be made before a solid curriculum could
be established. Curriculum '78 was roundly criticized as merely describing
the current state of computer science education at large universities,
rather than pointing the way to the future. The Curricula '91 report came at
an awkward time for the discipline - a time when there were strong doubts
about the wisdom of teaching an introductory course which focussed almost
entirely on teaching programming. Yet the main proposal for a replacement
was a broad-based introductory sequence that had yet to be tried at more
than a handful of institutions. As a result, the ensuing report did not
recommend a specific curriculum, instead presenting a large number
(probably too large a number!) of "knowledge units" which departments were
urged to combine into a coherent curriculum. While there were many
possible implementations presented in that report, it was not sufficient
to provide guidance for departments that needed help, and it caused great
frustration for authors and publishers who wished to write texts for a
national curriculum.
I believe that after a period of experimentation, some curricular
directions are now becoming clearer. In the next few paragraphs we
explore several of these.
The general report on Strategic Directions in Computer Science Education
discussed general issues that need to be addressed in CS Education.
In this piece I would like to discuss some important particular issues
that I feel need to be addressed in
designing more up to date curricula in Computer Science. There is no
attempt here to be complete, and no claim is made that these are THE most
important issues. Instead they reflect my concerns about the impact of
programming languages and paradigms as well as my concerns about the role
of theory in computing.
Including the object-oriented paradigm into the curriculum
Perhaps the most obvious change since the Curricula '91 report has been
the growing importance of the object-oriented paradigm. While this area
has been over-hyped, it is becoming clear that there are important
advantages (especially in terms of composition and reuse of code) to this way
of viewing problems and organizing code. Unfortunately, the current
generation of object-oriented programming languages has had many
deficiencies compared with more traditional imperative languages. However,
there is great hope that the next generation of object-oriented languages
will provide more support for the programmer in writing reliable,
easy-to-understand code. For example, the new language Java is one of the
first
object-oriented languages to recognize the importance of language design
in supporting reliability and security in the production of software.
Future object-oriented languages will combine these features with a simple
conceptual model and safe, yet expressive, type systems in order to
simplify the production of truly reusable software components.
Unfortunately, for all of the advantages of the object-oriented paradigm,
there are corresponding disadvantages. While a good library for an
object-oriented language is much more likely to be useful than a
similar library for an imperative language, it is also
correspondingly more difficult to design a good library. The designer
must not only consider the needs of users of the components, but also
those who wish to make incremental changes to the provided classes in order
to adapt them to slightly different situations. Similarly it is often
hard for those who have first learned a more standard imperative approach
to learn the object-oriented way of designing algorithms. Those who have
shifted to object-oriented languages often report an "aha" experience
after several years using these languages. Object-oriented modelling is
more difficult to understand and do and will require extra effort and time
for the key ideas to get through.
I believe that the object-oriented approach will need to permeate our
curriculum, but fear that it may take more time to get the ideas across
than more traditional approaches.
Introductory courses
There have been several problems with the introductory course. Many
have advocated the need to move from an introductory sequence which is
predominately programming to a more broad-based sequence. On the other
hand, experience in teaching broad-based introductory sequences has shown
that it is quite difficult to create a broad-based course which retains
student interest and is perceived as being of value.
Moreover there has been no consensus on what language
should be used in introductory courses. Pascal has clearly outlived its
usefulness, especially in data structures courses where the lack of
support for data abstraction is a tremendous handicap. Some have suggested
C as the appropriate language, but its support for abstraction is no
better than Pascal, and its syntax and low-level orientation make it more
error-prone than Pascal.
As stated above, accumulating evidence suggests that object-oriented
languages are likely to be dominant in the future. This has led many to
advocate C++ as the introductory language of choice. However most
programmers have found C++ to be difficult to master, especially if one
wants to adopt a truly object-oriented approach to program design. While
languages like Eiffel might be a much better choice, political
considerations suggest that it is unlikely to emerge from the pack.
Instead the new language Java may provide a useful compromise. It's
C-like syntax and support for programming on the world-wide web make it an
attractive choice for many, while its relatively simple conceptual model,
support for garbage collection, and relatively comprehensive graphics
library make it an attractive choice for introductory courses. While Java
desperately needs support for parameterized classes, there is every
indication that this will come in the near future.
Moreover, object-oriented languages' support for modelling suggests that an
introductory sequence can be created which discusses issues of modelling
as applied to many different areas of computer science. Students could
add features to an emulated computer architecture, experiment with
different data structures for indexing data bases, or experiment with
different heuristics for AI problems. The object-oriented paradigm should
make it easier for the instructor to provide a simulator which can then be
added to or modified by students. Thus students can build their
programming skills while learning about other areas of computer science via
emulators. Moreover, the use of inheritance will require students to read
other programmers' code, making it easier for them to write good code
themselves. This mix of programming and broader-based approaches may prove
to be more successful than either of the alternatives.
The importance of learning multiple programming paradigms
In spite of the focus above on object-oriented languages, it is quite
important for students to learn other ways of approaching and solving
problems. Too many students only know one way to approach problems. All
students should be exposed to the functional and perhaps the logic or
constraint-based approaches to problem-solving. Those who know only one
approach to problem-solving find it quite difficult to shift to a new
approach.
The role of theory in CS curricula
Theory has been ghettoized in most current computer-science curricula.
It is typically relegated to a single theory of computation course, which is
not even required in most programs. Moreover, the material covered in this
course has barely changed in the last 20 years, generally representing theory
for building compilers and classical
material on decidability and complexity classes. Theoretical results play
an important role in such areas as data base and the design and semantics of
programming languages, but these are rarely mentioned in undergraduate
courses. In many colleges and universities, mathematical analyses of
algorithm complexity and correctness are given short shrift in favor of
covering a larger catalog of algorithms. We need to rethink our approach
to theory and mathematical foundations of computing throughout the
curriculum. We need not embrace mathematics for its own sake, but instead
think of the ways in which it would further students' abilities to deal
with a rapidly changing discipline.
Miscellaneous points
We finish with a few more general points.
- Too few schools have integrated curricula which ensure that important
ideas from earlier courses are built on and expanded from earlier courses.
A curriculum should not simply by a collection of courses whose union
covers everything that we think an "educated" graduate should know. Key
"recurring principles" (for example as described in Curricula '91) should be
identified and reinforced throughout a student's academic career. These
principles can provide a framework for students to organize both their
current knowledge and provide a mechanism to support the acquisition and
use of new material.
- In most schools, the demands of industry play in important role in
curriculum design. Most employers have lists of items they want new
graduates to know or to be able to master in order to be hired. A curriculum
which turns out students who are not employable will not survive long.
However, colleges and universities need also to think about their graduates
long-term needs. If a curriculum is designed around today's industrial
needs, what happens to the students when those needs change? Moreover
some faculty seem to feel that if most entry level positions
require competence of language X on architecture Y with operating system Z,
then this means that students should learn these items from the beginning
of their academic careers. Others have argued that this is analogous to
requiring pilot trainees to begin learning to fly on jumbo jets. As
faculty our job is to ensure that students have mastered certain ideas and
skills by the end of their academic careers. Starting with simpler ideas
and tools allows students to master the fundamentals before attempting to
deal with more complex situations and tools.
We need to ensure that our students have the ability to
keep up with the inevitable changes to the field throughout their careers,
as well as have the necessary skills to find productive employment upon
graduation. Because of the difficulty of forecasting exactly what those
skills are, we should be conservative about chasing after the latest
technology, while actively pursuing breakthroughs which have an impact on
fundamental principles underlying the discipline.
Several years ago I served on a committee writing a report on teaching
computer science. Because the words "Dynamic And Rapidly Changing" were
repeated over and over in the report, we coined the acronym DARC in order
to save words by describing Computer Science as a "DARC" discipline.
The description is still apt as both the focus and many of the details of
the discipline change rapidly over time. The difficulty is to be
able to stand back far enough and yet still look carefully enough to see
the broad outlines of the fundamental principles that graduates need to
know. It is easy to fall into the trap of believing all graduates need to
know nearly everything. Instead we need to focus on those items which are
necessary as a foundation to enable the later mastery of more specialized
material. Reasonable people will disagree on what those items are, but we
are all likely to learn as we engage in these discussions.
Permission to make digital
or hard copies of part or all of this work for personal or classroom
use is granted without fee provided that copies are not made or
distributed for profit or commercial advantage and that copies bear
this notice and the full citation on the first page. Copyrights for
components of this work owned by others than ACM must be honored.
Abstracting with credit is permitted. To copy otherwise, to
republish, to post on servers, or to redistribute to lists, requires
prior specific permission and/or a fee. Request permissions from
Publications Dept, ACM Inc., fax +1 (212) 869-0481, or
permissions@acm.org.
Last modified: Tues Oct 1 23:20:43 EDT 1996
Kim Bruce
<kim@cs.williams.edu>