Abstraction, Modularity, and Layering
Computer scientists have long used a set of tools known as abstraction, modularity, and layering to help them deal with the complexity of designing information technology (IT) systems. The limits of these approaches are tested by large-scale systems in a variety of ways:
Abstraction is the process of simplifying the description of an element of a system to hide unnecessary details and allow greater focus on attributes that are important to system analysis or design. The trick is to select an appropriate abstraction that preserves the necessary attributes of the element without becoming unrealistic. Using abstraction, for example, one can form a simplified abstract model of a packet router and actually prove things about the interconnections of such routers. To some extent, however, performance is the enemy of abstraction. When an algorithm or system is tuned to improve performance, it usually departs from its simple, abstract form, giving up many of the benefits of reasoning about the abstraction.
Modularity refers to the decomposition of a system into smaller subsystems that can be developed separately (and in parallel). Modules encapsulate the internal details of a system component and specify a set of interfaces for allowing interaction among components. As such, changes in the internal configuration of one module do not necessarily require changes to other modules. By reducing the complexity of intersystem dependencies, modularity facilitates more rapid reconfiguration of systems to meet operational requirements. As the scale and complexity of IT systems grow, however, it becomes more difficult to separate functionality cleanly, and the set of interfaces can become more complicated, increasing the possibility of errors in implementation or the possibility that particular circumstances will not be sufficiently addressed.
Layering is a form of modularity that decomposes systems into horizontal strata (layers), each of which depends on the layer below and provides services to the layer above (by adding its own capabilities to those of the lower layers). Layering allows capability to be added to a system by building on what already exists in lower layers. It also allows the implementation of one layer to be changed without necessarily affecting the layers above. Layering is helpful in large-scale systems, but only to a point. It can lead to reduced performance because of the additional overhead associated with moving between layers. Furthermore, when the lower layers fail to do their jobs, the upper-level abstractions fail, and in ways that may net be easily recognizable. A common layer in networks is the transport layer, which allows users to assume that each node in a distributed computation has some number of reliable transport paths to other nodes. If one or more of these fail, then users can quickly find it hard to reason about the system as a whole, unless care has been taken when implementing the lower layers to reduce the difficulties involved in analyzing failures.
SOURCES: The definitions of abstraction, modularity, and layeringderive from those in CSTB (1999b) and Messerschmitt (2000).