An approach to software development in which an initial highly abstract representation of some required program is gradually refined through a sequence of intermediate representations to yield a final program in some chosen programming language. The initial representation employs notations and abstractions that are appropriate for the problem being addressed. Subsequent development then proceeds in a sequence of small steps. Each step refines some aspect of the representation produced by the previous step, thus yielding the next representation in the sequence. Typically a single step involves simultaneous refinement of both data structures and operations, and is small enough to be performed with some confidence that the result is correct. Refinement proceeds until the final representation in the sequence is expressed entirely in the chosen programming language. The approach is normally associated with N. Wirth, designer of the Pascal and Modula languages. Compare structured programming.