3 Konfigurationsmöglichkeiten von Software

3.1.1 Ablauf des Softwareentwicklungsprozesses



Der Softwareentwicklungsprozess umfasst nach [Balz 2001] 6 Phasen, die in Abbildung 1 dargestellt sind. Die Softwareentwicklung beginnt mit der Planungsphase, in der eine Untersuchung vorgenommen wird, ob sich das Softwareprodukt nach fachlichen, ökonomischen und personellen Gesichtspunkten realisieren lässt. Es werden hier diverse Studien durchgeführt, um das passende Produkt auszuwählen und schließlich grob Anforderungen, Funktionen, Qualitätsmerkmale etc. zu erheben. Schließlich muss in dieser Phase überprüft werden, ob sich das Projekt umsetzen lässt. Am Ende stehen das Lastenheft, ein Projektplan und eine Aufwandsschätzung62.
Hier schließt sich die Definitionsphase an. In dieser Phase werden die anfangs noch sehr vagen Produktanforderungen spezifiziert, indem sie mit Hilfe verschiedener beteiligter Akteure ermittelt, deren Daten und Funktionen modelliert, analysiert und nach Simulation und Ausführung festgelegt werden. Ziel ist es, ein konsistentes und vollständiges Produktmodell zu entwickeln. Das Ergebnis dieser Phase ist ein Pflichtenheft, eine konkrete Zusammenfassung aller zu realisierenden Anforderungen, Funktionen, Daten und Strukturen, und ein Produktmodell oder ein oberflächlicher Prototyp.63.
In diesen beiden Phasen ist der Begriff des Requirements Engineering verankert64.
In der Entwurfsphase werden auf Grundlage der erfassten Anforderungen die Softwarearchitektur, die Nutzeroberfläche, Schnittstellen, Datenbankanbindungen und andere Zielplattformen entwickelt. Hier werden Rand- und Umfeldbedingungen berücksichtigt und die grundlegenden Entscheidungen z.B. über Schnittstellen zu peripheren Programmen getroffen. Die zu entwickelnde Softwarearchitektur beschreibt die Struktur des Software-Systems durch die Systemkomponenten und deren Beziehungen. Sie soll funktionale und nichtfunktionale Produktanforderungen und Qualitätsanforderungen erfüllen und Schnittstellen versorgen65.
Die Ergebnisse dieses Abschnitts sind die Vorraussetzungen der Implementierungsphase. Hier wird die entworfene Softwarearchitektur in Programmiertätigkeiten überführt, um die geforderten Leistungen der vorgegebenen Spezifikation zu implementieren. Dazu gehören die programmiertechnische Entwicklung der Software sowie die Dokumentation und Testfälle.
In der nun folgenden Abnahme- und Einführungsphase wird die fertiggestellte Software an den Auftraggeber oder Markt nach zahlreichen Tests und mit einem Abgabeprotokoll übergeben.
Dann folgt bei Auftragsarbeiten die Einführung bei dem Kunden durch Installation, Schulung, Übergabe der Benutzerdokumentation und Inbetriebnahme der Software.66.
Die Wartungs- und Pflegephase beginnt nach der Softwareeinführung. Herausforderungen sind die Fehlerkorrekturen, das Altern der Software und somit nötige Leistungsverbesserungen und das Anpassen von Änderungen oder Erweiterungen. Hier können auch bereits Informationen und Anforderungen an ein neueres Produkt gesammelt werden.67.
Testen und Validieren sind integrierte Aufgaben, die sich durch alle Phasen ziehen.68.


3.1.2 Konzepte der Systemfamilienentwicklung


Zur Bewerkstelligung der besonderen Anforderungen von Systemfamilien und der Wiederverwendung auf der Ebene des Codes, des Design und der Architektur von Software werden im Folgenden dazu Konzepte und Methoden69 vorgestellt, die einander bedürfen und aufeinander im Laufe der Softwareentwicklung aufbauen.
Ausgehend von der Objektorientierung und deren feingranularen Klassenstruktur wird Code wiederverwendet. Spezialisierte Klassen über definierte öffentliche Schnittstellen lassen sich in Klassenbibliotheken zusammenfassen und wiederverwenden. Über Vererbung können neue Klassen abgeleitet werden, an die dynamisch Anfragen gestellt werden können. Der konkrete Einsatz zur Laufzeit von Klassen kann über den Polymorphismus oder ifdef- Anweisungen70 gesteuert werden. Die Erstellung universeller Klassen bedarf dabei sorgfältiger Analysen und Merkmalmodelle, die jedoch das Prinzip der Datenkapselung verletzen, wenn periphere Funktionen wie Persistenz, Sicherheit, Remotezugriffe etc. in verschiedenen Klassen geändert werden. Dafür lässt sich die Aspektorientierte Programmierung einsetzen, wo solche kritischen Prozesse in eigenen Klassen zusammengefasst werden, die Basisklassen enthalten nur noch reine Logik.
Das erhöht die Wartbarkeit und die Wiederverwendbarkeit. Diese Fachklassen werden in den restlichen Code 'eingewoben'.
Klassen selbst sind aber für eine komfortable Wiederverwendung oft zu klein, wenn sie nur eine Funktion abdecken. Deswegen haben sich gröbere Strukturen wie Komponentenarchitekturen oder Plugins bewährt. Ihre Granularität bestimmt sich nach Angaben der Performance und Skalierbarkeit, ihrem Installationsumfang und der Anzahl der Komponenten im System. Hier wird nur noch in Container, also Laufzeitumgebungen, die sich um die technischen Belange kümmern, und die Komponenten mit der reinen Berechnungslogik unterteilt.
Gute Konfigurierbarkeit in den Komponenten gewährleistet die Verwendung für Systemfamilien.
Die Wiederverwendung findet nicht nur im Code, sondern auch in der Architektur und dem Design statt. Dies kann auf Designebene mit Entwurfsmustern, welche Designerfahrungen auf konzeptioneller Ebene beinhalten, und auf Architekturebene mit Frameworks geschehen. Allumfassend beschäftigt sich die Generative Programmierung mit dem Erstellen eines stabilen 'Stecksystems' aus variablen Komponenten und der automatischen Ableitung über Generatoren, die z.B. auf GenVoca basieren. Persistente Einstellungen können im laufenden System z.B. in XML spezifiziert sein.


 


Top| Home| << Zurück | Nächste >>
" TARGET="_blank"> >> Home Page <<