embarc logo
embarc logo

Prinzipien für die Umsetzung querschnittlicher Bounded Contexts

Felix Kammerlander Felix Kammerlander
15.02.2024

Lesezeit: 16 Minuten

Querschnittliche Fachlichkeit zentral zur Verfügung zu stellen verspricht Kapazitäten und Kosten zu sparen. Eine zielführende Umsetzung ist allerdings nicht trivial und birgt Tücken. Welche das sind und wie man diese sinnvoll adressiert, erfahrt ihr in diesem Artikel.

Wir greifen in diesem Artikel das fiktive Beispiel einer Film- und Musikplattform „Spotiflix“ aus dem vorhergehenden Blogartikel „Kriterien für die Einführung von querschnittliche Bounded Contexts“ auf.
Für das Verständnis dieses Beitrags genügt es jedoch zu wissen, dass Spotiflix aus dem Zusammenschluss eines Film- und eines Musikanbieters hervorgegangen ist. Auf dieser Plattform können Nutzer:innen Filme und Musik kaufen und abspielen. Die Funktionalität, solche Medien in einen Warenkorb zu legen und die Produkte zu kaufen, soll als querschnittliche Fachlichkeit zentral angeboten werden. Nach dem Zusammenschluss brachten Filme und Musik zunächst jeweils ihren eigenen Warenkorb mit, welche das Entwicklungsteam über eine UI-Integration aus Nutzer:innensicht vereinheitlichte. Die geplante Architektur von Spotiflix ist in Abbildung 1 zu sehen.

Datenhaltung, Schnittstellen und Entwicklung

Der Warenkorb bildet einen eigenen Bounded Context, und damit eine modelltechnische Grenze, der Subdomänen wie Produktkataloge für Filme und Musik, die Bestellübersicht oder den Bezahlvorgang beinhaltet. Wie die Bounded Contexts „Musik-Streaming“ und „Film-Streaming“, kennt dieser Begriffe wie „Film“ oder „Song“. Die konkrete Bedeutung und Modellierung dieser Begriffe unterscheidet sich jedoch von Bounded Context zu Bounded Context. Die Grenzen der Bounded Contexts sind auch die Grenzen der Ubiquituous Language.

Wenn aber beide Bounded Contexts „Film-Streaming“ und „Warenkorb“ den Begriff oder die Entität „Film“ kennen, auch wenn die Modelle dazu unterschiedlich aussehen, stellt sich direkt die Frage, welcher Bounded Context die Hoheit oder Ownership über die „Filme“ besitzt.
Hier gibt es sehr viele Möglichkeiten:
Liegen die Filme beim Film-Streaming und der Warenkorb muss nach den vorhandenen Filmen fragen? Falls ja, was ist mit Attributen, die nur im Warenkorb eine Rolle spielen? So ist ein Film vielleicht noch nicht zu streamen, aber bereits vorbestellbar. Oder ein Film ist nur noch für Nutzer:innen zu streamen, die den Film bereits gekauft hatten; ein weiterer Verkauf ist aber etwa aus rechtlichen Gründen nicht mehr möglich.

Ist es umgekehrt? In diesem Falle müsste der Film-Player die Daten zum Streamen aus dem Warenkorb erhalten. Das klingt seltsam – eine Idee der Zentralisierung des Warenkorbs war schließlich, unterschiedliche Qualitätsziele für das Verkaufen und das Streamen von Filmen besser zu erreichen. Wenn wir die Filme zum Streamen aus dem Warenkorb beziehen, muss dieser doch wieder Qualitätsziele wie Performanz erfüllen, um kein Flaschenhals für das Film-Streaming zu werden.

Werden die Filme zentral gelagert und Warenkorb wie Film-Streaming bedienen sich aus derselben Datenquelle? Welches Team hat dann die Verantwortung über Persistenztechnologie und Datenformat?

Führen beide Bounded Contexts jeweils einen eigenen Datenbestand von Filmen? Wie sorgen wir in diesem Falle dafür, dass die Daten zusammenpassen? Denn schließlich wäre es sehr ärgerlich für die Nutzer:innen, wenn ein eben gekaufter Film dann gar nicht abrufbar wäre, weil der gekaufte Film im Warenkorb und der abspielbare Film im Streaming nicht richtig verknüpft sind. Sämtliche Fragen stellen sich analog für das Medium Musik.

