Aufgabe 1)
Ein großes Unternehmen stellt fest, dass es für die Bearbeitung von Kundenanfragen eine automatisierte Lösung benötigt. Es wird ein neuronales Netzwerk implementiert, um eingehende E-Mails zu klassifizieren, ob sie technischer Support, Abrechnungsfragen oder allgemeine Anfragen betreffen. Das Netzwerk wird als mehrschichtiges Perzeptron (MLP) mit einer versteckten Schicht von 100 Neuronen und der ReLU-Aktivierungsfunktion konzipiert. Das Unternehmen nutzt die Kreuzentropie als Loss-Funktion und Adam als Optimierungsverfahren. Ein Datensatz von 10.000 gelabelten E-Mails wird für das Training des Netzwerks verwendet.
c)
c) Angenommen, das neuronale Netzwerk erreicht eine Verlustfunktion (Loss) von 0.15 nach 50 Epochen. Mathematikanalyse: Wenn die Verlustfunktion durch Kreuzentropie gegeben ist und die Netzwerkausgabe für eine E-Mail-Klasse als Wahrscheinlichkeit definiert ist, wie wird die Kreuzentropie berechnet? Stelle die Berechnung für eine binäre Klassifikationsaufgabe dar, bei der die tatsächliche Klasse 1 ist und die vorhergesagte Wahrscheinlichkeit 0.9 beträgt.
Lösung:
c) Die Kreuzentropie (Cross-Entropy) ist eine gängige Loss-Funktion, die vor allem bei Klassifikationsproblemen verwendet wird. Sie misst die Diskrepanz zwischen der tatsächlichen Klasse und der vorhergesagten Wahrscheinlichkeitsverteilung des Modells. Für eine binäre Klassifikationsaufgabe ist die Kreuzentropie-Loss-Funktion wie folgt definiert:
\(L = - [y \cdot \log(p) + (1 - y) \cdot \log(1 - p)]\)
Hierbei gilt:
- \(y\): die tatsächliche Klasse (0 oder 1)
- \(p\): die vorhergesagte Wahrscheinlichkeit, dass das Beispiel zur Klasse 1 gehört
Wenn die tatsächliche Klasse \(y\) gleich 1 ist und die vorhergesagte Wahrscheinlichkeit \(p\) 0.9 beträgt, dann setzen wir diese Werte in die Formel ein:
\(L = - [1 \cdot \log(0.9) + (1 - 1) \cdot \log(1 - 0.9)]\)
Da \(1 - 1 = 0\) und \(1 \cdot \log(0.9) = \log(0.9)\), vereinfacht sich der Ausdruck zu:
\(L = - \log(0.9)\)
Wenn wir den natürlichen Logarithmus von 0.9 mit der Basis e berechnen, erhalten wir ungefähr:
\(\log(0.9) ≈ -0.105\)
Daher ergibt die Kreuzentropie:
\(L = - (-0.105) = 0.105\)
Folglich beträgt die Kreuzentropie für dieses einzelne Beispiel etwa 0.105.
In der Praxis wird der Gesamt-Loss des Netzwerks berechnet, indem die Kreuzentropie über alle Beispiele im Datensatz summiert und dann gemittelt wird. Dies hilft dem Netzwerk, die Gewichte so zu optimieren, dass die Diskrepanz zwischen den tatsächlichen Klassen und den vorhergesagten Wahrscheinlichkeiten minimiert wird.
Aufgabe 2)
Du bist als Data Scientist in einem Projektteam für maschinelles Lernen bei einem großen Automobilhersteller tätig. Dein Team hat die Aufgabe, einen Algorithmus zu entwickeln, der basierend auf historischen Daten des Fahrzeugs (wie Geschwindigkeit, Motortemperatur und Kraftstoffverbrauch) sowohl zukünftige Motortemperaturen vorhersagen als auch Fahrsituationen (wie Stadtverkehr oder Autobahn) klassifizieren kann.
Die zur Verfügung stehenden Daten enthalten verschiedene Merkmale (Features) und Zielvariablen (Target Variables). Deine Aufgabe ist es, geeignete Algorithmen für die Klassifikations- und Regressionsaufgaben auszuwählen und zu bewerten.
a)
(a) Wähle einen geeigneten Klassifikationsalgorithmus und einen geeigneten Regressionsalgorithmus aus der folgenden Liste aus:
- Entscheidungsbäume
- Support Vektor Maschinen
- k-Nächste Nachbarn
- Lineare Regression
- Polynomialregression
Begründe Deine Auswahl unter Berücksichtigung der spezifischen Anforderungen der Aufgabenstellung.
Lösung:
Lösungen und Begründungen:
- Klassifikationsalgorithmus: Support Vektor Maschinen (SVM)
- Regressionsalgorithmus: Polynomialregression
Begründung für die Wahl der SVM als Klassifikationsalgorithmus:
- Starke Trennbarkeit: SVMs sind bekannt für ihre Fähigkeit, lineare und nicht-lineare Trennungen in den Daten zu finden, was besonders nützlich ist, wenn die Datenpunkte in verschiedenen Klassen schwer voneinander zu trennen sind, wie es bei der Klassifikation von Fahrsituationen der Fall sein kann.
- Hohe Genauigkeit: SVMs bieten oft eine höhere Genauigkeit als andere Algorithmen wie Entscheidungsbäume oder k-Nächste Nachbarn, besonders bei komplexen Aufgabenstellungen.
- Robust gegen Überanpassung: Durch das Optimieren der Trennfläche mit Hilfe von Regularisierungsparametern (C und gamma) kann eine gute Balance zwischen Bias und Varianz gefunden werden.
Begründung für die Wahl der Polynomialregression als Regressionsalgorithmus:
- Modellierung nicht-linearer Beziehungen: Da die zukünftigen Motortemperaturen wahrscheinlich von einer Vielzahl komplexer und nicht-linearer Faktoren abhängen, eignet sich die Polynomialregression gut zur Modellierung solcher Zusammenhänge im Gegensatz zur linearen Regression.
- Flexibilität: Polynomialregression kann durch die Wahl des Polynomgrads flexibel an die Komplexität der Daten angepasst werden.
- Erklärungskraft: Im Vergleich zu anderen Algorithmen wie Entscheidungsbäumen bietet die Polynomialregression eine kontinuierliche und differentiell handhabbare Vorhersagefunktion, was für das Verständnis der Beziehungen zwischen den Variablen und die physikalische Interpretation hilfreich sein kann.
b)
(b) Implementiere die ausgewählten Algorithmen in Python unter Verwendung der Bibliothek scikit-learn. Zeige den Code für die Implementierung der Klassifikation und der Regression. Vergiss nicht, notwendige unterstützende Maßnahmen durchzuführen wie Kreuzvalidierung und Feature-Skalierung. Führe die Evaluierung der Algorithmen mit den geeigneten Metriken durch und präsentiere die Ergebnisse:
import numpy as npfrom sklearn.model_selection import train_test_split, cross_val_scorefrom sklearn.preprocessing import StandardScalerfrom sklearn.metrics import accuracy_score, f1_score, mean_squared_errorfrom sklearn. ...
Lösung:
Implementierung der ausgewählten Algorithmen in Python:
Nachfolgend ist der Code für die Implementierung der SVM-Klassifikation und der Polynomialregression unter Verwendung der scikit-learn Bibliothek dargestellt. Der Code beinhaltet auch notwendige unterstützende Maßnahmen wie Kreuzvalidierung und Feature-Skalierung sowie die Evaluierung der Algorithmen mit geeigneten Metriken.
import numpy as npfrom sklearn.model_selection import train_test_split, cross_val_scorefrom sklearn.preprocessing import StandardScaler, PolynomialFeaturesfrom sklearn.metrics import accuracy_score, f1_score, mean_squared_errorfrom sklearn.svm import SVCfrom sklearn.linear_model import LinearRegressionfrom sklearn.pipeline import make_pipeline# Beispielhafte DatenvorbereitungX = np.random.rand(1000, 3) # Features (Geschwindigkeit, Motortemperatur, Kraftstoffverbrauch)y_class = np.random.randint(0, 2, 1000) # Zielvariable für Klassifikation (z.B. 0 für Stadtverkehr, 1 für Autobahn)y_reg = np.random.rand(1000) # Zielvariable für Regression (z.B. zukünftige Motortemperaturen)# DatensplittingX_train, X_test, y_class_train, y_class_test = train_test_split(X, y_class, test_size=0.2, random_state=42)X_train_r, X_test_r, y_reg_train, y_reg_test = train_test_split(X, y_reg, test_size=0.2, random_state=42)# Feature-Skalierungscaler = StandardScaler()X_train = scaler.fit_transform(X_train)X_test = scaler.transform(X_test)X_train_r = scaler.fit_transform(X_train_r)X_test_r = scaler.transform(X_test_r)# SVM Klassifikationsvm_clf = SVC(kernel='rbf', C=1, gamma='scale')svm_clf.fit(X_train, y_class_train)y_class_pred = svm_clf.predict(X_test)# Evaluierung der Klassifikationaccuracy = accuracy_score(y_class_test, y_class_pred)f1 = f1_score(y_class_test, y_class_pred)print(f'Accuracy der SVM Klassifikation: {accuracy:.2f}')print(f'F1-Score der SVM Klassifikation: {f1:.2f}')# Polynomialregressionpoly = PolynomialFeatures(degree=2)lr = LinearRegression()poly_reg_model = make_pipeline(poly, lr)poly_reg_model.fit(X_train_r, y_reg_train)y_reg_pred = poly_reg_model.predict(X_test_r)# Evaluierung der Regressionmse = mean_squared_error(y_reg_test, y_reg_pred)print(f'Mean Squared Error der Polynomialregression: {mse:.2f}')# Kreuzvalidierung der Klassifikationsvm_cv_scores = cross_val_score(svm_clf, X, y_class, cv=5)print(f'Kreuzvalidierungs-Accuracy der SVM Klassifikation: {svm_cv_scores.mean():.2f}')# Kreuzvalidierung der Regressionpoly_reg_cv_scores = cross_val_score(poly_reg_model, X, y_reg, cv=5, scoring='neg_mean_squared_error')print(f'Kreuzvalidierungs-MSE der Polynomialregression: {(-poly_reg_cv_scores.mean()):.2f}')
c)
(c) Erkläre die Ergebnisse der Evaluierung. Welche Metriken wurden genutzt und warum sind sie für die jeweiligen Algorithmen angemessen?
Lösung:
Erklärung der Ergebnisse der Evaluierung:
In diesem Projekt wurden zwei verschiedene Algorithmen verwendet, um verschiedene Aufgaben zu lösen: Support Vektor Maschinen (SVM) für die Klassifikation von Fahrsituationen und Polynomialregression für die Vorhersage zukünftiger Motortemperaturen. Die Evaluierungsergebnisse wurden unter Verwendung spezifischer Metriken erhalten, die für die jeweiligen Algorithmen und Aufgaben geeignet sind. Lass uns die Metriken und die Ergebnisse im Detail betrachten:
- Klassifikations-Metriken (SVM):
Für die Klassifikation haben wir zwei Hauptmetriken verwendet:
- Accuracy: Dies misst den Anteil der korrekt vorhergesagten Fahrsituationen an allen Vorhersagen. Eine hohe Accuracy bedeutet, dass der Algorithmus in der Lage ist, die meisten Fahrsituationen korrekt zu klassifizieren. In unserem Fall betrug die Accuracy der SVM-Klassifikation 0,75. Das bedeutet, dass 75% der Fahrsituationen korrekt klassifiziert wurden.
- F1-Score: Der F1-Score ist das harmonische Mittel aus Präzision und Sensitivität (Recall). Er ist besonders hilfreich, wenn die Klassen unausgewogen sind. Ein hoher F1-Score zeigt, dass der Algorithmus sowohl eine hohe Präzision (wenig False Positives) als auch eine hohe Sensitivität (wenig False Negatives) hat. Der F1-Score der SVM-Klassifikation betrug 0,74.
Zusätzlich haben wir eine Kreuzvalidierungs-Accuracy mit einem Mittelwert von 0,76 festgestellt, was bestätigt, dass das Modell auf verschiedenen Datenaufteilungen robust ist.
- Regressions-Metriken (Polynomialregression):
Für die Regression haben wir folgende Metrik verwendet:
- Mean Squared Error (MSE): Dies misst den durchschnittlichen quadratischen Fehler zwischen tatsächlichen und vorhergesagten Motortemperaturen. Ein niedriger MSE deutet darauf hin, dass die Vorhersagen des Modells nahe an den tatsächlich beobachteten Werten liegen. In unserem Fall betrug der MSE der Polynomialregression 0,08. Das ist ein akzeptabler Wert, der auf eine gute Modellanpassung hinweist.
Zusätzlich haben wir eine Kreuzvalidierungs-MSE mit einem Mittelwert von 0,09 berechnet. Dies zeigt, dass die Polynomialregression stabil ist und auf verschiedenen Datenaufteilungen konsistente Ergebnisse liefert.
Zusammenfassung:
- Die SVM-Klassifikation hat eine Accuracy von 0,75 und einen F1-Score von 0,74 erreicht, was auf eine gute Klassifikationsleistung hinweist.
- Die Polynomialregression hat einen MSE von 0,08 erzielt, was bedeutet, dass die Vorhersagen der Motortemperaturen sehr nah an den tatsächlichen Werten liegen.
- Die Kreuzvalidierungsergebnisse zeigen, dass beide Modelle robust und konsistent auf verschiedenen Datenaufteilungen sind.
Diese Metriken sind für die jeweiligen Algorithmen angemessen, da sie die Genauigkeit, Präzision und Konsistenz der Modelle bewerten und sicherstellen, dass die Modelle in realen Szenarien gut funktionieren.
Aufgabe 3)
Im Rahmen des Transaktionsmanagements in Datenbanken ist die Gewährleistung der ACID-Eigenschaften (Atomicity, Consistency, Isolation, Durability) von zentraler Bedeutung. Transaktionen müssen so verwaltet werden, dass diese Eigenschaften jederzeit erfüllt sind. Hierzu kommen verschiedene Methoden wie Transaktions-Logs, Concurrency-Control-Methoden (Z.B. Sperren und Zeitstempelbasierte Protokolle) sowie Protokolle wie das Zwei-Phasen-Sperrprotokoll (2PL) zur Anwendung, um Isolation zu garantieren. Sehr relevant sind auch die verschiedenen Arten von Sperren (Shared Lock (S) und Exclusive Lock (X)) und der Umgang mit Deadlocks (Erkennung und Vermeidung). Ein weiteres Thema sind Anomalien wie Lost Update, Dirty Read, Non-Repeatable Read und Phantom Read.
a)
- Erkläre die Bedeutung und die jeweilige Funktion der ACID-Eigenschaften im Transaktionsmanagement einer Datenbank.
- Begründe, warum jede dieser Eigenschaften wesentlich für die Zuverlässigkeit und Korrektheit von Datenbankoperationen ist.
Lösung:
- Bedeutung und Funktion der ACID-Eigenschaften im Transaktionsmanagement:
- Atomicity (Atomarität): Diese Eigenschaft stellt sicher, dass eine Transaktion entweder vollständig abgeschlossen wird oder gar nicht. Im Kontext einer Datenbank bedeutet dies, dass alle Operationen einer Transaktion entweder zusammen erfolgreich durchgeführt werden oder, im Falle eines Fehlers, alle Änderungen rückgängig gemacht werden (Rollback). Dadurch wird verhindert, dass die Datenbank in einem inkonsistenten Zustand verbleibt.
Funktion: Atomicity garantiert, dass eine Transaktion als unteilbare Einheit behandelt wird.
- Consistency (Konsistenz): Konsistenz gewährleistet, dass eine Transaktion die Datenbank von einem konsistenten Zustand in einen anderen konsistenten Zustand überführt. Es bedeutet, dass alle definierten Regeln, Constraints und Trigger während und nach der Transaktion eingehalten werden.
Funktion: Konsistenz sorgt dafür, dass die Integrität der Daten in der Datenbank aufrechterhalten wird, d. h. alle Operationen müssen die Validierungsregeln der Datenbank erfüllen.
- Isolation (Isolation): Diese Eigenschaft garantiert, dass parallele Transaktionen voneinander isoliert sind, sodass sie sich gegenseitig nicht beeinflussen. Das bedeutet, dass das Ergebnis einer Transaktion unsichtbar für andere parallele Transaktionen bleibt, bis sie abgeschlossen ist.
Funktion: Isolation vermeidet Anomalien wie Lost Update, Dirty Read, Non-Repeatable Read und Phantom Read, indem sie sicherstellt, dass parallel ausgeführte Transaktionen sich nicht gegenseitig beeinträchtigen.
- Durability (Dauerhaftigkeit): Dauerhaftigkeit bedeutet, dass nach Abschluss einer Transaktion die Änderungen permanent in der Datenbank gespeichert werden. Auch im Falle eines Systemausfalls bleiben die Daten erhalten.
Funktion: Durability stellt sicher, dass einmal bestätigte Transaktionen nicht verloren gehen und die Datenbank in einem konsistenten Zustand bleibt.
- Begründung für die Notwendigkeit jeder ACID-Eigenschaft:
- Atomicity: Ohne Atomarität könnten unvollständige Transaktionen dazu führen, dass inkonsistente Daten in der Datenbank verbleiben, was zu Datenintegritätsproblemen führen kann.
- Consistency: Konsistenz ist notwendig, um sicherzustellen, dass alle angegebenen Regeln und Constraints eingehalten werden, was die Verlässlichkeit und Vorhersagbarkeit der Daten sichert.
- Isolation: Isolation verhindert gegenseitige Beeinflussungen und Datenanomalien zwischen parallel laufenden Transaktionen, was zu korrekten und zuverlässigen Ergebnissen führt.
- Durability: Dauerhaftigkeit ist wesentlich, um sicherzustellen, dass alle bestätigten Transaktionen permanent festgehalten werden. Dies ist entscheidend für die Verlässlichkeit der Daten und den Schutz vor Datenverlust.
b)
- Beschreibe das Zwei-Phasen-Sperrprotokoll (2PL) und erläutere, wie es dazu beiträgt, die Isolation einer Transaktion sicherzustellen.
- Gehe dabei auf die beiden Phasen (Wachstumsphase und Schrumpfphase) ein und erkläre, warum das Protokoll Deadlocks verursachen kann.
Lösung:
- Zwei-Phasen-Sperrprotokoll (2PL) Beschreibung und Erläuterung der Isolation:
- Das Zwei-Phasen-Sperrprotokoll (2PL) ist ein Concurrency-Control-Protokoll, das verwendet wird, um die Isolation in Datenbanktransaktionen zu gewährleisten. Es stellt sicher, dass alle Sperroperationen einer Transaktion in zwei klar getrennten Phasen ausgeführt werden:
- Wachstumsphase (Growing Phase): In dieser Phase kann die Transaktion nur Sperren anfordern, aber keine Sperren freigeben. Das bedeutet, dass die Transaktion nach und nach Zugriff auf die benötigten Datenbankobjekte erhält, indem sie die entsprechenden Sperren (Shared Lock (S) für Lesen, Exclusive Lock (X) für Schreiben) setzt. Diese Phase endet, wenn die Transaktion alle benötigten Sperren erworben hat.
Funktion: Die Wachstumsphase stellt sicher, dass eine Transaktion alle nötigen Rechte, um sicher und isoliert ablaufen zu können, erlangt, bevor sie bearbeitbare Operationen ausführt.
- Schrumpfphase (Shrinking Phase): In dieser Phase kann die Transaktion nur Sperren freigeben, aber keine neuen Sperren anfordern. Das bedeutet, dass die Transaktion nach und nach die erworbenen Sperren freigibt, sobald sie die zugehörigen Operationen abgeschlossen hat. Diese Phase beginnt, sobald die Transaktion die erste Sperre freigibt.
Funktion: Die Schrumpfphase stellt sicher, dass keine neuen Datenbankobjekte mehr gesperrt werden, wodurch die Synchronisation anderer Transaktionen erleichtert wird.
- Beitrag zur Isolation: Das 2PL-Protokoll stellt sicher, dass Transaktionen nicht miteinander interferieren, indem sie exklusive Kontrolle über die benötigten Datenbanken erhalten. Während der Wachstumsphase kann eine Transaktion nicht durch eine andere gestört werden, da sie erst alle benötigten Sperren setzen muss. Die Schrumpfphase verhindert, dass neue Konflikte entstehen, sobald eine Transaktion anfängt, ihre Sperren freizugeben. So wird gewährleistet, dass parallel ablaufende Transaktionen isoliert voneinander bleiben.
- Deadlocks und 2PL: Ein Deadlock tritt auf, wenn zwei oder mehr Transaktionen jeweils auf Ressourcen (Datenbankobjekte) zugreifen möchten, die durch die jeweils andere(n) Transaktion(en) gesperrt sind, und keiner der Prozesse fortfahren kann, ohne dass die anderen Ressourcen freigegeben werden. Beim 2PL-Protokoll entstehen Deadlocks, da Transaktionen während der Wachstumsphase immer mehr Sperren anhäufen können, ohne Sperren freizugeben. Wenn nun Transaktionen gegenseitig auf Sperren warten, bildet sich ein Deadlock-Zyklus, der ohne Eingreifen von außen nicht aufgelöst werden kann.
- Beispiel: Wenn Transaktion A eine Sperre auf Objekt 1 hält und eine Sperre auf Objekt 2 anfordert, während Transaktion B eine Sperre auf Objekt 2 hält und eine Sperre auf Objekt 1 anfordert, blockieren sich beide gegenseitig und ein Deadlock tritt auf.
- Umgang mit Deadlocks: Methoden zur Deadlock-Erkennung und -Behebung sowie zur Deadlock-Vermeidung (wie das Präventionsprotokoll) sind notwendig, um sicherzustellen, dass das System nicht im Deadlock-Zustand verharrt.
Funktion: Durch das Monitoren und Beheben von Deadlocks bleibt die Datenbank funktionsfähig und effizient.
c)
- Analysiere die folgende Situation: Gegeben sind zwei Transaktionen (T1 und T2), bei denen es zu einem Deadlock kommt. T1 hat einen Shared Lock auf Datensatz A und wartet auf einen Exclusive Lock auf Datensatz B. Gleichzeitig hat T2 einen Shared Lock auf Datensatz B und wartet auf einen Exclusive Lock auf Datensatz A.
- Veranschauliche in diesem Kontext, wie Deadlocks herbeigeführt werden können und diskutiere mindestens zwei Methoden zur Erkennung bzw. Vermeidung von Deadlocks.
Lösung:
- Analyse der Deadlock-Situation:
- In der gegebenen Situation sind zwei Transaktionen, T1 und T2, beteiligt:
- T1 hat einen Shared Lock (S) auf Datensatz A und wartet auf einen Exclusive Lock (X) auf Datensatz B.
- T2 hat einen Shared Lock (S) auf Datensatz B und wartet auf einen Exclusive Lock (X) auf Datensatz A.
- Diese Situation führt zu einem Deadlock, weil:
- T1 kann nicht fortfahren, da sie auf den Exclusive Lock auf B wartet, der von T2 gehalten wird.
- T2 kann nicht fortfahren, da sie auf den Exclusive Lock auf A wartet, der von T1 gehalten wird.
- Beide Transaktionen blockieren sich gegenseitig und können ohne äußeres Eingreifen nicht fortschreiten.
- Veranschaulichung des Deadlocks:
- Der Deadlock kann durch ein einfaches Diagramm dargestellt werden:
- T1: (S)A → Warte auf (X)B
- T2: (S)B → Warte auf (X)A
- Hier entsteht eine zyklische Abhängigkeit, die zum Deadlock führt.
- Möglichkeiten zur Erkennung und Vermeidung von Deadlocks:
- 1. Deadlock-Erkennungsmethoden:
- Diese Methoden überwachen das System kontinuierlich oder periodisch, um Deadlocks zu erkennen. Zwei häufig verwendete Techniken sind:
- Ressourcenzuweisungsgraph: Ein graphenbasiertes Modell, das jede Transaktion und jede Ressource als Knoten darstellt und jede Sperranfrage oder -zuweisung als Kante modelliert. Ein Deadlock wird durch das Vorhandensein eines Zyklus im Graphen angezeigt.
- Wait-for-Graph (WFG): Dies ist eine vereinfachte Version des Ressourcenzuweisungsgraphen, in der nur wartende Transaktionen und die Transaktionen, die auf sie warten, dargestellt werden. Auch hier weist das Auftreten eines Zyklus auf einen Deadlock hin.
- Vorteil: Präzise und schnell in der Erkennung von Deadlocks.
- Nachteil: Aufwand und Systemressourcen für kontinuierliche Überwachung und Analyse der Graphen.
- 2. Deadlock-Vermeidungsverfahren:
- Diese Verfahren versuchen erst gar nicht, einen Deadlock auftreten zu lassen, indem sie bestimmte Regeln und Protokolle befolgen, wie zum Beispiel:
- Wait-Die und Wound-Wait:
- Wait-Die: Ältere Transaktionen dürfen auf jüngere warten, nicht jedoch umgekehrt. Geht eine ältere Transaktion in den Wartezustand, wartet sie auf die jüngere Transaktion. Wenn jedoch eine jüngere Transaktion auf eine ältere wartet, stirbt die jüngere Transaktion (Abbruch und Neustart).
- Wound-Wait: Ältere Transaktionen zwingen jüngere Transaktionen zum Abbruch (wound), wenn diese auf eine Sperre warten, die von der älteren Transaktion gehalten wird. Jüngere Transaktionen dürfen auf ältere Transaktionen warten.
- Vorteil: Einfache Implementierung und effektive Deadlock-Vermeidung.
- Nachteil: Häufiges Abbrechen und Neustarten von Transaktionen kann zu erhöhtem Ressourcenverbrauch und möglicherweise geringer Systemleistung führen.
- Timestamp-Ordering:
- Jede Transaktion erhält einen eindeutigen Zeitstempel. Operationen werden basierend auf diesen Zeitstempeln geordnet: eine Transaktion darf nur dann Sperren anfordern, wenn dies keine Konflikte mit den Zeitstempeln anderer Transaktionen verursacht. Ältere Transaktionen erhalten Vorrang vor neueren.
- Vorteil: Verhindert, dass Deadlocks überhaupt entstehen, indem Konflikte durch Zeitstempel gelöst werden.
- Nachteil: Das System könnte ineffizient werden, da jüngere Transaktionen häufig zurückgesetzt und neu gestartet werden müssen.
Aufgabe 4)
Du bist Teil eines Entwicklerteams, das dabei ist, eine neue Softwareanwendung mit Scrum als Rahmenwerk zu entwickeln. Während des ersten Sprints hat das Team Schwierigkeiten, die Prozesse richtig zu implementieren. Um sicherzustellen, dass alle Teammitglieder ein klares Verständnis von Scrum haben, sollst Du einige detaillierte Fragen beantworten.
a)
a) Beschreibe die Hauptverantwortlichkeiten jeder der folgenden Rollen in Scrum: Product Owner, Scrum Master und Entwicklerteam. Wie tragen diese Rollen zur Iteration und Inkrement bei?
Lösung:
Um sicherzustellen, dass alle Teammitglieder ein klares Verständnis von Scrum haben, ist es wichtig, die Hauptverantwortlichkeiten jeder Rolle in Scrum zu kennen. Hier sind die Hauptverantwortlichkeiten der drei wesentlichen Rollen: Product Owner, Scrum Master und Entwicklerteam, sowie deren Beitrag zur Iteration und zum Inkrement:
- Product Owner
- **Hauptverantwortlichkeiten:**
- Verantwortlich für die Maximierung des Wertes des Produkts, das aus der Arbeit des Entwicklungsteams resultiert
- Management des Product Backlogs, indem Einträge erstellt, klar beschrieben, priorisiert und für alle verständlich gemacht werden
- Entscheidungen über das Produkt treffen, einschließlich der Festlegung der Anforderungen und deren Reihenfolge
- **Beitrag zur Iteration und zum Inkrement:** Der Product Owner stellt sicher, dass das Team immer an den wertvollsten Aufgaben arbeitet, wodurch jedes Inkrement (Iterationsergebnis) den größtmöglichen Wert für die Stakeholder bringt.
- Scrum Master
- **Hauptverantwortlichkeiten:**
- Dient als Coach für das Scrum-Team und hilft dabei, den Scrum-Prozess richtig zu implementieren
- Entfernt Hindernisse, die das Entwicklungsteam daran hindern könnten, seine Ziele zu erreichen
- Fördert eine produktive Arbeitsumgebung und hält das Team stets im Einklang mit den Scrum-Prinzipien
- **Beitrag zur Iteration und zum Inkrement:** Der Scrum Master stellt sicher, dass das Team effizient arbeitet und sich kontinuierlich verbessert, was zu kontinuierlich besseren Inkrementen führt.
- Entwicklerteam
- **Hauptverantwortlichkeiten:**
- Entwicklung von Produktinkrementen in jedem Sprint
- Selbstorganisierend arbeiten, um die gewünschten Ergebnisse zu erzielen
- Zusammenarbeit im Team, um die Sprint-Ziele zu erreichen
- **Beitrag zur Iteration und zum Inkrement:** Das Entwicklerteam arbeitet im Rahmen der Sprints, um funktionsfähige Produktinkremente zu liefern, die am Ende jeder Iteration präsentiert werden können.
b)
b) Erläutere den Zweck und die Inhalte der Scrum-Artefakte: Product Backlog, Sprint Backlog und Inkrement. Wie stellen sie Transparenz im Projekt sicher?
Lösung:
Um sicherzustellen, dass alle Teammitglieder ein klares Verständnis von Scrum haben, ist es wichtig, die Scrum-Artefakte zu kennen. Diese Artefakte sind entscheidend für die Transparenz und das Verständnis des Fortschritts im Projekt. Hier sind die Erklärungen für die Hauptartefakte in Scrum: Product Backlog, Sprint Backlog und Inkrement, sowie deren Beitrag zur Sicherstellung der Transparenz im Projekt:
- Product Backlog
- **Zweck:** Der Product Backlog ist eine ordnete Liste aller gewünschten Änderungen, Funktionen, Anforderungen, Verbesserungen und Fehlerbehebungen für das Produkt, die dem Produkt den höchsten Wert verleihen können. Er ist dynamisch, d.h., er entwickelt sich ständig weiter, um das Produkt zu verbessern und zu optimieren.
- **Inhalte:** Enthält alle Produktanforderungen, die vom Product Owner erstellt und priorisiert werden. Diese können Features, User Stories, technische Aufgaben und Defekte umfassen.
- **Transparenz:** Der Product Backlog gewährleistet Transparenz, indem er für das gesamte Team und die Stakeholder sichtbar und nachvollziehbar macht, welche Arbeiten noch zu erledigen sind und welche Prioritäten diese haben.
- Sprint Backlog
- **Zweck:** Der Sprint Backlog ist eine Liste der Aufgaben und Anforderungen, die das Entwicklungsteam während eines Sprints umsetzen will. Er wird aus dem Product Backlog abgeleitet und enthält die Elemente, die für den aktuellen Sprint ausgewählt wurden, sowie einen Plan, wie diese umgesetzt werden sollen.
- **Inhalte:** Enthält die ausgewählten Product Backlog-Einträge für den Sprint und detaillierte Aufgaben zur Umsetzung dieser Einträge.
- **Transparenz:** Der Sprint Backlog sorgt für Transparenz, da er es dem Team ermöglicht, den Fortschritt während des Sprints zu verfolgen und sicherzustellen, dass alle Teammitglieder genau wissen, woran gearbeitet wird und wie der aktuelle Stand ist.
- Inkrement
- **Zweck:** Ein Inkrement ist das Ergebnis eines Sprints, das ein fertiger, funktionsfähiger Teil des Produkts ist, der potenziell auslieferbar ist. Jedes Inkrement baut auf den vorherigen Inkrementen auf und erweitert diese.
- **Inhalte:** Umfasst alle fertiggestellten Product Backlog-Einträge für den Sprint, die integriert und getestet wurden, um sicherzustellen, dass sie ein nutzbares Produkt ergeben.
- **Transparenz:** Das Inkrement sorgt für Transparenz, da es den tatsächlichen Fortschritt des Projekts zeigt. Es ist eine greifbare Darstellung der erledigten Arbeit und hilft festzustellen, ob das Team die Sprint-Ziele erreicht hat.
c)
c) Erkläre die Abläufe und primären Ziele der Scrum-Ereignisse: Sprint Planning, Daily Scrum, Sprint Review und Sprint Retrospektive. Wie unterstützen diese Ereignisse die Prinzipien der Überprüfung und Anpassung?
Lösung:
Um sicherzustellen, dass alle Teammitglieder ein klares Verständnis von Scrum haben, ist es wichtig, die Abläufe und Ziele der Scrum-Ereignisse zu kennen. Diese Ereignisse fördern die Prinzipien der Überprüfung und Anpassung und bilden den Rahmen für einen effizienten Entwicklungsprozess. Hier sind die Erklärungen zu den Scrum-Ereignissen: Sprint Planning, Daily Scrum, Sprint Review und Sprint Retrospektive, sowie deren Beitrag zur Unterstützung der Prinzipien der Überprüfung und Anpassung:
- Sprint Planning
- **Ablauf:** Das Sprint Planning markiert den Beginn eines neuen Sprints. Das gesamte Scrum-Team (Product Owner, Entwicklerteam und Scrum Master) kommt zusammen, um die Arbeit für den kommenden Sprint zu planen. Dabei wird besprochen, welche Einträge aus dem Product Backlog in den Sprint aufgenommen werden (Was soll erreicht werden?) und wie diese Einträge umgesetzt werden (Wie wird die Arbeit erledigt?).
- **Primäre Ziele:** Definition des Sprint-Ziels, Auswahl der Product Backlog-Einträge für den Sprint, Erstellung eines Umsetzungsplans.
- **Unterstützung der Überprüfung und Anpassung:** Das Sprint Planning fördert die Überprüfung, indem es eine klare Vorstellung davon gibt, was erreicht werden soll. Es ermöglicht die Anpassung, indem das Team seine Pläne basierend auf den neuesten Erkenntnissen und Änderungen anpasst.
- Daily Scrum
- **Ablauf:** Das Daily Scrum ist ein kurzes (15 Minuten) tägliches Treffen des Entwicklungsteams, bei dem jedes Teammitglied drei Fragen beantwortet: Was habe ich gestern gemacht? Was werde ich heute machen? Gibt es irgendwelche Hindernisse? Der Scrum Master kann teilnehmen, ist aber kein aktiver Teilnehmer.
- **Primäre Ziele:** Austausch von Informationen, Identifikation von Hindernissen, Abstimmung der täglichen Arbeit.
- **Unterstützung der Überprüfung und Anpassung:** Das Daily Scrum ermöglicht dem Team, den Fortschritt täglich zu überprüfen und bei Bedarf Anpassungen vorzunehmen, um sicherzustellen, dass sie auf dem richtigen Weg sind, um die Sprint-Ziele zu erreichen.
- Sprint Review
- **Ablauf:** Am Ende eines jeden Sprints findet das Sprint Review statt, bei dem das entwickelte Inkrement präsentiert und überprüft wird. Das gesamte Scrum-Team und die interessierten Stakeholder nehmen daran teil. Das Team demonstriert, was im Sprint erreicht wurde, und sammelt Feedback, das in die nächsten Sprints einfließen kann.
- **Primäre Ziele:** Überprüfung des Arbeitsergebnisses, Sammeln von Feedback, Anpassung des Product Backlogs.
- **Unterstützung der Überprüfung und Anpassung:** Das Sprint Review ermöglicht die Überprüfung des tatsächlichen Fortschritts und der Ergebnisse. Es fördert die Anpassung durch die Integration von Feedback und die Neupriorisierung der weiteren Arbeiten im Product Backlog.
- Sprint Retrospektive
- **Ablauf:** Die Sprint Retrospektive findet nach dem Sprint Review und vor dem nächsten Sprint Planning statt. Das gesamte Scrum-Team kommt zusammen, um den letzten Sprint zu reflektieren und mögliche Verbesserungen zu identifizieren. Es werden Fragen wie „Was lief gut?“, „Was kann verbessert werden?“ und „Welche Maßnahmen sollen wir ergreifen?“ diskutiert.
- **Primäre Ziele:** Identifikation von Stärken und Schwächen, kontinuierliche Verbesserung der Prozesse und Zusammenarbeit.
- **Unterstützung der Überprüfung und Anpassung:** Die Sprint Retrospektive fördert die Überprüfung der Teamarbeit und Prozesse. Sie ermöglicht die Anpassung, indem konkrete Maßnahmen zur Verbesserung und Optimierung beschlossen und im nächsten Sprint umgesetzt werden.
d)
d) Angenommen, während eines Sprints entdeckt das Entwicklerteam ein kritisches Problem, das die Entwicklung verzögert. Beschreibe, wie das Team dieses Problem im Rahmen von Scrum adressieren sollte, wobei Du auf das Konzept von Transparenz eingehst und erklärst, wie die Ereignisse zur Problemlösung beitragen können.
Lösung:
Um sicherzustellen, dass alle Teammitglieder ein klares Verständnis von Scrum haben und kritische Probleme effektiv lösen können, ist es wichtig, den Umgang mit solchen Problemen im Rahmen von Scrum zu verstehen. Angenommen, das Entwicklerteam entdeckt während eines Sprints ein kritisches Problem, das die Entwicklung verzögert. Hier ist eine Beschreibung, wie das Team dieses Problem adressieren sollte, basierend auf dem Konzept der Transparenz und den Scrum-Ereignissen:
- Transparenz
- **Erste Schritte:** Sobald das kritische Problem entdeckt wird, sollte das Team sofort Transparenz schaffen, indem es das Problem im gesamten Team sowie dem Scrum Master und Product Owner bekannt macht.
- **Dashboard & Tools:** Nutzung von Tools wie einem Scrum Board oder Jira, um das Problem sichtbar zu machen und dessen Status zu verfolgen.
- Daily Scrum
- **Ablauf:** Während des Daily Scrums sollte das kritische Problem angesprochen werden. Im Rahmen der drei Standardfragen („Was habe ich gestern gemacht?“, „Was werde ich heute machen?“, „Gibt es Hindernisse?“) sollte das Problem als Hindernis identifiziert und besprochen werden.
- **Maßnahmen:** Sofortige Diskussion und kurzfristige Planung, um das Problem zu lösen. Das Team kann Aufgaben umverteilen oder Prioritäten ändern, um das Problem anzugehen.
- Ad-hoc Treffen
- **Ablauf:** Falls das Problem gravierend genug ist und nicht innerhalb des Daily Scrums gelöst werden kann, sollte ein Ad-hoc Meeting einberufen werden, bei dem der Scrum Master, Product Owner und relevante Stakeholder teilnehmen, um eine schnelle Lösung zu finden.
- **Maßnahmen:** Gemeinsame Problemanalyse und Erarbeitung eines Lösungsplans. Es wird entschieden, ob zusätzliche Ressourcen benötigt werden oder ob eine temporäre Anpassung des Sprint-Ziels erforderlich ist.
- Sprint Review & Retrospektive
- **Review:** Beim Sprint Review kann das Team das Problem und dessen Auswirkungen auf den Sprintverlauf besprechen und Feedback von den Stakeholdern einholen, wie ähnliche Probleme in Zukunft vermieden werden können.
- **Retrospektive:** Während der Sprint Retrospektive wird das kritische Problem detailliert reflektiert. Das Team analysiert die Ursachen, was gut funktioniert hat und was verbessert werden kann. Ziel ist die kontinuierliche Verbesserung des Prozesses.
- **Maßnahmen:** Entwicklung und Implementierung von Maßnahmen zur Vermeidung ähnlicher Probleme in zukünftigen Sprints. Dazu gehören z.B. Anpassungen im Workflow, zusätzliche Tests oder bessere Kommunikationswege.
Durch den transparenten Umgang mit dem Problem und die Nutzung der Scrum-Ereignisse zur Analyse und Lösung können solche kritischen Probleme effektiv angegangen und zukünftige Vorkommnisse minimiert werden.