Informatik/Softwaretechnik.md

116 KiB
Raw Blame History

title date author
Softwaretechnik 1 Wintersemester 20/21 Robert Jeutter

Software: Menge von Programmen oder Daten zusammen mit begleitenden Dokumenten, die für Ihre Anwendung notwendig oder hilfreich sind [Hesse]

Gute Software ist schwer herzustellen

  • Entspricht Kundenwünsche, Vollständigkeit
  • Funktioniert Korrekt
  • Kosten- und Termintreue bei der Erstellung
  • weitere nicht-funktionale Qualitätsforderungen
    • Benutzerfreundlichkeit, Ergonomie
    • Sicherheit
    • Zuverlässigkeit, Fehlertoleranz
    • Performanz
    • Ressourcen-Effizienz, Skalierbarkeit, Übertragbarkeit
    • Wartbarkeit, Änder- und Erweiterbarkeit

Softwaretechnik

  • Technische Disziplin der Software Herstellung
  • Zielorientierte Bereitstellung uns systematische Verwendung von Prinzipien, Methoden und Werkzeugen für die arbeitsteilige, ingenieurmäßige Entwicklung und Anwendung von umfangreichen Softwaresystemen [Balzert]

Wie kann man Software besser entwickeln?

  • Ingenieursmäßige Herangehensweise
    • Verwendung bekannter Prinzipien und Methoden
    • Systematische Vorgehensweise
  • Verwendung von:
    • Abstraktion, Modelle, Notation, Simulation
    • Wiederverwendung:Muster, Komponenten, Framework
  • Organisation
    • Arbeitsteilung, Integration, Planung
  • Verwendung von Werkzeugen
    • IDE (Integrated Development Environment)
    • Versionierung, Bugtracker, Modellierungswerkzeug

Modellierungskonzepte

Modell: ist eine Abstraktion eines Systems mit der Zielsetzung, das Nachdenken über ein System zu vereinfachen, indem irrelevante Details ausgelassen werden [Brügge] \rightarrow Beschreibung eines Ausschnitts der Realität

  • erstellen einer Abstraktion
  • abbilden signifikanter Eigenschaften
  • Deskriptiv/präskriptiv (real oder geplant)
  • Sichtweise auf ein System (Struktur, Verhalten, Zustand,...)
  • heißt Weglassen
  • setzt Verstehen voraus
  • ist nicht automatisierbar

Verschiedene Modelle:

  • Analysemodell
  • Entwurfsmodell
  • Implementierung (-smodell)
  • Vorgehensmodell
  • Produktmodell
  • Dokumentation, Alternativen-Auswahl

Modelle für:

  • Sichten
  • Funktionen
  • Daten
  • Algorithmen
  • Systemumgebung
  • Dynamisches Verhalten
  • Objektorientierte Modelle

Klassische Modelle

  • Funktionen:
    • Funktionsbaum
      • Hierarchische Dekomosition der Fkt
      • nummerieren der Ebenen/Funktionen möglich
      • Bsp: Abonnement Verwaltung
    • Blockschaltbild
      • eingebettetes System, HW/SW
  • 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 (<>)
  • 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)

Analysebaum von Sommerville Analysebaum von Sommerville

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

Anforderungsentwicklung von Balzert

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, wont)
    • 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

Kano Klassifikation von Balzert Kano Klassifikation von Balzert

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

Analyse nach Brügge/Dutoit Analyse nach Brügge/Dutoit

  • 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 <>
      • 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: <>
    • 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 GUIs
  • 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 others actions
Interfacer transforms information and requests between system parts

Hilfsmittel: CRC-Karten

  • Candidate (or class), Responsibility, Collaboration
  • Informelles Mittel zum
    • Finden,
    • Beschreiben und
    • iterativen Verändern von Klassen