Und weiter ergeben sich viele Fragen für die Weiterentwicklung der verschiedenen Teile, die Pflege von Daten und Schnittstellen: Wie gehen wir mit Abhängigkeiten in Anforderungen um? Wer pflegt Daten ein? Wer definiert Schnittstellen und wie stellt das Team deren Funktionalität und entsprechende Anpassungen, auch qualitativ, über die Zeit hinweg sicher? Wie treffen wir übergreifende Architekturentscheidungen und wie kommunizieren wir sie?

Eine Frage der Abhängigkeiten

Wir stellen schnell fest, dass all diese Fragen und Problematiken in gewisser Weise mit Abhängigkeiten zu tun haben. Es geht stets um den Einfluss, den Entscheidungen und Änderungen in unserem querschnittlichen Bounded Context „Warenkorb“ auf andere Bounded Contexts – oder umgekehrt – haben. Die Frage, welche Herausforderungen ihr meistern müsst, um querschnittliche Fachlichkeit effektiv und effizient zentral bereitzustellen, lässt sich darauf reduzieren, welche Ausprägungen von Abhängigkeiten es gibt und wie ihr sie reduziert.

Gewisse Abhängigkeiten beeinflussen auch andere Abhängigkeiten. So hat etwa die Entscheidung über Datenhoheit oder Persistenztechnologie Einfluss auf Form und Qualitätsanforderungen von Schnittstellen. Zur Veranschaulichung dieser Abhängigkeiten zwischen verschiedenen Bounded Contexts führen wir ein einfaches Modell ein, welches in Abbildung 3 dargestellt wird.

Wir gehen von drei großen Abhängigkeitsbereichen zwischen Bounded Contexts aus:

Wie bereits erwähnt beeinflussen sich die verschiedenen Abhängigkeitsbereiche ebenfalls, was Abbildung 3 durch Überschneidungen der Bereiche darstellt. Mögliche Einflussfaktoren zwischen diesen Bereichen sind:

Das vorgestellte Modell unterstützt Euch wirksam dabei, die für Eurer Projekt relevanten Abhängigkeitsfaktoren zu finden. Beginnt mit dem Abhängigkeitsbereich, der euch am wichtigsten für euer Problem erscheint. Schnell werdet ihr Konsequenzen für andere Bereiche diskutieren und viele Iterationen durchspielen. Es ist allerdings hilfreich, mit einem Abhängigkeitsbereich zu beginnen und nicht sofort die Überschneidungen zu anderen Bereichen zu untersuchen. Gewinnt zunächst für einzelne Facetten ein gewisses Verständnis. Wenn ihr bei der Anwendung weitere Facetten identifiziert, bin ich sehr am Austausch interessiert.

Besondere Risiken für querschnittliche Fachlichkeit

Diese Abhängigkeiten spielen immer eine Rolle, wenn verschiedene Teams unterschiedliche und nicht unabhängige Teile einer Software liefern.
Doch insbesondere bei der Bereitstellung von querschnittlicher Fachlichkeit können diese besonders schwerwiegend und einflussreich sein: Querschnittliche Fachlichkeit wird in der Regel von vielen anderen Bounded Contexts verwendet. Häufig operiert der querschnittliche Context mit eigenen Daten genauso wie mit Daten der Konsumenten, was die Modellierung erschwert und ein unsauberer Schnitt fatale Folgen für alle Bounded Contexts in diesem Konglomerat haben kann. Zum einen sind die Daten der Konsumenten in der Regel unterschiedlich. Zum anderen müsst ihr entscheiden, welche Informationen ihr für den querschnittlichen Context verständlich bereitstellen müsst, welche ihr in einer für die querschnittliche Fachlichkeit nicht relevanten Form liefern könnt und welche überhaupt nicht betrachtet werden. Das Herausarbeiten und Erhalten einer passenden Schnittmenge und einer gemeinsamen Sprache ist hier eine besondere Herausforderung.

Gerade wenn der querschnittliche Context Fachlichkeit bereitstellt, die nicht zu einer Core Subdomain gezählt werden kann oder dieser Technologie verwendet, die sonst noch nirgends verwendet wird, ist der Druck von anderen Bounded Contexts auf diesen tendenziell größer. Das steigert die Gefahr, dass solche Domänen die Domäne des querschnittlichen Contexts kontaminieren und damit das Komplexität und Abhängigkeiten erhöht. Ein typischer Irrtum zeigt sich hier in Entscheidungen, die nach dem Motto „da haben wir ja schon einen Bounded Context, der querschnittliche Fachlichkeit oder Technologie X bereitstellt“ gefällt werden und die Verantwortlichkeit des Contexts verwässern.

