John Dalbey, Ph.D.

presented at Forum for Advancement of Software Engineering Education

We have developed a model for undergraduate programming instruction that we call The Software Engineering Apprentice. This model exemplifies several key "design concepts" from the Guidelines for Software Engineering Education. I would like to summarize the key features that distinguish our model from more traditional instructional models. I hope to emphasize those aspects of our model that may be useful to others designing undergraduate programs in software engineering.

The Software Engineering Apprentice is essentially an applied "case study" method for use in programming laboratory activities. In this regard we strongly support Guideline E.1.i. which recommends that students engage in the practice of software engineering through scheduled laboratories. Thanks to a grant from DISA we were able to develop a set of innovative and sophisticated laboratory programming "case studies" to accompany a Fundamentals of Computer Science course sequence. Each case study is a complete software application which demonstrates software engineering methods appropriate for beginning programmers. These case studies are available at no charge to educators and they include specifications, test plans, design documents, and complete source code, as well as guidelines for instructors.

Programming assignments in the first course typically are small "throwaway" programs (not part of a larger effort) that are built from scratch without reuse. A number of educators argue that this teaches students a "programming in the small" mentality. Guideline 1.b. suggests that from the beginning of their studies students should be introduced to the importance of software engineering. We argue that students can't see the relevance of software engineering when they are given "throwaway" programs where "hacking" will often be more expedient than software engineering. One metaphor I often use is carpentry school. Most programming labs assign students to build a dog house - they get to bang together the entire product but they don't need to engineer it. We think a better approach is to situate students within the skeleton framework of a real house and let them build small pieces of an pre-engineered product.

The Software Engineering Apprentice model is an attempt to create situations where the relevance for software engineering techniques is made apparent even though beginners aren't yet themselves capable of developing large applications. Our approach demands that students work with moderately large pre-existing software applications. Students play an "apprentice" role, participating in tasks found in a real software development environment - testing, code comprehension, maintenance, modification, and enhancement.

Our model features both "in the Small" and "in the Large" activities (Guideline 1.c.). The majority of the introductory activities are assignments completed by an individual, but as the students finish their first course they are given team activities to complete.

Since our lab assignments are intended to accompany a first course, they feature mostly "product" activities and not many "process" activities (Guideline 1.d.). We do provide some coding standards and an explicit procedure for software maintenance which would fall into the "process" category. But primarily we provide students with "products" that were produced by a hypothetical senior engineer that the students are apprenticed to. The case studies include complete software specifications, test plans, design documents, and documented source code for a fully functioning application. Instead of asking students to develop a trivial program completely from scratch, we ask them to carry out small tasks within the framework of a moderately large (by student standards), prewritten application.

The kinds of tasks we give to students mimic those that they might carry out as an entry level programmer in a software development shop - code verification, defect isolation and correction, code modification, and enhancement.

In essence our model offers students a chance to learn how software is constructed using a systematic, disciplined approach to software development, yet without demanding "software engineering" topics to be explicitly included in the introductory course. Students will implicitly be presented with "programming-in-the-large" techniques by reading and comprehending pre-existing code. They will see examples of specification and design documentation, test plans, and coding standards. They will see relevant and meaningful application of the language features they are studying, and they will carry out realistic software development tasks. They will be forced to consider how to adapt their solution to a pre-existing framework and thus by implication they will understand the importance of writing code that can be easily reused or modified by others.

The lab materials have been "field tested" in CS1 - CS2 courses at California Polytechnic State University and at Cuesta Community College. We found them very easy to integrate into the existing curriculum. Students were able to understand and complete the lab assignments with little external guidance from the instructor. Student self-reports indicate that students found the labs to be valuable in learning to read, comprehend, and modify source code. We also think it is important that students found it motivating to work on programs that could perform some significant task (in contrast to the trivial examples found in most textbooks).

A full description of The Software Engineering Apprentice can be found in an article of that title by this author which appeared in the April 1998 issue of Computer Science Education Journal: 

The materials described in this article are available on the web at 

We would like to thank the Ada Joint Program Office and the Defense Information Systems Agency for their funding of the development of these laboratory materials (grant #DCA100-94-1-0004).


Computer Science Department

California Polytechnic State University

San Luis Obispo, CA 93407