The problem of content in a data structures (CS2) course is quite
dependent upon an understanding of just what is "Computer
Science" today, and where is it going? Computer use has entered
so many fields in recent years, with many different levels of
expertise required, that the distinction between Computer Science
majors and other computer users has become more and more blurred.
When a technology is new, those who work with it often need to
have an intimate knowledge of the inner workings to use it successfully.
As the same technology develops, layers of abstraction are added
and the user is distanced from the internal details. Fewer people
(but still a positive number) need to know the details - are these
the "Computer Science" majors? - while many others can
build very sophisticated programs from components supplied by
others. Even computer "manufacturers" now sell systems
completely constructed out of parts, boards, etc., supplied by
external companies. Still, someone does have to design and build
those components.
We must teach both approaches to data structures - the design
and the use. Students coming out of CS1 should have a fairly
complete introduction to control structures and how to use them.
In CS2 we should introduce data structures as another tool for
building programs, and perhaps concentrate on the use of library
classes/packages as plug-in components to be incorporated into
programs. And while I believe the use of abstraction is vastly
important here, and I try to convince my students to see beyond
any implementation to the abstract concepts, I do feel that some
examples of the implementation of library units are valuable when
introducing these ideas to freshman students. In CS2 I would certainly
include stacks and queues, binary trees, and perhaps some others.
I would also provide libraries containing strings, balking queues,
priority queues, B-trees, etc., to be used without full implementation
details. (The problem here is to provide such libraries without
showing the student the implementation code. Some languages permit
this real "information hiding", while others just hide
the details from other program modules, but not from the human
working on the program.)
Once the use of advanced data structures has been taught, along
with the implementation of a few simple ones, we can move on to
the question of designing, implementing, and evaluating the libraries.
This would seem to be the purview of a course that combined program
design with algorithm analysis, and may fit in the place formerly
held by CS7 several years ago. But the situation is continually
evolving. The question of how far to carry out the expansion of
abstractions in this third course will change over the years.
We must keep looking at the problem, evaluating the alternatives,
and updating our degree programs and offerings to keep up with
that evolution.