116 KiB
title | date | author |
---|---|---|
Softwaretechnik 1 | Wintersemester 20/21 | Robert Jeutter |
Software: Menge von Programmen oder Daten zusammen mit begleitenden Dokumenten, die für Ihre Anwendung notwendig oder hilfreich sind [Hesse]
Gute Software ist schwer herzustellen
- Entspricht Kundenwünsche, Vollständigkeit
- Funktioniert Korrekt
- Kosten- und Termintreue bei der Erstellung
- weitere nicht-funktionale Qualitätsforderungen
- Benutzerfreundlichkeit, Ergonomie
- Sicherheit
- Zuverlässigkeit, Fehlertoleranz
- Performanz
- Ressourcen-Effizienz, Skalierbarkeit, Übertragbarkeit
- Wartbarkeit, Änder- und Erweiterbarkeit
Softwaretechnik
- Technische Disziplin der Software Herstellung
- Zielorientierte Bereitstellung uns systematische Verwendung von Prinzipien, Methoden und Werkzeugen für die arbeitsteilige, ingenieurmäßige Entwicklung und Anwendung von umfangreichen Softwaresystemen [Balzert]
Wie kann man Software besser entwickeln?
- Ingenieursmäßige Herangehensweise
- Verwendung bekannter Prinzipien und Methoden
- Systematische Vorgehensweise
- Verwendung von:
- Abstraktion, Modelle, Notation, Simulation
- Wiederverwendung:Muster, Komponenten, Framework
- Organisation
- Arbeitsteilung, Integration, Planung
- Verwendung von Werkzeugen
- IDE (Integrated Development Environment)
- Versionierung, Bugtracker, Modellierungswerkzeug
Modellierungskonzepte
Modell: ist eine Abstraktion eines Systems mit der Zielsetzung, das Nachdenken über ein System zu vereinfachen, indem irrelevante Details ausgelassen werden [Brügge]
\rightarrow
Beschreibung eines Ausschnitts der Realität
- erstellen einer Abstraktion
- abbilden signifikanter Eigenschaften
- Deskriptiv/präskriptiv (real oder geplant)
- Sichtweise auf ein System (Struktur, Verhalten, Zustand,...)
- heißt Weglassen
- setzt Verstehen voraus
- ist nicht automatisierbar
Verschiedene Modelle:
- Analysemodell
- Entwurfsmodell
- Implementierung (-smodell)
- Vorgehensmodell
- Produktmodell
- Dokumentation, Alternativen-Auswahl
Modelle für:
- Sichten
- Funktionen
- Daten
- Algorithmen
- Systemumgebung
- Dynamisches Verhalten
- Objektorientierte Modelle
Klassische Modelle
- Funktionen:
- Funktionsbaum
- Hierarchische Dekomosition der Fkt
- nummerieren der Ebenen/Funktionen möglich
- Bsp: Abonnement Verwaltung
- Blockschaltbild
- eingebettetes System, HW/SW
- Funktionsbaum
- Daten
- Data Dictionary
- Verzeichnis von Daten mit Strukturinformationen
- Backus-Naur-Form, kontextfreie Grammatik
- Entity Relationship Diagram
- Daten und ihre Beziehungen
- Data Dictionary
- Systemumgebung
- Datenflussdiagramm
- Fluss und Transformation von Daten zwischen Funktionen, Speichern und Schnittstellen
- kein Kontrollfluss
- Datenflussdiagramm
- Algorithmen
- Entscheidungstabelle
- Regelbasierte Beschreibung
- Bedingung
- Aktionen
- Reduktionsregeln
- Pseudocode
- von Programmiersprache abstrahierende, detaillierte Beschreibung eines Algorithmus
- Programmablaufplan
- Grafische Beschreibung des Kontrollflusses
- DIN 66001
- Unstrukturiert
- Struktogramm
- Nassi-Shneidermann-Diagramm
- keine Sprünge
- Entscheidungstabelle
- Dynamisches Verhalten (diskrete Zustände und atomare zustandübergänge)
- Zustandsautomat
- Verhalten mit Zuständen und -übergängen
- Automatenmodelle und -theorie
- Ggf zerlegung oder kommunizierende Automaten
- Flow-Chart
- Ereignisgesteuerte Prozesskette (EPK)
- Geschäftsprozesse
- BPM
- Petri-Netz (ggf. mit Zeitmodell)
- Grafische Beschreibung von Nebenläufigkeit und Synchronisation
- Zustandsautomat
- Objektorientierte Modelle
- Klassendiagramme
- UML
Objektorientierung
- bessere Strukturierung für komplexe Zusammenhänge
- Abstraktere Sichtweise
- Grundprinzip: Zerlegung; Teile und Herrsche
- ein System besteht aus vielen Objekten
- ein Objekt hat
- definiertes Verhalten
- Menge genau definierter Operationen
- Operation wird beim Empfang einer Nachricht ausgeführt
- inneren Zustand
- Zustand des Objekts ist Privatsache
- Resultat einer Operation hängt vom aktuellen Zustand ab
- eindeutige Identität
- Identität ist unabhängig von anderen Eigenschaften
- Mehrere verschiedene Objekte mit identischem Verhalten und identischem inneren Zustand im gleichen System möglich
- definiertes Verhalten
- Klasse
- Gleichartige Objekte mit ggf. verschiedenen Zuständen
- Verhaltensschema – Operationen
- Innere Struktur – Attribute
Vorteile der Objektorientierung
- Zuständigkeitsbereiche
- Daten, Operationen und Zustand: lokal und gekapselt
- Klare Schnittstellen
- Definiertes Objektverhalten, Nachrichten
- Hierarchie
- Vererbung und Polymorphie (Spezialisierung), Klassenschachtelung
- Baukastenprinzip
- Benutzung vorgefertigter Klassenbibliotheken, Anpassung durch Spezialisierung (mittels Vererbung)
Unified Modeling Language
- Grafisches Beschreibungsmittel für Aspekte des Softwareentwurfs diskreter Systeme
- Spezifikation, Entwurf, Visualisierung, Konstruktion, Dokumentation von Software
- Für OO-Softwareentwicklung und -prozess geeignet
- UML ist weder Methode noch Prozess
Warum UML?
- Objektorientierung ist zur Zeit das vorherrschende Modellierungs-Paradigma, Industrie-Standard
- Kombination von Struktur-, Verhaltens-, Interaktions-, und Verteilungsmodellen
- Für Analyse, Entwurf, Implementierung und Test einsetzbar
- Gute Werkzeugunterstützung für Editieren, Versionierung, Codegenerierung
- Erweiterbarkeit der UML mit Stereotypen und Tags
- Semi-formale Modelle, z.T. verschiedene Interpretationen
- Offenheit: Erweiterung mit stereotypes, tags, constraints
Nachteile UML
- UML ist in vielen Facetten nicht präzise festgelegt
- Werkzeuge für Transformation, Analyse etc. fehlen noch
- UML ist keine „kleine Sprache“: Lernaufwand notwendig
- Komponenten sind nicht adäquat darstellbar
- Sprachen wie die UML werden erlernt durch Übung!
- Aber: LV SWT ist kein kompletter UML-Kurs
Überblick über Modelle
- 14 Diagrammarten
- Struktur-Diagramme
- Klassen-, Objekt-, Komponenten-, Kompositions-Struktur-,
- Paket- und Verteilungsdiagramm
- Profildiagramm – zur UML-Erweiterung
- Verhaltens-Diagramme
- Use-Case-, Aktivitäts- und Zustandsdiagramms
- Interaktionsdiagramme: Sequenz-, Kommunikations-, Timing- und Interaktionsübersichts-Diagramm
Use-Case-Diagramm
- Beschreiben Systemfunktion aus Benutzersicht (Was, nicht Wie)
- Erste Anforderungsspezifikation (requirements)
- Planbare Einheiten als Inkremente für die Entwicklung
- Keine Modellierung eines Ablaufs!
- Erstellen von Testfällen (test case generation)
- Grundelemente
- Anwendungsfall: Use Case
- Beteiligte: Aktor
- Verfeinerung mittels Use-Case-Realisierung notwendig
- Textuelle Beschreibung
- Verhaltensdiagramme
Klassendiagramm
- Modellierung der Struktur (Aufbau) eines Systems
- Modellierung von statischen Aspekten
- Modellierung der Struktur von Daten
- Klasse im Mittelpunkt
- Aufbau: Attribute, Operationen
- Beziehungen zueinander: Assoziationen, Vererbung
- Verbreitetstes und bekanntestes Diagramm der UML
Objektdiagramm
- Struktur des Systems zur Laufzeit zu einem Zeitpunkt
- Tatsächliche Zusammenhänge und Belegungen von Attributen von Objekten zu einem Zeitpunkt
- Eine detaillierte Sicht auf einen Aspekt
- Keine vollständige Beschreibung (zu komplex)
- Für kompliziertere Abhängigkeiten (z.B. Rekursion)
- Objektdiagramm für alle Arten von Exemplaren
- z.B.: Klasse (Objekt), Komponente, Knoten, ...
- Keine Exemplare von Operationen -> Ablauf -> Verhaltensdiagramme / Interaktionsdiagramme
- Kein Verlauf der Wertebelegung über die Zeit
Paketdiagramm
- Gliederung (Strukturierung) des Systems in Teile (Pakete)
- Zuordnung von Elementen zu einem Paket
- Bildung von Hierarchien (Enthält-Beziehung)
- Abhängigkeiten zwischen den Paketen
- "Include" von Quellcode-Dateien (<>)
- Anwendung:
- Zum Grobentwurf von Systemen
- Definition von Schichten
Komponentendiagramm
- Strukturierung des Systems durch Komponenten
- Komponente: Modulare, austauschbare Einheit (Substitution)
- Modellierung der Abhängigkeiten zwischen Komponenten
- Modellierung der inneren Struktur von Komponenten
- Definition von Schnittstellen
Kompositionsstrukturdiagramm
- Teile-Ganzes-Strukturen -> Kompositionsstruktur
- Strukturell statische Kompositionsstrukturen:
- Kurzschreibweise bei vielen Kompositionen
- Modellierung des Aufbaus komplexer Systeme
- Strukturell dynamische Kompositionsstrukturen:
- Notwendige Strukturen zur Realisierung eines Verhaltens
- Definition von Rollen, zur Lösung wiederkehrender Probleme -> Modellierung von Mustern
- Starke Verwandtschaft mit dem Klassendiagramm
- Spezialisierte Kompositionsbeziehung -> erweiterte Semantik
Aktivitätsdiagramm
- Modellierung von
- Kontrollflüssen
- Datenflüssen
- Parallelem Verhalten
- Verzweigungen, bedingten und gewichteten Abläufen
- Geschäftsprozessmodellierung möglich
- Abstrakte und detaillierte Verhaltensbeschreibung möglich
- Grundlage zur Codegenerierung
- Zur Verfeinerung von
- Use-Cases
- Operationen / Interaktionen
- anderen Aktionen und Aktivitäten
Interaktionsdiagramme
- Modellierung von
- Kommunikation zwischen Kommunikationspartnern (Lebenslinie)
- Operationen (Modellierung eines Programms)
- Informationsaustausch / Nachrichten
- Gemeinsames Grundkonzept der Interaktionsdiagramme
- Sehr detaillierte Diagramme
- Meist nicht zur vollständigen Beschreibung eines Systems
- Betrachtung eines wichtigen Teilaspekts
- Grundlage zur Codegenerierung
Sequenzdiagramm
- Genaue zeitliche Abfolge von Nachrichten
- Umfangreichstes Interaktionsdiagramm
- Kontrollelemente möglich (Schleifen, Verzweigungen)
Kommunikationsdiagramm
- Kommunikationsbeziehungen der Kommunikationspartner stehen im Vordergrund
- Welche Komponenten arbeiten wie zusammen, um eine Funktion zu erfüllen
Timing-Diagramm
- Genaue zeitliche Darstellung von Zustandsübergängen
- Kommunikation abhängiger Zustandsautomaten
- Modellierung einzelner Interaktion
Prinzipieller Aufbau
- Zeitlicher Verlauf senkrecht
- Kommunikationspartner waagerecht (unsortiert)
- Lebenslinie
- Rechteck mit gestrichelter senkrechter Linie
- Start, Ende und Dauer der Ausführung einer Operation
- Rekursive Aufrufe möglich
- Ereignisspezifikation
- Stelle des Sendens / Empfangens der Nachricht
- Definition der Reihenfolge des Auftretens
- Trace: Folge von Sende- und Empfangsereignissen
Weitere Elemente des Sequenzdiagramms
- Nachrichten ohne Sender
- z.B. am Beginn einer Interaktion
- Verlorene Nachrichten (ohne Empfänger)
- Nachricht ohne dargestellten Empfänger
- z. B. am Ende einer Interaktion
- Erzeugen von Lebenslinien
- Gestrichelte Linie mit geöffnetem Pfeil
- Keine Rückgabenachricht
- Zeitliche Einrückung des Rechtecks
- Zerstören von Lebenslinien
- Durchgezogene Linie mit Dreieckende
- Kann Rückgabenachricht erzeugen
Nachrichten in Interaktionsdiagrammen
- Ereignis des Sendens bzw. Empfangens von Nachrichten
- Typen:
- Operationsaufruf (synchron / asynchron)
- Antwort Nachricht
- Signal (asynchron), Create-/ Delete Message
- Operationsaufruf: Parameterliste muss kompatibel sein
- Nachrichtentypen
Zustandsdiagramm
- Modellierung des (vollständigen?) Verhaltens
- Zustände von Klassen / Objekten / Komponenten
- Übergänge zwischen den Zuständen
- Ereignisse, die Zustandswechsel auslösen
- Modellierung von endlichen Automaten (Zustandsmaschinen)
- Deterministische
- Nichtdeterministische
- Verfeinerung von Zuständen möglich
- Modellierung von verteilten Systemen / parallelem Verhalten
- Grundlage zur Codegenerierung
Analyse
-
Einordnung in den Projektablauf
-
Was ist eine Anforderung?
- Merkmal, Eigenschaft, Bedingung oder Einschränkung eines Systems
- Notwendig für die Akzeptanz vom Kunden
- Definition (IEEE 610.12-1990)
- Dokumentierte Darstellung einer Fähigkeit oder Eigenschaft
- von Anwender benötigt zur Problemlösung bzw. um Ziel zu erreichen
- Muss von System oder Komponente erfüllt werden, um Vertrag oder Standard zu erfüllen
-
Funktionale Anforderungen - Was soll es tun?
- „...Legt eine vom Softwaresystem oder einer seiner Komponenten bereitzustellende Funktion oder Service dar“ [Balzert]
- Was leistet das System
- Welche Funktionen bietet es
- Wie interagiert es mit der Umgebung
- Anforderungen an:
- Verhalten
- Struktur
- (Alternativ: Statik, Dynamik, Logik)
-
Nichtfunktionale Anforderungen – Wie?
- „...legen qualitative oder quantitative Eigenschaften des Softwareprojektes oder einer Komponente fest“ [Balzert]
- Auch Bezeichnet als:
- Quality of Service
- Qualitätsanforderungen
- Arten - FURPS (ISO 9126):
- Functionality (Funktionalität)
- Usability (Benutzbarkeit)
- Reliability (Zuverlässigkeit)
- Performance (Effizienz) / Portability (Übertragbarkeit)
- Supportability (Änderbarkeit/ Wartbarkeit)
-
Funktionalität
- Angemessen, Genauigkeit
- Sicherheit: Vertraulichkeit, Informationssicherheit, Datenintegrität, Verfügbarkeit
- (Nicht ausreichend spezifizierte funktionale Anforderung)
-
Benutzbarkeit
- Verständlichkeit, Erlernbarkeit, Bedienbarkeit, Attraktivität
-
Zuverlässigkeit
- Reife (Fehler-Anzahl), Fehlertoleranz, Wiederherstellbarkeit
-
Effizient/ Leistungsanforderungen
- Zeitverhalten, Verbrauchsverhalten, Wirtschaftlichkeit
-
Portabilität
- Anpassbarkeit, Installierbarkeit, Koexistenz, Austauschbarkeit
-
Wartbarkeit
- Analysierbarkeit, Änder- und Erweiterbarkeit, Stabilität (bei Änderungen), Testbarkeit
-
Weitere:
- Konformität zu Konventionen und Bestimmungen
- Interoperabilität zu anderen Systemen
- Implementierungsanforderungen
- Schnittstellenanforderungen
- Skalierbarkeit (Änderungen des Problemumfangs)
- Betriebliche und rechtliche Rahmenbedingungen
- Liefer- und Verpackungsanforderungen
Nichtfunktionale Anforderungen
Schwierigkeit nichtfunktionaler Anforderungen
- Hängen oft von Verhalten ab: daher komplex und nicht direkt sichtbar
- „Das Auto hat vier Räder“ (Struktur)
- „Wenn der Blinker betätigt wird, blinkt das Auto dreimal wenn die Zündung an ist; ansonsten wird das Standlicht einseitig eingeschaltet“ (Korrektes Verhalten)
- „Das Motorsteuergerät darf innerhalb von 5 Jahren und 150.000km Laufleistung höchstens mit 0.1% Wahrscheinlichkeit ausfallen“ (Zuverlässigkeit)
Umgang mit nichtfunktionalen Eigenschaften
- Nicht direkt „by construction“ zu realisieren
- Naive Herangehensweise: Ignorieren!
- Entwerfen und Implementieren der Software ohne Berücksichtigung nichtfunktionaler Eigenschaften
- Testen der nichtfunktionalen Eigenschaften
- Wenn nicht erfüllt: Entwurf und Implementierung ändern!
- Funktioniert nur bei sehr einfachen Systemen, bzw. wenn nichtfunktionale Eigenschaften nicht wichtig sind!
Sinnvoller Umgang mit nichtfunktionalen Eigenschaften
- Untersuchung der Projektrisiken bereits in der Analysephase
- größte Risiken zuerst betrachten!
- Immer fragen: Geht das so überhaupt?
- Festlegungen des Entwurfs möglichst früh gegen Anforderungen prüfen – aber wie?
- Modellbasierter Entwurf
- Modellierung des Systems und seiner Umwelt
- Bewertung des Modells (Simulation)
- Lehrveranstaltungen Systementwurf, KIS, LTS
Randbedingungen
- „... Eine Randbedingung ist eine organisatorische oder technologische Vorgabe, die die Art und Weise einschränkt, wie das betrachtete System realisiert werden kann.“
- Werden nicht umgesetzt
- Schränken Lösungsraum ein
- Beispiele:
- Kosten
- Durchlaufzeit: Time to Market
- Vorgaben durch Marketing und Vertrieb
- Technische Randbedingungen (nichtfunktionale Anforderung)
Geforderte (Meta-)Eigenschaften
-
Vollständig: alle Szenarien sind beschrieben
-
Konsistent: keine Widersprüche
-
Eindeutig: nur eine Interpretation möglich
-
Korrekt: genaue und richtige Darstellung
-
Realistisch: unter geg. Einschränkungen implementierbar
-
Überprüfbar: durch Tests am Endprodukt nachweisbar
-
Rückverfolgbar: Auswirkungen bis zur Implementierung nachvollziehbar (Testfälle, Auswirkung von Änderungen)
-
Klassifizierbar (Risiko, Priorität, Dringlichkeit, Nutzen ...)
-
Validierung mit dem Kunden
-
Requirements Engineering
- Ermittlung, Analyse und Verwaltung von Anforderungen
- Ausgangspunkt: Projektidee
-
Anforderungsermittlung
- requirements elicitation, requirements definition
- Bestimmen und dokumentieren der Anforderungen an das geplante System
- Beteiligt: Entwickler, Kunde, Benutzer
- Ergebnis: Anforderungsspezifikation - Glossar, Vertrag, Lastenheft
-
Anforderungs-Analyse
- requirements analysis, system modeling
- Beschreibung im Detail und formal strukturiert
- Beteiligt: Entwickler
- Ergebnis: funktionale Spezifikation - Produktdefinition, Analysemodell, Pflichtenheft
Anforderungsermittlung | Systemmodellierung | |
---|---|---|
Ergebnis | Anforderungsspezifikation im Lastenheft, Glossar, Lastenheft | funktionale Spezifikation in Produktdefinition, Analysemodell, Pflichtenheft |
Notation | Text | Text + (semi-) formales Modell |
Kommunikation | mit dem Kunden | zwischen Entwicklern |
Sichtweise | des Anwenders | äußere Systemaspekte |
Vor allem: Kommunikationsleistung! |
Bedeutung:
- Falsche Anforderungen führen zu falschem System
- Frühe Fehler im Entwicklungsprozess sind teuer!
Fehlerentstehung und Fehlerquellen bei Anforderungserfassung
- 83% sprachliche Fehler (Un- bzw. Missverständlich)
- 75% Logische Fehler (Widersprüchlichkeit, Redundanz)
- 73% Inhaltliche Fehler (Falsche Sachverhalte, Unvollständig)
Ermiteln von Anforderungen
Woher kommen Anforderungen?
- Ausgangspunkt
- Projektidee, schriftliche Skizze
- Kurz und knapp
- Stichpunkte der wichtigsten Funktionen
- Lastenheft (falls schon existiert)
- Interessenhalter (stakeholder)
- Identifizieren, Wichtigkeit bewerten (berücksichtigen?)
- Ansprechpartner? Interessen und Erwartungen
- Fachexperten, Verantwortliche, Betroffene
Beteiligte Rollen
- Endbenutzer
- Aufnahme Ist-Zustand, Domänenwissen, Anforderungen
- Kunde
- Definiert Ziel des Systems, Vertragsverhandlung
- Konfigurationsmanager
- Revisionsgeschichte der Dokumente, Nachvollziehbarkeit
- Architekt
- Integration von Anwendungsfall- und Objektmodellen
- Analytiker
- Modelliert das System und erstellt Anwendungsfälle
- Redakteur
- Prüfer
Wie ermittelt man Anforderungen?
- Problem: Entwickler müssen sich in Begriffs- und Denkwelt des Kunden einarbeiten, sonst Kommunikationsprobleme
- Systematische Vorgehensweise
- Kommunikation mit Kunden
- Geschäftsprozess (business process)
- fachlicher Ablauf, der Wert oder Kosten verursacht
- Akteur (actor)
- Benutzer, Schnittstelle nach außen
- Szenario (scenario)
- Interaktion mit System als Ablauf
- Anwendungsfall (use case)
- Automatisierter Arbeitsschritt, vom System ausgeführt
- Interviews mit Fachanwendern
- Mitschrift, später strukturierter Text und Tabelle
- Strukturierte Spezifikation
- Vorlagen / sprachliche Anforderungsschablonen
- Formulare
- Reduzierung sprachlicher Mehrdeutigkeiten
- Anwendungsfalldiagramm (Use-Case-Diagramm)
- Arbeitsschritt eines Geschäftsprozesses, der durch das System ausgeführt wird
- Anforderungen an das System modellieren – was soll das System leisten
- Systemgrenzen / Systemkontext festlegen
- Systembeteiligte modellieren
- Planbare Einheiten als Schritte für die Entwicklung
- Verwendung bereits ab Projektbeginn
- Keine Modellierung eines Ablaufs!
- Umgang mit Szenarien und Anwendungsfällen
- Zunächst nur zum Verständnis kurz aufstellen
- Systemgrenze definieren
- Beschreibungen verfeinern
- Änderungen mit Kunden abstimmen
- Prototypen nur zur visuellen Unterstützung
- Benutzungsschnittstelle erst beginnen, wenn funktionale Anforderungen in etwa klar sind
Leitfaden für Anwendungsfälle
-
Benennen mit Verbalphrasen, die Anwendersicht beschreiben (Simuliere)
-
Akteure mit Substantiven benennen (Anwender)
-
Systemgrenzen klären. Arbeitsschritte von Akteuren und System kennzeichnen
-
Schritte im aktiven Stil beschreiben (Auto bremst)
-
Ursächliche Beziehung zwischen Folgeschritten
-
1 Anwendungsfall = 1 vollständige Transaktion
-
Normalfall darstellen; Ausnahmen gesondert beschreiben
-
Nicht die Benutzungsschnittstelle beschreiben (statt dessen visuellen Prototypen verwenden)
-
Übersichtlichkeit (max. 2-3 Seiten), sonst zerlegen
-
Typische Probleme
- Kommunikations- und Verständnisprobleme
- Viele verschiedene Beteiligte
- Kunden wissen nicht, was sie genau wollen und was geht
- Verwendung von Fachsprachen
- Widersprüchliche Anforderungen, verschiedene Interessen
- Nicht-technische organisatorische, historische oder rechtliche Rahmenbedingungen
- Zusätzliche Beteiligte können auftauchen
- Anforderungen ändern sich während der Entwicklung
-
Anforderungsänderungen
- Sind die Regel
-
Tätigkeiten der Anforderungsanalyse
- Anforderungen strukturieren
- Eigenschaften der Anforderungen bestimmen
- Anforderungen priorisieren
- Anforderungen in Textform, Grafiken, Modellen dokumentieren
- Anforderungen modellieren
- Anforderungen auf inhaltliche Qualität prüfen
- Auf Übereinstimmung mit den Zielen prüfen
- Ziel Abnahme der Anforderung
- Hängt mit Analyse des Systems zusammen
-
Anforderungen strukturieren
- Unterteilung
- Funktional, Nichtfunktional
- Muss, Kann,... oder Haupt- und Nebenanforderung
- Hierarchische Zerlegung
- Unterteilen, Verfeinern
- Ordnung festlegen, eindeutig Nummerieren
- auf Einmaligkeit achten
- Beziehungen festhalten
- Verwendung von Werkzeugen
- MS-Project, Doors, Git issues, Trac, Bugzilla, MKS,...
- Modellierungswerkzeuge
- Unterteilung
-
Eigenschaften bestimmen
- Wahl der Eigenschaften firmen- bzw. projektspezifisch
- Wichtige Eigenschaften
- Identifikationsnummer
- Kurzbezeichnung
- Beschreibung (Text, ggf. Grafik, Modell)
- Aufwand
- Priorität der Anforderung
- Bearbeitungsstatus / Restaufwand
- Zugeordnet (wer ist verantwortlich / bearbeitet)
- Querverbindungen zu anderen Anforderungen
- Ggf. zusätzliche Dokumente oder Bemerkungen
- Stabilität der Anforderung (Änderungswkt.)
- Kritikalität der Anforderung: Schäden bei Fehlern?
- Entwicklungsrisiko: Erfolgsaussichten der Umsetzung
- Abnahmekriterien / Erfüllungsnachweis durch?
- Anforderungstyp: Funktional, nicht funktional ,...
- Anforderungssicht: Dynamik, Statik, Logik, Struktur, Funktion
- Mögliche Konflikte
- Autor
- Quelle: Wer möchte die Anforderung umgesetzt haben?
- Status der Beschreibung: Idee, grober Inhalt, detailliert
- Anforderungsversion
-
Anforderungen priorisieren
- MuSCoW-Priorisierung
- Muss-, Kann-, Optional, Nicht (Abgrenzungskriterien) (must, should, could, won‘t)
- Ad-hoc: Stakeholder priorisiert Anforderungen
- Priorisierungsmatrix / Kosten-Wert-Analyse
- Eigenschaften bewerten (Punkte vergeben)
- Werte gewichten
- Priorität berechnen
Prioritäten = \frac{Nutzen - Nachteil}{Kosten + Risiko}
- Kano-Klassifikation
- Basiseigenschaften: Werden vorausgesetzt (fehlen stört, wenig zusätzliche Zufriedenheit)
- Leistungseigenschaften: Sonderwünsche
- Begeisterungseigenschaften: Wird nicht erwartet
- Abfragen per Fragenkatalog
- Reihenfolge festlegen
Objektorientierte Analyse und Systemmodellierung
- Übersicht
- Aufgabe: Systemmodell erstellen, funktionale Spezifikation
- Beschreibung der Systembenutzung und des Verhaltens
- Was, nicht wie – Implementierungsaspekte ausklammern
- Nicht: Datenhaltung, Verteilung, Technologien, Architektur, ..
- Zusammenhang mit Anforderungsspezifikation
- OO: Modell des Anwendungsbereichs
- Analysemodell
- Korrekt, vollständig, konsistent und nachprüfbar
- Struktur und Verhalten
- Verschiedene Sichten (OO, Strukturiert, ...)
- Eingangsdokumente
- Lastenheft, Anforderungsspezifikation
- Typische Ergebnisse
- Funktionales Modell
- Geschäftsprozesse und Anwendungsfälle
- Objektmodell
- Dynamisches Modell – Systemverhalten
- Zustands- und Sequenzdiagramme
- Vor- und Nachbedingungen von Systemoperationen
- Prototyp / Spezifikation Benutzungsschnittstelle
- Pflichtenheft
- Funktionales Modell
- Objektorientierte Analyse nach [Brügge / Dutoit]
- Verdeutlicht iterativen Ablauf
- Unterteilung des Analysemodells in:
- Funktionales Modell (Anwendungsfälle)
- Objektmodell (Klassen und Objektdiagramme)
- Dynamisches Modell (Zustands- und Sequenzdiagramme)
- Unterscheidung der Objekttypen
-
Heuristik Sprache
\rightarrow
OO-Modell -
Objektarten im Systemmodell
- Entitätsobjekte – vom System verwaltete Informationen
- Grenzobjekte – Interaktion zwischen System und Akteuren
- Steuerungsobjekte – Durchführung der Anwendungsfälle
-
Identifizierung von Entitätsobjekten
- Begriffe, die klargestellt werden müssen
- Wiederkehrende Substantive in Anwendungsfällen
- Heuristiken
- Reale Objekte, die das System kennen muss
- Reale Prozesse, die das System verfolgen muss
- Anwendungsfälle
- Datenquellen und -senken
- Artefakte, mit denen der Nutzer interagiert
-
Identifizierung von Grenzobjekten
- Elemente der Benutzungsschnittstelle
- Formulare für Eingaben
- Nachrichten, Rückmeldungen
- Endgeräte
- In der Begriffswelt des Anwenders bleiben!
- Schnittstellen grafisch skizzieren bzw. Prototyp!
-
Identifizierung von Steuerungsobjekten
- Koordination von Grenz- und Entitätsobjekten
- Abarbeitung von Anwendungsfällen
- Reihenfolge von Schritten
- Informationen übernehmen und weiterleiten
- Oft ein Steuerungsobjekt pro Anwendungsfall
- Beispiel: Simulationsszenario
- Verhaltensmodell sinnvoll! Im folgenden: dynamische Modelle
-
Abläufe der Anwendungsfälle modellieren
- Ziel - Objekte finden
- Klassen identifizieren
- Verhalten / Operationen finden
-
Use Case durch Interaktion verfeinern
- einfacher kurzer Ablauf: textuelle Beschreibung, Aktivitätsdiagramm
- Ablauf mit Verzweigungen, Parallelitäten: Aktivitätsdiagramm (Kontrollflussmodellierung)
- datengetriebener Ablauf: Aktivitätsdiagramm (Objektflussmodellierung)
- Interaktion zwischen den Objekten wichtig: Kommunikationsdiagramm, Aktivitätsdiagramm (Aktivitätsbereiche), Sequenzdiagramm
- zeitliche Abfolge steht im Mittelpunkt: Sequenzdiagramm
- Zustandswechsel / zeitliche Abfolge von Zuständen: Zustandsdiagramm / Timing-Diagramm
- komplexe Abläufe mit Verzweigungen und Parallelitäten: Interaktionsübersichtsdiagramm
- komplexe Abläufe ohne Verzweigungen und Parallelitäten: weitere Verfeinerung durch Use-Case-Diagramm
- komplexer strukturierter Ablauf: Kollaboration aus dem Kompositionsstrukturdiagramm
-
Dynamische UML-Modelle
- Abläufe
- Aktivitätsdiagramm (activity diagram)
- Kommunikationsdiagramm (communication diagram)
- Sequenzdiagram (sequence diagram)
- Zeitdiagramm (timing diagram)
- Zustandsabhängiges Verhalten von Objekten
- Zustandsautomat (state chart diagram)
- Abläufe
-
Aktivitätsdiagramm
- Aktion – einzelner Schritt
- Aktivität
- Beschreibt einen Ablauf / repräsentiert ein Verhalten
- Beinhaltet eine Folge Aktionen, Kontroll- oder Objektknoten
- Schachtelung von Aktivitäten und Aktionen
- Aktionen in Aktivitäten enthalten
- Aktionen durch Aktivitäten verfeinerbar
- Aktivitäten beschreiben / verfeinern
- Aktionen, Use Cases, Interaktionen, Operationen ...
- Beschreibt einen Ablauf / repräsentiert ein Verhalten
- Ein- und Ausgabeparameter in Form von Objekten
- Parameterknoten entsprechend Pins der aufrufenden Aktion
- Alternativ: Parameterangabe mit Name und Typ
- Angabe von Vor- und Nachbedingungen möglich
- Optional: Parameter unter Aktivitätsnamen
-
Verfeinerung der Aktionen durch Aktivitäten
-
Aktion durch Interaktionen verfeinern
- Detaillierte Diagramme
- Meist entwurfsnah
-
Verfeinerung der Aktionen durch StateChart
-
Objekte zusammenstellen und klassifizieren
- Toolunterstützung (Möglichkeiten stark toolabhängig)
- Objekte Ergebnis der Verhaltensmodellierung
- Ergebnis Verhaltensdiagramm: Operationen der Klassen
- Klassen generalisieren / spezialisieren
\rightarrow
Klassenhierarchie
-
Übergang zum Entwurf
- Klassenstruktur festlegen
-
Spezifikation von Benutzungsschnittstellen
- Skizzieren, Prototyp generieren, Spezialwerkzeuge
- Klassen und Operationen in Funktionen
- Gestaltung MMI, style guides, Standards
Dokumentation von Anforderungen
- Lastenheft
- Gesamtheit der Forderungen eines Auftraggebers (AG) an die Lieferungen und Leistungen eines Auftragnehmers (AN), manchmal Vertragsbasis
- Muss-Kriterien, Kann-Kriterien, Abgrenzungskriterien
- Pflichtenheft
- Entwurf aus AN-Sicht, Umsetzung des Lastenhefts
- Meist Vertragsbasis
- Inhalt Anforderungsspezifikation
- Zielsetzung
- Allgemeine Beschreibung
- Umgebung, generelle Funktion, Restriktionen, Benutzer
- Spezifische funktionale Anforderungen
- möglichst quantitativ (z.B. Tabellenform)
- eindeutig identifizierbar (Nummern)
- Spezifische nicht-funktionale Anforderungen
- z.B. Antwortzeit, Speicherbedarf, HW/SW-Plattform
- Entwicklungs- und Produkt-Standards
- Qualitäts-Zielbestimmung
- Zu erwartende Evolution des Systems, Versionen
- Abkürzungsverzeichnis, Glossar, Index, Referenzen
Pflichtenheft (Beispiel)
- Einleitung, Zielbestimmung
- Übersicht
- Einsatzbereich, Zielgruppen
- Produkt-Umgebung
- Produkt-Funktionen
- Restriktionen
- Annahmen und Abhängigkeiten
- Vorhandenes System (ggf.)
- Vorgeschlagenes System
- Übersicht
- Funktionale Anforderungen
- Benutzungsschnittstelle
- Nichtfunktionale Anforderungen
- Systembeschreibung
- Szenarien
- Anwendungsfälle
- Glossar
Grobentwurf
Einführung
Systementwurf – Aufgabe
- Sicht des geplanten Systems von innen (Entwickler)
- Wie sollen vereinbartes Verhalten und Funktionen (Analysemodell) intern realisiert werden?
- Von Spezifikation von Anforderungen und Funktionen -> Vorbereitung der Implementierung
- Formal: Transformation des Analysemodells in ein Systementwurfsmodell
- System(grob)entwurf, Feinentwurf/Objektentwurf
Teile und herrsche
- Grobentwurf
- Entwurfsziele identifizieren
- Grobe Systemstruktur festlegen (Architektur)
- Zerlegung in Subsysteme, Spezifikation
- Schichten, Pakete, Komponenten
- Bewerten der Zerlegung anhand der Entwurfsziele
- Schnittstellen festlegen
- Feinentwurf
- Subsysteme im Detail entwerfen
- Strukturierung der Komponenten
- Klassen, Objekte, Funktionen, Datenstrukturen
- Verhalten, Algorithmen – Teillösungen
- Subsysteme im Detail entwerfen
Systemzerlegung
Vorgehen
- Zerlegung eines Systems in Subsysteme
- Betrachtung der Lösungsdomäne!
- Subsysteme weiter zerlegen bis Komplexität ausreichend klein ist z.B. für Arbeitspakete
Was macht ein Subsystem aus?
- Schnittstellen, Funktionen, „Verantwortung“
- Was bietet es an?
- Was benutzt es?
- Was tut es intern?
Operation
- Name und Parameter
- Funktion, Prozedur, Methode, Eintrittspunkt ...
Dienst
- Satz von Operationen, die bereitgestellt werden
Abhängigkeiten von Subsystemen
- Subsysteme untereinander: Kopplung (coupling)
- Maß für die Abhängigkeit von Subsystemen
Möglichst lose Kopplung
- Änderungen in einem beteiligten Subsystem haben geringe Auswirkungen (Stabilität)
- Erleichtert Wartbarkeit und Arbeitsteilung
Mittel zur Verringerung der Kopplung
- Zusätzliche Unterteilung in Subsysteme
- Aber: dann größere Komplexität!
Abhängigkeiten von Subsystemen
Kopplungsart | Bemerkung |
---|---|
Datenkopplung (gemeinsame Daten) | Möglichst vermeiden! Wenn nicht möglich, Verwaltung zentralisieren und Zugriff über Schnittstelle |
Schnittstellenkopplung (gegenseitiger Aufruf) | Akzeptabel |
Strukturkopplung (gemeinsame Strukturelemente) | Vermeiden! (z.B. keine Vererbung über Paketgrenzen hinweg) |
- Elemente eines Subsystems: Kohäsion (cohesion)
- Maß für Zusammengehörigkeit der Elemente
- Möglichst hohe Kohäsion
- Enge Beziehung oder ähnliche Aufgaben der Elemente
- Erleichtert Verständnis, Wartung und Anpassung
- Mittel zum Erreichen hoher Kohäsion
- Datenkapselung, Objektorientierung
- Benutzung geeigneter Patterns (Kapitel 5)
Metriken für modulare Entwürfe
- Fan-in / fan-out-Metrik [S.Henry, D. Kafura 1981]:
- Fan-in: Anzahl der Stellen, wo Kontrollfluss auf das betrachtete Modul M übergeht (Aufrufe von Funktionen / Prozeduren in M) + Anzahl globaler Variablen, die in M zugänglich sind
- Fan-out: Anzahl von Stellen, an denen M andere Module aufruft + Anzahl der globalen Variablen, die von M verändert werden
- Heuristik Kopplung / Kohäsion
- Hoher Fan-out bedeutet hohe Kopplung, minimieren
- Hoher Fan-in kann auf geringe Kohäsion von M hindeuten
Komplexität beherrschen: "Wenn Du es nicht in fünf Minuten erklären kannst, hast Du es entweder selbst nicht verstanden oder es funktioniert nicht." [Rechtin, Maier: The Art of Systems Architecting 2000]
Vorgehen: Heuristiken und Erfahrungen
- „Erfahrung ist die härteste Lehrerin. Sie gibt Dir zuerst den Test und anschließend den Unterricht.“ [Ruth 1993]
- „Ein Architekt der zu Beginn seiner Arbeit vollständige und konsistente Anforderungen benötigt, mag ein brillanter Entwickler sein – aber er ist kein Architekt“ [Rechtin 2000]
- „Das Leben von Software-Architekten besteht aus einer langen und schnellen Abfolge suboptimaler Entwurfs-entscheidungen, die teilweise im Dunkeln getroffen werden.“ [Kruchten2001]
Wie organisiert man Subsysteme?
- Innerhalb einer Verfeinerungsstufe: fachlich orientierte Zerlegung
- Mehrfache Zerlegung: Hierarchie-Graph der Verfeinerung
Schicht
-
Gruppe von Subsystemen in der Zerlegungshierarchie
-
Verwandte Dienste
-
Ähnlicher Abstraktionsgrad
-
Abhängigkeit nur von darunter liegenden!
-
Geschlossene Schichtenarchitektur
- Beispiel: OSI-Modell für Kommunikationssysteme
-
Offene Schichtenarchitektur
- Beispiel: Java Swing auf X11-Plattform
Prinzipien des OO-Entwurfs
- So-einfach-wie-möglich-Prinzip (KISS)
- Fehler berücksichtigen (Strukturierung, Kapselung, Modularisierung, Wiederverwendung)
- Entwerfen nach Verantwortlichkeiten
- Hohe Kohäsion / Geringe Kopplung
- Zyklische Abhängigkeiten vermeiden
- Auf Schnittstellen konzentrieren
- Abhängigkeiten nur von Schnittstellen
- Abtrennung von Schnittstellen (eher viele kleine als eine große)
- Umkehr der Abhängigkeiten (dependency inversion-Prinzip)
- Offen / Geschlossen Prinzip
Zyklische Abhängigkeiten vermeiden
- Änderungen wirken sich auf beide Komponenten aus
- Probleme beim Löschen und Initialisieren
- Auflösen durch
- Gemeinsame Klassen in separates Paket
- Gemeinsame Schnittstellen definieren
Symptome schlechten Designs
- Starrheit
- Einfache Änderungen schwierig realisierbar
- Einfache Änderungen führen zur Modifikation einer Vielzahl von Komponenten
- Zerbrechlichkeit
- Änderungen an einer Stelle führen zu Fehlern an völlig anderer Stelle
- Schlechte Wiederverwendbarkeit
- Komponenten können Aufgrund spezieller Anhängigkeiten kaum wiederverwendet werden
Wann ist ein Entwurf „gut“?
- Korrekt
- Erfüllung der Anforderungen
- Wiedergabe aller Funktionen des Systemmodells
- Sicherstellung der nichtfunktionalen Anforderungen
- Verständlich und präzise, gut dokumentiert
- Anpassbar
- Hohe Kohäsion innerhalb der Komponenten
- Schwache Kopplung zwischen den Komponenten
- Wiederverwendung
- Kriterien gelten auf allen Ebenen des Entwurfs! (Architektur, Subsysteme, Komponenten)
Architekturmodelle
- Modellierung mit UML
- Bisher: logische Sicht
- Technisch: Organisation in Paketen, Namensraum, Import
- Paketdiagramm
- Gliederung (Strukturierung) des Systems in Teile
- Zuordnung von Elementen zu einem Paket
- Hierarchien und Abhängigkeiten zwischen den Paketen
- Anwendung: Definition von Schichten
- Enthält-Beziehung
- Definiert, in welchem Paket ein Element enthalten ist
- Ermöglicht qualifizierten Zugriff auf enthaltene Elemente
- Löschen des Pakets bewirkt Löschen beinhalteter Elemente
- Definition von Sichtbarkeit / Zugriffsrechte
- Auswirkung auf weitere Enthält-Beziehung
- '+' - public (default)
- '-' - private
- Paket- / Element-Import
- Unqualifizierter Zugriff auf Elemente eines anderen Namensraums (Paketes)
- Komponentendiagramm
- Komponente – modulare, austauschbare Einheit
- Strukturierung des Systems durch Komponenten
- Modellierung der
- Abhängigkeiten zwischen Komponenten
- inneren Struktur von Komponenten
- Definition von Schnittstellen
- Verwendung von Elementen aus Klassen- und Objektdiagramm
- Stärkere dynamische Sicht -> kein Verhalten
- Komponente <>
- Kapselt Funktionalitäten (Physisch gruppierte Klassen)
- „Spezialisierte“ Klasse (Vererbung, Exemplare möglich)
- Stellt Funktionalitäten über Schnittstellen bereit
- Definiert benötigte Schnittstellen
- Enthält Klassen oder weitere Komponenten
- Modulares Element: Substitution (Austauschbarkeit) steht im Vordergrund
- Black-Box-Darstellung
- Zur Verfügung gestellte Funktionalität
<<provided interfaces>>
- Benötigte Funktionalität
<<required interfaces>>
‚
- Zur Verfügung gestellte Funktionalität
- White-Box-Darstellung
- Interner Aufbau der Komponente
<<realization>>
- Artefakte
<<artifacts>>
‚ Realisierende physische Einheit (z.B.: .dll)
- Interner Aufbau der Komponente
Schnittstellen / Interfaces
- Definition Diagrammunabhängig
- Meist Klassendiagramm
- Ähnlich Semantik einer Klasse
- Nur public-Attribute und Operationen
- Definiert Verpflichtung zur Implementierung von
- Operationen
- Merkmale -> Attribute dürfen definiert werden
- Verpflichtungen (z.B.: Vor- / Nachbedingungen)
- Meist abstrakte Klassen mit abstrakten Operationen
- Abstrakt – muss überschrieben werden
- Notation
- Stereotyp: <>
- Meist kursiv geschrieben, da abstrakte Klasse
Schnittstellenrealisierung, Implementierungsbeziehung
- Schnittstellen werden realisiert, nicht instanziiert
- Schnittstellenkonform
- Klasse realisiert alle Attribute und Operationen
- Schnittstelle kann von anderen Schnittstellen erben
- Keine Schnittstellenrealisierung zwischen zwei Interface-Klassen -> Generalisierung verwenden
- Darstellung
- Gestrichelte Linie mit nicht gefülltem Dreieck an der Seite der Superklasse
- Alternativ: Lollipop-Darstellung
Softwarearchitekturmuster
- Wiederverwendung auf sehr hoher Abstraktionsstufe
- Falls geplante Anwendung passt, anwenden!
Schichten-Architektur (layers)
- Problem
- Komplexität: Strukturierung des Systems, unterschiedliche Abstraktionsebenen
- Änderungen sollen möglichst lokal bleiben
- Teilsysteme sollen austauschbar, wiederverwendbar und getrennt entwickelbar sein
- Schnittstellen sollen stabil sein
- Lösung
- Zuordnung von Subsystemen zu horizontalen Schichten gleicher Abstraktionsebene
- Komponenten einer Schicht bieten Dienste der darüber liegenden Schicht an
Client-Server (Klient/Anbieter)
- Client (front-end)
- Benutzungsschnittstelle
- Einbindung in Geschäftsprozesse
- Entkoppelt von Netztechnologie und Datenhaltung
- Server (back-end)
- Datenhaltung, evtl. Fachlogik
- Genauer: Two-tier client/server architecture
- Asynchroner Kontrollfluss
- Aufteilung Funktionen Client / Server
- Mehr Funktionen im Server:
- zentrale Verwaltung, Wartungsaufwand geringer, Portabilität, einfache Client-Hardware (Net PC)
- „Thin Client“ – nur GUI
- Mehr Funktionen im Client: Flaschenhals Server wird entlastet, individuellere Client-Funktionen
- „Fat Client“ – Teil der Anwendung im Client
- Entscheidet mit über Umsetzung (Java Script, ...)
- Mehr Funktionen im Server:
Three-Tier / Four-Tier Architecture
- Client/Server mit weiterer Aufteilung ähnlich Repository
Bewertung Client-Server
- Vorteile
- Leicht verständlich
- Änderungen bleiben lokal
- Geringere Kopplung zwischen den Schichten
- Schichten austauschbar und wiederverwendbar
- Getrennte Entwicklung der Schichten möglich
- Vorhandene / stabilere Schnittstellen
- Nachteile
- Geringere Performance
- Zusätzlicher Verwaltungs- oder Datenoverhead
- Manche Änderungen führen zu Änderungen in allen Schichten (z.B. neues Datenfeld)
Pipes and Filters
- Datenstrom- oder Kontrollflussorientiertes System
- Lose verbundene Berechnungskomponenten
- Kombination der Berechnungskomponenten nur vom Typ der Ein- und Ausgabedaten abhängig
- Leicht erweiterbar System gewünscht
- Parallele Verarbeitung vorteilhaft
- Verwendung von globalen Steuerungskontrollstrukturen (Parallelisierung, Verzweigung, Schleifen) gewünscht
- Vorteile
- Stark entkoppelte Komponenten
- Hohe Flexibilität gegenüber Änderungen & Erweiterungen
- Hoher Wiederverwendungsgrad der Komponenten
- Unabhängige Entwicklung der Komponenten
- Leichte Parallelisierung der Berechnungen möglich
- Überprüfung der Datenkompatibilität dynamisch / statisch
- Nachteile
- Schwierige Fehlerbehandlung, kein expliziter Kontrollfluss
- Fehler durch inkompatible Datentypfehler erst zur Laufzeit
- Häufig zusätzliche Datenkonvertierungen notwendig
Plug-In Architektur (Microkernel)
- Zielstellung
- Stabile, verbreitete Standard-Anwendung (Kern)
- Funktionalität soll durch Komponenten leicht erweiterbar sein
- Dritte sollen Komponenten leicht erstellen können
- Lösung
- Möglichst schlanker zentraler Kern
- Plugin-Manager verwaltet Komponenten: Laden, Entladen, Zugriffskontrolle, Konfiguration
- Plugin
- Komponente mit Standard-Schnittstelle
- Erweitert Funktionalität (extension point)
- Vorteile
- Robustes Verhalten
- Trennung der Zuständigkeiten
- Erweiterbar, Austauschbar, Wiederverwendbar
- Geringe Kopplung zu den Komponenten
- Anpassung an eigene Bedürfnisse möglich
- Leichte Aufteilung der Entwicklung der Arbeitspakete
- Nachteile
- Höherer initialer Aufwand
- Verwaltungsoverhead zur Laufzeit
- Versionsverwaltung der Komponenten nötig
- Abhängigkeiten unter den Komponenten schwierig realisierbar
- Geschickte Definition der Extension Points nötig
Repository (Depot, blackboard)
- Zentrale Datenhaltung
- Datenbankmanagementsystem, Dateisystem
- Anwendungen tauschen Daten nur über Repository aus
- Kontrollfluss z.B. über Signale oder Semaphore
- Gut für datenintensive Verarbeitungsaufgaben geeignet
Peer-to-peer
- Gleichberechtigte Partner, “Föderation”
- Verteilte kommunizierende Subsysteme
- Orts- und Umgebungsunabhängigkeit
Model-View-Controller (MVC)
- Modell / Sicht / Steuerung
- Trennung verschiedener Aufgabengebiete:
- Model: verwaltet Domänenwissen, Daten und Zustand; häufig Datenbank
- View: Darstellung, Anzeige, GUI
- Controller: Steuerung der Interaktion, Nutzerbefehle
- Erlauben Austausch von Anzeige- und Speichersystem
- Kontrollfluss
- Controller steuert
- View wird über Datenänderungen benachrichtigt (callback)
- Geeignet für interaktive Systeme
- Problem
- Lose Kopplung zwischen verschiedenen Komponenten
- Daten werden in verschiedenen Sichten dargestellt
- Realisierung von GUI‘s
- Lösung durch drei Komponenten
- Daten (Model) enthält die Kernfunktionalität / Durchführung der Geschäftsprozesse, kapselt und Speichert die Daten
- Sichten bzw. Dialoge (View) stellt die Daten für den Anwender in unterschiedlicher Art dar
- Logik bzw. Steuerung (Controller) Realisiert die Interaktion mit dem Benutzer, übernimmt die Eingaben vom View und ändert die Daten im Modell, legt die Darstellungsart der Sichten fest
- Vorteile
- Unabhängige Entwicklung der Komponenten
- Änderung der Oberfläche ohne Änderung des Modells
- Unterschiedliche Oberflächen für das selbe Modell
- Nachteile
- Performance
- Erhöhter initialer Entwicklungsaufwand
Frameworks
Was ist ein Framework?
- A framework is a set of prefabricated software building blocks that programmers can use, extend, or customize for specific computing solutions [Taligent]
- Ein framework (Rahmenwerk, Anwendungsgerüst) ist eine Menge von zusammengehörigen Klassen, die einen abstrakten Entwurf für eine Problemfamilie darstellen [nach Pomberger/Blaschek]
Ziele
- Wiederverwendung von Code, Architektur, Entwurfsprinzipien und Verhaltensschema
- Ähnliche Benutzungsschnittstelle
Klassifikation I
- Anwendungs-Framework (application framework)
- Gibt Systemarchitektur für typische Anwendungsstruktur vor
- GUI-Framework: Motif, Qt, Swing, ...
- Bereichsspezifisches Framework (domain framework)
- Expertenwissen für Anwendungsbereich
- für typische Anwendungen u.a. in den Bereichen Luftfahrt, Produktion, Finanzwesen, Automotive, ...
- Beispiel: AUTOSAR
- Infrastrukturgerüst (support framework)
- Gerätetreiber, Anpassung an Hardware
- Middleware: DCOM, Java RMI, CORBA, WebSphere, ...
Klassifikation II
- Offene Programmgerüste (white box)
- Erweiterbarkeit durch Vererbung und dynamische Bindung
- Funktionen konkretisieren durch Ableitung von Basisklassen des Programmgerüsts und Überschreiben vordefinierter Methoden
- Geschlossene Programmgerüste (black box)
- Erweiterbarkeit durch Definition von Schnittstellen für Module, die für eine konkrete Anwendung in das Gerüst eingesetzt werden können
- Wiederverwendung durch Komponenten, die sich an Schnittstellen halten; Aufruf über Delegation
Webframeworks – Angular JS
-
Clientseitiges Webframework von Google
-
Frei verwendbar (Open Source)
-
Erstellung von Single-Page-Webanwendungen
-
Model View Prinzip
-
Vorteile
- Weitergabe von Expertenwissen
- Durchdachtes Design: langfristige Aufwandsersparnis
- Wartungsaufwand reduziert, systematische Tests möglich
- Prinzipiell sehr hohe Produktivität möglich
- Erleichtert Integration und Konsistenz verwandter Anforderungen
-
Nachteile
- Erstellung und Einarbeitung aufwändig
- Zusätzlicher Dokumentations- und Wartungsaufwand
- Fehlersuche erschwert durch Overhead des Frameworks
- Kombination verschiedener Frameworks sehr schwierig
Systemarchitektur und Verteilung
Systemarchitektur
- Aufbau und Elemente der Ablaufumgebung, Hardware
- Häufig enger Zusammenhang mit Softwarearchitektur
- Architekturmuster
- Ablaufmuster
- Besonders bei eingebetteten Systemen
- Systemarchitektur hat Einfluss auf Softwarearchitektur
- Grenzobjekte, Schnittstellen, ...
- Gute Systemarchitektur?
- Nichtfunktionale Anforderungen
- Modellierung und Simulation, Lastmessungen
Typische Strukturen
-
Zentralrechner (mainframe) mit Terminals
-
Server und einfache Stationen
-
PCs und Server
-
Kommunikationsverbindungen, Sensoren, Speicher, ...
-
Blockdiagramm
- Klassisches Beschreibungsmittel für Systemaufbau
- Nicht Teil von UML
-
Konfigurationsdiagramm
- meistverbreitetes Hilfsmittel zur Beschreibung der physikalischen Verteilung von System-Komponenten
- Nicht Teil von UML
-
Verteilungsdiagramm (UML deployment diagram)
- Darstellung der Hardwaretopologie
- Zuordnung von Artefakten zu Hardwareeinheiten (Knoten)
- Verteilung von Systembestandteilen auf Hardware
- Kommunikationsverbindung und Abhängigkeiten zwischen Knoten
- Relativ spät im Projekt Installation / Wartung des Systems
Globaler Kontrollfluss
Globaler Kontrollfluss
- Ablaufsicht der Architektur
- Definition nebenläufiger Systemeinheiten (z.B. Prozesse)
- Steuerung der Abfolge von Einzelfunktionen
- Synchronisation und Koordination
- Reaktion auf externe Ereignisse
- Darstellung z.B. durch Sequenzdiagramme
- Nebenläufigkeit auf Architekturebene
- Threads , Prozesse, verteiltes System
- Asynchroner Nachrichtenaustausch
- Einfluss auf Architektur / abhängig von Architektur!
- Ablaufmuster
- Zentral
- Call/Return (prozedural, synchron)
- Master/Slave (nebenläufig mit zentraler Steuerung)
- Dezentral
- Ereignisgesteuert (event-driven)
- interrupts
- publish-subscribe (ähnlich observer)
- (selective) broadcast
- Datenflussgesteuert (data flow architecture)
- Ereignisgesteuert (event-driven)
- Zentral
Sonstiges
Ablauf des OO-Systementwurfs [B. Oesterreich]
- Schichtenmodell definieren
- Verteilungsmodell definieren
- Fachliches Subsystemmodell definieren
- Ablaufverantwortlichkeiten definieren
- Komponentenspezifisches Klassenmodell entwickeln
- Komponentenschnittstelle entwerfen
- Zustandsmodelle weiterentwickeln
- Objektfluss modellieren
- Interaktionsmodelle entwickeln, Attribute definieren
- Dialoge spezifizieren
- Design-Diskurs
- Testgetriebene Entwicklung
Weitere Aufgaben beim Grobentwurf
- Entwurf einer persistenten Datenverwaltung
- Dateisystem, Datenbank
- Sicherheit
- Zugriffskontrolle
- Fehlertoleranz (Daten und Hardware)
- Protokollfunktionen
- Kontrollfluss
- Ausnahmen
- Starten, Initialisieren und Beenden der Anwendung
- „Randanwendungsfälle“
Notwendigkeit der Architekturdokumentation
- Quellcode aufgrund niedrigen Abstraktionsniveaus ungünstig für Dokumentation
- Überblick und Arbeitsteilung
- Lebensdauer von Systemen länger als geplant
- Fehler und Probleme leichter finden und beseitigen
- Neue Anforderungen mit angemessenem Aufwand erfüllen
- Vereinfachung der Wartung, Pflege, Erweiterung, Wiederverwendung
Dokumentation
- Grundprinzipien
- Verständlich aus Sicht des Lesers formulieren (Glossar)
- Das Warum beschreiben (Entwurfsentscheidungen)
- Annahmen, Voraussetzungen, Randbedingungen dokumentieren
- Wiederholungen vermeiden
- Notation erklären oder Standards verwenden (UML)
- Legende hinzufügen
- Auf Zweckdienlichkeit prüfen, Reviews durchführen (Inhalt, Qualität)
- Verschiedene Sichten für verschiedene Zielgruppen
Feinentwurf
Analyse-Modell | Entwurfs-Modell |
---|---|
Fachliche Domäne | Lösungsdomäne |
Teilweise unvollständig in Attributen und Operationen | Vollständige Angabe aller Attribute und Operationen |
Datentypen und Parameter können noch fehlen | Vollständige Angabe von Datentypen und Parametern |
Noch kaum Bezug zur Realisierungssprache | Auf Umsetzung in gewählter Programmiersprache bezogen |
Keine Überlegungen zur Realisierung von Assoziationen | Navigationsangaben, Qualifikation, Ordnung, Verwaltungsklassen |
Entscheidung über Datenstrukturen, Anbindung GUI |
Schließen der Lücke zwischen Grobentwurf und Implementierung
- Identifizieren und Entwerfen von Klassen der Lösungsdomäne
- Identifikation und Verwendung von Entwurfsmustern
- Detaillierte Beschreibung der Klassen
- Beschreibung von Schnittstellen
- Iterativer Prozess!
- Verbesserung des Entwurfs – Refactoring
- Optimieren des Entwurfsmodells zur Erfüllung nichtfunktionaler Anforderungen
Objektorientierter Feinentwurf
- Ausgangspunkt
- Grobdefinition der Architektur, Zerlegung in Subsysteme (evtl. unter Verwendung von Standardarchitekturen)
- Verteilungskonzept
- Ablaufmodell
- Ergebnis
- OO-Modell für jedes Subsystem der Architektur
- OO-Modell für unterstützende Subsysteme unter Berücksichtigung gewählter Technologien
- Spezifikationen der Klassen
- Spezifikationen von externen Schnittstellen
Klassen- und Objektentwurf
- Klassen der Lösungsdomäne
- Klassen, die nicht durch objektorientierte Analyse der Anwendungsdomäne entstehen
- Entstehungsgründe
- Architektur von Software und System
- nichtfunktionale Anforderungen
- Beispiele: Kommunikation, Fehlertoleranz, Adapter, Datenhaltung, Effizienz, Benutzerschnittstellenobjekte, Middleware, ...
- Sichtbare (Grenz- und Steuerungsobjekte) werden schon in der Analyse identifiziert
Klassen identifizieren (responsibility-driven design (Wirfs-Brock, McKean))
Verantwortlichkeits-Prinzip: Sichtweise: Objekte und Klassen sind nicht nur Behälter für Verhalten und Daten, sondern erfüllen in Zusammenarbeit mit anderen Objekten bestimmte Aufgaben eigenverantwortlich
Responsibility-Driven Design – Begriffe
- Sichtweise auf Softwaresystem
- Application = set of interacting objects
- Object = implementation of role(s)
- Role = set of related responsibilities
- Responsibility = obligation to perform a task or know information
- Collaboration = interaction of objects or roles
- Contract = agreement outlining collaboration terms
Arten von Rollen
Information holder | knows and provides information |
Structurer | maintains relationship between objects and information about relationships |
Service provider | performs work, offers computing services |
Coordinator | reacts to events by delegating tasks to others |
Controller | makes decisions and directs other’s actions |
Interfacer | transforms information and requests between system parts |
Hilfsmittel: CRC-Karten
- Candidate (or class), Responsibility, Collaboration
- Informelles Mittel zum
- Finden,
- Beschreiben und
- iterativen Verändern von Klassen
Ein Objekt
- implementiert eine Schnittstelle und beeinflusst andere Objekte
- wird in drei Teilen entworfen
- Öffentliche Schnittstelle
- Art und Weise der Benutzung
- Innere Details der Funktionsweise
- Kohärenz: zusammengehörende Verantwortlichkeiten in einer Klasse konzentrieren!
Entwurfsprinzipien
- Kapselung
- Probleme: Zugriff auf private oder ebenen-fremde Attribute
- Verwenden von get- und set-Operationen
- Zusicherungen einhalten
- Zugriffe zentralisieren
- Verbalisierung
- Zugriffsbeschränkung
- Zerlegung
- Teile und Herrsche
- Zerlegen in Komponenten
- Verantwortlichkeitsprinzip: Komponente ist klar für eine Aufgabe verantwortlich
- Eigenschaften und Schnittstellen im Klassendiagramm
- Beziehungen zwischen Klassen: Assoziationen
- Aggregation
- „besteht aus“, „ist Teil von“ oder „Ganzes-/Teile-Beziehung“
- Schwache Bindung der Teile mit dem Ganzen
- Notation: ungefüllte Raute am Ganzen
- Komposition
- Wie Aggregation, jedoch stärkere Bindung
- Teil nur einem Ganzen zugeordnet
- Nur Multiplizität von 1 oder 0..1 möglich!
- Gefüllte Raute am Ganzen
- Polymorphie
- Reaktion auf eine Nachricht abhängig vom Typ des Objektes
- Variablen können Objekte verschiedener Klassen aufnehmen (Voraussetzung: Typ der Variablen ist eine gemeinsame Basisklasse der (davon) abgeleiteten Klasse(n) der Objekte)
- Überladen von Operationen
- gleicher Operationsname, unterschiedliche Signatur
- abstrakte Operationen: Virtuelle Operationen ohne Implementierung
- abstrakte Klasse: Klasse mit abstrakten Operationen
- Folgen
- von abstrakten Klassen können keine Objekte angelegt werden (Implementierung fehlt)
- Abgeleitete Klassen müssen Operation implementieren, damit Objekte angelegt werden können
Vererbung im Entwurf
- In der Analyse: Klassifikation von Objekten, Taxonomie, Spezialisierung/Verallgemeinerung, Organisation von Klassen in Hierarchien
- Verringerung von Redundanz und damit Inkonsistenzen
- Funktionalität nur einmal implementieren!
- Spezifikations-Wiederverwendung
- Implementierungs-Wiederverwendung
- Verbesserung der Erweiterbarkeit
- Abstrakte Schnittstellen einsetzen!
Vererbung oder Assoziation
- Schlüsselwort Vererbung: ist ein
- Schlüsselwort Assoziation: besteht aus, ist Teil, hat,...
- Vererbung: Unterscheidungsmerkmal definierbar (Diskriminator)
- Vermeide Vererbung, wenn es Alternativen gibt
- Mehrfachvererbung
- Problem: Unabhängige Aspekte der Vererbungshierarchie
- Vermeidung: abstrakte Klassen oder Komposition
Abstrakte Klassen
- Nur Unterklassen, keine Instanzen
- Attribute in Unterklassen füllen
- Notation: Kursiv oder Stereotyp <>
Offen / Geschlossen-Prinzip [Meyer 1988]
- Erweiterbarkeit eines Entwurfs
- Offen für Erweiterungen,
- z.B. durch Vererbung / Polymorphie
- Virtuelle Operationen verwenden
- Verändert vorhandenes Verhalten nicht
- Erweiterung um zusätzliche Funktionen oder Daten
- Geschlossen für Änderungen
- private Attribute
- Möglichst protected Operationen
- Beschränkung der Erweiterbarkeit
- Keine Einschränkungen der Funktionalität der Basisklasse!
Liskovsches Ersetzungsprinzip
- Wenn S eine Unterklasse von T ist, dann können Objekte des Typs T in einem Programm durch Objekte des Typs S ersetzt werden, ohne die Funktion des Programms zu verändern. [Barbara Liskov 1987]
- Engere Definition als „ist-ein“-Beziehung
- Kein unerwartetes Verhalten eines Objektes eines Subtyps
- Methoden, die Objekte der Basisklasse erwarten, müssen auch mit Objekten der abgeleiteten Klasse funktionieren
- Zusicherungen der Basisklasse müssen von der abgeleiteten Klasse erfüllt werden!
Gesetz von Demeter (LoD)
- Gesetz von „schüchternen“ Objekten
- Objekte sollen nur mit Objekten in ihrer unmittelbaren Umgebung kommunizieren
- Aus einer Methode M dürfen (sollten) nur Nachrichten an Objekte gesendet werden, die ...
- unmittelbarer Bestandteil des Objekts von M sind (super)
- M als Argument übergeben wurden
- direkt in M erzeugt wurden
- (oder sich in globalen Variablen befinden)
- Als Metrik überprüfbar
Ein Objekt sollte
- Nur Methoden aufrufen, die zur eigenen Klasse gehören
- Nur Methoden von Objekten aufrufen, die:
- Von Attributen referenziert werden
- Als Parameter übergeben wurden
- Selbst erzeugt wurden
Entwurfsmodelle
Klassendiagramm
- Eigenschaften
- Modellierung der statischen Struktur (Aufbau)
- Modellierung der Struktur von Daten
- Klasse im Mittelpunkt (Aufbau, Beziehungen zueinander)
- Wichtigstes und bekanntestes Diagramm der UML!
- Elemente des Klassendiagramms
- Klasse (Attribute, Operationen)
- Vererbung / Realisierung
- Assoziationen
- Beziehungen / Abhängigkeiten
- Attribute
- Klassenattribut: "X" static – statisch, nur einmal pro Klasse vorhanden
- Sichtbarkeit
- "+" public – im Namensraum sichtbar
- "#" protected – nur in abgeleiteten Klassen sichtbar
- "~" package – im Paket sichtbar
- "-" private – nur in der Klasse selbst sichtbar
- Ableitung "/" derived – abgeleitetes Attribut
- Weitere Eigenschaften
- readOnly – nach Initialisierung nicht änderbar
- composite – Aggregation: Composition
- redefines X – überschreibe Attr. der Oberklasse
- subsets X – Teilmenge
- union – Attribut ist Vereinigung der subsets
- unique – Elemente eindeutig (Schlüsselattribut)
- ordered – Elemente sind geordnet (unordered)
- sequence – Speicherung der Elemente als Liste
- bag – Elemente sind Multimenge
- Parameterlisten
- in: Eingangsparameter
- out: Ausgangsparameter
- inout: Eingangs- und Ausgangsparameter
- return: Rückgabewert
- Beziehungen
- navigierbar/unspezifiziert/nicht-navigierbar
- ungerichtete/gerichtete Relation/assoziation
Aktive Klassen
- Reagieren nicht nur, sondern werden von sich aus aktiv
- Z.B. Steuerobjekte
- Als Thread oder Prozess realisiert
Schnittstellen
- Vereinbarung über Art des Aufrufs
- Homogenität gleicher Funktionen
- Enthält
- Spezifikation von Operationen
- keine Implementierung ( Java, nicht UML!)
- keine Attribute
- In Java außerdem anstelle von Mehrfachvererbung
- Schnittstellen in UML
- Funktion ähnlich abstrakter Klasse
- Meist für technische Aspekte
- Notation: Stereotyp <> oder grafisch (lollipop notation)
- Verträge („design by contract“)
- Schnittstelle sagt bisher nichts über Effekt der Klasse aus
- Vollständige Beschreibung wäre Programm?
- Vereinfachte Beschreibung für Abfolgen:
- Vorbedingung: Prädikat, das vor Aufruf gelten muss <>
- Nachbedingung: Prädikat, das nach Aufruf gelten muss <>
- Invariante: Prädikat, das immer gilt <>
- Jeweils Einschränkungen!
Protokollrollen - Dynamisches Verhalten von Schnittstellen
- Ohne Sicht auf innere Implementierung (anders als beim Objektlebenszyklus)
- Protokoll = Kollaboration von Protokollrollen (protocol, protocol role)
- Modell: Zustandsautomat
- Genauer: Spezialisierung
- Beschreibung der Synchronisation von Objekten
Entwurfsmuster
- Warum Wiederverwendung?
- Geringerer Aufwand
- Das Rad nicht noch einmal neu erfinden
- Verwenden üblicher, aus Erfahrung gewachsener Strukturen
- ... und warum nicht?
- Aufwand für Anpassung kann hoch sein!
- Einarbeiten in teilweise komplexe Schnittstellen
- Abhängigkeit von externen Komponenten, Zwang zu späterer Portierung
Was ist ein Entwurfsmuster? Eine schematische Lösung für eine Klasse verwandter Probleme (Höhere Ebene: Architekturmuster)
- Wie helfen Muster im Entwurf?
- Identifizieren von Klassen (Anwendungs- und Lösungsdomäne)
- Regeln sind abstrakt oder an realen Objekten orientiert
- Muster: Arten von Rollen bzw. Lösungshinweise für typische Strukturierungsaufgaben
- Änderbarkeit und Lesbarkeit des Entwurfs verbessern
- Arten von Entwurfsmustern
- Erzeugungsmuster
- Strukturmuster
- Verhaltensmuster
- Erzeugungsmuster
- Factory Method, Fabrikmethode
- Implementierungsvarianten; Erzeugung von Objekten wird an Unterklassen delegiert
- Abstract Factory, Abstrakte Fabrik
- Schnittstelle zur Erzeugung von Familien verwandter Objekte
- Prototype, Prototyp
- Objekterzeugung durch Vorlage und Kopie
- Builder, Erbauer
- Trennung von Erzeugung und Repräsentation komplexer Objekte, für Erzeugung unterschiedlicher Repräsentationen
- Singleton
- Sicherstellung, dass nur ein Objekt einer Klasse erzeugt wird, die einen globalen Zugriff bietet
- Factory Method, Fabrikmethode
Strukturmuster
- Adapter
- Anpassung der (inkompatiblen) Schnittstelle einer Klasse oder eines Objekts an eine erwartete Schnittstelle
- Bridge, Brücke
- Abstraktion (Schnittstelle) von Implementierung entkoppeln, um beide unabhängig zu ändern; Impl.-Klasse nur als Verweis
- Decorator, Dekorierer
- Objekt dynamisch um Zuständigkeiten erweitern (Alternative zur Bildung von Unterklassen)
- Facade, Fassade
- Einheitliche Schnittstelle zu einer Schnittstellenmenge, vereinfacht Zugriff
- Flyweight, Fliegengewicht
- Gemeinsame Nutzung kleiner Objekte zur effizienten Verwendung großer Mengen davon (Speicheraufwand)
- Composite, Verbund, Kompositum
- Zusammenfügen verschiedener Objekte zur Repräsentation von Teil-Ganzes-Beziehungen; Objekte und Kompositionen können einheitlich behandelt werden, Baumstruktur
- Proxy, Stellvertreter
- Kontrollierter Zugriff auf Objekt durch vorgeschaltetes Stellvertreterobjekt
- Gründe: Schutz, entfernter Zugriff (remote proxy), smart pointer, Erzeugung on demand
Adapter
- Vorteile
- Kommunikation unabhängiger Softwarekomponenten
- Einfache Erweiterung um zusätzliche Funktionalität
- Austausch der Komponente durch Änderung des Adapters leicht möglich
- Nachteile
- Zusätzlicher Adaptierungsschritt benötigt Zeit
- Schlechte Wiederverwendbarkeit der Adapter
- Bekannte Verwendung, Spezialfälle
- Fassade: Adapter eines Teilsystems
- Proxy: erweitert die Funktionalität bei gleicher Schnittstelle
- Brücke: keine Anpassung, sondern vorherige Strukturierung
Verhaltensmuster
- Command, Befehl
- Befehl / Operation als Objekt kapseln (Parameterübergabe, Operations-Warteschlangen, logging, Rückgängig machen)
- Observer, Beobachter
- 1-zu-n-Beziehung zwischen Objekten, so dass die Änderung des zentralen Objekts zu einer Benachrichtigung und Aktualisierung der n (abhängigen) Zustände führt
- Visitor, Besucher
- Beschreibung und Kapselung einer zu definierenden Operation, die auf einer Objektmenge ausgeführt wird
- Interpreter
- Repräsentation der Grammatik einer Sprache sowie Interpreter zur Analyse von Sätzen der Sprache
- Iterator
- Sequentieller Zugriff auf die Elemente einer Sammlung ohne Kenntnis der Implementierung der Sammlung
- Memento
- Internen Zustand eines Objekts erfassen und speichern, um Objektzustand wiederherstellen zu können
- Template Method, Schablonenmethode
- Beschreibung des Skeletts eines Algorithmus mit Delegation der Einzelschritte an Unterklassen; Teilschritte können von Unterklassen geändert werden
- Strategy, Strategie
- Ermöglicht Austausch verschiedener Implementierungen einer Aufgabe ohne Beeinflussung der sie benutzenden Objekte
- Mediator, Vermittler
- Objekt, welches das Zusammenspiel einer lose gekoppelten Objektmenge in sich kapselt. Vermeidet direkten Bezug der Objekte untereinander und ermöglicht unabhängige Änderung des Zusammenspiels
- State, Zustand
- Ermöglicht Objekt, sein Verhalten abhängig von seinem inneren Zustand zu ändern, als ob es die Klasse wechselt
- Chain of Responsibility, Zuständigkeitskette
- Vermeidet direkte Kopplung von Auslöser und Empfänger einer Anfrage bzw. Operation. Mehrere Objekte werden nacheinander benachrichtigt, bis die Anfrage erledigt ist
Bewertung Observer
- Vorteile
- Entkopplung von Komponenten und Schichten möglich
- Broadcast und selective Broadcast möglich
- Nachteile
- Bei vielen Beobachtern: Benachrichtigung aufwendig
- Unerwartete Änderung, Änderungskaskaden und Rekursion
- Abmelden der Beobachter vor dem Löschen
- Bekannte Verwendung, Spezialfälle
- Verwendung im Model-View-Controller Muster
- Qt: Signal / Slot-Prinzip ähnlich
Anwendung von Entwurfsmustern
- Untersuche Anwendbarkeit und Konsequenzen
- Analysiere Struktur, Teilnehmer und Kollaborationen
- Wähle aus dem Anwendungskontext Namen für Teilnehmer
- Spezifiziere die teilnehmenden Klassen
- Deklariere Schnittstellen, Vererbung und Variablen
- Identifiziere existierende Entwurfsklassen, die durch das Muster beeinflusst werden
- Wähle anwendungsspezifische Namen für Operationen
- Implementiere Operationen entsprechend den Verantwortlichkeiten und Kollaborationen des Musters
Klassenbibliotheken und Komponenten
Klassenbibliotheken
- Zusammenfassung von Modulen, Klassen, etc.
- Mit einem bestimmten (abstrakten) Zweck
- Abstrakte Datenverwaltung, Templates
- Grundlegende System-Aufgaben
- Untere Kapselungs-Schicht des Laufzeitsystems oder der Programmierumgebung
- Numerische Routinen, Simulation, ...
- Wird in Anwendung eingebunden (importiert), API
- Objekte instanziieren oder Klassen ableiten
- Meist passiv: Kontrollfluss wird von Anwendung gesteuert
- Beispiele: stdlib, MFC, GNU scientific library, Java 3D, IPP
Komponentenbasierte Entwicklung
- Bausteinorientierte Programmierung (component-ware)
- Softwareentwicklung: Konstruktion aus vorgegebenen Bausteinen
- Entsprechung für Wiederverwendung: Generische Bausteine (components)
- Anpassbar, zusammensetzbar
- Werkzeuggestützte bzw. grafische Kompositionsmechanismen
- Beispiele: Java Beans, Enterprise Java Beans (EJBs), Microsoft COM+
- Komponenten-Entwicklung oft auch projektspezifisch
- Warum Komponenten
- Monolithische, proprietäre Software führt zunehmend zu Problemen
- Zunehmend verteilte Anwendungen mit offener Struktur und Internet-Anbindung
- Zusammensetzen der Funktionalität aus standardisierten Elementen, die über offene Schnittstellen kommunizieren
- Komponenten sollen Flexibilität bei sich ändernden Anforderungen erhöhen
- Weg aus der „Software-Krise“?
- Eigenschaften von Komponenten
- müssen von ihrer Umgebung und anderen Komponenten unabhängig und getrennt sein
- Kontextabhängigkeiten: benötigte Komponenten-Infrastruktur und Systemressourcen
- Kapseln ihre angebotenen Funktionen
- Werden immer als ganze Einheit eingesetzt; alle Bestandteile sind enthalten (Archiv-Datei)
- Sind nicht von Kopien ihrer selbst unterscheidbar
- Klare Spezifikation der Schnittstelle nötig; explizit definierte Interaktionen mit Komponenten und Umgebung
- Komposition durch Dritte: Endbenutzer, Komponenten-Hersteller und Komponenten-Integrator; meist nur kompilierter Code verfügbar
- müssen von ihrer Umgebung und anderen Komponenten unabhängig und getrennt sein
Komponenten für Client/Server-Architekturen
- Wichtige Aspekte
- Transaktionen
- Sicherheit
- Ressourcenverwaltung
- Persistenz
- Komponentenkonzept für Server-Komponenten
- meist unsichtbare Komponenten
- standardisierte Realisierung der wichtigen Eigenschaften für Client/Server-Anwendungen
- Realisierung: Enterprise Java Beans (EJBs) innerhalb eines Java Enterprise Edition Servers
Dokumentation
Dokumentation des Feinentwurfs
- Möglichkeiten
- Eigenständiges Dokument
- Erweiterung des Lastenhefts / Grobkonzepts
- Eingebettet in den Quellcode (Werkzeug, z.B. Javadoc)
- Inhalt
- Ähnlich Grobkonzept
- Zusätzlich detaillierte Modelle
- Abwägungen des Objektentwurfs
- Klassenschnittstellen
Implementierung
Aufgaben der Implementierung
- Aus Spezifikationen Programm(code) erzeugen
- Aufbauend auf Ergebnissen des Feinentwurfs
- Algorithmen konzipieren
- Datenstrukturen realisieren
- Umsetzen in konkreter Programmiersprache
- Dokumentation
- Untersuchung des Zeit- und Speicherbedarfs
- Test und Verifikation
- „Programmieren im Kleinen“
Konventionen und Werkzeuge
Konventionen beim Programmieren
- (Coding Rules, -conventions, -standards)
- Regeln für verständliche Programme
- „wie“ sollte Quellcode formal und strukturell gestaltet sein
- Bezeichner, Einrückungen, Dokumentation, Dateien, ...
- Strukturierung: Block, Methode, Klasse, Package
- Firmenspezifische Regeln
- Festlegung Entwurfsprinzipien (z.B. keine Mehrfachvererbung)
Namenskonventionen
- Klasse
- (mit) Substantiv, „UpperCamelCase“
- Beispiele: Account, StandardTemplate
- Methode
- (mit) Verb, Imperativ (Aufforderung), „lowerCamelCase“
- Beispiele: checkAvailability(), getDate()
- Attribut, Variable
- (mit) Substantiv, „lowerCamelCase“
- Beispiele: anzahlAutos, fensterBreite
- Konstante
- Nur Großbuchstaben, Worte mit "_" zusammengesetzt
- Standardpräfixe: "MIN_", "MAX_", "DEFAULT_", ...
- Beispiele: NORTH, BLUE, MIN_WIDTH, DEFAULT_SIZE
Formatierungs-Richtlinien
- Entsprechend Schachtelungstiefe einrücken, aber nicht zu weit
- Einheitliche Verwendung von Leerzeilen und Leerzeichen
- Einheitliche Dateistruktur verwenden
- Eine .java-Datei pro Klasse
- Ein Verzeichnis für jedes package
- Werkzeuge: source beautifier, oft in IDEs enthalten
- Editor: syntax highlighting
- Navigationswerkzeuge
- Auf- und Zuklappen, Inhaltsverzeichnis, tagging
- doxygen, Eclipse etc.
Änderungsfreundlicher Code
- Wahl von Variablen, Konstanten und Typen orientiert an der fachlichen Aufgabe, nicht an der Implementierung:
typedef char name [NAME_LENGTH]
typedef char firstName [FIRST_NAME_LENGTH]
- Symbolische Konstanten statt literaler Werte verwenden, wenn spätere Änderung denkbar
- Algorithmen, Formeln, Standardkonzepte in Methoden/Prozeduren kapseln
- Übersichtlichkeit: Zusammenhängende Einheit nicht größer als Editorfenster (40-60 Zeilen, 70 Zeichen breit)
- Strukturierte Programmierung (Regeln je nach Schärfe)
- Kein goto verwenden (in anderen Sprachen als Java)
- switch nur mit break-Anweisung nach jedem Fall
- break nur in switch-Anweisungen verwenden
- continue nicht verwenden (Effekt ähnlich goto)
- return nur am Ende zur Rückgabe des Werts
- Übersichtliche Ausdrücke
- Seiteneffektfreie Ausdrücke, schlecht: y += 12*x++;
- Variablen möglichst lokal und immer private deklarieren
- Wiederverwendung "äußerer" Namen vermeiden
Werkzeuge
- Integrated Development Environments (Eclipse, KDevelop)
- Compiler, Linker; Build / Make; Versionskontrolle (git, svn)
Code-Qualität
Portierbarer Code
- Code, den man ohne Änderungen in ein anderes System (Compiler, Betriebssystem, Rechner) übertragen kann
- Kein implementierungsabhängiges Verhalten!
- ANSI C++ Standard ist nicht vollständig definiert
- Ist das Verhalten nicht festgelegt, unterscheidet der ANSI C++ Standard zwischen:
- Implementierungsabhängigem, unspezifiziertem oder undefiniertem Verhalten
- Code, welcher auf implementierungsabhängigem, unspezifiziertem oder undefiniertem Verhalten basiert, ist
- Nicht portabel und somit häufig verboten
- Wird unter Umständen ungewollt wegoptimiert
Implementierungsabhängiges Verhalten
-
Compiler übersetzen bestimmte Sprachkonstrukte unterschiedlich, Ergebnis unterscheidet sich
-
Voraussetzung
- Verhalten ist konsistent festgelegt und dokumentiert
- Kompilierung von standardkonformem Code ist erfolgreich
-
Beispiel: Speichergröße von Integer-Typen
- char kann signed oder unsigned sein: Nicht damit rechnen!
- 32 Bit System ist wie erwartet
- 16 Bit System: Multiplikation wird mit int durchgeführt -> Überlauf -> undefiniertes Verhalten
-
Unspezifiziertes Verhalten
- Wie implementierungsabhängiges Verhalten
- Compiler muss sich für ein bestimmtes Verhalten entscheiden
- Muss nicht dokumentiert sein
- Beispiel: Evaluierungsreihenfolge von Funktionsargumenten
tuWas(zuerstDas(),oderDochLieberDas());
-
Undefiniertes Verhalten
- Keinerlei Vorgaben
- Compiler muss mögliches Problem nicht melden
- Keine Voraussage welches Resultat eintritt
- Bereits die Kompilierung kann fehlschlagen
- Oder das laufende Programm kann falsche Resultate liefern.
- Effekt: „Bei mir läuft es aber!?“
- „undefiniertes Verhalten nutzen grenzt an Sabotage!“
Sicherer Code mit const
- Const Variable – Konstante
- Stellt sicher, dass sich der Wert nicht verändert
- Const Parameter
- Übergabeparameter ändert sich nicht innerhalb der Operation
- Z.B. bei Übergabe komplexer Daten als Referenz bzw. Zeiger
long calcMeanValue(const image &i){...}
- Const Operationen
- Sicherstellen, dass Operation das Exemplar nicht ändert
- Aufruf der const Operation bei const Variablen möglich
- Verwende const wenn möglich
Dokumentation
- Selbstdokumentierende Programme?
- 2001 Int. Obfuscated C Code Contest Winner, Short Program
Integrierte Dokumentation
- Verständlichkeit, Wartbarkeit – auch für Programmierer!
- Code selbst sollte möglichst verständlich sein
- Dokumentation in Programm schreiben und aktualisieren
- Beschreibung der Bedeutung des Codes!
- Als Konventionen festschreiben
- Programmvorspann
- Kurzbeschreibung Datei / Klasse / Funktion ...
- Verwaltungsinformationen
- Autor, Datum, Version, Projekt, ToDo, FixMe, ...
- Zustand: geplant, in Bearbeitung, vorgelegt, akzeptiert
- Laufende Kommentare im Quellcode
Programmierer-Dokumentation
- Als eigenes Dokument elektronisch oder gedruckt
- Einstieg in Programmverständnis (z.B. Bachelor-Arbeit)
- Konsistenz mit Quelltext? Verweise?
- Technische Unterstützung: JavaDoc (Java), doxygen (C++)
- Ergänztes Java-Programm Dokumentation HTML, PDF,
/** @author name Mustermann */ /** @param name description */ /** @return description */
Benutzerdokumentation
- Benutzer-Handbuch, Online-Dokumentation
- Unterstützung ohne Support?
- Vollständige und fehlerfreie Beschreibung der Benutzung
- Beispiele, screen shots
- Arten: Tutorial, Beschreibung, Referenz
Benutzer-Unterstützungssysteme
- Integrierte Hilfe (Suchfunktion, balloon help / tool tips)
- Assistenz-System (Zustandsabhängige Anleitung)
- Tutor-System zum Erlernen
- Bug-Listen, Mailinglisten, Diskussionsforen
Codegenerierung
Bezug zwischen Modell und Programmcode
- Vorwärtsmodellierung: Modell - Code
- Rückwärtsmodellierung: Code - Modell
- Außerdem: Modelltransformation, Refaktorisierung
- Idealfall: Automatische Übersetzung durch SW-Werkzeug (in beiden Richtungen)
- „Modellbasierte Entwicklung“
- Statisch: Beispiel Klassendiagramm - Quelltext der Klassen mit allen Vererbungsbeziehungen, Attributen und Methodensignaturen (Klassen-Stümpfe mit leeren Methodenrümpfen zum Ausfüllen)
- Dynamisch: Beispiel Zustandsdiagramm - Quelltext der Zustandssteuerung einer Klasse
Weitere statische Transformationen
- Abbildung von Assoziationen auf Sammlungen
- Abbildung von Verträgen auf Ausnahmen
- Abbildung von Objektmodellen auf Datenbankschemata
- Abbildung von Entwurfsmustern auf Codefragmente
Optimierung des Entwurfsmodells
- Grund: nichtfunktionale Eigenschaften
- Zugriffspfade
- Klassen in Attribute umwandeln
- Verzögerung von Berechnungen
- Zwischenspeicherung aufwändiger Ergebnisse
Codegenerierung aus StateCharts
- Einfachste Möglichkeit: Switch (Case) Statement
- Zustände werden durch Datenwerte repräsentiert
- Aktueller Zustand: einzelne skalare Variable
- Jedes Ereignis wird durch Methode implementiert
- Ausgehend von aktivem Zustand wird bei Eintreffen eines Ereignisses der entsprechende Programmcode ausgeführt
- Abhängig von Zustandsvariable wird Aktion ausgeführt und der Folgezustand eingestellt
- Wird in einer Klasse realisiert
- Sinnvoll für einfache, “flache” Modelle
- Sonst Logik für Hierarchie nötig
Anpassung der Generierung
- Verschiedene Zielsprachen (Java, C++, ...)
- Model2Text-Transformationen
- Verschiedene Generatoren, z.B. Eclipse Modelling Project
- Generierung aus dem Modellierungswerkzeug
- Parametrisierung der Codegenerierung
- Generierungsvorlagen
Weitere Werkzeuge
- Compiler-Compiler: Syntaxbeschreibung wird in lexikalische Analyse (tokenizer) und Syntaxanalyse-Programm transformiert (lex & yacc / flex & bison / antlr)
- Codegenerierung für grafische Benutzungsoberflächen aus grafischer Beschreibung: GUI toolkits
- XML-Parser
- XSLT, DOM, SAX, ...
Implementierung aktiver Objekte
Realisierung aktiver Entwurfsobjekte
- Reagieren nicht nur (Methodenaufruf), sondern implementieren eigenes Verhalten
- Aktive Klassen, z.B. Steuerobjekte
Arten von Programmabarbeitung
- Sequentiell: es gibt immer genau einen nächsten Schritt, alle Schritte werden nacheinander ausgeführt
- Parallel: Spezielle Hardware bzw. Mehrkernprozessor, mehrere Befehlsfolgen werden echt parallel bearbeitet
- Quasi-parallel: Ein Prozessor arbeitet mehrere Befehlsfolgen in freier Einteilung ab
- Nebenläufig: Oberbegriff für Parallel und Quasi-parallel
- concurrent
Vorteile
- Höhere Geschwindigkeit
- Kein aktives Warten auf Ereignisse
- Getrennte Implementierung unabhängiger Aspekte
Ergebnisse eines Programms
- Ein Programm, dessen Ablauf eindeutig vorherbestimmt ist, nennt man deterministisch (deterministic)
- Ein Programm, das bei gleichen Eingaben gleiche Ausgaben produziert, heißt determiniert (determined)
- Programme in üblichen Programmiersprachen sind sequentiell, deterministisch und determiniert
- Grund: Herkömmliche Programmiersprachen sind durch das von-Neumann-Modell geprägt
- Determinismus nicht notwendig für Determiniertheit!
- Determiniertheit nebenläufiger Programme: Synchronisation
- Vermeidung von Schreib/Schreib und Schreib/Lese-Konflikten
Java Threads
- Verwaltung durch die Java Virtuelle Maschine (JVM)
- Realisierung der Threads ist je nach Implementierung der JVM unterschiedlich
- Abbildung auf Betriebssystem-Threads (z.B. unter Windows weitverbreitet)
- Realisierung durch die JVM (z.B. unter Unix und in Java-fähigen Browsern)
- Nachteile: Keine Ausnutzung von Multiprozessorsystemen durch die VM; Zuteilungsstrategie für Threads ist in derzeitigen Implementierungen unterschiedlich
- Threads arbeiten immer im Adressraum der JVM (eigener Prozess) und sind außerhalb dieser nicht sichtbar
Erzeugung eines Threads
- Unterklasse der Basisklasse „Thread“ bilden
class MyThread extends Thread
- Problem: keine Mehrfachvererbung, daher Alternative nötig (Beispiel: Applet):
- Schnittstelle „Runnable“ implementieren
class MyThread implements Runnable
- Die vordefinierte Schnittstelle Runnable ist definiert als
public interface Runnable { public abstract void run(); }
Starten eines Threads
- Eine Klasse, die Runnable implementiert, muss wie Unterklassen von Thread immer eine run()-Methode definieren
- Seiteneffekt der Runnable-Schnittstelle
- Instanzen der Klasse werden nebenläufig zu den anderen laufenden Threads ausgeführt
- Ausführung beginnt mit der Methode run ()
- Ablauf
- Thread-Objekt erzeugen
- Thread starten mit t.start()
- start() ruft implizit run() auf
Synchronisation von Threads
- Gezielte Einschränkung der Nebenläufigkeit
- Gründe
- Zugriffsbeschränkung, gegenseitiger Ausschluss
- Abhängigkeiten, einseitige Synchronisation
- Methoden: Semaphore, Monitore, Schlossvariablen, ...
Java: Monitore
- Zugriffsoperationen werden in Klassen zusammengefasst
- Gegenseitiger Ausschluss: Spezifikation der betroffenen Zugriffsoperation als synchronized
Verifikation und Testen
Wie erreicht man qualitativ hochwertige Software?
- Wissen, Erfahrung und Methodenkompetenz der Programmierer
- Projektstruktur, klare Verantwortlichkeiten
- Kosten- und Zeitdruck? Änderungen?
- Programmier- und Testmethoden
- pair programming, code reading etc.
- Qualitätsverantwortlicher, automatisiertes Testen
- Technische Unterstützung
- Z.B. Versionierung, Dokumentation, Testen, Entwicklungsumgebung
Begriffe
- Zuverlässigkeit: Maß für Übereinstimmung des Systemverhaltens mit Spezifikation
- Grund für Unzuverlässigkeit:
- Fehler (bug, fault): fehlerhafter Programmcode o.ä.
- Der Begriff „Bug“:
- Schon vor Computern als Begriff für Fehler benutzt
- Motte im Relais des Computers Mark II Aiken (1947)
- Der Begriff „Bug“:
- Fehlerhafter Zustand (error): Fehler hat zur Laufzeit zu einem internen fehlerhaften Zustand geführt, der möglicherweise zu einem Ausfall führt
- Störfall, Ausfall (failure): Abweichung vom spezifizierten Verhalten, meist mit negativen Folgen
- Fehler (bug, fault): fehlerhafter Programmcode o.ä.
Vergleich System / Systemmodell
- Anspruch guter Software: System entspricht Systemmodell (Korrektheit)
- Problem: System nicht vollständig automatisch erzeugbar!
- Auswege
- Fehlervermeidung (Inspektion, pair programming, ...)
- Nachweis, dass System dem Modell entspricht - Verifikation
- Überprüfen, ob System dem Modell entspricht - Testen
- Fehlertoleranz (durch Redundanz)
Verifikation
- Mathematisch formaler Beweis, dass ein Programm einer Spezifikation genügt
- Vorteil: wenn anwendbar, dann vollständiger Beweis
- Problem: für viele (realistisch große) Fälle nicht anwendbar
- Zu aufwändig
- Umgebung muss ebenfalls verifiziert werden
- Auch in der Theorie nicht immer entscheidbar: Halteproblem, Gödelscher Unvollständigkeitssatz
- Theoretische Informatik: Berechenbarkeitstheorie, formale Semantik; aktives Forschungsgebiet
- model checking
Testen
- Systematischer Versuch, Defekte in der Software zu finden
- Ingenieurtechnik zur Erhöhung des Vertrauens in Softwaresysteme, aber: unvollständig!
- Kann nur die Anwesenheit von Fehlern nachweisen, aber nicht Korrektheit (Abwesenheit von Fehlern)!
- Aufgabe: Unterschiede zwischen Modell und System finden
- Destruktiv im Gegensatz zu sonstigen SWE-Aufgaben
- Daher sollten nicht (nur) Entwickler selbst testen
Testplanung
- Testen ist aufwändig, deshalb ist gute Planung nötig!
- Testplanung sollte bereits mit der Anforderungsanalyse beginnen und im Entwurf verfeinert werden (V-Modell, Test-First-Ansatz)!
- Typische Bestandteile einer Test-Spezifikation (Testdrehbuch)
- Phasenmodell des Testprozesses
- Zusammenhang zur Anforderungsspezifikation, z.B. dort festgelegte Qualitätsziele
- Zu testende Produkte
- Zeitplan für die Tests
- Abhängigkeiten der Testphasen
- Aufzeichnung der Testergebnisse
- Hardware- und Softwareanforderungen
Arten von Tests
- Komponententest: Fehler in einzelnen Objekten oder Subsystemen, losgelöst vom umgebenden System
- Umgebung muss nachgebildet werden
- Integrationstest: Zusammenspiel von Komponenten
- Vollständiges System: Systemtest; Szenarios
- Strukturtest: innere Zustände, Interaktionen
- Funktionstest: Anforderungen aus Lastenheft
- Leistungstest: nichtfunktionale Anforderungen
- Benutzbarkeitstest: Fehler in der Benutzungsschnittstelle, Verständlichkeit, Akzeptanz bei Anwendern
- Prototypen
- Akzeptanztest, Installationstest: Kunde, Abnahme
Komponententests
- Überprüft Verhalten einer Systemkomponenten im Vergleich zur Spezifikation
- Da Tests bereits frühzeitig stattfinden sollten, ist Umgebung meist nicht vollständig implementiert
- Teststumpf (stub, dummy) simuliert aufgerufene Komponenten
- Testtreiber simuliert aufrufende Komponenten
- Vorgehensweisen
- Bottom-up
- Top-down
- Sandwich
- Schichtenweises Testen
Systematisches Testen
- Testfall
- Beschreibung, Name
- Zu testende Komponente, Testgegenstand (Pfad, Aufrufart)
- Eingabedaten (Testdaten)
- Erwartete Ergebnisse („Orakel“)
- Protokoll (erzeugte Ausgaben)
- Bewertung des Ergebnisses
- Weitere Begriffe
- Regressionstest: erneute Durchführung eines Tests anhand einer geänderten Version des Testgegenstands
- Alphatest: Test eines Prototypen durch Benutzer
- Betatest: Test der vollständigen Software durch Benutzer
Funktionaler Test (black box test)
- Testfallauswahl beruht auf Spezifikation
- Ohne Wissen über inneren Aufbau
- E/A-Zusammenhang
Äquivalenzklassen im funktionalen Test
- Problem: alle Kombinationsmöglichkeiten der Eingangsdaten sind zu umfangreich für vollständigen Test
- Mögliche Einschränkung: Bildung von Äquivalenzklassen der Eingangsdaten, für die ähnliches Verhalten erwartet wird
- Basierend auf Anwendungsdomäne
- Äquivalenzklasse = Teilmenge der möglichen Datenwerte der Eingabeparameter
- Test je eines Repräsentanten jeder Äquivalenzklasse
- Finden von Äquivalenzklassen
- Zulässige / unzulässige Teilbereiche der Datenwerte
- Unterteilung der Bereiche nach erwarteten Ausgabewerten
Grenztests
- Ergänzung von Äquivalenztests: Spezialfälle
- Rand der Äquivalenzklasse
- Außerdem: Sonderfälle, erwartete Problemfälle (technisch)
Strukturtest (white box test, glass box test)
- Testfallauswahl beruht auf Programmstruktur
- Wie erreicht man möglichst vollständige Abdeckung?
- Kontrollflussorientiert
- Anweisungsüberdeckung anhand Quellcode
- Zweigüberdeckung und
- Pfadüberdeckung anhand des Flussgraphen reduzierte Variante: bounded interior Pfadtest
- Datenflussorientiert
- defines / uses-Verfahren: Abarbeitungspfade von Definition zu jeder Verwendung von Variable oder Objekt durchlaufen
- Zustandsorientiert
Testaktivitäten und Werkzeuge
Wann wird getestet?
- Während der Implementierung!
- Auch wenn Schreiben von Tests scheinbar unproduktiv ist
- Tests sind unbeliebt, da Probleme aufgezeigt werden
- Aber: spätes Testen erhöht Aufwand!
- Inkrementell, d.h. für jede überschaubare Änderung
- Spezielle Vorgehensweise: test first-Ansatz
Wie wird getestet?
- Geplant, systematisch, möglichst automatisiert, dokumentiert, wiederholbar
Testplanung
- Iterative Erstellung eines Testplans / Testdrehbuchs
- Aktivitäten – Festlegen von
- Teststrategie (Testumfang, Testabdeckung, Risikoabschätzung)
- Testziele und Kriterien für Testbeginn, -ende und -abbruch
- Vorgehensweise (Testarten)
- Testumgebung (Beschreibung)
- Hilfsmittel und Werkzeuge zum Testen
- Testspezifikation
- Testorganisation (Termine, Rollen, Ressourcen)
- Fehlermanagement (Werkzeugunterstützung)
- Ergebnis: Inhalt des Testplans
Testspezifikation
- Auswahl der zu testenden Testfälle
- Definition einzelner Testfälle
- Grundlage: Anwendungsfälle, Anforderungen, Fehlermeldungen (Zuordnung notwendig)
- Aktivitäten
- Testfallfindung und Testfalloptimierung
- Testfälle beschreiben (was genau ist zu testen)
- Randbedingungen finden (Abhängigkeiten zu anderen Testfällen)
- Festlegen und Erstellen der Eingabedaten
- Festlegungen zum Testablauf und zur Testreihenfolge
- Festlegen Soll-Ergebnis
- Festlegung der Bedingung(en) für 'Test erfüllt'; ...
Testvorbereitung
- Tätigkeiten im Vorfeld des Tests
- Aktivitäten
- Vorbereitung der Tests entsprechend Testplan
- Bereitstellen der Dokumente (Testspezifikation)
- Verfügbar machen von Werkzeugen (Fehlermanagement)
- Aufbauen der Testumgebung(en)
- Integration der Entwicklungsergebnisse in die Testumgebung (Software installieren, konfigurieren, ...)
- Bereitstellung von Testdaten bzw. Eingabedaten in die Testumgebung
- Benutzer und Benutzerrechte anlegen
Testdurchführung
- Durchführung der spezifizierten Tests
- Manuell
- Automatisiert
- Aktivitäten
- Auswählen der zu testenden Testfälle
- Bereitstellen der Testdaten
- Starten, Überwachen, Abbrechen, Beenden
- Erfassung des Ist-Ergebnisses zur Auswertung
- Besondere Vorkommnisse dokumentieren
- Umgebungsinformationen für den Testlauf archivieren, ...
Testauswertung
- Überprüfung der Ergebnisse
- Vergleich Ist-Ergebnis mit Soll-Ergebnis
- Entscheidung Testergebnis (ok / Fehler)
- Bei Fehler:
- Klassifizierung (z. B.: Fehlerursache, Fehlerschwere etc.)
- Fehler reproduzieren!
- Angemessene Fehlerbeschreibung und –erläuterung: Nur ausreichend dokumentierte Fehler sind gültig und können bearbeitet werden!
- Fehler im Fehlermanagement eintragen (Bug report)
- Testfall bleibt offen
Bugbeschreibung
- Möglichst genaue Beschreibung des Fehlers
- Ziel ist die Reproduzierbarkeit des Fehlers
- Zuordnung zu Projektplan: Meilenstein, Version
- Fehlerklassifikation
- defect: Fehler in einer bestehenden Funktionalität
- enhancement / feature: Funktionale Anforderung oder Erweiterung der bestehenden Funktionalität
- task: Allgemeine Aufgabe
- Priorität festlegen
- Unterschiedliche Stufen
- Festlegung innerhalb eines Unternehmens / Projektes
- Prioritäten von Fehlern (bugs)
Stufe | Bedeutung | Verhalten |
---|---|---|
blocker | Schwerwiegender Fehler. Führt zur Arbeitsunfähigkeit anderer (Entwicklung, QA, Produktion,...). | Verdrängt alle anderen Aufgaben! Muss sofort gelöst werden, um Arbeitsfähigkeit wieder herzustellen. |
critical | Schwerer Fehler. Eine grundlegende Funktionalität des Systems ist nicht gegeben. Fehler muss bis zur nächsten Version behoben werden. System kann nicht verwendet werden. | Alle anderen Fehler (außer blocker) werden später gelöst. Bis zum nächsten Release muss dieser Bug gelöst sein. |
major | „normaler“ Fehler. Es tritt ein Fehler innerhalb einer Funktion des Systems auf. Das System kann jedoch weiterhin verwendet werden. | Fehler wird normal eingeplant. |
minor | Kleiner Fehler. Fehler behindert nicht weiter die Funktionsfähigkeit des Systems. Einfacher Work-Around vorhanden? | Je nach Aufwand und Zeitplanung erledigen. |
trivial | Schönheitsfehler. Fehler stört während des Betrieb des Systems nicht. | Je nach Aufwand „zwischendrin“ erledigen. Alle anderen Bugs bevorzugt lösen. |
Testabschluss
- Zusammenfassen der Tests
- Gesamtstatus dokumentieren und kommunizieren
- Entscheidungen herbeiführen z.B.: Auslieferung?
- Ziele erreicht - nächste Schritte (Auslieferung)
- Tests vorzeitig beenden oder unterbrechen
- Gründe dokumentieren
- Vollständiger Nachtest oder Teiltest möglich?
- Unterlagen archivieren
Testautomatisierung
- Automatische Code-Validierung
- Statisch: lint (C), Compiler
- Dynamisch: run-time checking, memory leaks etc.
- Beispiel: Test-Framework JUnit
Behebung funktionaler Fehler
- Log-Ausschriften bzw. Signale
- Debugger: Vorwärts / Rückwärts
- Haltepunkte setzen: Bedingte Haltepunkte für Schleifen
- Darstellung der Variablenbelegung, Werte setzen
- Analyse des Aufruf-Stacks
Behebung nichtfunktionaler Fehler
- Geschwindigkeit: profiling z.B. mit Eclipse TPTP
- Aufrufe, Zeitverbrauch in Methoden usw.
Memory Leaks, JProbe
- Runtime heap summary: Welche Objekte verbrauchen Speicher?
- Reference graph: Wer referenziert diese Objekte, so dass sie nicht per garbage collection gelöscht werden?
Softwareverteilung
Softwareverteilung (deployment)
- Prozess zur Installation von Software auf
- Anwender-PC‘s, Servern, Maschinen in Produktion ...
- Steuerung der Installation der Software
- Voraussetzungen für die Software schaffen
- Schulungen planen und durchführen
- Softwareverteilung ist ein kritischer Prozess!
- Fehler können zu vielen Störungen und Ausfällen führen
- Ziele
- Automatische Installation, Konfiguration und Wartung einer großen Anzahl von Systemen mit geringem Aufwand
- Erreichen eines störungsarmen und sicheren Betriebs
- Möglichst einheitliche Softwareversionen auf allen Systemen
Installationsarten
- Erstinstallation
- Software-Update (Software-Aktualisierung)
- Aktualisierung der Software, Daten oder Konfiguration
- Hotfixes und Service Packs
- Nur bestimmte Teile der Software werden aktualisiert
- Meist nur Fehlerbehebung, keine neuen Features
- Upgrade
- Erweitert eine Software deutlich um neue Funktionen
- Unbeaufsichtigte (automatische) Installation
- Installation erfolgt ohne Benutzereingriff
- Periodisch, durch Aufruf des Anwenders, beim Programmstart
- Einstellungen in einem Skript festgelegt oder werden als Parameter übergeben
Installationshilfsmittel
- Installationsprogramm (Installer)
- Windows: Windows Installer, InstallShield
- Linux: RPM, Port, APT
- MAC-OS: Installer, WarpIn
- Installations-Script
- Installationsanweisung
Software-Rollout
- Vorgang des Veröffentlichens und Verteilens von Softwareprodukten auf entsprechende Clients
- Anzahl der Clients kann weit über 10.000 liegen!
- Rollout abhängig von verschiedenen Kriterien (Vorherige Installation, Hardwarekonfiguration, Zeit, Kunde)
- Rollout-Varianten
- Zentral / Dezentral
- Manuell (Benutzer löst Installation aus)
- Automatisiert (ohne Benutzerinteraktion)
Vollständige Verteilung (big bang)
- Alle Installationen werden mit einem Mal installiert
- Sehr hohes Risiko
- Eventuelle Fehler führen zu vielen fehlerhaften Zuständen oder Störfällen - führt zu hohem Druck
- Eventuelle Fehler müssen schnell gelöst werden (Provisorium)
- Sehr kurze Einführungsphase
- Rollback-Mechanismus sehr empfohlen
Rollback
- Wiederherstellung des Ursprungszustands
- Technische Realisierung muss ermöglicht werden
Pilotierte Einführung
- Einführung für wenige ausgewählte Installationen
- Sehr hohe Sicherheit
- Festlegung der späteren Rollout-Schritte
- Benötigt zusätzliche Zeit
- Geringere Auftrittswahrscheinlichkeit von Fehlern
Schrittweise (iterative) Einführung
- Einführung erfolgt schrittweise mit einer definierten Anzahl
- von Installationen (Rampe – ramp-up)
- Höhere Fehlerwahrscheinlichkeit -> Bessere Reproduzierbarkeit -> schnelleres Finden von Fehlern -> Erfahrungsgewinn
- Begrenztes Risiko, mittlerer Zeitaufwand
Vorgehensmodelle
Einführung
Wie läuft Softwareerstellung ab?
- (oder besser, wie sollte sie ablaufen?)
- Aufgaben und Phasen siehe vorangegangene Kapitel
- Wann wird was getan? Abhängigkeiten?
- Sequentiell / nebenläufig,
- Prozessmodelle der Softwareentwicklung
- Regelwerke, Erfahrungen, best practices für große Projekte
- Aktives Entwicklungsgebiet
- Erweiterbar zum Software-Lebenszyklus mit Inbetriebnahme, Wartung, Außerdienststellung usw.
Softwareentwicklungsprozess/Vorgehensmodell
- Methode zur Erstellung von Softwaresystemen
- Systematisch, rational und schrittweise erfolgender Weg vom Problem zur Lösung
- Ziel: Softwareentwicklungsprozess übersichtlich, plan- und strukturierbar
- Zerlegung des Softwareentwicklungsprozesses in überschaubare Einheiten
- Unternehmensspezifisch, anpassbar, erweiterbar
- Eigene Varianten, evtl. projektabhängig
- An spezielle Bedürfnisse des Informationsbereichs angepasst
- Kein allgemeingültiges Vorgehen
- Einsetzbar in verschiedenartigen Projekten
Phasen
- Überwiegend zeitliche Zerlegung
- Zeitlich begrenzte Phasen
- Auch inhaltlich und organisatorisch begrenzte Phasen möglich
- Teilprozesse / Aktivitäten
- Inhaltliche Zerlegung
- Satz von Aufgaben
- Verteilung der Teilprozesse / Aktivitäten auf verschiedene Phasen
- Begleitet von unterstützenden, übergreifenden Aktivitäten
Aufgabe
- Erzeugt Arbeitsergebnis (Artefakt)
- Verbraucht Ressourcen (z.B. Arbeitskraft, Zeit, Ausrüstung)
Arbeitsergebnis (oder Artefakt)
- Dokument, Modell, System, Programmcode Lastenheft, Spezifikation, Glossar, Handbuch usw.
- Intern zu lieferndes Ergebnis
Teilnehmer und Rollen
- Verantwortungsbereich eines Teilnehmers (z.B. Kunde, Projektmanager, Entwickler, Architekt)
- Rolle bearbeitet / enthält Satz von Aufgaben
Unterstützungsprozesse / -Aktivitäten
- Projektmanagement
- Projektplanung, -verfolgung und -steuerung
- Risikomanagement
- Anforderungsmanagement
- Im Gegensatz zur Anforderungsaufnahme und -analyse
- Qualitätsmanagement
- Problem Management
- Softwaremetriken (Messung von Softwareeigenschaften)
- Statische + dynamische Analyse (Bestimmung von Schwachstellen)
- Konfigurationsmanagement
- Versionsverwaltung, Änderungsmanagement
- Dokumentation
Sequenzielle Modelle
- Wasserfallmodell
- Abhängigkeiten zwischen Teilergebnissen
- Ursprung in System- Hardwareentwicklung
- Wurde für die SW-Entwicklung übernommen
- Auch heute verbreitetes Vorgehen bei HW-Entwicklung
- Sequenzielles Phasenmodell (Abschluss der Phasen)
- Stark Dokumentengetrieben (Ergebnisse der Phasen)
- Unterteilung in abgeschlossene Phasen:
- Analyse
- Design/Entwurf
- Implementierung
- Test & Integration
- Einführung, Betrieb & Wartung
- Alternativ:
- Planung
- Definition
- Entwurf
- Implementierung
- Test & Integration
- Einsatz und Wartung
- Vorteile
- Einfach und verständlich, bekannt und verbreitet
- Erleichterte Planung und Steuerung
- Nachteile
- Idealisierte Annahme rein sequentiellen Ablaufs
- Starke Abhängigkeiten zwischen Teilergebnissen
- Ungeeignet, falls Anforderungen zu Beginn unklar
- Unflexibel gegenüber Änderungen
- Erst sehr spät greifbare Ergebnisse
- Erweitertes Wasserfallmodell
- Verbesserung für Änderungen und Fehler – Rückschritte
- Alternative Arten von Phasenmodellen
- Sequenziell
- Phasen strikt nacheinander, Dokumenten-orientiert
- Keine Änderungen abgeschlossener Artefakte
- Nebenläufig
- Phasen laufen teilweise parallel für bessere Zeitnutzung
- Weiterhin keine Änderungen fertiger Dokumente
- Inkrementell
- Unterteilung des Produkts in Teile
- Schnellere Auslieferung von Teilfunktionalität nach vollständiger Aufnahme der Anforderungen
- Alternative: Evolutionär
- Anforderungen entwickeln sich im Projekt
- Ausgelieferte Versionen ergeben neue Anforderungen
- Sequenziell
- V-Modell [Boehm]
- Explizite Adressierung der Qualitätssicherung
- Entwicklung des V-Modells in Deutschland
- Leitfaden, in Bundesbehörden ab 1990er verbindlich
- Version V-Modell 97 erweitert um Werkzeuganforderungen, Rollen und Submodelle der Beteiligten
- Kritik: schlecht skalier- und anpassbar, zu unflexibel,
- bürokratisch, nicht an moderner OO-SWEntw. orientiert
- V-Modell XT (extreme tailoring)
- Aktuelle Version ab 2004/05
- Einfache projektspezifische Anpassbarkeit
- Assistent www.v-modell-xt.de (kleines Projekt ~40 Dok.!)
- Überprüfbarer Projektfortschritt
- AG/AN-Sichten und Schnittstellen, Ausschreibungen
- Gesamter SW-Lebenszyklus
Iterative Modelle
Iterativer Entwicklungsprozess
- Spezifikation, Entwurf und Implementierung müssen immer wieder verändert und angepasst werden
- Häufiges Integrieren, Validieren und Testen
- "You should use iterative development only on projects that you want to succeed." [Fowler]
Inkrementelle Entwicklung
- Wenn möglich, sollte es immer einen lauffähigen (unvollständigen) Prototypen geben
- Neue Funktionen sofort integrieren
- Neue Versionen gegenüber Anforderungen Validieren
- Risikogetrieben: Größte Projektrisiken identifizieren und als erstes bearbeiten (Prototyp?)
- Spirale = iterativer Zyklus durch dieselben Schritte
- Ziele jedes Durchlaufs aus alten Ergebnissen ableiten
- Kosten/Nutzen abwägen
- Regelmäßige Überprüfung des Prozessmodells
- Anpassbar
- Hoher Management-Overhead, große Projekte
Unified Process
- Vorgehensmodelle zur objektorientierten Softwareentwicklung
- Ivar Jacobson, Grady Booch and James Rumbaugh: The Unified Software Development Process, (Rational/IBM), 1999
- Phasen der Entwicklung
- Anfang, Ausarbeitung, Erstellung, Überleitung
- Unterteilung in Iterationen
- Definition von Meilensteinen
- Definition von Kernprozessen, die in den Phasen ablaufen
- Geschäftsprozessmodellierung, Anforderungsanalyse, Analyse & Design, Implementierung, Test, Auslieferung
- In unterschiedlichen Anteilen parallel ablaufend!
Prinzipieller Ablauf des Unified Process
- Haupteigenschaften des UP
- Inkrementell, iterativ, evolutionär
- Anwendungsgetrieben
- Architekturzentriert
- Risikoorientiert
- Ereignisorientiert
- Nutzt die UML als Notationssprache
- Erweiterbar / Anpassbar
- Verbreitete Vertreter
- Rational Unified Process – RUP (Rational / IBM)
- Open Unified Process – OpenUP (Eclipse Foundation)
- Object Engineering Process – OEP (oose GmbH)
- Vorteile
- Vorteile der Eigenschaften (iterativ, inkrementell, anpassbar, ...)
- Berücksichtigung des Risikos
- Passend für objektorientiertes Paradigmas und UML
- Tool-Unterstützung
- Reaktion auf Änderungen möglich
- Industriestandard
- Nachteile
- Hoher Bürokratischer Aufwand -> Tailoring notwendig!
- Relativ hohe „Lernkurve“ aller Beteiligten
- Keine schnelle Reaktion auf Änderungen
- Keine integrierte Qualitätssicherung
Agile Methoden
- Ausgangspunkt
- Ziv's Unsicherheitsprinzip des Software Engineering: "Unsicherheit ist im Software-Entwicklungsprozess und den Produkten inhärent und unvermeidlich." (Ziv, 1996)
- Humphrey's Prinzip der Anforderungsunsicherheit: "In einem neuen Software System werden die Anforderungen solange nicht komplett bekannt sein, bis die Anwender damit arbeiten." (Humphrey, 1995)
- Wegner's Lemma: "Es ist unmöglich, ein interaktives System komplett zu spezifizieren." (Wegner, 1995)
- Ziele
- geringer bürokratischer Aufwand
- Hauptziel ist die Softwareentwicklung
- nur wenige Regeln bzw. Verhalten definiert
- sehr flexibel gehaltenes Vorgehen
- stark Anwendungs- und Ereignisorientiert
- iterativ / inkrementell / evolutionär
- sehr schnelle Entwicklungsiterationen
- meist Architekturzentriert
- auch testgetriebenes Vorgehen möglich
- Berücksichtigung sozialer Aspekte
- Softwareentwicklung: Kreative Arbeit von Kreativen
Das Agile Manifest (2001)
- Individuen und Interaktionen bedeutender als Prozesse und Tools
- Funktionierende Software bedeutender als übermäßige Dokumentation
- Stetige Zusammenarbeit mit dem Kunden bedeutender als Vertragsverhandlung
- Mut und Offenheit für Änderungen bedeutender als Befolgen eines Plans
Eigenschaften agiler Vorgehensmodelle
- Team ist für Ergebnis verantwortlich und organisiert sich selbst
- Kleine Teams 5-8 Personen
- Definition von Richtlinien, Werten und Prinzipien
- Beispiele für Werte
- Kommunikation (Kommunikation statt Dokumentation)
- Einfachheit (KISS „Keep it small and simple“)
- Feedback
- Mut
- Respekt
- Beispiele für Prinzipien
- Beidseitiger Vorteil
- Fehlschläge hinnehmen
- Ständige Verbesserungen
- Ständige Lauffähigkeit des Codes
- Kleine Schritte
- Wiederverwendung bestehender / bewährter Lösungen
- Beispiele für Praktiken
- Pair-Programing, Coding Rules
- Kollektives Eigentum / Gemeinsamer Codebesitz
- Testgetriebene Entwicklung
- Ständiges Refactoring
- Keine Überstunden
- Vorteile agiler Methoden
- Geringer bürokratischer Aufwand
- Besseres Arbeitsklima (Berücksichtigung Sozialer Aspekte)
- Ständige Verfügbarkeit einer lauffähigen Version
- Mögliche / nötige Einflussnahme des Kunden
- „Freie“ Wahl der Prinzipien/Regeln
- Vermeidung von Spezialistentum und individuellem Besitz
- Nachteile
- Schwierigeres Projektmanagement
- Chaotische Vorgehen
- Schwere Planbarkeit des Ergebnisses
- Notwendige Beteiligung des Kunden
- Ergebnis ist schwer vorherzusagen
- Schwierigeres Projektmanagement
eXtreme Programming (XP)
- Beck 1999, aus Kritik an „monumentalen Modellen“
- Evolutionäre Entwicklung in kleinen Schritten
- Möglichst einfaches Design
- Konzentration auf Programmcode als Analyseergebnis, Entwurfsdokument und Dokumentation
- Weglassen von explizitem Design, ausführlicher Dokumentation und Reviews
- Code wird permanent lauffähig gehalten (täglich)
- Schnell und flexibel
- Erfordert Disziplin der Teilnehmer
- Rollen: Projektleiter, Kunde (verfügbar), Entwickler
- Max. 5-10 Entwickler
- Kunde bestimmt Anforderung und Prioritäten
- planning game; story cards (use cases)
- Implementierung in kleinen Schritten
- pair programming, collective code ownership
- Häufige Releases inkl. Integration
- Refactoring bei Designänderungen
- Programmier-Konventionen
- Regelmäßiges automatisiertes Testen
- test-first Ansatz
- Morgendliches Meeting im Stehen ohne Diskussionen
- 40h-Woche
- XP
Scrum
- [Ken Schwaber, Jeff Sutherland und Mike Beedle]
- Haupteigenschaften
- Iterativ / Inkrementell, Evolutionär
- stark Anwendungs- und Ereignisorientiert
- schnelle Entwicklungsiterationen
- Sprint
- eine schnelle Iteration: Dauer ca. 30 Tage
- Festlegung welche Features umgesetzt werden
- Product Backlog
- Liste der gewünschten Features des Produkts
- Vom Produkt-Owner priorisiert / Aufwand vom Team geschätzt
- Jeder kann Einträge beisteuern
- Rollen
- Product Owner
- Erfasst Bedürfnisse der Kunden und Stakeholder
- Pflegt Backlog, definiert, priorisiert Features pro Sprint
- Scrum Master
- Berät das Team, Überprüft Einhaltung von Werten und Techniken, moderiert die Meetings
- Schützt das Team vor äußeren Störungen
- Repräsentiert Team gegenüber Management
- Scrum Team (ca. 5-9 Personen)
- Team organisiert sich und die Aufgaben selbst
- Team bedeutet: Zielgerichtet und funktionsübergreifend arbeiten, gemeinsames Ziel verfolgen, selbstloses Handeln, Teamentscheidungen vertreten
- Product Owner
Sprint Backlog
- Für die aktuelle Iteration ausgewählte Aufgaben
- Aufgabe nicht länger als 2 Tage Aufwand
- Team-Mitglieder wählen Tasks aus – keine Zuweisung
- Restaufwand wird täglich aktualisiert – Burndown Chart
- Team-Mitglied kann Tasks hinzufügen, löschen, ändern
- Darstellung an prominenter Stelle
Daily Meeting
- ca. 15 Minuten
- Kurze Statusmeldung, Was wurde geschafft? Was ist zu tun? Was behindert den Fortschritt?
- Weiterführende Diskussionen erst im Anschluss
Sprint Review-Meeting
- Präsentation des Erreichten (Feature Demo)
- Product Owner, Kunde usw. geben Feedback
- Neue Anforderungen hinzufügen / Neu priorisieren
- Qualitätsansprüche ändern
Sprint-Retrospektive
- Rückkopplungsschleife
- Was war gut und was hat nicht funktioniert?
- Was kann verbessert werden?
- Nach jedem Sprint
- Diskussion der identifizierten Probleme
- Identifikation von wenigen „Action Items“
Burndown Chart
Zusammenfassung
- Software-Entwicklungsmethode
- Elemente
- Darstellung – Notation und Semantik für Modelle, Diagrammtypen, Dokumentvorlagen (Artefakte)
- Vorgehensmodell – Phasen, Arbeitsschritte
- Verfahren – Regeln, Anweisungen, Aktivitäten (+Rollen)
- Werkzeuge
- Industriestandards: RUP + UML
- Öffentliche Auftraggeber: V-Modell
- Firmenintern: eigene Varianten, evtl. projektabhängig
- Weitere Themen
- Reifegradbeurteilung CMMI, SPICE, ISO 9000
- Elemente
- Charakterisierung von Vorgehensmodellen
- Sequenziell
- Teilprozesse strikt nacheinander
- Keine Änderungen abgeschlossener Artefakte
- Nebenläufig
- Teilprozesse laufen teilweise parallel für bessere Zeitnutzung
- Dokumentgetrieben
- Erstellung von Dokumenten (Artefakte) im Vordergrund
- Festlegung der Dokumente pro Phase
- Sequenziell
- Charakterisierung von Vorgehensmodellen
- Iterativ
- Definition einer sich wiederholenden Abfolge von Teil-Prozessen bzw. Aktivitäten
- Schnelles Wiederholen dieser Abfolgen
- Inkrementell
- Definition und Kontrolle des Fortschritts pro Iteration
- Kleine Erweiterungen
- Evolutionäres Vorgehen
- Schnelle Prototypen
- Lauffähiger Prototyp jederzeit vorhanden
- Toolunterstützung (Versionierung)
- Iterativ
- Charakterisierung von Vorgehensmodellen
- Ereignisorientiert
- Schnelle Reaktion auf Anforderungsänderungen
- Keine starre Abfolge von Tätigkeiten / Prozessen
- Voraussetzung: Prozesse laufen parallel ab
- Architekturzentriert
- Starke Gewichtung der Architektur
- Verwendung von Modellen, Mustern und vorhandenem Wissen
- Anwendungsgetrieben
- Orientierung an den Anwendungsfällen
- Umsetzen, was einem Anwendungsfall zugeordnet werden kann
- Anwender steht im Mittelpunkt (User Stories)
- Risikoorientiert
- Risiko der Entwicklung wird in Planung berücksichtigt
- Risiko- / Nutzen-Analyse
- Test- / Qualitätsgetrieben
- Qualität steht im Vordergrund
- Test wird während oder sogar vor der Implementierungs-phase erstellt
- Erweiterbar / Anpassbar (tailoring)
- Nur Rahmen des Vorgehens festgelegt
- Konkretes Vorgehen wird an die Bedürfnisse angepasst
- Grundlegende Eigenschaft von Vorgehensmodellen
- Ereignisorientiert
- Softwareprojekt im Sommersemester
- Auswahl aus 3 Vorgehensmodellen
- Klassisches Vorgehen
- Unified Process
- Agiles Vorgehen
- Auswahl aus 3 Vorgehensmodellen
Projektmanagement
Was ist ein Projekt?
- Merkmale von Projekten
- Zielgerichtetes Vorhaben
- Einmaligkeit
- Zeitliche, finanzielle und personelle Rahmenbedingungen
- Abgrenzung zu anderen Vorhaben
- Projektspezifische Organisation
- Komplexität (Unterteilung in abhängige Teilaufgaben nötig)
- Unsicherheit vor allem in den Frühphasen
- Risiko durch unbekannte Aufgabe
Was ist Projektmanagement?
- Überbegriff für planende und durchsetzende Aktivitäten zur Vorbereitung und Durchführung eines Projekts
- Management des Problemlösungsprozesses
- Nicht die Lösung selbst, eigene Disziplin
- Aufgaben
- Problemabgrenzung
- Zielfestlegung, Ablaufplanung
- Planung und Bereitstellung personeller, finanzieller und sachlicher Ressourcen
- Führen der Projektgruppe und Koordination der Aktivitäten
- Steuerung und Überwachung des Projektablaufes
- Zum großen Teil Planungs- und Kommunikationsleistung!
Projektplanung
Planung des Projektablaufs
- Zunächst wieder: Teile und Herrsche!
- Projektstruktur
- Teilung der Projektaufgabe in Arbeitspakete (work packages) und darin enthaltenen Aktivitäten (activities)
- Einteilung möglich anhand Produktstruktur, fachlicher Struktur oder Phasenmodell des Entwicklungsprozesses
- Überblick weiterer Planungsaufgaben
Ablaufplanung
- Abhängigkeiten (Anordnungsbeziehungen) zwischen Vorgängen A und B: 4 Möglichkeiten
- Ende-Anfang (Normalfolge)
- B kann begonnen werden, sobald A beendet worden ist
- Anfang-Anfang (Anfangsfolge)
- B kann begonnen werden, sobald A begonnen worden ist
- Anfang-Ende (Sprungfolge)
- B kann beendet werden, sobald A begonnen worden ist
- Ende-Ende (Endfolge)
- B kann beendet werden, sobald A beendet worden ist
- Ende-Anfang (Normalfolge)
- Netzplantechnik
- Planungsarten
- Vorwärtsplanung (ab Startzeitpunkt)
- Rückwärtsplanung (ab gewünschtem Projektende)
- Berechnete Daten für Vorgänge
- Frühester und spätester Anfangszeitpunkt (FAZ / SAZ)
- Frühester und spätester Endzeitpunkt (FEZ / SEZ)
- Pufferzeiten, z.B. freier Puffer (Verzögerung ohne Verschiebung des Nachfolgers), Gesamtpuffer (Verzögerung ohne Gefährdung des Projektendes)
- Notation unterschiedlich
- Allgemein
- Kritischer Pfad (Verzögerung vergrößert Projektdauer)
- Kritische Vorgänge: Teil des kritischen Pfades
- Planungsarten
Beispiel:
- Arbeitspakete laut Pflichtenheft (z.B.: Use Case)
- Aufgaben festlegen
- Abhängigkeiten festlegen
- Vorwärtsrechnung durchführen
- Rückwärtsrechnung durchführen
- Kritischer Pfad und Puffer finden
Aufwandsschätzung
- Aus Erfahrungswerten systematisiert
- Versuch, wichtige Einflussfaktoren zu erfassen
- Metriken für Spezifikationen
- Komplexität von Teilfunktionen
- Menge der Funktionen
- Anpassung durch individuelle Faktoren, z.B. abhängig von Erfahrung in der Projektorganisation
- Methoden
- Function Point Analyse
- CoCoMo
Function Point Analyse
- Ursprung IBM Ende 1970er Jahre
- Funktionsumfang und Schwierigkeitsgrad von Software
- Verschiedene Verfahren
- für Echtzeit- (Full Function Point Method) und „normale“ Software (Int. Function Point User Group, ISO14143)
- Jeweils Anzahl x Gewicht
- Summe aller Werte = Unadjusted Function Points (UFP)
- Function Points = UFP x EG
- Einflussgrad EG = 1 + 0.01 x SummeEinflussfaktoren
- Einflussfaktoren: Einfluss auf Anwendungsentwicklung
- Berechnung der Personen-Monate aus Erfahrungen vorangegangener Projekte
- Aufwand, der von einer Person in einem Monat unter Idealbedingungen erledigt werden kann
- Umrechnung mit Tabelle (nichtlinearer Verlauf)
CoCoMo II
- Constructive Cost Model [Boehm2000]
- Ausgangspunkt: geschätzte Anzahl Zeilen Quellcode
- SLOC, source lines of code (zB. aus UFP schätzen)
- Aufwand Personen-Monate (PM)
PM = A * Size^E \prod_{i=1}^n EM
mitE=B+0,01*\sum_{j=1}^5 SF_j
- Faktoren
A=2.94
undB=0.91
(anpassbare Koeffizienten) - Effort multiplier
EM: n=6..16
, Tabelle nach Boehm- Beispiele: Komplexität, Wiederverwendbarkeit, ...
- Werte
0,7 .. 3,0
- Scale factor SF: Fünf Einflüsse auf Rentabilität der Softwareentwicklung
- Notwendige Entwicklungszeit (time to develop)
TDEV = C * PM^F
mitF = D + 0,2 * ( E - B )
- Faktoren
C=3,67
undD=0,28
, anpassbar - Ressourcenplanung
- Zeitplanung
- Zeitplan aus Abhängigkeiten, Aufwänden und Ressourcen sowie festen Terminen
- Darstellung als Gantt-Chart / Balkendiagramm
Projektdurchführung
Projektorganisation
- Teilnehmer: Personen, Rollen, Verantwortung, Teams
- Linienorganisation:
Projektmanager - Rolle und Aufgaben
- Planung, Start, Kontrolle und Beenden des Projekts
- Schnittstelle zur Umgebung des Projekts
- Kunden, Unterauftragnehmer, interne Kontakte, Verträge
- Team zusammenstellen und steuern
- 5-7 Mitglieder gemischter Qualifikation
- Team von äußeren Aufgaben abschirmen
- Teilaufgaben definieren, vergeben und koordinieren
- Fortschritt kontrollieren und Probleme beseitigen
- Weitere Ressourcen bereitstellen
- Notwendige Planänderungen erkennen und reagieren
- Wichtiger Dienstleister für den Projekterfolg
Projektstart
- Nach Abschluss der Planungsphase
- Festlegung von ...
- Arbeitsstil und interne Organisation
- Aufgabenverteilung und Themen-Verantwortung
- Erste Aufgaben, Verantwortliche und Termine
- Einigung über Meilensteine und Termine
- Art und Termine der Projekttreffen
- Informationen und Kommunikationswege
- Technische Infrastruktur (Versionskontrollsystem, Entwicklungsumgebung, Dokumentverwaltung, Rechnerzugang, verwendete PM-Software usw.)
- Starttreffen des Projekts (kick-off meeting)
Meetings / Projekttreffen
- Regelmäßige Abstimmung der Projektteilnehmer
- Außerdem zu wichtigen Meilensteinen
- Inhalt und Ablauf: geplant (Tagesordnung), Moderator
- Protokoll des letzten Treffens korrekt?
- Aktueller Stand
- Bericht über individuelle Aufgaben
- Planung des nächsten Termins
- Protokoll
- Datum, Zeit, Ort, Teilnehmer, Moderator
- Bezeichnung
- Tagesordnung mit einzelnen Punkten
- Kurz und knapp, neutral bei Diskussionen!
Fortschrittskontrolle
- Meilensteine
- Klar definiertes Zwischenresultat zur Beurteilung des Projektfortschritts
- Beispiele: Feinentwurfsdokument fertiggestellt und an Auftraggeber übergeben oder Paket XYZ implementiert und fertig getestet
- Besprechung in Projekttreffen
- Besprechung des Status jedes Meilensteins / jeder Aufgabe
- Welche Aufgaben sind bereits erledigt?
- Welche Probleme sind aufgetreten / gelöst?
- Verbleibender Aufwand – Terminverschiebung nötig?
- Planung der nächsten Schritte (Aufgabe, Verantwortlicher, Termin)
Meilenstein-Trendanalyse
- Technik zur Fortschrittskontrolle
- Überwachung des Projektfortschritts zur Erkennung von Terminverzögerungen
- Bei Verzögerungen:
- Ressourcen erhöhen
- Termine verschieben
- Funktionen reduzieren
Wie viel Planung?
- Planung ist wichtig, aber nicht übertreiben!
- Aufwand und Detaillierungsgrad der Planung an Projektgröße und „echten“ Aufwand anpassen
- Pläne müssen sich ändern können!
- Projekte sind einmalig und daher unvorhersehbar
- Adaptiv planen: nächste Aufgaben genau, spätere grob
- Einsatz von Projektmanagement-Software
- Projektende
- Abschlusstreffen
- Bewertung von Ergebnis und Organisation - was kann in Zukunft besser gemacht werden?