Bei Spotiflix stellen die im Bounded Context „Warenkorb“ enthaltenen Teildomänen „Produktkatalog“ und „Bezahlvorgang“ eine Supporting bzw. Generic Subdomain dar. Der Warenkorb bildet keine Funktionalität ab, mit der sich Spotiflix am Markt abhebt. Wenn der Produktkatalog besonders großartig aufgebaut ist, kauft dennoch keiner bei Spotiflix, wenn das Angebot oder die Streaming-Leistung schlecht ist. Der Produktkatalog wird allerdings zweifelsohne benötigt, er lässt sich aber vielleicht nicht als Softwareprodukt von der Stange kaufen und integrieren.
Ebenso sind die Bezahlvorgänge kein Marktdifferenzierungsfaktor. Nutzer:innen erwarten hier eine einfache und sichere Abwicklung über verschiedene Zahlungswege, was jedoch kein Alleinstellungsmerkmal von Spotiflix ist. Das Thema ist komplex, aber von anderen Software-Anbietern, deren Core Domain „Zahlungsvorgänge“ sind, gelöst. Spotiflix kann diese Funktionalität einkaufen.

Damit ist der Warenkorb aber, weil er zum einen zentral, zum anderen nicht das Herzstück des Unternehmens ist, viel eher Opfer von ungestümer Überfrachtung.
Ein Beispiel? Erinnert Ihr euch noch an das Cover Flow Feature, welches etwa in iTunes zwischen 2006 und 2012 verwendet wurde?
In einer Diskussion zwischen Musik-Streaming- und Warenkorb-Team könnte man etwa auf die Idee kommen, dass so etwas im Produktkatalog und im Musik-Streaming eine nette Sache wäre. Wie im Laden vor Ort könnte man so durch die Platten stöbern. Und wenn es dann im Warenkorb gebaut wurde, weil „die eh schon viel Frontend machen“, kann man es später im Streaming von dort übernehmen.
Vielleicht ist das Feature eine wunderbare Idee. Allerdings ist die Gefahr zunächst einmal hoch, dass nun Dinge im Warenkorb Context landen, die etwa für Filme gar nicht verwendet werden sollen.

Der Bounded Context Musik-Streaming beginnt den Warenkorb zu kontaminieren und macht diesen damit komplexer. Das Risiko, andere Konsumenten der Querschnittsfunktionalität nicht zu beachten und dabei zusätzlich den Warenkorb als „Gehilfen“ der „wichtigeren“ Core Domain zu betrachten, ist hier ungleich höher als in anderen Szenarien.

Abhängigkeiten reduzieren

Die Abhängigkeiten im eigenen System zu kennen und Konsequenzen von Entscheidungen zu verstehen ist die wichtigste Aufgabe, um querschnittliche Fachlichkeit effizient zur Verfügung zu stellen. Danach geht es in die Lösungsfindung, bei welcher ihr versucht, die schwerwiegenden und problematischen Abhängigkeiten aufzulösen oder zu reduzieren. An dieser Stelle diskutieren wir einige allgemeine Hinweise und Prinzipien dazu. Abbildung 5 visualisiert diese Prinzipien passend zu den in Abbildung 3 identifizierten Abhängigkeitsbereichen und den konkreten Abhängigkeiten.

Auch für die Überschneidungen der Abhängigkeitsbereiche lassen sich ein paar allgemeine Hinweise und Prinzipien finden:

Fazit

Welche Wege und Prinzipien in einer konkreten Situation Verwendung finden können und sollen, lässt sich nur anhand eben dieser Situation entscheiden. Die Frage, für welche Herausforderungen man Wege und Prinzipien finden sollte, lässt sich durch die Untersuchung der Abhängigkeitsbereiche beantworten. Ein einfaches Modell (vgl. Abbildung 3) kann hier helfen, die Diskussion zu starten und einige häufig auftretenden Fallstricke nicht zu übersehen. Ebenso helfen allgemeine Prinzipien (vgl. Abbildung 5) typische Abhängigkeiten anzugehen.
Am Ende solltet ihr bei sehr großen Herausforderungen und Schwierigkeiten, diese elegant zu lösen, auch nicht davor zurückschrecken, die Frage erneut aufzuwerfen, ob ein querschnittlicher Bounded Context die richtige Entscheidung ist.