2853 lines
		
	
	
		
			116 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			2853 lines
		
	
	
		
			116 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						||
title: Softwaretechnik 1
 | 
						||
date: Wintersemester 20/21
 | 
						||
author: 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
 | 
						||
- Daten
 | 
						||
  - Data Dictionary
 | 
						||
    - Verzeichnis von Daten mit Strukturinformationen
 | 
						||
    - Backus-Naur-Form, kontextfreie Grammatik
 | 
						||
  - Entity Relationship Diagram
 | 
						||
    - Daten und ihre Beziehungen
 | 
						||
- Systemumgebung
 | 
						||
  - Datenflussdiagramm
 | 
						||
    - Fluss und Transformation von Daten zwischen Funktionen, Speichern und Schnittstellen
 | 
						||
    - kein Kontrollfluss
 | 
						||
- 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
 | 
						||
- 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
 | 
						||
- 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
 | 
						||
- 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 (<<import>>)
 | 
						||
- 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
 | 
						||
- 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
 | 
						||
- 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)
 | 
						||
 | 
						||
- 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 ...
 | 
						||
  - 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)
 | 
						||
1. Einleitung, Zielbestimmung
 | 
						||
2. Übersicht
 | 
						||
    - Einsatzbereich, Zielgruppen
 | 
						||
    - Produkt-Umgebung
 | 
						||
    - Produkt-Funktionen
 | 
						||
    - Restriktionen
 | 
						||
    - Annahmen und Abhängigkeiten
 | 
						||
    - Vorhandenes System (ggf.)
 | 
						||
3. Vorgeschlagenes System
 | 
						||
    - Übersicht
 | 
						||
    - Funktionale Anforderungen
 | 
						||
    - Benutzungsschnittstelle
 | 
						||
    - Nichtfunktionale Anforderungen
 | 
						||
    - Systembeschreibung
 | 
						||
      - Szenarien
 | 
						||
      - Anwendungsfälle
 | 
						||
4. 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
 | 
						||
 | 
						||
 | 
						||
## 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 <<component>>
 | 
						||
    - 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>>`‚
 | 
						||
  - White-Box-Darstellung
 | 
						||
    - Interner Aufbau der Komponente `<<realization>>`
 | 
						||
    - Artefakte `<<artifacts>>`‚ Realisierende physische Einheit (z.B.: .dll)
 | 
						||
 | 
						||
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: <<Interface>>
 | 
						||
  - 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, ...)
 | 
						||
 | 
						||
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)
 | 
						||
 | 
						||
## 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 <<abstract>>
 | 
						||
 | 
						||
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 <<interface>> 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 <<precondition>>
 | 
						||
    - Nachbedingung: Prädikat, das nach Aufruf gelten muss <<postcondition>>
 | 
						||
    - Invariante: Prädikat, das immer gilt <<invariant>>
 | 
						||
  - 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
 | 
						||
 | 
						||
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
 | 
						||
 | 
						||
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,
 | 
						||
  ```js
 | 
						||
  /** @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
 | 
						||
  ```java
 | 
						||
  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)
 | 
						||
  - 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
 | 
						||
 | 
						||
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
 | 
						||
- 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
 | 
						||
 | 
						||

 | 
						||
Spiralmodell
 | 
						||
- 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
 | 
						||
 | 
						||
### 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
 | 
						||
  - Sammlung von 12 "best practices"
 | 
						||
  - Test-getrieben
 | 
						||
  - Flexibel, effizient
 | 
						||
  - Kleine Teams
 | 
						||
  - Erfordert Disziplin der Teilnehmer
 | 
						||
  - 
 | 
						||
 | 
						||
### 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
 | 
						||
 | 
						||
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
 | 
						||
- Darstellung der offenen und erledigten Aufwände / Tasks
 | 
						||
- 
 | 
						||
 | 
						||
## 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
 | 
						||
- 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
 | 
						||
- 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)
 | 
						||
- 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
 | 
						||
- Softwareprojekt im Sommersemester
 | 
						||
  - Auswahl aus 3 Vorgehensmodellen
 | 
						||
    - Klassisches Vorgehen
 | 
						||
    - Unified Process
 | 
						||
    - Agiles Vorgehen
 | 
						||
 | 
						||
# 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
 | 
						||
  - Bestimmen der Abhängigkeiten
 | 
						||
  - Ermitteln der nötigen Ressourcen
 | 
						||
  - Schätzen der Aufwände
 | 
						||
  - Zeitplan aufstellen
 | 
						||
  - Meilensteine definieren
 | 
						||

 | 
						||
 | 
						||
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
 | 
						||
- 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
 | 
						||
 | 
						||
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$ mit $E=B+0,01*\sum_{j=1}^5 SF_j$
 | 
						||
- Faktoren $A=2.94$ und $B=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$ mit $F = D + 0,2 * ( E - B )$
 | 
						||
- Faktoren $C=3,67$ und $D=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:
 | 
						||
  - hierarchisch 
 | 
						||
  - Matrixorganisation 
 | 
						||
  - Reine Projektorganisation: Mitarbeiter werden aus Organisation herausgelöst und Projektleiter unterstellt
 | 
						||
 | 
						||
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? |