Ein Objekt

  • implementiert eine Schnittstelle und beeinflusst andere Objekte
  • wird in drei Teilen entworfen
    • Öffentliche Schnittstelle
    • Art und Weise der Benutzung
    • Innere Details der Funktionsweise
  • Kohärenz: zusammengehörende Verantwortlichkeiten in einer Klasse konzentrieren!

Entwurfsprinzipien

  • Kapselung
    • Probleme: Zugriff auf private oder ebenen-fremde Attribute
    • Verwenden von get- und set-Operationen
    • Zusicherungen einhalten
    • Zugriffe zentralisieren
    • Verbalisierung
    • Zugriffsbeschränkung
  • Zerlegung
    • Teile und Herrsche
    • Zerlegen in Komponenten
    • Verantwortlichkeitsprinzip: Komponente ist klar für eine Aufgabe verantwortlich
    • Eigenschaften und Schnittstellen im Klassendiagramm
    • Beziehungen zwischen Klassen: Assoziationen
    • Aggregation
      • „besteht aus“, „ist Teil von“ oder „Ganzes-/Teile-Beziehung“
      • Schwache Bindung der Teile mit dem Ganzen
      • Notation: ungefüllte Raute am Ganzen
    • Komposition
      • Wie Aggregation, jedoch stärkere Bindung
      • Teil nur einem Ganzen zugeordnet
      • Nur Multiplizität von 1 oder 0..1 möglich!
      • Gefüllte Raute am Ganzen
  • Polymorphie
    • Reaktion auf eine Nachricht abhängig vom Typ des Objektes
    • Variablen können Objekte verschiedener Klassen aufnehmen (Voraussetzung: Typ der Variablen ist eine gemeinsame Basisklasse der (davon) abgeleiteten Klasse(n) der Objekte)
    • Überladen von Operationen
      • gleicher Operationsname, unterschiedliche Signatur
    • abstrakte Operationen: Virtuelle Operationen ohne Implementierung
    • abstrakte Klasse: Klasse mit abstrakten Operationen
    • Folgen
      • von abstrakten Klassen können keine Objekte angelegt werden (Implementierung fehlt)
      • Abgeleitete Klassen müssen Operation implementieren, damit Objekte angelegt werden können

Vererbung im Entwurf

  • In der Analyse: Klassifikation von Objekten, Taxonomie, Spezialisierung/Verallgemeinerung, Organisation von Klassen in Hierarchien
  • Verringerung von Redundanz und damit Inkonsistenzen
    • Funktionalität nur einmal implementieren!
    • Spezifikations-Wiederverwendung
    • Implementierungs-Wiederverwendung
  • Verbesserung der Erweiterbarkeit
    • Abstrakte Schnittstellen einsetzen!

Vererbung oder Assoziation

  • Schlüsselwort Vererbung: ist ein
  • Schlüsselwort Assoziation: besteht aus, ist Teil, hat,...
  • Vererbung: Unterscheidungsmerkmal definierbar (Diskriminator)
  • Vermeide Vererbung, wenn es Alternativen gibt
  • Mehrfachvererbung
    • Problem: Unabhängige Aspekte der Vererbungshierarchie
    • Vermeidung: abstrakte Klassen oder Komposition

Abstrakte Klassen

  • Nur Unterklassen, keine Instanzen
  • Attribute in Unterklassen füllen
  • Notation: Kursiv oder Stereotyp <>

Offen / Geschlossen-Prinzip [Meyer 1988]

  • Erweiterbarkeit eines Entwurfs
  • Offen für Erweiterungen,
    • z.B. durch Vererbung / Polymorphie
    • Virtuelle Operationen verwenden
    • Verändert vorhandenes Verhalten nicht
    • Erweiterung um zusätzliche Funktionen oder Daten
  • Geschlossen für Änderungen
    • private Attribute
    • Möglichst protected Operationen
  • Beschränkung der Erweiterbarkeit
    • Keine Einschränkungen der Funktionalität der Basisklasse!

