``Computing as a Discipline'' [1] presents nine subject areas comprising the discipline of computing. Accreditation boards are using the classifications in ``Computing as a Discipline'' to evaluate computer science programs. COM 1205 and COM 3360 courses include some of the material in six of the nine areas. In the graduate course (COM 3360), the material is covered in greater breadth and depth.
Students learn to express algorithmic knowledge at a high level of abstraction through traversals and visitors. Structural knowledge representation is introduced through class dictionaries. Students learn about analogical reasoning by transforming a program from one data structure to another.
Students learn to design schemas for object-oriented databases. They also learn a novel query notation: traversals and visitors. They learn about XPath, an XML standard, and its applications to XQL, the query language for XML.
Students learn how to visualize programs based on collaborating objects and classes.
Students learn to use a family of programming languages that live on top of object-oriented languages. Implementation of these languages is discussed through operational semantics.
Class dictionaries and traversals and visitors are a new programming language and at the same time a new specification and design language.
The focus is on the Java programming language and how to to use it for traversal-visitor-style programming and for programming collaborations.
Students learn principles of development of flexible software systems. They learn about several design patterns, such as Visitor, Observer, Structure-Shy Traversal, Structure-Shy Object, Context, etc. Extreme Programming is also covered.
``Computing as a Discipline'' describes three important processes used in the computing discipline: Theory, Abstraction, and Design. These courses cover aspects of all three processes:
Students learn definitions of class dictionaries and traversals and visitors and a few theorems and proofs. They become experts at proving very simple ``theorems'' of the form: This object O is a legal object with respect to a given set of classes.
Students learn to abstract class dictionaries from objects. They learn to abstract adaptive programs from object-oriented programs, i.e., they learn Adaptive Programming (AP). They learn to abstract parameterized classes from classes.
Students learn about requirements in the form of use-cases. Students learn about specification, design, implementation, and testing of adaptive software.
A large part of the courses explains how AP works. Since AP uses an excutable specification language for object-oriented programs, specification, design, and implementation are closer together than in other approaches to software development.
Finally, ``Computing as a Discipline'' identifies twelve recurring concepts fundamental to computing. The following concepts are covered extensively in these courses:
AP uses a sophisticated mechanism to bind methods to classes. AP uses a sophisticated mechanism to map abstract traversals to concrete traversals. Using the DJ tool, algorithms may be written parameterized by traversal graphs that are bound late to concrete traversal graphs.
Students learn to design their own models and to debug them first with respect to structure and then with respect to functionality. Debugging of the structure is accomplished through parsing. Debugging of the functionality is achieved through ``evolution histories'' which allow debugging in layers.
Ease of evolution is one of the key properties of adaptive software. Students learn how to evolve their Java or C++ programs by controlling the evolution through class dictionaries and traversals and visitors.
Students learn to effectively deal with multiple levels of abstraction, most importantly learning the distinction between groups of objects and groups of classes. Students are challenged by abstraction level collapsing, such as when a group of classes is suddenly viewed as a group of objects (which happens, for example, when students learn about self-describing class dictionaries and how to write programs for them). Parameterized classes are also used extensively, adding a third layer of abstraction.
When students write traversals and visitors, they operate at multiple levels of abstraction: the object, class, and parameterized class level for the structural information, and the adaptive and object-oriented level for the behavioral information.
Ease of reuse is one of the driving forces behind adaptive software. Students learn how to write software with fewer built-in assumptions, which makes the software easier to reuse in new environments. The Law of Demeter plays an important role.