Option C Layers of Abstraction
The concept of layered software suggests a software development methodology quite different from top-down design. In top-down design one starts with a rather complete description of the required global functionality and decomposes this into subfunctions that are simpler than the original. The process is applied recursively until one reaches functions simple enough to be implemented directly. This design methodology does not, by itself, tend to give rise to layers - coherent collections of subfunctions whose coherence is independent of the specific application under development.
The alternative methodology is called ``bottom-up'' design. Starting at the bottom - i.e. the virtual machine provided by the development environment - one builds up successively more powerful layers. The uppermost of these layers, which is the only one directly accessible to the applications developer, provides such powerful functionality that writing the final application is relatively straightforward. This methodology emphasizes flexibility and reuse, and, of course, integrates perfectly with bottom-up strategies for implementation and testing. Throughout the development process, one must bear in mind the needs of the specific application being developed, but, as said above, most of the layers are quite immune to large shifts in the application's functionality, so one does not need a ``final'', ``complete'' description of the required global functionality, as is needed in the top-down methodology.
https://webdocs.cs.ualberta.ca/~holte/T26/layered-sw.html