Resources for Next Generation Introductory CS Courses
Report of the ITiCSE’'99 Working Group on
Resources for the Next Generation CS 1 Course

Joseph Bergin (co-chair)
Pace University, USA
berginf@pace.edu
Viera K. Proulx (co-chair)
Northeastern University, USA
vkp@ccs.neu.edu
Alyce Faulstich Brady
Kalamazoo College, USA
abrady@max.cs.kzoo.edu
Stephen Hartley
Richard Stockton College of NJ, USA
hartleys@loki.stockton.edu
Charles Kelemen
Swarthmore College, USA
cfk@cs.swarthmore.edu
Frank Klassner
Villanova University, USA
klassner@monet.csc.vill.edu
Amruth Kumar
Ramapo College of NJ, USA
amruth@ramapo.edu
Myles McNally
Alma College, USA
mcnally@alma.edu
David Mutchler
Rose-Hulman Institute of Technology, USA
David.Mutchler@Rose-Hulman.Edu
Richard Rasala
Northeastern University, USA
rasala@ccs.neu.edu
Rocky Ross
Montana State University, USA
ross@coe.montana.edu

ABSTRACT
The ongoing purpose of this working group is to collect, evaluate, and foster the development of resources that might be used in next generation introductory CS courses. Such courses will integrate elements of object-oriented programming and design, program design patterns, concurrency, and event-driven programming. The product of the working group is a web repository that provides resources that might be used in such a course. The site will include sample syllabi, pedagogical patterns, programming and design patterns, course modules, projects, tools and techniques.
The URL for the web site is:
http://csis.pace.edu/ ~bergin/iticse99/


1 INTRODUCTION

The time seems ripe for reconceptualizing the introductory courses in computer science. Over the past few years the first course has become, in many universities, an introduction to programming and little else. More positively, there has been a shift away from procedural programming in the direction of object-oriented programming, though a number of institutions continue to do a good job with Scheme and the functional paradigm. This working group was brought together in the belief that the teaching of introductory courses in computer science needs to be improved and that Java, in particular, gives us opportunities for advancing on a number of fronts to improve both the content and the pedagogy of the introductory courses.
We believe that for the next several years, the object-oriented paradigm will continue to advance and will be the predominant development methodology for almost all software. The implication of this seems clear: the paradigm must be at the core of computer science education.
However, the object paradigm is not a simple extension of the procedural paradigm, as the metaphor of independent interacting objects and the nature of late binding changes the focus of design. The implication is that the programmer must adopt a particular mental model of computation to be successful with the object paradigm. This further implies that the pedagogy of objects is different from that of other programming paradigms.
The members of this working group are committed to finding ways to develop this new pedagogy and to promote its use in the CS education community. However, rather than just talk about the difference and exhort our colleagues to learn new ways of teaching, we believe that techniques and resources for accommodating this new pedagogy must be demonstrated. We also feel that many of the tools and examples used by educators who are teaching other paradigms are not entirely appropriate for teaching object technology and so there is a need for new course resources that use this new methodology effectively. This working group begins to fill this need.

2 COURSE DESIGN CHOICES

The working group members are not going to try to predict all features of new introductory courses, beyond the choice of the object-oriented paradigm. Java was chosen for its features and not because of any belief that its use is necessary in such a course. Indeed, Java merely sets a focus for our work, some of which was begun in other languages, notably C++. Indeed, one of the modules developed here introduces assembly language.
The intent is to provide resources that might be used by instructors in courses designed according to their own standards. We do believe that some topics that have not traditionally been taught are becoming more important to software development generally, and so we have focussed on these areas. Among these topics are concurrency, event-driven programming, graphical interface programming, and programming and design patterns.
The course also needs to be more than a course in programming techniques. Design may be introduced in a variety of ways, through the use of standard OO diagramming techniques and design patterns. Breadth may also be brought into the course by judicious choice of the projects on which students work. These are intended to show the student the range of possibilities of software.

The choices that an instructor must consider in defining the nature of object-oriented introductory computer science courses include the following.

Objects-First vs. Procedural-First

It is generally agreed in the computing community that programming using the object-oriented model requires a different approach and way of thinking than traditional procedural programming. The object model requires a distribution of computation among objects in which the sender of any given message may not know the type of the receiver or the implementation of the message action. In concurrent situations, it will not even be clear at what time certain messages are executed.
It has been found that practitioners who were trained on the top-down procedural paradigm cannot easily make the paradigm shift to the object model. This means that the question of how to teach students entering the discipline is quite important.

Based on the belief that it will be harder for students to learn if we force them into a paradigm shift, the objects-first approach exposes students to objects from the very beginning. Conversely, in the procedural-first approach students are gently led up to objects to avoid a perceived cognitive overload.

Linear vs. Spiral Coverage

