ACM Computing Surveys 28A(4), December 1996, 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,


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.

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

Last modified: Tues Oct 1 23:20:43 EDT 1996
Kim Bruce <>