Resources for Large-scale and Distributed Systems

Resources for Large-scale and Distributed Systems

Modern

Classics

  • On the Criteria to be used in Decomposing Systems into Modules, Parnas (CMU), ACM, Dec 1972

    • Simplifying change as a critical criterion for modularizing software. 

    • Using "Information Hiding" as the criteria for modularization bodes better to Requirements Changes than "Flowchart-based componentization" i.e., conventional "Functional decomposition".

      • Using libraries to share common encapsulated modules.

    • Additional modularization best practices

      • Data structures are not shared/passed outside of the module.

      • The routine and its factory are encapsulated within the module.

      • Encapsulate "formats of control blocks" - i.e., API interfaces.

      • Modules should not rely on sequencing of operations.

    • Clean Decomposition is independent of Hierarchical structure

      • Lower-levels can be reused independently

      • Higher-levels are simplified by using lower-levels

  • Using tool abstractions to compose systems, Garlan, Kaiser, Notkin (CMU/Columbia/UofW), IEEE, 1992

    • Managing complexity and supporting evolution are fundamental problems with large-scale systems

    • Data abstraction allows easier change in design decisions about the representation of data structures, while tool abstraction allows easier change in system functions. 

    • Using event-driven integration to implement functional composition on top of data-abstraction-based modularization.

      • Spreadsheets as an ideal example of this - with additive equations as event-driven control of function - orthogonal to the underlying data.

  • A Note on Distributed Computing, Waldo, et al, IEEE, 1994

    • Can't have a fault-tolerant system when remote calls are made as local calls.

  • Decoupling Change from Design, VanHilst and Notkin (UofW), ACM, 1996

    • Making a change can be expensive, even if limited to a single module - as modules themselves can be complex and large.

    • Recursively decomposing using Parnas' techniques is not easy or appropriate.

    • Decomposing modules around smaller design decisions - encoding one design choice per "submodule".

      • Example design decisions: data type, algorithm, remote or local procedure calling.

      • All design choices are considered equally likely to change.

      • Using C++ template classes

        • Decision not pre-determined by developer.

    • Sub-modularize modules to achieve a fine-grained separation of concerns.

    • Using submodules, the choice of high level modularization could itself be changed without having to rewrite large amounts of code.

  • Modularity for the Modern World, Mary Shaw (CMU), ACM, March 2011

    • Why Modularize?

      • Intellectual control - cognitive independence.

      • Segmentation of work - distribution of responsibilities.

      • Evolution - localize changes, substitutions, composition, keep up with marketplace.

    • Service-oriented architecture