Liskovsches Ersetzungsprinzip

  • Wenn S eine Unterklasse von T ist, dann können Objekte des Typs T in einem Programm durch Objekte des Typs S ersetzt werden, ohne die Funktion des Programms zu verändern. [Barbara Liskov 1987]
  • Engere Definition als „ist-ein“-Beziehung
  • Kein unerwartetes Verhalten eines Objektes eines Subtyps
  • Methoden, die Objekte der Basisklasse erwarten, müssen auch mit Objekten der abgeleiteten Klasse funktionieren
  • Zusicherungen der Basisklasse müssen von der abgeleiteten Klasse erfüllt werden!

Gesetz von Demeter (LoD)

  • Gesetz von „schüchternen“ Objekten
  • Objekte sollen nur mit Objekten in ihrer unmittelbaren Umgebung kommunizieren
  • Aus einer Methode M dürfen (sollten) nur Nachrichten an Objekte gesendet werden, die ...
    • unmittelbarer Bestandteil des Objekts von M sind (super)
    • M als Argument übergeben wurden
    • direkt in M erzeugt wurden
    • (oder sich in globalen Variablen befinden)
  • Als Metrik überprüfbar

Ein Objekt sollte

  • Nur Methoden aufrufen, die zur eigenen Klasse gehören
  • Nur Methoden von Objekten aufrufen, die:
    • Von Attributen referenziert werden
    • Als Parameter übergeben wurden
    • Selbst erzeugt wurden

Entwurfsmodelle

Klassendiagramm

  • Eigenschaften
    • Modellierung der statischen Struktur (Aufbau)
    • Modellierung der Struktur von Daten
    • Klasse im Mittelpunkt (Aufbau, Beziehungen zueinander)
    • Wichtigstes und bekanntestes Diagramm der UML!
  • Elemente des Klassendiagramms
    • Klasse (Attribute, Operationen)
    • Vererbung / Realisierung
    • Assoziationen
    • Beziehungen / Abhängigkeiten
  • Attribute
    • Klassenattribut: "X" static statisch, nur einmal pro Klasse vorhanden
    • Sichtbarkeit
      • "+" public im Namensraum sichtbar
      • "#" protected nur in abgeleiteten Klassen sichtbar
      • "~" package im Paket sichtbar
      • "-" private nur in der Klasse selbst sichtbar
    • Ableitung "/" derived abgeleitetes Attribut
  • Weitere Eigenschaften
    • readOnly nach Initialisierung nicht änderbar
    • composite Aggregation: Composition
    • redefines X überschreibe Attr. der Oberklasse
    • subsets X Teilmenge
    • union Attribut ist Vereinigung der subsets
    • unique Elemente eindeutig (Schlüsselattribut)
    • ordered Elemente sind geordnet (unordered)
    • sequence Speicherung der Elemente als Liste
    • bag Elemente sind Multimenge
  • Parameterlisten
    • in: Eingangsparameter
    • out: Ausgangsparameter
    • inout: Eingangs- und Ausgangsparameter
    • return: Rückgabewert
  • Beziehungen
    • navigierbar/unspezifiziert/nicht-navigierbar
    • ungerichtete/gerichtete Relation/assoziation

Aktive Klassen

  • Reagieren nicht nur, sondern werden von sich aus aktiv
  • Z.B. Steuerobjekte
  • Als Thread oder Prozess realisiert

Schnittstellen

  • Vereinbarung über Art des Aufrufs
    • Homogenität gleicher Funktionen
    • Enthält
      • Spezifikation von Operationen
      • keine Implementierung ( Java, nicht UML!)
      • keine Attribute
    • In Java außerdem anstelle von Mehrfachvererbung
  • Schnittstellen in UML
    • Funktion ähnlich abstrakter Klasse
    • Meist für technische Aspekte
    • Notation: Stereotyp <> oder grafisch (lollipop notation)
  • Verträge („design by contract“)
    • Schnittstelle sagt bisher nichts über Effekt der Klasse aus
    • Vollständige Beschreibung wäre Programm?
    • Vereinfachte Beschreibung für Abfolgen:
      • Vorbedingung: Prädikat, das vor Aufruf gelten muss <>
      • Nachbedingung: Prädikat, das nach Aufruf gelten muss <>
      • Invariante: Prädikat, das immer gilt <>
    • Jeweils Einschränkungen!

