Skip to main content
Article thumbnail
Location of Repository

STREAM: A First Programming Process

By Michael E. Caspersen and Michael Kölling


Programming is recognized as one of seven grand challenges in computing education. Decades of research have shown that the major problems novices experience are composition-based---they may know what the individual programming language constructs are, but they do not know how to put them together. Despite this fact, textbooks, educational practice, and programming education research hardly address the issue of teaching the skills needed for systematic development of programs.\ud \ud We provide a conceptual framework for incremental program development, called Stepwise Improvement, which unifies best practice in modern software development such as test-driven development and refactoring with the prevailing perspective of programming methodology, stepwise refinement. The conceptual framework enables well-defined characterizations of incremental program development.\ud \ud We utilize the conceptual framework to derive a programming process, STREAM, designed specifically for novices. STREAM is a carefully down-scaled version of a full and rich agile software engineering process particularly suited for novices learning object-oriented programming. In using it we hope to achieve two things: to help novice programmers learn faster and better while at the same time laying the foundation for a more thorough treatment of more advanced aspects of software engineering. In this article, two examples demonstrate the application of STREAM.\ud \ud The STREAM process has been taught in the introductory programming courses at our universities for the past three years and the results are very encouraging. We report on a small, preliminary study evaluating the learning outcome of teaching STREAM. The study indicates a positive effect on the development of students’ process competences

Topics: QA76
Publisher: ACM
Year: 2009
OAI identifier:

Suggested articles


  1. (1968). A Constructive Approach to the Problem of Program Correctness. doi
  2. (1976). A Discipline of Programming. doi
  3. (2002). Agile Software Development. doi
  4. (1991). Cognitive apprenticeship: Making thinking visible.
  5. (1995). Design Patterns: Elements of Reusable Object-Oriented Software. doi
  6. (2007). Educating Novices in the Skills of Programming.
  7. (2000). Extreme Programming Explained: Embrace Change.
  8. (2003). Object Design: Roles, Responsibilities, and Collaborations,
  9. (1978). On the Correctness of Refinement Steps in Program Development.
  10. (2003). Pragmatic Unit Testing in Java with JUnit. The Pragmatic Programmers. doi
  11. (2008). Problems Encountered by Novice Pair Programmers. doi
  12. (1971). Program Development by Stepwise Refinement. doi
  13. (1990). Programming from Specifications, doi
  14. (1990). Programming in the 1990’s. doi
  15. (1996). Programming pedagogy − a psychological overview. doi
  16. (1999). Refactoring: Improving the Design of Existing Code. doi
  17. (1998). Refinement Calculus: A Systematic Introduction. doi
  18. (1972). Structured Programming. doi
  19. (2004). Teaching Software Development Methods: The Case of Extreme Programming. doi
  20. (2003). Test-Driven Development by Example. doi
  21. (2004). Test-Driven Development Goes to School.
  22. (2006). Test-Driven Learning: Intrinsic Integration of Testing into the CS/SE Curriculum. doi
  23. (2003). The BlueJ System and its Pedagogy. doi
  24. (1981). The Science of Programming. doi
  25. (2009). Unit Testing in BlueJ. doi
  26. (2004). Using Software Testing to Move Students from Trial-and-Error to Reflection-in-Action. doi

To submit an update or takedown request for this paper, please submit an Update/Correction/Removal Request.