From subroutines to subsystems: component-based software development

In the early days of programming, when machines were hard-wired and every byte of storage was precious, subroutines were invented to conserve memory. Their function was to allow programmers to execute code segments more than once, and under different (parameterized) circumstances, without having to duplicate that code in each physical location where it was needed. Software reuse was born. However, this was a different breed of reuse than we know today: This was reuse to serve the machine, to conserve mechanical resources. Reuse to save human resources was yet to come. Soon, programmers observed that they could insert subroutines extracted from their previous programs, or even written by other programmers, and take advantage of the functionality without having to concern themselves with the details of coding. Generally-useful subroutines were collected into libraries, and soon very few people would ever again have to worry about how to implement, for example, a numerically-well-behaved double-precision cosine routine. This phenomenon represented a powerful and fundamental paradigm shift in how we regarded software. Invoking a subroutine from a library became indistinguishable from writing any other statement that was built in to the programming language being used. Conceptually, this was a great unburdening. We viewed the subroutine as an atomic statement -- a component -- and could be blissfully unconcerned with its implementation, its development history, its storage management, and so forth.

[1]  Frederick P. Brooks,et al.  No Silver Bullet: Essence and Accidents of Software Engineering , 1987 .

[2]  David Garlan,et al.  Architectural Mismatch or Why it's hard to build systems out of existing parts , 1995, 1995 17th International Conference on Software Engineering.

[3]  Ian Thomas,et al.  Definitions of Tool Integration for Environments , 1992, IEEE Softw..

[4]  Evan K. Wallace,et al.  A Robust Evaluation of the Object Management Architecture: A Focused Case Study in Legacy System Migration , 1996 .

[5]  Edsger W. Dijkstra,et al.  The structure of the “THE”-multiprogramming system , 1968, CACM.

[6]  Dan Harkey,et al.  The Essential Distributed Objects Survival Guide , 1995 .

[7]  D. L. Parnas,et al.  On the criteria to be used in decomposing systems into modules , 1972, Software Pioneers.

[8]  David Lorge Parnas,et al.  Information Distribution Aspects of Design Methodology , 1971, IFIP Congress.

[9]  Leonard J. Bass,et al.  SAAM: a method for analyzing the properties of software architectures , 1994, Proceedings of 16th International Conference on Software Engineering.

[10]  David Carney,et al.  Principles of CASE Tool Integration , 1994 .

[11]  Charles H. Schmauch ISO 9000 for software developers , 1994 .

[12]  Robert M. Poston,et al.  Evaluating and selecting testing tools , 1992, IEEE Software.

[13]  Gail E. Kaiser,et al.  Enveloping sophisticated tools into computer-aided software engineering environments , 1995, Proceedings Seventh International Workshop on Computer-Aided Software Engineering.

[14]  G. K. Smelser The structure of the eye , 1961 .

[15]  Mary Shaw,et al.  An Introduction to Software Architecture , 1993, Advances in Software Engineering and Knowledge Engineering.

[16]  Jyrki Kontio,et al.  A case study in applying a systematic method for COTS selection , 1996, Proceedings of IEEE 18th International Conference on Software Engineering.