"Software reuse is the use of existing software components to construct new systems. Reuse applies not only to source-code fragments, but to all the intermediate work products generated during software development, including requirements documents, system specifications, design structures, and any information the developer needs to create software."
Prieto-Díaz, 1993
Wiederverwendung ist eines der Schlagworte der modernen Softwareentwicklung und gilt als ein wichtiges Mittel zur Bewältigung großer Softwareprojekte. Wiederverwendung ist der wiederholte Einsatz vorhandener Komponenten aller Art und dem Zusammensetzen von Software aus diesen Komponenten. Dadurch kann die Anzahl der speziell entwickelten Bausteine zum Teil erheblich verringert werden, was wiederum zur Verkürzung der Entwicklungszeit und zur Verringerung der Entwicklungskosten führen kann.
Die Wiederverwendung beschränkt sich dabei nicht allein auf den Programmcode einer Anwendung. Sie bezieht sich auf alle im Entwicklungsvorgang auftretenden Artefakte, wie z.B. Programmzeilen in Hochsprachen, Prozeduren, Softwaremodule und Klassen. Die genannten Elemente der Wiederverwendung sind alle auf der Ebene der Programmierung und des Programmcodes angesiedelt. Sie treten demzufolge erst sehr spät im Softwareentwicklungszyklus auf. Entsprechende Wiederverwendungstechniken sind somit auf die späten Phasen der Softwareentwicklung beschränkt. Die Konzepte dazu wurden bereits eingehend analysiert (siehe z.B. [Krueger 1992 ], [Biggerstaff & Perlis (Hrsg.), 1989a] und [Biggerstaff & Perlis (Hrsg.),1989b]) und sind der Stand der Technik. Kapitel 2 liefert eine kurze Zusammenfassung dazu.
Die Anwendung der Wiederverwendungsmethoden ist aber nicht allein auf den Vorgang der Programmierung beschränkt, sondern kann und sollte bereits vorher zum Einsatz kommen, zum Beispiel durch den Einsatz von Frameworks , Software-Architekturen, Software-Schemata oder auch durch Anwendungsgeneratoren (siehe z.B. [Krueger, 1992] und [Biggerstaff & Perlis (Hrsg., 1989b ]). Die Effizienzsteigerung durch Wiederverwendung liegt hier wesentlich höher als bei den Ansätzen, die nahe bei den Programmiersprachen liegen (siehe auch Kapitel 2).
Im Software-Engineering verlagert sich der Schwerpunkt immer mehr in Richtung Problemanalyse- und Entwurfsphasen. In diesen frühen Phasen steckt die eigentliche Problematik, die Beherrschung umfangreicher Softwareentwicklungsvorhaben. Die hierbei entstehenden Ergebnisdokumente, wie z.B. Produktdefinitionen und Analysemodelle, sind heute ebenfalls zum Gegenstand der Wiederverwendungsbestrebung geworden.
Die Bisher genannten Phasen der Softwareentwicklung fügen sich zu einem Gesamtbild des Softwareentwicklungsprozesses zusammen. Der sogenannte Strukturierte Ansatz gilt seit den 80er Jahren als Standard und ist es auch heute überwiegend noch. Die verschiedenen Ausprägungen, von denen in Abbildung 1 schematisch das iterierte Phasenmodell dargestellt ist, lassen jedoch bisher eine methodische Vorgehensweise zur durchgängigen Softwarewiederverwendung vermissen.

Abbildung 1: Das itertierte Phasenmodell der Softwareentwicklung
Neben den strukturierten Ansätzen gilt die Objektorientierung als Methode der 90er Jahre, die alle Softwarentwicklungsphasen überstreicht und es ermöglicht, Produkte nach einer durchgängigen Philosophie zu entwickeln. Dabei sind die objektorientierten Programmiersprachen besonders geeignet, auf der Ebene des Quellcodes wiederverwendbare Strukturen in Form von Klassen und Objekten zu erstellen. Objektorientierte Analyse- und Entwurfsmethoden und -modelle eignen sich besonders gut für die Abbildung der Probleme unserer Umwelt in adäquate Softwarearchitekturen.
Einen weiteren Schritt in dieser Reihe stellen die Bestrebungen nach Wiederverwendung auf der Ebene der Analyse und Designmodelle dar. Der Anteil der Programmierung am Gesamtaufwand beträgt nur etwa 20%. Der weitaus größere Teil steckt in der Analyse und im Entwurf. Nachfolgeprojekte weisen nun häufig ähnliche Problemstellungen auf. Somit könnten bestehende Analyse- und Entwurfsdokumente wiederverwendet werden, eine Tatsache, die zu nicht unerheblichen Einsparungen führen kann. Statt grundsätzlich neue Entwürfe zu erstellen, können alte entsprechend modifiziert und angepaßt werden. Allgemein gibt es Bestrebungen, Vorgehensmodelle und Entwicklungswerkzeuge mit speziellen Wiederverwendungseigenschaften zu entwerfen. Diese erlauben es, Wiederverwendung im gesamten objektorientierten Softwareentwicklungsprozeß zu betreiben, d.h.in Analyse-, Design- und Implementierungsphase. Ein Beispiel dafür ist das ESPRIT Projekt Itbaca [Belozina et al.,1994].
Entwurfsmuster bilden eine weitere Ebene über dem bisher genannten. Entwurfsmuster sind keine Softwarekomponenten, aus denen durch einfaches Zusammensetzen neue Anwendungen entstehen. Entwurfsmuster sind Problem-Lösungspaare für in der Praxis auftretende Probleme des Softwareentwurfs (Abbildung 22 ).
Sie tragen somit zur Wiederverwendung von Wissen bei, hier speziell dem Wissen aus dem Software-Engineering. Die Erfahrungen aus über 40 Jahren Softwareentwicklung sind in unzähligen Büchern niedergeschrieben. Oft ist dies nur theoretisch und praxisfern geschehen. Der Weg vom Anfänger zum erfahrenen Softwareingenieur führt bisher über diese Bücher und über viele in der Praxis erworbene Erfahrungen. Auch Entwurfsmuster werden das Problem der Informationsflut nicht beseitigen können. Sie sollen jedoch vorhandenes und relevantes Wissen komprimierenund in eine Form bringen, in der es besser nutzbar ist. Der Lernprozeß soll durch die Verwendung von Entwurfsmustern verkürzt und Anfänger vor zu vielen Entwurfsfehlern bewahrt werden.

Abbildung 2: Problem-Lösungspaar
Wiederverwendung von Software oder deren Komponenten ist kein neuer Modebegriff , sondern ein seit langem erklärtes Ziel. Doug McIlroy prägte bereits 1968 auf der ersten Tagung über Software-Engineering den Begriff mass-produced software components , mit dem die industrielle Fertigung von Software gefordert wird [Krueger 1992]. Der Gedanke liegt nahe, Programme aus vorgefertigten Einzelteilen zusammenzusetzen, ähnlich wie im Maschinenbau durch Maschinenteile und Verbindungselemente neue Konstruktionen erstellt werden. Das Beispiel Maschinenbau zeigt, daß Wiederverwendung keine Erfindung der Softwareingenieure ist, sondern in anderen Bereichen schon weitaus länger existiert und dort mit großem Erfolg angewendet wird. Voraussetzung dafür war im Maschinenbau eine firmenübergreifende Standardisierung und Normierung von Bauteilen. Als Beispiel sei hier die Normierung der Schraube durch Joseph Whitworth genannt. Deren Standardisierung legte in der Mitte des 19.Jahrhunderts den Grundstein für die Massenproduktion und stellte einen weiteren Schritt in Richtung Industrialisierung dar [Kellerman & Treue, 1996]. Dabei wurden Tausende verschiedene, in Handarbeit gefertigte Schrauben, gegen ein relativ kleines, normiertes System ersetzt, das noch heute zu einem der am weitesten verbreiteten gehört (Whitworth-Gewinde mit Zollmaßen).
Ein derart durchschlagender Erfolg ist der Softwareindustrie bisher noch nicht gelungen. Unter anderem ist das auf den Akzeptanzverzug von 10 bis 25 Jahren bis zur Einführung einer neuen Methode oder Technologie in die Industrie zu erklären [Quibeldey-Cirkel, 1994]. Einige der auftretenden Probleme bzw.Widerstände gegen die Wiederverwendung im großen Stil werden im Abschnitt 1.3 aufgeführt.