Wie wir zu Entscheidungsgrundlagen finden

Jedes große (Software-)Projekt beinhaltet unzählige Entscheidungen, die getroffen werden müssen. Auf welchen Fundamenten aber könnten diese stehen und gibt es solche Grundlagen überhaupt? Dieser Artikel will einige Denkanstöße in diese Richtung geben.

Various berries in boxes combined to a grid.
Photo by Will / Unsplash

Jede und jeder kennt die Situation: das Vorhaben ist groß, die Aufgaben sind zusammenhängend und jede zu treffende Entscheidung wird das Resultat wie auch alle weiteren Handlungsmöglichkeiten beeinflussen (nämlich spezifizieren und beschränken).

Natürlich können wir uns zuallererst die Frage stellen, ob wir überhaupt systematisch und auf rationaler Grundlage Entscheidungen treffen wollen, oder aber ausschließlich aus Erfahrungen, kreativen (künstlerischen?) Denkprozessen oder aus Gewohnheiten heraus schöpfen wollen. Wenn wir uns für Ersteres entscheiden (sic!), bedarf es bei jeder Entscheidung auch einer (logisch nachvollziehbaren) Begründung.

Wir tun das und stehen nun also, bereit zur Tat in einem neuen Projekt, vor zwei wesentlichen Herausforderungen:

  1. der Herausforderung der Komplexität, also Verwobenheit der einzelnen Schritte und Ziele untereinander
  2. der Herausforderung der Unsicherheit, also unvollständigen Information und Zufälligkeiten

Die zweite Frage ist nun, ob es universell gültige Grundlagen gibt, welche die Entscheidungsfindung auf dem Weg zu konkreteren und fortlaufend mehr gesicherten Ergebnissen erleichtern können. Wie könnten wir diese Grundlagen ausfindig machen?

Wir könnten (uns und anderen) folgende Fragen stellen:

  1. Was müssen wir unabhängig von der Ausgestaltung unserer Systeme uneingeschränkt beibehalten? Darunter fallen unter anderem rechtliche Rahmenbedingungen, Compliance-Richtlinien, Codes of Conduct innerhalb einer Branche oder Organisation, ethische Grenzen.
  2. Was sind für die zu erwartende Gruppe von Nutzerinnen und Nutzern Must Haves, was Ausschlusskriterien? Beispielsweise hinsichtlich Barrierefreiheit, UX/CX, Kompatibilität, Verfügbarkeit, usw.
  3. Was darf unter keinen Umständen passieren? Globale Constraints und SAT Solvers (Abb. 1) helfen uns dabei, Worst-Case-Szenarien zu verhindern, indem wir (möglichst automatisiert) das System / den Systementwurf auf Korrektheit überprüfen.
  4. Gibt es Invariante, die universell in unserem System verankert werden können? Auf Design-Ebene könnte es sich dabei um Konzepte und Muster handeln, auf architektonischer Ebene um technologische Komponenten und Implementierungen (Frameworks, Libraries, APIs, Standards, usw.), auf Ebene der Systemeigenschaften um Immutables, auf relationaler Ebene um statische Beziehungen zueinander.
SAT solver - Wikipedia

Abb. 1: SAT solver (Wikipedia)

Wenn wir für jede Entscheidung eine Verifizierung durchführen und diese während Entwicklung, Umsetzung und Betrieb auch einer laufenden Validierung unterziehen, tragen wir bereits zu einer deutlichen Stabilisierung unserer Systeme bei.

Es gibt mit Design Rationale (Abb. 2) eine Methodik, welche die systematische Arbeit mit begründeten Entscheidungen erleichtert und diese über lange Zeiträume hinweg transparent hält, was offensichtlich insbesondere beim regelmäßigen Wechsel von Teams, Strategien, Technologien und Verantwortlichkeiten von essentieller Bedeutung ist.

Design rationale - Wikipedia

Abb 2: Design Rationale (Wikipedia)

Abschließend sei gesagt, dass selbstverständlich jedes Unterfangen immer eine ordentliche Portion an Pragmatismus benötigt. Dass aber dieser niemals auf Kosten der entscheidenden Erfolgskriterien ausgespielt werden darf, ist so klar wie auch schwierig zu erlangen.

Neben dem benötigten Handwerkszeug sind daher Sorgfalt, Offenheit und Aufmerksamkeit von großer Bedeutung – und allem voran ein großer gemeinsamer Einsatz für das zu verwirklichende Projekt.