Flexibility: The ease with which a system or component can be modified for use in applications or environments other than those for which it was specifically designed We find this surprising because hardly any artefact is ‘flexible’ in absolute terms. The RAM capacity of a desktop computer, for example, can be expanded only if the hardware and the operating system were specifically designed to accommodate for such changes.
Rapid technological developments pervade every aspect of daily life, having a direct effect on the software we use. Every element of the software’s operational environment is in a state of constant flux: Frequent changes in the hardware, operating system, cooperating software, and client’s expectations are motivated by performance improvements, bug-fixes, security breaches, and attempts to assemble synergistically ever more sophisticated software systems. Classic and contemporary literature in software design recognize the central role of flexibility in software design and implementation. Structured design, modular design, object-oriented design, software architecture, design patterns, and component-based software engineering, among others, seek to maximize flexibility.