Protokollrollen - Dynamisches Verhalten von Schnittstellen

  • Ohne Sicht auf innere Implementierung (anders als beim Objektlebenszyklus)
  • Protokoll = Kollaboration von Protokollrollen (protocol, protocol role)
  • Modell: Zustandsautomat
    • Genauer: Spezialisierung
    • Beschreibung der Synchronisation von Objekten

Entwurfsmuster

  • Warum Wiederverwendung?
    • Geringerer Aufwand
    • Das Rad nicht noch einmal neu erfinden
    • Verwenden üblicher, aus Erfahrung gewachsener Strukturen
  • ... und warum nicht?
    • Aufwand für Anpassung kann hoch sein!
    • Einarbeiten in teilweise komplexe Schnittstellen
    • Abhängigkeit von externen Komponenten, Zwang zu späterer Portierung

Was ist ein Entwurfsmuster? Eine schematische Lösung für eine Klasse verwandter Probleme (Höhere Ebene: Architekturmuster)

  • Wie helfen Muster im Entwurf?
    • Identifizieren von Klassen (Anwendungs- und Lösungsdomäne)
    • Regeln sind abstrakt oder an realen Objekten orientiert
    • Muster: Arten von Rollen bzw. Lösungshinweise für typische Strukturierungsaufgaben
    • Änderbarkeit und Lesbarkeit des Entwurfs verbessern
  • Arten von Entwurfsmustern
    • Erzeugungsmuster
    • Strukturmuster
    • Verhaltensmuster
  • Erzeugungsmuster
    • Factory Method, Fabrikmethode
      • Implementierungsvarianten; Erzeugung von Objekten wird an Unterklassen delegiert
    • Abstract Factory, Abstrakte Fabrik
      • Schnittstelle zur Erzeugung von Familien verwandter Objekte
    • Prototype, Prototyp
      • Objekterzeugung durch Vorlage und Kopie
    • Builder, Erbauer
      • Trennung von Erzeugung und Repräsentation komplexer Objekte, für Erzeugung unterschiedlicher Repräsentationen
    • Singleton
      • Sicherstellung, dass nur ein Objekt einer Klasse erzeugt wird, die einen globalen Zugriff bietet

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,
    /** @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

Codegenerierung

Weitere statische Transformationen

  • Abbildung von Assoziationen auf Sammlungen
  • Abbildung von Verträgen auf Ausnahmen
  • Abbildung von Objektmodellen auf Datenbankschemata
  • Abbildung von Entwurfsmustern auf Codefragmente

Optimierung des Entwurfsmodells

  • Grund: nichtfunktionale Eigenschaften
  • Zugriffspfade
  • Klassen in Attribute umwandeln
  • Verzögerung von Berechnungen
  • Zwischenspeicherung aufwändiger Ergebnisse

Codegenerierung aus StateCharts

  • Einfachste Möglichkeit: Switch (Case) Statement
  • Zustände werden durch Datenwerte repräsentiert
    • Aktueller Zustand: einzelne skalare Variable
  • Jedes Ereignis wird durch Methode implementiert
  • Ausgehend von aktivem Zustand wird bei Eintreffen eines Ereignisses der entsprechende Programmcode ausgeführt
  • Abhängig von Zustandsvariable wird Aktion ausgeführt und der Folgezustand eingestellt
  • Wird in einer Klasse realisiert
  • Sinnvoll für einfache, “flache” Modelle
    • Sonst Logik für Hierarchie nötig

Anpassung der Generierung

  • Verschiedene Zielsprachen (Java, C++, ...)
  • Model2Text-Transformationen
    • Verschiedene Generatoren, z.B. Eclipse Modelling Project
  • Generierung aus dem Modellierungswerkzeug
    • Parametrisierung der Codegenerierung
    • Generierungsvorlagen

Weitere Werkzeuge

  • Compiler-Compiler: Syntaxbeschreibung wird in lexikalische Analyse (tokenizer) und Syntaxanalyse-Programm transformiert (lex & yacc / flex & bison / antlr)
  • Codegenerierung für grafische Benutzungsoberflächen aus grafischer Beschreibung: GUI toolkits
  • XML-Parser
    • XSLT, DOM, SAX, ...

Implementierung aktiver Objekte

Realisierung aktiver Entwurfsobjekte

  • Reagieren nicht nur (Methodenaufruf), sondern implementieren eigenes Verhalten
  • Aktive Klassen, z.B. Steuerobjekte

Arten von Programmabarbeitung

  • Sequentiell: es gibt immer genau einen nächsten Schritt, alle Schritte werden nacheinander ausgeführt
  • Parallel: Spezielle Hardware bzw. Mehrkernprozessor, mehrere Befehlsfolgen werden echt parallel bearbeitet
  • Quasi-parallel: Ein Prozessor arbeitet mehrere Befehlsfolgen in freier Einteilung ab
  • Nebenläufig: Oberbegriff für Parallel und Quasi-parallel
    • concurrent

Vorteile

  • Höhere Geschwindigkeit
  • Kein aktives Warten auf Ereignisse
  • Getrennte Implementierung unabhängiger Aspekte

Ergebnisse eines Programms

  • Ein Programm, dessen Ablauf eindeutig vorherbestimmt ist, nennt man deterministisch (deterministic)
  • Ein Programm, das bei gleichen Eingaben gleiche Ausgaben produziert, heißt determiniert (determined)
  • Programme in üblichen Programmiersprachen sind sequentiell, deterministisch und determiniert
  • Grund: Herkömmliche Programmiersprachen sind durch das von-Neumann-Modell geprägt
  • Determinismus nicht notwendig für Determiniertheit!
    • Determiniertheit nebenläufiger Programme: Synchronisation
    • Vermeidung von Schreib/Schreib und Schreib/Lese-Konflikten

Java Threads

  • Verwaltung durch die Java Virtuelle Maschine (JVM)
  • Realisierung der Threads ist je nach Implementierung der JVM unterschiedlich
    • Abbildung auf Betriebssystem-Threads (z.B. unter Windows weitverbreitet)
    • Realisierung durch die JVM (z.B. unter Unix und in Java-fähigen Browsern)
    • Nachteile: Keine Ausnutzung von Multiprozessorsystemen durch die VM; Zuteilungsstrategie für Threads ist in derzeitigen Implementierungen unterschiedlich
  • Threads arbeiten immer im Adressraum der JVM (eigener Prozess) und sind außerhalb dieser nicht sichtbar

Erzeugung eines Threads

  • Unterklasse der Basisklasse „Thread“ bilden class MyThread extends Thread
  • Problem: keine Mehrfachvererbung, daher Alternative nötig (Beispiel: Applet):
    • Schnittstelle „Runnable“ implementieren
    • class MyThread implements Runnable
  • Die vordefinierte Schnittstelle Runnable ist definiert als
    public interface Runnable
    { public abstract void run(); }
    

Starten eines Threads

  • Eine Klasse, die Runnable implementiert, muss wie Unterklassen von Thread immer eine run()-Methode definieren
  • Seiteneffekt der Runnable-Schnittstelle
    • Instanzen der Klasse werden nebenläufig zu den anderen laufenden Threads ausgeführt
    • Ausführung beginnt mit der Methode run ()
  • Ablauf
    • Thread-Objekt erzeugen
    • Thread starten mit t.start()
    • start() ruft implizit run() auf

Synchronisation von Threads

  • Gezielte Einschränkung der Nebenläufigkeit
  • Gründe
    • Zugriffsbeschränkung, gegenseitiger Ausschluss
    • Abhängigkeiten, einseitige Synchronisation
  • Methoden: Semaphore, Monitore, Schlossvariablen, ...

Java: Monitore

  • Zugriffsoperationen werden in Klassen zusammengefasst
  • Gegenseitiger Ausschluss: Spezifikation der betroffenen Zugriffsoperation als synchronized

Verifikation und Testen

Wie erreicht man qualitativ hochwertige Software?

  • Wissen, Erfahrung und Methodenkompetenz der Programmierer
  • Projektstruktur, klare Verantwortlichkeiten
  • Kosten- und Zeitdruck? Änderungen?
  • Programmier- und Testmethoden
    • pair programming, code reading etc.
    • Qualitätsverantwortlicher, automatisiertes Testen
  • Technische Unterstützung
    • Z.B. Versionierung, Dokumentation, Testen, Entwicklungsumgebung

Begriffe

  • Zuverlässigkeit: Maß für Übereinstimmung des Systemverhaltens mit Spezifikation
  • Grund für Unzuverlässigkeit:
    • Fehler (bug, fault): fehlerhafter Programmcode o.ä.
      • Der Begriff „Bug“:
        • Schon vor Computern als Begriff für Fehler benutzt
        • Motte im Relais des Computers Mark II Aiken (1947)
    • 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-PCs, 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
    • VModell
    • 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 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 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
    • XP

Scrum

  • [Ken Schwaber, Jeff Sutherland und Mike Beedle]
  • Haupteigenschaften
    • Iterativ / Inkrementell, Evolutionär
    • stark Anwendungs- und Ereignisorientiert
    • schnelle Entwicklungsiterationen
  • Sprint
    • eine schnelle Iteration: Dauer ca. 30 Tage
    • Festlegung welche Features umgesetzt werden
  • Product Backlog
    • Liste der gewünschten Features des Produkts
    • Vom Produkt-Owner priorisiert / Aufwand vom Team geschätzt
    • Jeder kann Einträge beisteuern
  • Rollen
    • Product Owner
      • Erfasst Bedürfnisse der Kunden und Stakeholder
      • Pflegt Backlog, definiert, priorisiert Features pro Sprint
    • Scrum Master
      • Berät das Team, Überprüft Einhaltung von Werten und Techniken, moderiert die Meetings
      • Schützt das Team vor äußeren Störungen
      • Repräsentiert Team gegenüber Management
    • Scrum Team (ca. 5-9 Personen)
      • Team organisiert sich und die Aufgaben selbst
      • Team bedeutet: Zielgerichtet und funktionsübergreifend arbeiten, gemeinsames Ziel verfolgen, selbstloses Handeln, Teamentscheidungen vertreten

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

Scrum Vorgehen

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
  • Burndown Chart

Zusammenfassung

  • Software-Entwicklungsmethode
    • Elemente
      • Darstellung Notation und Semantik für Modelle, Diagrammtypen, Dokumentvorlagen (Artefakte)
      • Vorgehensmodell Phasen, Arbeitsschritte
      • Verfahren Regeln, Anweisungen, Aktivitäten (+Rollen)
      • Werkzeuge
    • Industriestandards: RUP + UML
    • Öffentliche Auftraggeber: V-Modell
    • Firmenintern: eigene Varianten, evtl. projektabhängig
    • Weitere Themen
      • Reifegradbeurteilung CMMI, SPICE, ISO 9000
  • 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 Projektstruktur

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
  • Projektplanung

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)
  • FPA
  • 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
  • FPA2
  • 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)
  • FPA3

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 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 hierarchisch
    • Matrixorganisation matrix
    • 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?