One of Dijkstra's main questions was:
"Can the programmer arrange his activity in such a way that his growing product remains firmly in his intellectual grip, that he continues to understand what he is doing?" [EWD303]
To write structured programs, Dijkstra proposed five well-known techniques:
- operational abstraction
- representational abstraction
- configurational abstraction (cf. layered software)
- textual encapsulation (cf. modularity)
The latter two are discussed here.
Configurational abstraction essentially refers to layered software, as encountered in Dijkstra's THE operating system:
I am referring to the functions of an operating system that can rebuild a single processor installation into a multiple processor installation, that can rebuild a hierarchy of storage levels into a virtual store etc. [EWD303]
Dijkstra mentioned configurational abstraction's two main goals. First, it helps towards program portability. Second, it allows one to build a virtual machine which is much more attractive to program than the underlying machine.
Textual encapsulation has to do with viewing a program as part of a family of neighboring programs, not as a stand-alone entity. In his words:
It is becoming recognized more and more that it is highly desirable that the transformation of a program into another one of the family should only affect well isolated portions of the program text and should not require adjustments scattered all through the program text.