Software Product Mastering / Das unsichtbare Biest / Das "Was" und das "Wie" / Stacey Matrix
Cynefin-Modell in der Softwareentwicklung¶
Quelle: https://en.wikipedia.org/wiki/Dave_Snowden (9.11.2024)
Das Cynefin-Modell (ausgesprochen: kuh-NEV-in) ist ein Framework, das ursprünglich vom walisischen Forscher Dave Snowden entwickelt wurde und hilft, verschiedene Arten von Problemen zu kategorisieren und darauf aufbauend die geeigneten Entscheidungsstrategien und Handlungsweisen zu wählen. Im Kontext der Softwareentwicklung bietet das Modell einen nützlichen Rahmen, um komplexe Entscheidungen zu treffen und geeignete Methoden zur Problemlösung und Projektsteuerung zu wählen.
Cynefin ist ein walisisches Wort, das üblicherweise im Deutschen mit 'Lebensraum' oder 'Platz' übersetzt wird, obwohl diese Übersetzung nicht seine volle Bedeutung vermitteln kann. Eine vollständige Übersetzung des Wortes würde aussagen, dass wir alle mehrere Vergangenheiten haben, derer wir nur teilweise bewusst sein können: kulturelle, religiöse, geographische, stammesgeschichtliche usw.

Einfach (Obvious)
- Merkmale: Ursache-Wirkung klar, Best Practices vorhanden
- Vorgehen: „Erkennen – Kategorisieren – Reagieren“
- Beispiele: Wartungsaufgaben, Einhaltung von Coding-Standards
Kompliziert (Complicated)
- Merkmale: Ursache-Wirkung nicht sofort klar, Fachwissen erforderlich
- Vorgehen: „Erkennen – Analysieren – Reagieren“
- Beispiele: Architekturdesign, Performance-Optimierung
Komplex (Complex)
- Merkmale: Ursache-Wirkung retrospektiv erkennbar, Experimentation notwendig
- Vorgehen: „Probieren – Erkennen – Reagieren“
- Beispiele: Entwicklung neuer Features, Prototypen-Tests
Chaotisch (Chaotic)
- Merkmale: Keine klare Ursache-Wirkung, schnelle Reaktion erforderlich
- Vorgehen: „Handeln – Erkennen – Reagieren“
- Beispiele: Notfall-Bugfixes, Sicherheitsverletzungen
Unordentlich (Disorder)
- Merkmale: Kategorie unklar, Diagnosephase nötig
- Beispiele: Unklare Anfangsphase von Projekten
Nutzen im Projektmanagement
- Methodenanpassung: Wahl passender Methoden für die jeweilige Kategorie
- Risiko-Management: Kategorisierung zur besseren Risikoeinschätzung
- Agilität: Iterative Methoden im komplexen Bereich
Nochmal zum Nachlesen...
Das Modell unterscheidet fünf Bereiche, die durch die Natur und das Verständnis der Probleme und Systeme geprägt sind:
Einfach (Obvious):
- Probleme in diesem Bereich sind klar und einfach zu verstehen. Ursache und Wirkung sind offensichtlich und die Lösung kann auf bewährte Best Practices zurückgreifen. In der Softwareentwicklung betrifft dies oft routinemäßige Aufgaben, wie das Debuggen von gut bekannten Fehlern, die Standardimplementierung von bewährten Mustern oder das Anwenden von Coding-Standards.
- Vorgehensweise: „Sense – Categorize – Respond“ (Erkennen – Kategorisieren – Reagieren).
- Beispiele: Standardisierte Wartungsaufgaben, Einhaltung von Coding-Guidelines und Durchführung von klar definierten Testfällen.
Kompliziert (Complicated):
- Hier sind die Beziehungen zwischen Ursache und Wirkung zwar nicht sofort offensichtlich, aber durch Analyse herauszufinden. Für diese Art von Problemen ist Fachwissen erforderlich. Softwarearchitektur-Design, die Optimierung von Algorithmen oder das Einführen neuer Frameworks fallen oft in diesen Bereich, da Expertise und Erfahrung erforderlich sind.
- Vorgehensweise: „Sense – Analyze – Respond“ (Erkennen – Analysieren – Reagieren).
- Beispiele: Design-Entscheidungen zur Skalierbarkeit oder Performance-Optimierung, Auswahl eines geeigneten Technologie-Stacks, Einführung neuer Frameworks.
Komplex (Complex):
- In diesem Bereich ist Ursache und Wirkung erst im Nachhinein (retrospektiv) erkennbar. In der Softwareentwicklung trifft dies oft auf die Implementierung neuer, innovativer Features zu, die zuvor in dieser Form noch nicht umgesetzt wurden. Iterative Ansätze wie agile Methoden oder Scrum eignen sich gut für komplexe Umgebungen, da sie durch kurze Iterationen und regelmäßige Rückmeldungen helfen, auf Veränderungen zu reagieren und den Entwicklungsprozess anzupassen.
- Vorgehensweise: „Probe – Sense – Respond“ (Probieren – Erkennen – Reagieren).
- Beispiele: Entwicklung neuartiger Features, das Testen von Prototypen oder Proof of Concepts, Umstellungen auf neue Softwarearchitekturen.
Chaotisch (Chaotic):
- In chaotischen Situationen gibt es keine Beziehung zwischen Ursache und Wirkung. Hier steht das Problem oft plötzlich und unvorhergesehen auf der Agenda, etwa bei Krisen oder akuten Zwischenfällen. In der Softwareentwicklung tritt dieser Zustand bei schwerwiegenden Bugs in Produktivsystemen auf, die schnelles Eingreifen und unmittelbare Lösungsansätze erfordern.
- Vorgehensweise: „Act – Sense – Respond“ (Handeln – Erkennen – Reagieren).
- Beispiele: Notfall-Reparaturen, schnelle Bugfixes, Reaktionen auf Sicherheitsverletzungen.
Unordentlich (Aporetisch/Disorder):
- Diese Kategorie beschreibt einen Zustand, in dem unklar ist, welche der vier vorherigen Kategorien zutrifft. Es handelt sich um eine Zwischenzone, in der das Problem noch nicht vollständig verstanden wird. Hier wird oft eine Diagnosephase benötigt, um festzustellen, in welche Kategorie das Problem tatsächlich gehört.
- Beispiele: Anfangsphasen von Projekten oder Anforderungen, bei denen nicht klar ist, wie der Umfang oder die genaue Problemstellung aussieht.
Anwendung des Cynefin-Modells in der Softwareentwicklung¶
In der Praxis kann das Cynefin-Modell Softwareentwicklungsteams helfen, Situationen und Herausforderungen besser einzuordnen und darauf basierend die beste Handlungsweise auszuwählen:
Team-Zusammensetzung und Entscheidungsfindung: Die Bereiche des Cynefin-Modells bieten Orientierung für die Auswahl von Methoden und Ressourcen. In komplexen Bereichen eignen sich beispielsweise interdisziplinäre Teams und agile Methoden, während in einfachen und komplizierten Bereichen ein erfahrener Experte für klare, analytische Entscheidungen geeignet ist.
Methodenanpassung: Projekte können in verschiedenen Phasen in unterschiedliche Kategorien fallen. Ein neues, unerprobtes Feature kann komplex beginnen und wird möglicherweise nach mehreren Iterationen und Tests zu einer komplizierten oder einfachen Aufgabe. Das Modell hilft dabei, den Entwicklungsansatz dynamisch an den Bereich anzupassen, in dem sich das Team befindet.
Risiko-Management und Planung: Durch das frühzeitige Erkennen, in welcher Kategorie sich eine Aufgabe oder ein Problem befindet, können Risiken im Projektmanagement besser eingeordnet werden. Chaotische oder komplexe Bereiche erfordern beispielsweise andere Planungs- und Risikomanagement-Strategien als einfache oder komplizierte Aufgaben.
Agilität und Experimentation: Im Bereich der komplexen Probleme zeigt das Modell, warum Experimente und Feedback-Schleifen entscheidend sind. Teams sollten iterativ vorgehen und die Möglichkeit zur Anpassung bewahren, um die besten Lösungen für unklare Probleme zu finden.
Insgesamt ist das Cynefin-Modell ein mächtiges Werkzeug in der Softwareentwicklung, das Entscheidungsträgern dabei hilft, Probleme zu strukturieren und systematisch zu lösen.
Cynefin-Modell spielerisch kennenlernen¶
Eine spielerische Möglichkeit zur Erkundung des Cynefin-Modells könnte eine interaktive Zuordnungsaufgabe sein, bei der der Benutzer Beispiele zu den richtigen Kategorien des Modells zuordnen muss. Nach der Zuordnung kann das Programm die Eingaben des Benutzers überprüfen und Feedback geben.
Hier ein Beispiel:
import ipywidgets as widgets
from IPython.display import display, clear_output
# Beschreibungen für jedes Cynefin-Feld
questions = {
"Erfordert tiefere Analyse, wie etwa das Design einer neuen Softwarearchitektur.": "Kompliziert",
"Unklare Anforderungen, bei denen der Bereich noch nicht identifiziert ist.": "Unordentlich",
"Die Entwicklung neuartiger Features, die regelmäßige Feedback-Schleifen erfordern.": "Komplex",
"Ein Beispiel für Routineaufgaben, wie das Debuggen einfacher Fehler.": "Einfach",
"Notfall-Bugfixes oder Sicherheitsverletzungen, die sofortiges Eingreifen benötigen.": "Chaotisch"
}
# Dropdown-Menüs für die Antworten ohne descriptions, stattdessen mit Labels
options = ["Einfach", "Kompliziert", "Komplex", "Chaotisch", "Unordentlich"]
dropdowns = {question: widgets.Dropdown(options=options, layout=widgets.Layout(width='50%')) for question in questions}
# Überprüfungsfunktion
def check_answers(b):
clear_output()
score = 0
total = len(questions)
for question, dropdown in dropdowns.items():
answer = dropdown.value
if answer == questions[question]:
score += 1
print(f"Korrekt: {question}")
else:
print(f"Falsch: {question} (Ihre Antwort: {answer}, Richtig: {questions[question]})")
print(f"\nIhr Ergebnis: {score}/{total} richtig.")
# Button zum Überprüfen der Antworten
check_button = widgets.Button(description="Überprüfen")
check_button.on_click(check_answers)
# Anzeige der Labels, Dropdowns und des Buttons
for question, dropdown in dropdowns.items():
display(widgets.Label(value=question)) # Frage als Label
display(dropdown) # Dropdown-Menü darunter
display(check_button)
Korrekt: Erfordert tiefere Analyse, wie etwa das Design einer neuen Softwarearchitektur. Korrekt: Unklare Anforderungen, bei denen der Bereich noch nicht identifiziert ist. Korrekt: Die Entwicklung neuartiger Features, die regelmäßige Feedback-Schleifen erfordern. Korrekt: Ein Beispiel für Routineaufgaben, wie das Debuggen einfacher Fehler. Korrekt: Notfall-Bugfixes oder Sicherheitsverletzungen, die sofortiges Eingreifen benötigen. Ihr Ergebnis: 5/5 richtig.