Podcast
Questions and Answers
Welche der folgenden Aussagen beschreibt am besten den Begriff 'Software Engineering' im Sinne des IEEE Standards Board?
Welche der folgenden Aussagen beschreibt am besten den Begriff 'Software Engineering' im Sinne des IEEE Standards Board?
- Ein unsystematischer Ansatz zur Softwareentwicklung, der sich auf Kreativität und Intuition stützt.
- Die Anwendung eines systematischen, disziplinierten und quantifizierbaren Ansatzes für die Entwicklung, den Betrieb und die Wartung von Software. (correct)
- Die Anwendung von Hardware-Engineering-Prinzipien auf die Softwareentwicklung.
- Die Anwendung von Programmierkenntnissen zur Entwicklung von Softwareanwendungen.
Welche der folgenden Aussagen beschreibt am besten eine Herausforderung im Zusammenhang mit Software, die über Netzwerke erreichbar ist?
Welche der folgenden Aussagen beschreibt am besten eine Herausforderung im Zusammenhang mit Software, die über Netzwerke erreichbar ist?
- Erhöhte physische Sicherheit der Software.
- Vergrösserte Angriffsfläche für potenzielle Sicherheitsbedrohungen. (correct)
- Vereinfachte Trennung von Subsystemen.
- Reduzierte Angriffsfläche durch Netzwerkisolation.
Welche der folgenden Aussagen beschreibt am besten die Herausforderung fehlender physischer Grenzen in der Softwareentwicklung?
Welche der folgenden Aussagen beschreibt am besten die Herausforderung fehlender physischer Grenzen in der Softwareentwicklung?
- Ermöglicht eine einfache physische Lokalisierung von Fehlern.
- Vereinfachte Trennung von Softwarekomponenten und Subsystemen.
- Erschwerte Trennung und Isolation von Subsystemen. (correct)
- Reduzierter Bedarf an modularem Design.
Welche der folgenden Aussagen beschreibt am besten das Problem, das durch mangelnde Kontrolle über Updates in der Software entstehen kann?
Welche der folgenden Aussagen beschreibt am besten das Problem, das durch mangelnde Kontrolle über Updates in der Software entstehen kann?
Welche der folgenden Aussagen beschreibt am besten das Problem des 'fehlenden Verschleißes' in Software im Kontext eines sich verändernden Umfelds?
Welche der folgenden Aussagen beschreibt am besten das Problem des 'fehlenden Verschleißes' in Software im Kontext eines sich verändernden Umfelds?
Welche der folgenden Aussagen beschreibt am besten die Schwierigkeit, die Eigenschaften von Software zu messen?
Welche der folgenden Aussagen beschreibt am besten die Schwierigkeit, die Eigenschaften von Software zu messen?
Wie beeinflusst die Anwendung des Domain-Driven-Designs (DDD) die Softwareentwicklung?
Wie beeinflusst die Anwendung des Domain-Driven-Designs (DDD) die Softwareentwicklung?
In welchem Zusammenhang stehen Anforderungsanalyse und Requirements Engineering?
In welchem Zusammenhang stehen Anforderungsanalyse und Requirements Engineering?
Welche der folgenden Aufgaben wird NICHT typischerweise von einem Dateiexplorer in einer integrierten Entwicklungsumgebung (IDE) übernommen?
Welche der folgenden Aufgaben wird NICHT typischerweise von einem Dateiexplorer in einer integrierten Entwicklungsumgebung (IDE) übernommen?
Wie unterstützt Syntaxhervorhebung die Softwareentwicklung und was sind dessen Grenzen?
Wie unterstützt Syntaxhervorhebung die Softwareentwicklung und was sind dessen Grenzen?
Welche der folgenden Aussagen beschreibt am besten die Interaktion zwischen Entwicklungsumgebung und Versionskontrolle?
Welche der folgenden Aussagen beschreibt am besten die Interaktion zwischen Entwicklungsumgebung und Versionskontrolle?
Wie interagieren interaktive Programmiersprachen und Shell-Umgebungen bei der Prozess- und Dateiverwaltung?
Wie interagieren interaktive Programmiersprachen und Shell-Umgebungen bei der Prozess- und Dateiverwaltung?
Was ist das Hauptziel bei der Automatisierung von Aufgaben in Entwicklungsumgebungen und wie wird dies typischerweise erreicht?
Was ist das Hauptziel bei der Automatisierung von Aufgaben in Entwicklungsumgebungen und wie wird dies typischerweise erreicht?
Wie beeinflusst eine gute Dokumentation die Softwareentwicklung und welche besondere Rolle spielt sie bei der Einarbeitung neuer Teammitglieder?
Wie beeinflusst eine gute Dokumentation die Softwareentwicklung und welche besondere Rolle spielt sie bei der Einarbeitung neuer Teammitglieder?
Wie können Pipes und Redirects in der Shell verwendet werden, um die Standardein- und -ausgabe von Befehlen zu verändern und welche Auswirkungen hat das?
Wie können Pipes und Redirects in der Shell verwendet werden, um die Standardein- und -ausgabe von Befehlen zu verändern und welche Auswirkungen hat das?
Welche Bedeutung haben Exit-Codes in der Fehlerbehandlung von Shell-Skripten und wozu dienen sie?
Welche Bedeutung haben Exit-Codes in der Fehlerbehandlung von Shell-Skripten und wozu dienen sie?
Welche Rolle spielen Variablen, Arithmetik, Bedingungen und Schleifen bei der Gestaltung von Entwicklungsprozessen?
Welche Rolle spielen Variablen, Arithmetik, Bedingungen und Schleifen bei der Gestaltung von Entwicklungsprozessen?
Welches Hauptziel verfolgt ein systematischer Ansatz bei der Softwareentwicklung, -implementierung, -betrieb und -wartung?
Welches Hauptziel verfolgt ein systematischer Ansatz bei der Softwareentwicklung, -implementierung, -betrieb und -wartung?
Wie wirken sich Kollaboration und Koordination auf die Gestaltung von effektiven Softwareentwicklungsprozessen aus?
Wie wirken sich Kollaboration und Koordination auf die Gestaltung von effektiven Softwareentwicklungsprozessen aus?
Welche Herausforderungen entstehen bei der Entwicklung von Software, wenn die Anforderungen als 'eingefroren' betrachtet werden?
Welche Herausforderungen entstehen bei der Entwicklung von Software, wenn die Anforderungen als 'eingefroren' betrachtet werden?
Welche der folgenden Aussagen charakterisiert am besten den Unterschied zwischen traditionellen und agilen Softwareentwicklungsmodellen?
Welche der folgenden Aussagen charakterisiert am besten den Unterschied zwischen traditionellen und agilen Softwareentwicklungsmodellen?
Warum ist es wichtig, die Trennung von Aufgaben in der Schichtenarchitektur zu beachten und welche Vorteile ergeben sich daraus im Bezug auf Wartbarkeit und Testbarkeit?
Warum ist es wichtig, die Trennung von Aufgaben in der Schichtenarchitektur zu beachten und welche Vorteile ergeben sich daraus im Bezug auf Wartbarkeit und Testbarkeit?
Was versteht man unter dem Architecture-Sinkhole Anti-Pattern und welche Auswirkungen hat dies auf die Softwarearchitektur?
Was versteht man unter dem Architecture-Sinkhole Anti-Pattern und welche Auswirkungen hat dies auf die Softwarearchitektur?
Welche Herausforderungen bestehen bei der vertikalen Skalierung in einer Schichtenarchitektur und wie können diese überwunden werden?
Welche Herausforderungen bestehen bei der vertikalen Skalierung in einer Schichtenarchitektur und wie können diese überwunden werden?
Wie beeinflusst die Organisation von Komponenten in getrennten Diensten (Service-orientiert) die Softwareentwicklung, Wartung und den Einsatz von Technologien?
Wie beeinflusst die Organisation von Komponenten in getrennten Diensten (Service-orientiert) die Softwareentwicklung, Wartung und den Einsatz von Technologien?
Welche potenziellen Nachteile sind mit der Verwendung einer Message-Bus-Architektur für die Kommunikation zwischen Diensten verbunden?
Welche potenziellen Nachteile sind mit der Verwendung einer Message-Bus-Architektur für die Kommunikation zwischen Diensten verbunden?
Welche Eigenschaften kennzeichnen Filter in einer Pipes-and-Filters-Architektur und wie tragen diese zur Skalierbarkeit bei?
Welche Eigenschaften kennzeichnen Filter in einer Pipes-and-Filters-Architektur und wie tragen diese zur Skalierbarkeit bei?
Was sind die Herausforderungen bei der Fehlerbehandlung in einer Pipes-and-Filters-Architektur und wie können Quelldaten gesichert werden?
Was sind die Herausforderungen bei der Fehlerbehandlung in einer Pipes-and-Filters-Architektur und wie können Quelldaten gesichert werden?
Welchen Einfluss hat das Domain-Driven-Design (DDD) auf die Kommunikation zwischen Entwicklern und Stakeholdern?
Welchen Einfluss hat das Domain-Driven-Design (DDD) auf die Kommunikation zwischen Entwicklern und Stakeholdern?
Warum ist es wichtig, Seiteneffekte in der Softwareentwicklung zu minimieren und wie kann dies erreicht werden?
Warum ist es wichtig, Seiteneffekte in der Softwareentwicklung zu minimieren und wie kann dies erreicht werden?
Welche Bedeutung hat das Liskovsche Substitutionsprinzip (LSP) in der objektorientierten Programmierung und welche Auswirkungen hat es auf Subtypen?
Welche Bedeutung hat das Liskovsche Substitutionsprinzip (LSP) in der objektorientierten Programmierung und welche Auswirkungen hat es auf Subtypen?
Welche Vorteile bietet das 'Don't Repeat Yourself' (DRY)-Prinzip in der Softwareentwicklung und wie kann es implementiert werden?
Welche Vorteile bietet das 'Don't Repeat Yourself' (DRY)-Prinzip in der Softwareentwicklung und wie kann es implementiert werden?
Welche Bedeutung hat das Single-Responsibility-Prinzip (SRP) für die Softwarearchitektur und welche Konsequenzen ergeben sich aus der Verletzung dieses Prinzips?
Welche Bedeutung hat das Single-Responsibility-Prinzip (SRP) für die Softwarearchitektur und welche Konsequenzen ergeben sich aus der Verletzung dieses Prinzips?
Welche Auswirkungen hat hohe Kopplung auf die Klassen in einem Softwaresystem und wie beeinflusst sie die Änderungsfreundlichkeit?
Welche Auswirkungen hat hohe Kopplung auf die Klassen in einem Softwaresystem und wie beeinflusst sie die Änderungsfreundlichkeit?
Welche Rolle spielt die Kohäsion bei der Gestaltung von Klassen und Modulen und wie wirkt sich geringe Kohäsion aus?
Welche Rolle spielt die Kohäsion bei der Gestaltung von Klassen und Modulen und wie wirkt sich geringe Kohäsion aus?
Flashcards
Software Engineering (Definition)
Software Engineering (Definition)
Anwendung eines systematischen, disziplinierten, quantifizierbaren Ansatzes zur Entwicklung, Betrieb und Wartung von Software.
Anwendungssoftware Beispiele
Anwendungssoftware Beispiele
Programme für Nutzer (Texteditor, Browser)
Systemsoftware Beispiele
Systemsoftware Beispiele
OS, Firmware, Treiber – ohne direkte Nutzerinteraktion
Software as a Service (SaaS)
Software as a Service (SaaS)
Signup and view all the flashcards
Netzwerk Erreichbarkeit
Netzwerk Erreichbarkeit
Signup and view all the flashcards
Keine physischen Grenzen
Keine physischen Grenzen
Signup and view all the flashcards
Geringe Distributionskosten
Geringe Distributionskosten
Signup and view all the flashcards
Keine Update-Kontrolle
Keine Update-Kontrolle
Signup and view all the flashcards
Kein Verschleiß
Kein Verschleiß
Signup and view all the flashcards
Lange Lebenszeit
Lange Lebenszeit
Signup and view all the flashcards
Schwierig messbare Eigenschaften
Schwierig messbare Eigenschaften
Signup and view all the flashcards
Anforderungsanalyse
Anforderungsanalyse
Signup and view all the flashcards
Domain-Driven-Design
Domain-Driven-Design
Signup and view all the flashcards
Entwicklung
Entwicklung
Signup and view all the flashcards
Validierung
Validierung
Signup and view all the flashcards
Designprinzipien
Designprinzipien
Signup and view all the flashcards
Entwurfsmuster
Entwurfsmuster
Signup and view all the flashcards
Architektur
Architektur
Signup and view all the flashcards
Betrieb
Betrieb
Signup and view all the flashcards
Dateiexplorer (IDE)
Dateiexplorer (IDE)
Signup and view all the flashcards
Syntax-Highlighting
Syntax-Highlighting
Signup and view all the flashcards
Codevervollständigung
Codevervollständigung
Signup and view all the flashcards
Problemindikator
Problemindikator
Signup and view all the flashcards
Codenavigation
Codenavigation
Signup and view all the flashcards
Refactoring (Umbennenung)
Refactoring (Umbennenung)
Signup and view all the flashcards
Validierung (IDE)
Validierung (IDE)
Signup and view all the flashcards
Debugging
Debugging
Signup and view all the flashcards
Versionskontrolle
Versionskontrolle
Signup and view all the flashcards
Terminal/Shell
Terminal/Shell
Signup and view all the flashcards
Shell
Shell
Signup and view all the flashcards
Shell-Automatisierung
Shell-Automatisierung
Signup and view all the flashcards
Shell-Dokumentation
Shell-Dokumentation
Signup and view all the flashcards
touch (Befehl)
touch (Befehl)
Signup and view all the flashcards
ls (Befehl)
ls (Befehl)
Signup and view all the flashcards
mv (Befehl)
mv (Befehl)
Signup and view all the flashcards
head/tail (Befehl)
head/tail (Befehl)
Signup and view all the flashcards
grep (Befehl)
grep (Befehl)
Signup and view all the flashcards
chmod (Befehl)
chmod (Befehl)
Signup and view all the flashcards
Shell Pipelining
Shell Pipelining
Signup and view all the flashcards
Shell-Fehlerbehandlung
Shell-Fehlerbehandlung
Signup and view all the flashcards
Study Notes
Software Engineering Definition
- Software Engineering bezieht sich auf die Anwendung eines systematischen, disziplinierten und quantifizierbaren Ansatzes für die Entwicklung, den Betrieb und die Wartung von Software.
- Es ist die Anwendung der Ingenieurwissenschaften auf Software.
Softwarearten
- Anwendungssoftware wie Texteditoren und Browser
- Systemsoftware wie Betriebssysteme, Firmware und Treiber, die keine direkte Nutzerinteraktion erfordern
- Software as a Service (SaaS) wie Serverprogramme, auf die über Browser oder Remote Shell zugegriffen wird
Eigenschaften von Software
- Erreichbarkeit über Netzwerke erhöht die Angriffsfläche.
- Fehlende physische Grenzen erschwert die Trennung von Subsystemen.
- Geringe Vertriebskosten ermöglichen eine einfache Fehlerbehebung.
- Mangelnde Kontrolle über Updates kann schnell zur Veralterung führen.
- Kein Verschleiß, aber veränderliche Umgebungen bringen unvorhergesehene Anforderungen mit sich.
- Lange Lebenszeiten sind typisch.
- Eigenschaften sind oft schwierig zu messen.
Bereiche des Software Engineering
- Anforderungsanalyse
- Domain-Driven Design
- Entwicklung inklusive Entwicklungswerkzeuge, Validierung, Designprinzipien, Entwurfsmuster und Architektur
- Betrieb
Entwicklungswerkzeuge - IDEs
- Bieten Hilfestellung durch Dateiexplorer, Syntaxhervorhebung, Codevervollständigung, Problemindikatoren, Codenavigation, Refactoring, Validierung, Debugging und Versionskontrolle
- Beinhalten Terminal/Shell
Shell
- Interaktive Programmiersprache zur Verwaltung von Prozessen und Dateien
- Ermöglicht Automatisierung von Entwicklungsaufgaben und das Zusammenfassen von Befehlen in Skripten
- Gute Dokumentation erleichtert die Einarbeitung.
- Das Format ist: BEFEHL [FLAGS] ARGUMENTE, z.B.
ls --recursive --ignore=*.png dir1 dir2 dir3
Nützliche Shell-Befehle
touch
: Erzeugt eine leere Dateils
: Listet Dateien aufmv
: Verschiebt Dateiencp
: Kopiert Dateienrm
: Löscht Dateienfind
: Sucht Dateienchown/chmod
: Ändert Dateizugriffsrechtecat
: Hängt Dateiinhalte aneinanderwc
: Zählt Wörtersort
: Sortiertgrep
: Durchsucht Textecho
: Gibt Text aushead/tail
: Gibt Anfang/Ende eines Textes ausless
: Gibt Teile eines langen Textes austee
: Gibt Text in Datei und Shell auspwd
: Gibt das aktuelle Verzeichnis ausmkdir
: Erstellt ein Verzeichniscd
: Ändert das Verzeichnisrmdir
: Löscht ein Verzeichnis- Input-/Output-Redirection: Umlenkung der Standardein- und ausgabe
Pipes und Redirects
- Pipes und Redirects verknüpfen und verändern Standardein-/ausgaben
|
: Leitet die Ausgabe von Befehl 1 in die Eingabe von Befehl 2 um.1>
: Leitet die Ausgabe eines Befehls in eine Datei um.2>
: Leitet Fehlermeldungen eines Befehls in eine Datei um.&>
: Leitet sowohl Ausgabe als auch Fehlermeldungen eines Befehls in eine Datei um.<
: Leitet den Inhalt einer Datei als Eingabe in einen Befehl um.
Fehlerbehandlung in der Shell
- Erfolgt durch Exit-Codes (0-255)
0
: Erfolg1-255
: Fehler, wobei der Wert den Typ des Fehlers angibt.- Es gibt auch Variablen, Arithmetik, Bedingungen und Schleifen
Entwicklungsprozesse
- Systematischer Ansatz zum Entwerfen, Implementieren, Betreiben und Warten von Software
- Ziel ist es, Software mit dem höchsten Wert zu den geringsten Kosten zu liefern.
- Die Prozessgestaltung wird durch Kollaboration, Skalierbarkeit, Konsistenz, Qualitätssicherung, Risikomanagement und kontinuierliche Verbesserung erreicht.
Aktivitäten im Prozess
- Anforderungsanalyse
- Design
- Entwicklung
- Validierung
- Betrieb
- Wartung
Prozessmodelle: Traditionell vs. Agile
- Traditionell:*
- Anforderungen müssen klar definiert und unveränderlich sein.
- Validierung erfolgt erst nach der Implementierung.
- Software geht erst am Ende des Prozesses in Betrieb.
- Agile:*
- Kürzere Entwicklungszyklen (Sprints/Iterationen) ermöglichen bessere Reaktion auf Veränderungen.
- Kontinuierliches Feedback durch Zyklusstruktur.
- Diese Modelle sind veraltet; agile werden eher benutzt.
Anforderungsanalyse
- Siehe Requirements Engineering
Architektur Definition
- Architektur beschreibt das übergeordnete Design/Organisation von Software (Komponenten und Interaktionen.)
- Ermöglicht Anforderungserfüllung, Qualität, Wartbarkeit und Erweiterbarkeit.
Dimensionen der Softwarearchitektur
- Operational: Verfügbarkeit, Skalierbarkeit, Performance (Eigenschaften der Ausführung)
- Strukturell: Erweiterbarkeit, Wartbarkeit, Nachnutzbarkeit, Konfigurierbarkeit (Eigenschaften des Codes)
- Übergreifend: Datenschutz, Sicherheit, Lokalisierung, Bedienbarkeit (betreffen alle Teile der Software)
Architekturstil Definition
- Komponenten der Software, wie sie organisiert und voneinander abhängig sind und miteinander kommunizieren
- Beispiele sind Schichten, Pipes & Filter, Service-orientiert, Broker und Microservices
- Jeder Stil hat Vor- und Nachteile.
Schichtenarchitektur
- Trennung der Aufgaben erhöht Wartbarkeit und Testbarkeit.
- Nutzeranfragen werden von oben nach unten durch Schichten gereicht.
- Es gibt geschlossene (Schicht muss passiert werden) und offene Schichten (kann umgangen werden).
- Architecture-Sinkhole Anti-Pattern: Evtl. unnötiges Durchreichen.
- Keine vertikale Skalierung: Verteilung auf mehrere Server schwer.
Service-orientiert
- Komponenten sind in mehreren, getrennten Diensten organisiert.
- Unabhängige Entwicklung, Wartung, Einsatz und Technologien.
- Kommunikation über Message Bus.
- Skalierung durch Hinzufügen neuer Dienste.
- Datenflüsse schwer nachvollziehbar, Overhead für Kommunikation.
Pipes & Filter
- Filter transformieren Daten, die durch Pipes verbunden sind.
- Filter sind eigenständig, unabhängig und zustandslos.
- Parallele Laufzeit erhöht Skalierbarkeit, niedriger Speicherbedarf & Aufgabentrennung durch Unabhängigkeit.
- Zwischenspeicherung/Serialisierung aufwändig, teilweise unpraktisch, komplizierte Fehlerbehandlung.
Domain-Driven Design
- Es zielt auf die Entwicklung nahe an der Problemdomäne ab, reduziert "Cruft" und erleichtert die Kommunikation mit Stakeholdern.
- Es erstellt ein Domänenmodell, identifiziert Kernkonzepte, generalisiert und erarbeitet deren Eigenschaften unter Nutzung der Domäne-Vokabulars
Designprinzipien
- Unterscheidung in:
- Komplexitätsbewältigung: Keep it simple, stupid; Trennung von Seiteneffekten; Vermeiden mehrdeutiger Dateitypen; Liskovsches Substitutionsprinip
- Änderungsauswirkungen minimieren: Don't repeat yourself; Single-Responsibility-Prinzip; Hohe Kohäsion, niedrige Kopplung; Interface-Segregation-Prinzip
- Keep it simple, stupid! (KISS): Reduziert unbeabsichtigte Komplexität, passt die Software an und erkennt, dass essentielle Komplexität aus der Problemdomäne entsteht und nicht reduziert werden kann.
Gründe für hohe Komplexität
- Mangelnde Dokumentation, schlechte Architekturentscheidungen, voreilige Optimierung, unerfahrene Entwickler und Softwarerevolution.
Bewältigung von Komplexität
- Funktionalem Programmierstil für kürzeren, weniger komplexen Code.
- Komplexitätsmetriken: Fan-in, Fan-out, Codegröße, Zyklomatische Komplexität, Schachtelungstiefe und Kopplung.
- Komplexe Komponenten erkennen: Statische (Komponenten im Projekt) & Longitudinale Analyse (Analyse über Zeitraum, Trends identifizieren)
Seiteneffekte
- Häufige Quelle von Komplexität und Fehlern.
- Sollten von der Geschäftslogik getrennt werden.
- Seiteneffektfreier Code ist leichter zu verstehen.
- Methoden mit Seiteneffekten können nicht-deterministisch sein.
- Typische Seiteneffekte: Mutation von Variablen/Datenstrukturen, Systemzustand auslesen, Netwerkanfragen und Lesen/Schreiben von Dateien/Datenbanken.
Mehrdeutige Datentypen
- Semantische Namen vermeiden Mehrdeutigkeit und verbessern das Verständnis des Codes.
- Das Liskovsche Substitutionsprinzip (LSP) ist ein starkes verhaltensbasiertes Subtyping.
Don't repeat yourself (DRY)
- Vermeidet Wiederholungen im Code, da Änderungen an mehreren Stellen erforderlich wären.
- Dies wird durch Ersetzen wiederholter Ausdrücke durch Variablen, Wrapper-Methoden und Verschieben von Code in Superklassen erreicht.
Single-Responsibility-Prinzip
- Jede Klasse/Modul sollte genau eine Verantwortlichkeit haben, um Änderungen kleiner zu halten.
- Tätigkeitsverantwortlichkeit: Führt eine Aufgabe aus
- Wissensverantwortlichkeit: Stellen Informationen für andere zur Verfügung
- Bei mehreren Aufgaben: Refactoring betreiben und Aufgaben auskoppeln
Hohe Kohäsion, niedrige Kopplung
- Kopplung: Klassen, die sich häufig ändern
- Kohäsion: Klassen mit mehreren Verantwortlichkeiten
- Hohe Kopplung ist problematisch: Kaskadierende Änderungen, schwierig zu verstehen, schlecht nachnutzbar und wenig modular.
- Arten von Kopplung: Attribute, (Teil-)Ausdrücke, Methodenaufrufe, Methoden, die von einer anderen Instanz verwendet werden, Subtypisierung und Metrik CBO (Coupling between Objects).
- Kohäsion bezieht sich auf die Zusammengehörigkeit der Methoden einer Klasse; niedrige Kohäsion bedeutet, dass Methoden wenig miteinander zu tun haben und aufgespaltet werden sollten.
- Metrik: LCOM (Lack of Cohesion of Methods).
- Interface-Segregation-Prinzip (ISP): Große Interfaces in kleinere aufspalten, damit Nutzer nötige Funktion besser erkennen
Entwurfsmuster
- Bewährte Lösungen für häufige Probleme
- Vermeiden „das Rad neu zu erfinden“
- Verbessern Komplexität, Kopplung, Nachnutzbarkeit, Codeverständnis & Kommunikation mit Entwickler:innen
Kritik an Entwurfsmustern
- Boilerplate: Benötigen Code, der nicht direkt zur Lösung beiträgt
- Unnötige Nutzung: Teilweise einfachere Lösungen, die zugunsten von Entwurfsmustern bevorzugt werden
- Dogmatismus: Strikte Befolgung, statt Anpassung an jeweiliges Programm
Kategorien der Entwurfsmuster
- Erzeugung: Beschreiben, wie Objekte erzeugt werden (Bsp: Abstract Factory)
- Struktur: Beschreiben die Komposition von Klassen (Bsp: Decorator)
- Verhalten: Beschreiben Interaktion von Klassen (Bsp: Iterator & Observer)
Abstract Factory Pattern
- Delegiert Objekterzeugung an Subklassen- Bspw. Sinnvoll bei Cross-Platform-Apps, wo die GUI-Erzeugung unterschiedlich implementiert werden muss
- Beteiligte Klassen:
- AbstractFactory: Interface erzeugt Produkte einer Familie
- ConcreteFactory: Ermöglicht Erzeugung konkreter Objekte einer Familie
- AbstractProduct: Interface für konkrete Produkte
- ConcreteProduct: Implementierung des konkreten Produkts
- Client: Nutzt konkr. Produkte über AbstractProduct Interface, erzeugt konkr. Produkte mit einer ConcreteFactory, verwendet dazu das AbstractFactory Interface
Decorator
- Erweitert Klassen mit Delegation statt Vererbung -> Vererbung beschränkt Erweiterbarkeit
- Beteiligte Klassen/Struktur:
- Component: zu erweiternde Interface
- Decorator: erweitern andere Komponenten um neue Funktionalität
- BasicComponent: implementiert Grundfunktionalität (ohne Erweiterung)
- Vorteile: Erlaubt Erweiterung ohne Vererbung, dynamisch zur Laufzeit
- Nachteile: Oft von Reihenfolge der Decorator abhängig, Boilerplate für Methoden (nicht erweitert)
Iterator
- Ermöglicht den Zugriff auf Elemente einer Collection, ohne deren Struktur preiszugeben
- Versteckt Komplexität und vermeidet Fehler bei Traversierung
- Stellt Traversierung mit next/hasnext bereit
- Vorteile: Versteckt Komplexität und vermeidet Fehler bei Traversierung
- Nachteile: Schwere Parallelisierung, Implementierung evtl. komplex, Zustandsbehaftet und Probleme im Umgang mit Änderung, da komplexe Datenstruktur
Observer
- Erlaubt, Änderungen eines Objekts zu sehen, ohne Kopplung zu erzeugen
- Beteiligte Klassen:
- Subject: kennt Observer, nutzt entsprechendes Observer Interface
- Observer: Interface, um über Änderung am Subject zu informieren
- ConcreteSubject: Informiert die Observer bei Änderung am Zustand
- ConcreteObserver: ist an Änderung des ConcreteSubjects interessiert
- Vorteile: Kopplung nur abstrakt (Subject ↔ Observer) und Ermöglicht Broadcast-Kommunikation
- Nachteile: Gefahr von Update-Kaskaden und Benachrichtigungen werden an alle Observer geschickt, auch wenn sie nicht interessiert sind.
Funktionale Entwurfsmuster
- Monoid - Akkumulierung: Vermeidung von Wiederholungen; konkrete Beispiele: Listenkonkatenation, Strings (appendString), Zahlen (add, mul...) Boolesche Werte (Kon-/Disjunktion)
- Monade - Erweiterung: zusätzliche Funktionaliät Beispiele: Option (Wert vorhanden oder nicht); Liste: beliebig viele Werte
Software-Qualität
- Extern - Wahrnehmung Stakeholder:
- Funktionalität, Validität, Reaktionsgeschwindigkeit, Bedienbarkeit, Kompatibilität, Portabilität, Effizienz
- Maßnahme für Sicherstellung: Stakeholder-Feedback, Domänen-Modellierung, Testen, Statische Analyse
- Funktionalität, Validität, Reaktionsgeschwindigkeit, Bedienbarkeit, Kompatibilität, Portabilität, Effizienz
- Intern - Wahrnehmung Entwicker:innen:
- Erweiterbarkeit, Wartbarkeit, Verständlichkeit, Enjoyability - Sicherstellung durch: Architekturentscheidungen; Designprinzipen und Metriken; Entwurfsmuster.
Testen
- Stichprobenartige Ausführung des Testobjekts, unter spezifizierten Bedingungen zur Überprüfung der Ergebnisse
- Test-Orakel:
- Soll-Ausgaben, um Fehler zu erkennen -> Orakel ist Quelle
- Meistens manuell erstellt -> idealerweise aus Spezifikation generiert
- Testfall-Kriterien: repräsentativ, fehlerintensiv, redundanzarm und ökonomisch.
- Testarten: Automatisch vs. Manuell; beispielbasiert vs. Eigenschaftsbasiert; Black-box vs. White-box; funktionsorientiert vs. Strukturorientiert; Komponenten/Integration/System/UI; Akzeptanz/Smoketest/Usability/Accessibility...
Statische Analyse
- Tests alleine reichen nicht aus, da sie nur bestimmte Fälle berücksichtigen
- Statische Analyse: Infos über Code/Programm gewinnen, ohne Ausführung
- Einsatzfelder:
- In IDEs zur Unterstützung von Entwickler:innen:Klassenhierarchiel, Codenavigation, Methodenaufruf-Infos; Fehler, Warnungen, Code Smells, Optimierungsvorschläge; Refactoring, Auto Complete
- In Compilern: Type Checking, semantische Analyse; Optimierung von Code
- Für formale Verifikation: Informationssammlung für Beweise; Sicherstellen valider Spezifikationen
- In Sicherheitsanalysen: Schwachstellen finden; Schadsoftware identifizieren; Datenleaks erkennen
- Herausforderungen:
- Unentscheidbare Eigenschaften: terminiert? / doppelte Pointer? → keine definitive Antwort: Über- und Unterapproximation
- Vollständigkeit: keine unmögliche Ergebnisse produzieren → keine Überapproximation
- Korrektheit: alle mögliche Ergebnisse produzieren → keine Unterapproximation, vollständige Korrektheit oft nicht erreichbar
- Skalierbarkeit: Anforderungen stehen oft im Konflikt miteinander!
- Analysetypen:
- Kontrollflussanalyse; Datenflussanalyse
- Nach Eigenschaften: Umfang: intraprozedural (jede Methode für sich) & interprozedural (gesamtes Programm); Flusssensitivität: Insensitiv (global gültiges Ergebnis) & Sensitiv (Ergebnis je Anweisung beurteilen); Kontextsensitiv: Insensitiv (Codestück nur 1x betrachten) & Sensitiv (mehrere Kontexte, bspw. Methodenaufrufe)
- Analysetechniken: Typsysteme (Weisen Ergebnis einen Typ zu, Kompositional: Typ folgt aus Typen der Teilausdrücke, häufg genutzt (compilieren)) und Effektsysteme (Weisen Ausdruck einen Effekt zu, Kompositinal, seltener genutzt); Monotone Datenflussanalyse (intraprozedural, wie Werte zwischen Variablen fließen; Liveness, Reaching definitions und Available expressions); Interprozedurale Datenflussanalyse (IFDS & IDE), Datenfluss als Graph-Erreichbarkeits-Problem, wenn geeignet:: sehr effizient, Nutzung in z.B. Taintanalyse, Symbolische Ausführung, interpretiert Programme mit symbolischen Werten, Big-Step abstrakte Interpreter, Berechnen Abstraktionen konkreter Werte, Vereinigt Werte nach Verzweigungen à Pfadexplosion wird vermieden; Constraint-basierte Analyse; Slicing, wichtig für z.B. CFG & Dominator Baum, Callgraphen, Points-to-Analyse, Escape & Alias Analyse und Immutability & Purity
- Einsatzfelder:
Langlebige Software (Gastvortrag)
- Softwaresysteme, die so lange eingesetzt werden, dass sich diese regelmäßig über einen Zeitraum an sich ändernde Hardware, Softwareumgebungen und Benutzungsanforderung anpassen
- Stichwort: Softwareerosion - Innerer Strukturverlust von Software führt zu- schlechter Wartbarkeit; schlechter Anpassbarkeit; schlechter Performanz und Anhäufung von Fehlern und Sicherheitsrisiken.
→ Anzeichen, Quellen, Verstärker und Bändigung
- Anzeichen: Code passt nicht zur Dokumentation, schlechte Codequalität, Wartung schwierig.
- Verstärker: Fehlende Automatisierung, All-In-One-Developer, unvollständige Entscheidungsfindung, fehlendes Update-Management
- Quelle: Fehlendes Code-Verständnis, Ignorieren von Teamwissen, geänderte Code-Paradigmen werden nicht angepasst, Copy-Paste-Programmierung und Übermäßige Nutzung von KI
- Bändigung: Gute Codequalität, strukturierte Entscheidungsverfahren, geeignetes Projektmanagement und echte Architektur-Arbeit
Testabdeckung/Spezifikationsbasiertes Testen (Black Box)
- Referenz: Spezifikation des Prüfobjekts (der Software)
- Bewertung: Vollständigkeit & Korrektheit auf Spezifikation
- Äquivalenzklassentest
- Unmöglich, alle Kombinationen von Eingabewerten zu testen -> Unterteilung der Eingaben in „Gruppen ähnlicher Werte“
- Zerlege mögliche Eingaben in gültige und ungültige Äquivalenzklassen
- → getestet durch einen/mehrere Repräsentanten Bildung von Klassen
- geordneter Wertebereich:
- eine gültige, zwei ungültige Klassen
- mit unterer und oberer Schranke
- eine gültige, zwei ungültig
- Bedingung
- eine gültige, eine ungültige
- Aufzählung/ungeordneter Wertebereich mit Gleichbehandlung
- eine gültige, eine ungültige
- Aufzählung/ungeordneter Wertebereich ohne Gleichbehandlung
- eine gültige Pro Wert, eine ungültige
- Beim Testen: Pro Testfall mehrere gültige Klassen abdeckena und pro Testfall nur EINE ungültige Klasse
- Quellcodebasiertes Testen (White Box) :Testreferenz, Bewertung, Techniken, Testabdeckung
Kontrollflussorientiertes Testen
- Referenz ist der Kontrollfluss, der aus dem Quellcode abgeleitet ist
- Umfasst:
- Strukturbasierte Testabdeckung
- Schleifentests
- Logikbasierte Testabdeckung
- Datenflussorientiertes Testen
- Referenz: Datenfluss, abgeleitet aus Quellcode
- Ziel: Erreichen einer angemessenen Güte der test
- Operationalisierung: hinreichende Testabdeckung
- Beispiel: Zweigüberdeckung
- Strukturelle Abdeckung:
- Kontrollflussgraph: Test auf gültige Pfade(Start à Endknoten)
- Pfad: kann Kanten mehrfach durchlaufen, muss nicht alle Knoten durchlaufen
Arten der Strukturellen Abdeckung- Tests
- Anweisungsüberdeckungstest: Anteil der ausgeführten Anweisungen: Schwaches Kriterium
- Kantenüberdeckung: Jede Kante min. 1x ausführen
- Zweigüberdeckung: Zweige sind Kanten nach Entscheidung
- Kanten/Zweigüberdeckung allgemein äquivalent
- Pfadüberdeckungstest: feste Abfolge von Knoten im CFG
Performance Metriken
- Die Messung und Optimierung der Anwendungsperformance, organisiert nach Metriken wie Laufzeit und Ressourcennutzung.
Laufzeit
- Die für eine Aufgabe benötigte Zeit
- Abhängig von Systemlast, Speicherbedarf, Thread-Synching und JIT-Optimierung.
- Verschiedene Maße sind Real-Zeit, Nutzer-CPU Zeit und System-CPU Zeit.
- Messungen über Benchmarks, wobei Variation durch Garbage Collection, Systemlast und Festplattennutzung entsteht und Varianzreduzierung durch Medianbildung erreicht wird
- Visualisierung durch Flame Graphs, die die Laufzeit einzelner Methoden messen.
Ressourcennutzung
- Umfasst CPU-Nutzung (CPU-Zyklen zur Ausführung nutzen) und Speicherbedarf (benötigte Menge an Arbeitsspeicher).
- Hoher Speicherverbrauch gleich hohe Laufzeit.
- Unterscheidung in physischen & virtuellen Speicher zur Abgrenzung von Prozessen.
- Maße wie Durchsatz, Bandbreite und Sondermetriken
- Just-in-Time Optimierungen zur Laufzeit zur Verminderung von Systemlast.
Theoreische Performanzmaße
- Zeitkomplexität zur Beschreibung der Laufzeit eines Algorithmus mit zunehmender Eingabegröße
- Worst-Case-Zeitkomplexität
- Durchschnittliche Zeitkomplexität
Studying That Suits You
Use AI to generate personalized quizzes and flashcards to suit your learning preferences.