The Software Engineering Apprentice project is a curriculum development effort funded by a grant from DISA. We have developed a set of innovative laboratory programming exercises in Ada that can be used in a Fundamentals of Computer Science course sequence. The exercises revolve around a series of sophisticated "case studies": complete software applications which we developed to exemplify good software engineering methods. In addition to functioning Ada source code, the case studies include other software development artifacts: specifications, test plans, and design documents.
As an alternative to the "build it from scratch then throw it away" mentality of most assignments in a first course, the Software Engineering Apprentice approach demands that students build upon large pre-existing software applications. Instead of the contrived "language feature of the week" program assignments that are typical in these courses, the exercises we developed are modelled after tasks found in a real software development environment - testing, code comprehension, maintenance, modification, and enhancement.
We have created eight "case studies" for use as programming assignments in CS1-CS2 courses. Each case study may have more than one laboratory activity associated with it. Taken together they span most of the curriculum topics for CS1 - CS2.
Six of the eight cases follow the software engineering apprentice model we developed. Working from pre-existing source code, the case study begins with testing and debugging activities, advances to code modification and reformulation, and eventually to enhancements and upgrades which add new functionality. The last two case studies are traditional programming assignments, in which students are given a problem statement and are required to design and implement a solution from scratch.
The following summary gives a brief description of each case study and details which Ada language features are used.
Pizza - Calculates unit price of a pizza.
Moon Lander - A simulation of landing a rocket on the moon.
Hurkle - A simple guessing game in which the user tries to guess where the computer has hidden a "hurkle" on a square grid.
Jotto - A more sophisticated guessing game in which the user tries to guess a five letter word chosen by the computer.
Inventory - Display and update a simple flat database stored in a text file.
Mahjongg - A very sophisticated solitaire game based on the popular PC game.
Prospero - A simulation of a priority queue in the context of guests waiting to visit the king.
Animals - A "20 questions" style game in which the computer tries to guess an animal that the user has chosen.
In addition to the source code, documentation, and student exercises, we also provided supporting materials for the instructor. For each case study we provided the Ada source code for solutions to the student assignments. We included helpful "notes to the instructor" about each case study, which give teaching tips, estimates of how much work is demanded in each activity, and hints about sources of possible student difficulty. We also provide specific guidelines for how students may work effectively in teams. Without explicit guidance, student team projects are often poorly coordinated. These guidelines provide a strategy to help students organize their team programming projects.
We have produced the materials in a fashion to make them easily portable across hardware and software platforms. The instructional text is all in plain ASCII text and the program source code is in Ada. The source code has been compiled successfully on both DOS and UNIX platforms. The completed materials have been submitted to the ASSET software repository.
The laboratory materials we have developed can easily be adopted to augment any existing introductory course in Ada programming. The materials are not dependent upon a specific textbook or lecture format. They can supplement any existing instructional materials. An additional application for the labs is as a self-paced form of remedial instruction for students who need a refresher on certain topics.
The "modular" design of our materials makes them flexible and easily adapted by instructors with differing styles. Some or all of the case studies could be chosen by a particular instructor for discussion. In a sense we have provided a "smorgasbord" of student exercises, from which the instructor may assign as few or as many as are appropriate for their needs. The exercises can easily be customized, modified, or enhanced. The software applications we developed are rich enough to offer many opportunities for instructors to invent additional exercises which follow the apprentice model.
The 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.
A survey of student opinions about the labs revealed a number of ways in which the students found the labs to be valuable:
* It was helpful to learn by having to comprehend how someone else solved the problem, rather than be stuck in one's own approach.
* Reading and modifying code was great practice at software maintenance, a very realistic skill.
* Being required to integrate a new language feature into the context of a complete program was a key aid to understanding.
* The exercises modelled a strategy for learning a new language, which could be internalized and applied in different situations in the future.
* Working on programs which could perform some signficant task when completed was more interesting and motivating than the typical contrived textbook examples.
These course materials are available at no charge from the Software Engineering Apprentice Project or the ASSET repository.
Download the courseware.