When using linear coverage, the instructor completes coverage of one topic before moving on to the  next. When using spiral coverage, the instructor visits each topic several times over the course of the introductory sequence, incrementally covering the material on each pass.

Closed vs. Open Laboratories

In closed labs, contact time is dedicated to having students solve problems under the instructor's supervision. In contrast, students solve problems in open labs on their own time without direct supervision.

Breadth-First vs. Depth-First Coverage

In breadth-first coverage, selected topics from various computer science fields are carefully introduced through examples and exercises. Alternatively, the first course may focus on programming only.

Sequential vs. Concurrent Paradigm

Students can be taught traditional single-threaded execution or the course can contain elements of multi-threaded, concurrent programming.

Using Toolkits vs. Base-Language

Instructors may choose to use toolkits and development libraries that support the pedagogical process (e.g. I/O objects) or choose to work exclusively with the standard base language and libraries.

Graphical vs. Text-Only

Instructors have a range of choices in the form of user interaction used in their exercises and examples, from text-based, to graphical output, to event-driven GUI's.

Applications vs. Applets

Of the choices described here, this is the only language-specific choice. If Java is chosen, the instructor must decide whether to use applets, applications, or both.

3 PEDAGOGY

The pedagogy of object-oriented program design is fundamentally different from traditional ways of teaching introductory programming and design. Polymorphism, late binding, and message passing demand a change in program design techniques. The client/server view of computation is especially useful. Therefore, the pedagogy is much less bottom-up so that students deal almost immediately with larger program components (e.g. objects).
It also encourages the assignment of larger student projects and allows students to work on small parts of very large projects. Students are introduced early to standard libraries and become comfortable with the idea of reuse and working in environments in which they have little or no control over some parts of the project.
The Pedagogical Patterns Project (http://www-lifia.info.unlp.edu.ar/ppp/) describes a number of different techniques that can be used in teaching computer science and especially object-oriented programming and design. The working group repository will catalog appropriate existing pedagogical patterns and develop new pedagogical patterns that aid in teaching with objects. Modules included in the repository will reference the applicable pedagogical patterns.

4 PROGRAMMING AND DESIGN PATTERNS

Programming and design patterns provide a framework for the presentation, discussion, and refinement of software design and programming techniques. The design patterns community (http://www.hillside.net/patterns/) uses patterns as a means of communicating detailed problem-solving techniques and effective software architecture designs. To some extent, a pattern is an attempt to discover and codify best practice  with respect to a problem or class of problems. For example, the Model-View-Controller (MVC) pattern describes a way of organizing objects and classes to decouple data models from the way that they are displayed on a screen.
Elementary programming patterns are extremely simple design patterns that can be used by novices in learning programming. See, for example, the Elementary Patterns home page at:
http://www.cs.uni.edu/~wallingf/patterns/elementary/
They provide a way for educators to formalize the motivation, context, structure, applicability, and consequences of the concepts they teach, even in the earliest courses. This is a relatively new focus within the patterns community, so only a few programming patterns have been identified and documented [Astrachan 1998]. One example is the Selection Patterns [Bergin 1999], which describes variations on selection constructs (if, if-else, switch, etc.) and characterizes which situations call for which variation.
The working group's web site provides links to existing programming and design patterns and identifies other useful pattern topics for future development. The categories of programming and design patterns included are:

5 TOOLKITS AND COMPONENTS

Toolkits are collections of components that can be used to support student programming efforts over the course of many laboratory assignments. They can make it possible for students to accomplish tasks that would be difficult to do using just the raw base programming language. Among the areas that toolkits might support are a standard look and feel for student assignments; robust and flexible IO; graphics, plots, visualization, and animation; and concurrency.
Individual components (objects and classes) that may be used in lectures, demonstrations, or laboratory exercises also form a potentially valuable pedagogical resource. Although it is straightforward to build what may be called computer science classes  (arrays, lists, trees, graphs), it is more difficult to invent classes that apply to real world problems and can be understood by students. It is helpful, therefore, for faculty to have a source for a variety of such real world components.
We envision toolkits and components, available in source form, together with appropriate tutorial documents that explain the functionality and pedagogical purpose of the package. Faculty will then be free to adapt the materials as desired.

6 COURSE MODULES

A number of course modules have been developed or collected by our group. They are divided initially into six categories. The primary category is the Integrated Course Module. Such a module consists of a preliminary document to be examined by students, an in-class exercise, an outline of a lecture and an open lab exercise to be completed by students. The preliminary document may be a design or a program, together with some explanation. It requires study prior to the introduction of the topic in class. Group study is preferred to individual study in these modules. The in-class exercise often consists of a team interaction creating a design of something similar to the preliminary document. The open lab provides depth in the topic through student design and programming. Here team projects are especially encouraged. The design of these modules broadly follows the pedagogical patterns expressed in papers in the Pedagogical Patterns Project.
Other types of modules currently included in the repository are:
Stand-alone Project Modules
Each module contains ideas for one substantial stand-alone project.
Programming Patterns Modules
Each module is a collection of short exercises that allow the student to practice a particular programming pattern in a variety of situations. These exercises may or may not be packaged with a discussion of the pattern.
Mini-Lectures / Mini-Labs
Each module is a collection of pairs of mini-lectures and associated mini-labs that explore a topic.
Examples of Classes and Objects
Each module consists of a collection of objects that can be used as examples of interesting objects for teaching. Some of these may be accompanied by short handouts for students or simple verbal exercises.
Toolkits and Components
As discussed above, this is a collection of toolkits and components that supports teaching of the introductory course. The goal is to provide a stable base upon which students build their programs. For example, tools may support building GUIs, provide support for safe control of threads, or support robust filtered input operations.

7 HOW YOU CAN PARTICIPATE

We envision three ways the wider community can participate in our project. First, individuals are invited to submit resources to the project. Accepted resources will usually remain on the developer's site but will be indexed, with links provided from the repository site. The repository site will maintain an annotation page for each included resource. Providing annotations for existing resources is the second way that individuals can contribute to the project. Lastly, comments and suggestions for improvement will always be gratefully accepted.

8 EXISTING RESOURCES

A number of existing resources may be used effectively in the new introductory courses. Some examples follow; others will be on the Web page.
Karel J. Robot
The book, Karel++: A Gentle Introduction to the Art of Object-Oriented Programming, has been updated to Java by Joseph Bergin, with new material added. The new material covers the transition to object-oriented programming in general, and concurrency, including CSP style programming.
URL: http://csis.pace.edu/~bergin/KarelJava/
Karel++JavaEdition.html
BlueJ
The BlueJ project of Michael Kölling at Monash University in Australia provides a very usable design and development environment for beginners.
URL: http://www.sd.monash.edu.au/bluej/
Computer Education Research Group, Monash University
Monash University has established a web site for resources for teaching introductory courses that use Java.
URL: http://www.sd.monash.edu.au/cerg/

9 RELATED WORK

A number of other projects incorporate ideas and resources that are directly applicable to this one.
Rethinking CS101
Lynn Andrea Stein at MIT is developing a new first course in computing that emphasizes concurrency.
URL: http://www.ai.mit.edu/projects/cs101/
Curriculum 2001
The ACM/SIGCSE and the IEEE Computer Society have jointly undertaken a new project to examine the computing curriculum [Roberts 1999]. Curriculum 2001 intends to produce a new set of curriculum guidelines appropriate for current practice.
Northeastern Software Project
Resources developed at Northeastern University for teaching C++ to freshmen are available at
URL: http://www.ccs.neu.edu/teaching/index.html.
Java materials will be added during the next two years.
Rose-Hulman's CS 1 laboratories
Rose-Hulman Institute of Technology has developed a collection of closed laboratories (and associated materials) for teaching freshman an introduction to computer science using Microsoft Visual C++. The materials are available at URL: http://www.rose-hulman.edu/Class/cs/cs100.

10 ACKNOWLEDGMENTS

The working group leaders would like to thank the members for their hard work. We would all like to thank Dan Joyce for his work in organizing the ITiCSE working groups and making all of the arrangements that brought us together.

11 REFERENCES

Astrachan, O. and Wallingford, E. (1998) Loop Patterns. Available:
http://www.cs.duke.edu/~ola/patterns/plopd/loops.html
Bergin, J. (1999) Patterns for Selection. Available: http://csis.pace.edu/~bergin/patterns/selection.html
Rasala, R. (1997) Function Objects, Function Templates, and Passage by Behavior in C++, ACM SIGCSE’'97 Proceedings, 35-38.
Roberts, E., LeBlanc, R., Shackelford, R., and Denning, P. Curriculum 2001: Interim Report from the ACM/IEEE-CS Task Force (1999). ACM SIGCSE’'99 Proceedings, Available: http://www.acm.org/sigs/pubs/proceed/ [1999]

12 FURTHER READING

Bergin, J. (1997) Ten Pedagogical Patterns for Teaching Computer Science.
Available: http://csis.pace.edu/~bergin/PedPat1.2.html.
Bergin, J. (1998) Six Pedagogical Patterns. Available:
http://csis.pace.edu/~bergin/fivepedpat.html.
Fell, H. J., Proulx, V. K., and Rasala, R. (1998) Scaling: A Design Pattern in Introductory Computer Science, ACM SIGCSE’'98 Proceedings, 326-330.
Rasala, R. (1999) IOTools A Model Toolkit for Freshman CS, Available:
ftp://ftp.ccs.neu.edu/pub/people/rasala/iotools
Wolz, U., and Koffman, E. (1999) simpleIO: A Java Package for Novice Interactive and Graphic Programming, Proceedings of the 4th Annual SIGCSE/SIGCUE ITiCSE’'99 Conference, 139-142.