Qgelm

Software fachlich modellieren: CRUD war gestern | heise online

Originalartikel

Backup

<html> <div class=„article-layoutheader-container“> <header class=„&#10; a-article-header&#10; &#10; &#10; &#10;“><h1 class=„&#10; a-article-headertitle&#10; &#10;“ dir=„ltr“>Software fachlich modellieren: CRUD war gestern </h1> <p class=„a-article-headerlead“ dir=„ltr“> Wer Software entwickelt, muss die zugrunde liegende Fachlichkeit verstehen. Dabei hilft eine geeignete Modellierung der Fachdom&#228;ne. </p> <a-lightbox class=„article-image“ tabindex=„1“ src=„/imgs/18/4/8/0/6/5/2/3/shutterstock_1061212223-db24247d1b405449.jpeg“ modal-id=„a-8421“><figure><div class=„article-imagegallery-container“> <img src=„https://heise.cloudimg.io/width/610/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/4/8/0/6/5/2/3/shutterstock_1061212223-db24247d1b405449.jpeg“ srcset=„https://heise.cloudimg.io/width/336/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/8/0/6/5/2/3/shutterstock_1061212223-db24247d1b405449.jpeg 336w, https://heise.cloudimg.io/width/1008/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/8/0/6/5/2/3/shutterstock_1061212223-db24247d1b405449.jpeg 1008w, https://heise.cloudimg.io/width/610/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/8/0/6/5/2/3/shutterstock_1061212223-db24247d1b405449.jpeg 610w, https://heise.cloudimg.io/width/1220/q70.png-lossy-70.webp-lossy-70.foil1/_www-heise-de_/imgs/18/4/8/0/6/5/2/3/shutterstock_1061212223-db24247d1b405449.jpeg 1220w&#10;“ sizes=„(max-width: 991px) 95vw,610px“ alt=„“ width=„610“ height=„342“ class=„legacy-img“ referrerpolicy=„no-referrer“ /></div> <figcaption class=„a-caption“> (Bild:&#160;tomertu/Shutterstock.com) </figcaption></figure><section class=„heise-modal“><div class=„stage“></div></section></a-lightbox><div class=„a-article-headerpublish-info“> <div class=„a-publish-info“> <div class=„a-publish-inforead-time“> Lesezeit: 20&#160;Min. </div> <div class=„a-publish-infobranding“> <a href=„https://www.heise.de/developer/“> <div class=„a-article-branding a-article-branding–with-hover“ title=„Ein Beitrag von: Developer“> Developer </div> </a> </div> </div> <div class=„creator“> Von <ul class=„creatornames“><li class=„creatorname“>Golo Roden</li> </ul></div> </div></header><aside class=„article-layoutheader-wrbng“><div> <div id=„HEI_D_Incontent-1-label“ class=„ad-label“>Anzeige</div> <div id=„HEI_D_Incontent-1“ data-size=„300×250,300×600,300×3,fluid“ class=„ad ad–sticky“> </div> </div></aside></div><div class=„article-layoutcontent-container“> <div class=„article-layoutcontent“ dir=„ltr“> <div class=„article-content js-upscore-article-content-for-paywall“> <p>75 Prozent aller Softwareprojekte scheitern! Dazu habe ich im vergangenen Oktober bereits <a href=„https://www.heise.de/blog/75-Prozent-aller-Softwareprojekt-scheitern-was-tun-9979648.html“>einen Beitrag geschrieben</a>. Darin habe ich auch ein essenzielles und grundlegendes Problem angesprochen: Viele Softwareprojekte scheitern n&#228;mlich nicht an der Technik, sondern viel eher an einem fehlenden Verst&#228;ndnis der zugrunde liegenden Fachlichkeit. Denn es kommt &#228;u&#223;erst selten vor, dass Entwicklerinnen und Entwickler sowie Fachexpertinnen und Fachexperten die gleiche Sprache sprechen. Allerdings ist damit nicht eine nat&#252;rliche Sprache wie Deutsch, Englisch oder Franz&#246;sisch gemeint, sondern vielmehr das Fehlen einer gemeinsamen Fachsprache (und letztlich eines gemeinsamen Verst&#228;ndnisses, worum es bei der zu entwickelnden Software inhaltlich &#252;berhaupt geht).</p> <div class=„ad-label“ id=„HEI_M_Incontent-1-label“>Anzeige</div> <a-paternoster class=„a-paternoster-ad“ height=„360“ media=„(min-width: 320px) and (max-width: 767px)“><div class=„a-paternoster-clip“><div class=„a-paternoster-centered a-paternoster-container“><div> <div class=„“ id=„HEI_M_Incontent-1“> </div></div></div></div></a-paternoster><p>Dass dies zu impliziten Annahmen, zu Missverst&#228;ndnissen und zu fehlerhaften Interpretationen f&#252;hrt, haben wir in dem erw&#228;hnten Video ausf&#252;hrlich erl&#228;utert. Das bedeutet letztlich nichts anderes, als dass Entwicklerinnen und Entwickler eine Software immer so bauen, wie <em>sie</em> diese verstehen &#8211; und nicht unbedingt so, wie das Business die Software ben&#246;tigt. Folglich stellt sich die Frage, was man dagegen unternehmen kann: Eine m&#246;gliche Antwort ist eine wirklich gute Modellierung der Fachlichkeit. Wie eine solche Modellierung entwickelt wird, das erl&#228;utere ich Ihnen heute in diesem Blogpost.</p><h3 class=„subheading“ id=„nav_sprache_als0“>Sprache als Ursache des Problems</h3><p>Als allererstes sollte man zun&#228;chst verstehen, wo das Problem der fehlenden gemeinsamen Sprache und des fehlenden gemeinsamen Verst&#228;ndnisses &#252;berhaupt herkommt. Denn eigentlich sollte man meinen, dass es nicht so &#252;berm&#228;&#223;ig schwierig sein kann, miteinander zu sprechen. Das Problem ist jedoch, dass hier unterschiedliche Welten aufeinandertreffen, die beide nie gelernt haben, mit der jeweils anderen Disziplin zu kommunizieren:</p><ul class=„rtelist rtelist–unordered“><li>Fachexpertinnen und Fachexperten sind die sehr technologieorientierte Sprache aus der Entwicklung nicht gewohnt und verstehen sie daher nicht.</li><li>Entwicklerinnen und Entwickler wiederum sind die Fachsprache nicht gewohnt und begreifen sie deshalb ebenfalls nicht, zumal sie die dahinterliegenden Gesch&#228;ftsprozesse in der Regel nicht im Detail kennen.</li></ul><p>Das Problem lautet jedoch: Wie entwickeln Sie eine Software, die ein fachliches Problem l&#246;sen soll, wenn das fachliche Problem gar nicht verstanden wurde? Ganz einfach: Das funktioniert nicht.</p><h3 class=„subheading“ id=„nav_programmiersprac1“>Programmiersprache X oder Framework Y?</h3> <div class=„ad-mobile-group-1“> <div class=„ad-label“ id=„HEI_M_Incontent-3-label“>Anzeige</div> <div class=„ad ad–sticky“ id=„HEI_M_Incontent-3“> </div><p>Das Erschreckende ist jedoch, dass zu viele Teams und Unternehmen dies einfach ignorieren oder, was ich pers&#246;nlich noch viel schlimmer finde, dass ihnen diese Diskrepanz nicht einmal bewusst ist. Da wird dann wochen- oder monatelang diskutiert, ob man Programmiersprache X oder doch lieber Framework Y einsetzen sollte, aber niemand kommt auf den Gedanken, sich einmal gezielt mit der Fachlichkeit auseinanderzusetzen.</p> <p>Dann wird irgendwann drauflos entwickelt, und das geht ein paar Monate oder vielleicht auch ein oder zwei Jahre gut, aber schlie&#223;lich erkennt man &#252;ber kurz oder lang, dass die Software nicht genau das tut, was urspr&#252;nglich einmal gew&#252;nscht war. Und dann muss nachgebessert werden: Alles dauert auf einmal l&#228;nger, alles wird teurer, und selbstverst&#228;ndlich ist das Fundament (weil falsche Annahmen getroffen wurden) in eine v&#246;llig unpassende Richtung entwickelt worden, sodass die Anpassungen jetzt nur sehr umst&#228;ndlich und damit auch wieder &#228;u&#223;erst kostspielig m&#246;glich sind.</p><p>Mit hoher Wahrscheinlichkeit kommt dann jemand um die Ecke und behauptet:</p><p class=„indent rteabs–indent“><em>„Ich hab&#8217;s Euch ja von vornherein gesagt: H&#228;tten wir nicht auf Technologie X, sondern auf Technologie Y gesetzt, dann h&#228;tten wir das Problem jetzt nicht!“</em></p><p>Der Punkt ist jedoch: Das Problem w&#228;re genauso vorhanden, nur auf einer anderen technologischen Basis. Denn das ist der springende Punkt: In den seltensten F&#228;llen ist die Technologie an sich das Problem (womit ich nicht sagen m&#246;chte, dass es nicht bessere und schlechtere Technologieentscheidungen g&#228;be, in der Regel wird nur der Einfluss der Technologiewahl auf den Erfolg eines Projekts massiv &#252;bersch&#228;tzt).</p><h3 class=„subheading“ id=„nav_crud_als2“>CRUD als Ausgangsbasis</h3><p>Das bedeutet: Wenn Sie sicherstellen m&#246;chten, dass Sie eine zum zugrunde liegenden fachlichen Problem passende Software entwickeln, und das sogar noch zielgerichtet, funktioniert es letztlich nur, wenn Sie von Anfang an verstehen, worum es aus fachlicher Sicht &#252;berhaupt geht. Das mag trivial erscheinen &#8211; die Praxis sieht leider allzu oft anders aus.</p><p>Oft steht uns Entwicklerinnen und Entwicklern n&#228;mlich etwas im Weg, das wir leider von klein auf beigebracht bekommen haben: Das Denken in Datenbanktabellen. Wir alle haben in unserer Ausbildung oder in unserem Studium gelernt, Daten in relationalen Strukturen abzulegen. Um mit diesen Strukturen zu arbeiten, kennen wir vier Verben, n&#228;mlich <em>Create</em>, <em>Read</em>, <em>Update</em> und <em>Delete</em>, h&#228;ufig abgek&#252;rzt als <em>CRUD</em>. Wir haben gelernt, dass wir damit de facto alles modellieren k&#246;nnen, und aus technischer Sicht ist das auch durchaus korrekt.</p><h3 class=„subheading“ id=„nav_doch_was_ist3“>Doch was ist mit der Fachsprache?</h3><p>Aber das &#228;ndert selbstverst&#228;ndlich nichts daran, dass es sich bei diesen W&#246;rtern um die Fachsprache der Datenbank handelt. <em>Create</em>, <em>Read</em>, <em>Update</em> und <em>Delete</em> sind n&#228;mlich rein technische Begriffe, die von Datenbanken genutzt werden. Da wir h&#228;ufig mit Code zu tun haben, der auf Datenbanken zugreift, sind wir dazu &#252;bergegangen, diese vier Verben auch in unserem Code zu verwenden: So entstehen dann Funktionen mit Namen wie beispielsweise <code>UpdateBook</code>.</p><p>Aus technischer Sicht mag das sogar durchaus passend sein, wenn diese Funktion den Datensatz f&#252;r ein Buch in der Datenbank aktualisiert. Das Problem besteht jedoch darin, dass dies nicht den <em>fachlichen</em> Use Case widerspiegelt. Denn <em>warum</em> wird das Buch beziehungsweise dessen Datensatz aktualisiert? Diese Information liefert der Funktionsname leider nicht. Das Problem ist au&#223;erdem, dass sich hinter diesem <em>Update</em> alles M&#246;gliche verbergen kann. Ich bin mir sicher, dass wenn Sie an dieser Stelle kurz innehalten und sich &#252;berlegen, wie viele Gr&#252;nde Ihnen spontan einfallen, warum man ein Buch aktualisieren k&#246;nnen sollte, Sie keine Schwierigkeit haben, rasch auf zehn oder zwanzig unterschiedliche Gr&#252;nde zu kommen.</p><p>Ich bin mir au&#223;erdem sicher, dass Sie &#8211; je nachdem, f&#252;r welche Fachlichkeit Sie sich entscheiden &#8211; die Anwendung durchaus unterschiedlich entwickeln w&#252;rden: Ein System zum Verwalten der ausgeliehenen B&#252;cher in einer Bibliothek unterscheidet sich klar von einem System f&#252;r einen gro&#223;en Onlineshop, und beide sind wiederum etwas ganz anderes als ein System, das Autorinnen und Autoren beim Schreiben von Romanen unterst&#252;tzen soll.</p><p>In allen drei F&#228;llen kann es notwendig sein, ein Buch fr&#252;her oder sp&#228;ter zu aktualisieren, doch der gesamte Workflow darum ist jeweils ein v&#246;llig anderer, und abh&#228;ngig davon w&#252;rden vermutlich einige Dinge auch unterschiedlich gehandhabt. Ohne vertiefte Kenntnisse des umgebenden Prozesses ist es daher schwierig, Code zu schreiben, der das Richtige tut, und es greift zu kurz, einfach nur <code>UpdateBook</code> umzusetzen.</p><h3 class=„subheading“ id=„nav_crud_ist_ein4“>CRUD ist ein Antipattern</h3><p>Langer Rede, kurzer Sinn: Wenn wir ohne die Prozesse zu kennen den Code f&#252;r die Anwendung nicht ad&#228;quat und zielgerichtet schreiben k&#246;nnen, sollten wir dann nicht vielleicht versuchen, diese Prozesse zun&#228;chst besser zu verstehen? Zu verstehen, worum es bei der gesamten Thematik &#252;berhaupt geht? Wer etwas macht? Was diese Person macht? Warum sie das macht? Wann und wie oft sie es macht? Welchen Zweck das Ganze hat? Welche Konsequenzen es nach sich zieht? Und so weiter.</p><p>Falls Sie jetzt denken:</p><p class=„indent rteabs–indent“><em>„Stimmt, das w&#228;re sinnvoll!“</em></p><p>Dann m&#252;ssten wir als N&#228;chstes &#252;berlegen, wie man Prozesse angemessen beschreiben kann. Eines kann ich Ihnen schon vorab verraten: Die Begriffe <em>Create</em>, <em>Read</em>, <em>Update</em> und <em>Delete</em> sind dabei ziemlich fehl am Platz. Tats&#228;chlich ist die Denkweise in diesen vier Verben <a href=„https://www.youtube.com/watch?v=MoWynuslbBY“ rel=„external noopener“ target=„_blank“>sogar ein Antipattern</a>.</p><p>Doch wenn wir CRUD nicht verwenden k&#246;nnen, um fachliche Prozesse zu beschreiben, was machen wir dann stattdessen? Ben&#246;tigt wird daf&#252;r eine Methode, um Gesch&#228;ftsprozesse als das darzustellen, was sie wirklich sind &#8211; n&#228;mlich eine Abfolge von Ereignissen. Stellen Sie sich vor, Sie kommen abends nach Hause und Ihre Partnerin oder Ihr Partner fragt, wie Ihr Tag war, woraufhin Sie erz&#228;hlen, dass zuerst dieses und dann jenes geschehen sei. Sie berichten von Ereignissen, die Sie im Laufe des Tages erlebt haben &#8211; und genau das geschieht auch in einem Gesch&#228;ftsprozess.</p><h3 class=„subheading“ id=„nav_eine5“>Eine Stadtbibliothek</h3><p>Nehmen wir als Beispiel die vorhin bereits kurz erw&#228;hnte Bibliothek. Wir k&#246;nnen &#252;berlegen, welche Prozesse dort &#252;berhaupt auftreten: Welche Aktionen finden aus fachlicher Sicht in einer Bibliothek statt?</p><p>Man erkennt rasch, dass einer der wichtigsten Vorg&#228;nge darin besteht, dorthin zu gehen, um ein Buch zu leihen. Geliehene B&#252;cher m&#252;ssen &#252;ber kurz oder lang nat&#252;rlich auch wieder zur&#252;ckgegeben werden, doch die Ausleihe kann verl&#228;ngert werden, sofern niemand anderes das Buch vorbestellt hat. Wer zu sp&#228;t mit der R&#252;ckgabe ist, muss m&#246;glicherweise eine Strafe zahlen, und die Bibliothek nimmt regelm&#228;&#223;ig neue B&#252;cher in den Bestand auf und entfernt alte, die nicht mehr in gutem Zustand sind.</p><p>Hier bemerken Sie bereits, wie reichhaltig die Sprache an dieser Stelle ist und wie viele Verben wir dabei verwenden: <em>Ausleihen</em>, <em>zur&#252;ckgeben</em>, <em>verl&#228;ngern</em>, <em>vorbestellen</em>, <em>bezahlen</em>, <em>aufnehmen</em>, <em>entfernen</em> und so weiter.</p><h3 class=„subheading“ id=„nav_fachlichkeit_im6“>Fachlichkeit im Code abbilden</h3><p>Vielleicht denken Sie jetzt, es sei doch logisch, auf diese Weise dar&#252;ber zu sprechen, und im Grunde stimmt das auch. Doch warum findet man dann im Code h&#246;chstwahrscheinlich nur eine technisch benannte Funktion (n&#228;mlich <code>UpdateBook</code>) und nicht fachlich benannte Funktionen, etwa <code>BorrowBook</code>, <code>RenewBook</code> und <code>ReturnBook</code>?</p><p>Das ist eine berechtigte Frage, denn h&#228;tten wir diese Funktionen, k&#246;nnten sie intern selbstverst&#228;ndlich immer noch ein <em>Update</em> oder eine andere Datenbankoperation ausf&#252;hren, doch unser Code w&#252;rde pl&#246;tzlich eine fachliche Geschichte erz&#228;hlen. Es w&#228;re sehr viel einfacher, im Gespr&#228;ch mit einer Fachexpertin oder einem Fachexperten nachzuvollziehen, was gemeint ist, weil sich die verwendeten Begriffe auch im Code wiederfinden w&#252;rden.</p><p>Und das m&#246;glicherweise nicht nur im Code, sondern sogar auch in der API und in der UI. Wie viel besser k&#246;nnte ein System gestaltet sein, wenn es auf diesen Begriffen basieren w&#252;rde, anstatt stets nur von <code>UpdateBook</code> zu sprechen? Wie viel besser k&#246;nnte eine UI sein? Wie viel effektiver k&#246;nnte man Anwenderinnen und Anwender in ihrer Intention abholen und unterst&#252;tzen?</p><h3 class=„subheading“ id=„nav_die_realit&#xe4;t7“>Die Realit&#228;t kennt keine Updates</h3><p>An dieser Stelle kommen wir zum entscheidenden Punkt: Wenn wir zu der Erkenntnis gelangen, dass es besser ist, in unserem Code, in der API, in der UI und auch &#252;berall sonst mit fachlichen Begriffen zu arbeiten, anstatt mit technischen, warum modellieren wir dann nicht einfach die fachlichen Ereignisse so, wie sie wirklich stattfinden?</p><p>Was in der Realit&#228;t geschieht, sind n&#228;mlich keine <em>Updates</em>, sondern Ereignisse, die wir in der Software nachbilden m&#246;chten. Genau aus diesem Grund sollten wir nicht nur in fachlichen Funktionen denken, sondern auch in fachlichen Events. Wenn wir unsere Software so gestalten, dass sie von echten Events angetrieben wird, verf&#252;gen wir n&#228;mlich pl&#246;tzlich &#252;ber eine Architektur und eine Codebasis, die die Realit&#228;t widerspiegeln, anstatt nur ein unzureichendes technisches Abbild zu sein, das eine sprachliche Kluft und viel Raum f&#252;r Missverst&#228;ndnisse und Interpretationen hinterl&#228;sst.</p><p>Genau an dieser Stelle setzt die Event-Modellierung an. Wenn wir akzeptieren, dass unsere Software die fachliche Realit&#228;t widerspiegeln sollte und dass Events daf&#252;r das Mittel der Wahl sind, m&#252;ssen wir uns zwangsl&#228;ufig fragen: Wie finden wir die richtigen Events? Welche Ereignisse sind tats&#228;chlich relevant? Welche beschreiben eine Ver&#228;nderung? Auf welche Weise schneide ich meine Events so, dass sie fachlich sinnvoll sind?</p><p>Deshalb m&#246;chte ich das Ganze nun anhand eines konkreten Beispiels erl&#228;utern, n&#228;mlich an unserer bereits bekannten Stadtbibliothek.</p><h3 class=„subheading“ id=„nav_einen_ausweis8“>Einen Ausweis beantragen</h3><p>Bevor Sie dort &#252;berhaupt etwas leihen d&#252;rfen, ben&#246;tigen Sie zun&#228;chst einen Ausweis, eine sogenannte <em>Library Card</em>. Viele Entwicklerinnen und Entwickler w&#252;rden vermutlich damit beginnen, dass man eine Library Card erstellen muss, also mit <code>CreateLibraryCard</code> &#8211; und schon befindet man sich wieder in der Denkweise von <em>Create</em>, <em>Read</em>, <em>Update</em> und <em>Delete</em>. Auch wenn das technisch sp&#228;ter vielleicht korrekt sein mag, geht es zun&#228;chst doch darum, den Prozess aus <em>fachlicher</em> Sicht zu beschreiben.</p><p>Niemand w&#252;rde eine Bibliothek betreten und sagen:</p><p class=„indent rteabs–indent“><em>„Created mir bitte einen Bibliotheksausweis!“</em></p><p>Stattdessen w&#252;rde man wohl fragen, wie ein solcher Ausweis beantragt werden kann. Genau dies ist der erste Schritt unseres Prozesses. Die Frage lautet also: Welcher Begriff trifft das Ganze fachlich am besten? Die Formulierung „Ausweis beantragen“ passt aus meiner Sicht schon recht gut. Allerdings ist „Ausweis beantragen“ noch kein Event. Es m&#252;sste n&#228;mlich in der Vergangenheitsform stehen, also „Ausweis wurde beantragt“.</p><p>Das ergibt Sinn, denn wenn Sie sich vorstellen, abends nach Hause zu kommen und gefragt zu werden, wie Ihr Tag war, w&#252;rden Sie ebenfalls in der Vergangenheitsform erz&#228;hlen. Bei Bedarf l&#228;sst sich das Ganze dann schlussendlich noch ins Englische &#252;bertragen, was dann einem „Applied for a Library Card“-Event entsprechen w&#252;rde.</p><p>Als N&#228;chstes w&#252;rde der Ausweis vermutlich ausgestellt. Vielleicht denken Sie jetzt:</p><p class=„indent rteabs–indent“><em>„Alles klar, dann haben wir aber jetzt ein Create.“</em></p><p>In der Vergangenheitsform w&#228;re das ein „Library Card Created“-Event. Rein sprachlich w&#228;re das korrekt, allerdings hatte ich erw&#228;hnt, dass der Ausweis <em>ausgestellt</em> wird. Einen Ausweis auszustellen bedeutet jedoch nicht „Create a Library Card“, sondern eher „Issue a Library Card“. Daher h&#228;tten wir also eher ein „Library Card Issued“-Event.</p><h3 class=„subheading“ id=„naves_ist_doch9“>„Es Ist doch egal, wie man das nennt!“</h3><p>Vielleicht wenden Sie nun ein, dass das letztlich Wortklauberei sei. Ob nun <em>create</em> oder <em>issue</em> &#8211; das sei doch egal, man wisse schlie&#223;lich, was gemeint ist. Der springende Punkt ist jedoch: Das wei&#223; man eben gerade leider nicht. Wir hatten gerade selbst die Situation, dass wir zwei verschiedene Ereignisse &#8211; n&#228;mlich das Beantragen und das Ausstellen des Ausweises &#8211; zun&#228;chst beide als <em>create</em> bezeichnen wollten. H&#228;tten wir das getan, h&#228;tten wir nun bereits zwei Prozessschritte, die wir sprachlich nicht voneinander unterscheiden k&#246;nnten.</p><p>Indem wir versuchen, fachlich passende und semantisch ausdrucksstarke W&#246;rter zu finden, pr&#228;zisieren wir unsere Sprache. Wir erhalten dadurch nicht nur ein genaueres Verst&#228;ndnis dar&#252;ber, worum es fachlich geht, sondern n&#228;hern uns sprachlich auch der Fachabteilung an. Genau diese Kombination f&#252;hrt dazu, dass wir besser miteinander kommunizieren, W&#252;nsche und Anforderungen besser verstehen und auf diese Weise letztlich in der Lage sind, bessere Software in k&#252;rzerer Zeit zu entwickeln.</p><h3 class=„subheading“ id=„nav_bessere10“>Bessere Kommunikation</h3><p>Wie viel hilfreicher ist n&#228;mlich bitte die Frage:</p><p class=„indent rteabs–indent“><em>„Okay, wir haben jetzt implementiert, dass man Ausweise beantragen kann und dass diese anschlie&#223;end ausgestellt werden k&#246;nnen, was ist der n&#228;chste Schritt?“</em></p><p>im Vergleich zu der Aussage:</p><p class=„indent rteabs–indent“><em>„Wir haben jetzt</em>

CreateAusweis

<em>implementiert, wir machen dann als N&#228;chstes</em>

UpdateAusweis

.&#8220;</p><p>Ersteres bietet eine hervorragende Basis f&#252;r ein zielgerichtetes Gespr&#228;ch mit einer fachkundigen Person, w&#228;hrend Letzteres eine vage, technische &#196;u&#223;erung darstellt, die kaum etwas aussagt und wahrscheinlich jede weitere Kommunikation verhindert.</p><h3 class=„subheading“ id=„nav_sprachliche11“>Sprachliche Pr&#228;zision</h3><p>Dieses Prinzip, sprachlich pr&#228;zise zu sein und fachliche statt technischer Begriffe zu verwenden, sollten wir konsequent fortf&#252;hren: Ein Bibliotheksausweis allein bringt noch nicht viel, er bildet lediglich die Voraussetzung daf&#252;r, dass wir &#252;berhaupt B&#252;cher ausleihen d&#252;rfen. Und genau das w&#228;re vermutlich der n&#228;chste Schritt im Prozess: Ein Buch auszuleihen.</p><p>Nun stellt sich erneut die Frage, wie dieses Event genannt werden sollte. Sprechen wir einfach von einem <code>BookBorrowed</code>-Event? Oder existieren m&#246;glicherweise Unterschiede? Wird ein Buch beispielsweise sofort ausgeliehen, oder muss es erst reserviert werden, um es sp&#228;ter abzuholen? Welche Bedingungen m&#252;ssen erf&#252;llt sein, damit die Ausleihe tats&#228;chlich stattfindet? All das sind &#220;berlegungen, die wir nur anstellen, wenn wir sprachlich pr&#228;zise bleiben und uns eng an der Fachsprache orientieren, da uns genau das dazu zwingt, uns inhaltlich mit der Fachlichkeit auseinanderzusetzen. Dies ist gut. Auf diese Weise entstehen nach und nach die verschiedenen Events, die in der jeweiligen Fachdom&#228;ne eine Rolle spielen.</p><p>Ein weiterer Vorteil besteht darin, dass sich dies wunderbar gemeinsam umsetzen l&#228;sst: Die Entwicklungsabteilung und die Fachabteilung kommen zusammen, sodass ein Gespr&#228;ch entsteht und beide in eine gemeinsame Richtung arbeiten. Es handelt sich nicht um ein Gegeneinander (wie es sonst so h&#228;ufig der Fall ist), sondern um ein Miteinander. Die Fachabteilung hat schlie&#223;lich ein Interesse daran, dass die Entwicklung versteht, worum es geht, denn nur dann kann sie eine ad&#228;quate und zielgerichtete Software erstellen. Dies gilt selbstverst&#228;ndlich auch in umgekehrter Richtung. Genau diese Herangehensweise &#8211; die Fachlichkeit in den Vordergrund zu r&#252;cken &#8211; macht das Prinzip so m&#228;chtig.</p><h3 class=„subheading“ id=„nav_domain12“>Domain Storytelling, Event Storming &amp; Co.</h3><p>Vielleicht fragen Sie sich jetzt, ob es daf&#252;r nicht bereits einige fertige Workshop-Formate gibt. Tats&#228;chlich existiert eine ganze Reihe, etwa Event Storming, Event Modeling oder Domain Storytelling. Diese Formate verfolgen jeweils einen etwas anderen Ansatz: Domain Storytelling eignet sich beispielsweise sehr gut daf&#252;r, &#252;berhaupt erst einmal einen Fu&#223; in eine Fachdom&#228;ne zu setzen, w&#228;hrend Event Storming und Event Modeling sehr in die Tiefe gehen und teils auch technische Details beleuchten.</p><p>Deshalb w&#252;rde ich zumindest anfangs zu Domain Storytelling raten: Es ist zum Gl&#252;ck leicht zu erlernen, und es gibt ein interessantes <a href=„https://www.youtube.com/watch?v=EaKWQ1rsaqQ“ rel=„external noopener“ target=„_blank“>Buch zu diesem Thema</a>.</p><p>Letztlich spielt es jedoch keine gro&#223;e Rolle, welche dieser Methoden Sie verwenden oder ob Sie &#252;berhaupt eine davon nutzen. Wichtig ist nur, dass Sie eine gemeinsame Basis schaffen &#8211; mit einer gemeinsamen Sprache und einem gemeinsamen Verst&#228;ndnis. Der Weg dorthin ist letztlich zweitrangig. Nehmen Sie daher einfach das, was Ihnen am ehesten zusagt. W&#228;hlen Sie das, womit Sie sich wohlf&#252;hlen. Entscheiden Sie sich f&#252;r das, wo Sie m&#246;glicherweise schon jemanden kennen oder finden, der Sie dabei unterst&#252;tzt und den Prozess anleitet oder moderiert.</p><h3 class=„subheading“ id=„nav_die_kirsche_auf13“>Die Kirsche auf der Sahnetorte</h3><p>Vielleicht fragen Sie sich zum Schluss noch, warum Sie das alles speziell in dieser Event-Form gestalten sollten. Man k&#246;nnte anstelle von „Ausweis wurde beantragt“, „Ausweis wurde ausgestellt“, „Buch wurde ausgeliehen“ und so weiter ebenso gut Formulierungen im Indikativ verwenden, also in der Grundform, beispielsweise „Ausweis beantragen“, „Ausweis ausstellen“, „Buch ausleihen“ und so weiter.</p><p>Die fachlichen Verben w&#228;ren dort schlie&#223;lich ebenfalls enthalten. Das ist im Grundsatz richtig, aber es gibt gewisserma&#223;en noch einen Bonus, wenn Sie die Event-Form verwenden. Es ist sozusagen die sprichw&#246;rtliche Kirsche auf der Torte. Sobald Sie diese gesch&#228;ftlichen Ereignisse in der Event-Form ausdr&#252;cken, erhalten Sie die ideale Ausgangsbasis, um die Events in einem geeigneten Protokoll zu speichern, &#228;hnlich einem Logbuch.</p><p>Dies wiederum bietet eine Vielzahl von Vorteilen von einer deutlich besseren Transparenz dar&#252;ber, was wann und warum von wem durchgef&#252;hrt wurde, &#252;ber ein integriertes Audit-Log bis hin zu sehr flexiblen M&#246;glichkeiten f&#252;r Analysen und Reports. Das kann man sich leicht vorstellen: Wenn Sie nur wissen, dass ein Buch gerade ausgeliehen ist, kennen Sie diesen Zustand, aber sonst nichts. Wenn Sie jedoch die komplette Historie kennen, die im Laufe der Zeit zum aktuellen Status quo gef&#252;hrt hat, k&#246;nnen Sie unz&#228;hlige Fragen beantworten, auch wenn Ihnen zuvor nicht klar war, dass diese Informationen sp&#228;ter von Interesse sein w&#252;rden. Dazu z&#228;hlen Fragen wie:</p><ul class=„rtelist rtelist–unordered“><li>Wie oft im Jahr wird ein bestimmtes Buch ausgeliehen?</li><li>Welches Buch wird am h&#228;ufigsten verl&#228;ngert?</li><li>Wie viel Prozent der Personen, die sich einen Ausweis haben ausstellen lassen, nutzen ihn innerhalb der ersten vier Wochen, um mindestens drei B&#252;cher auszuleihen?</li><li>&#8230;</li></ul><p>Diese Art der Datenspeicherung nennt man <em>Event Sourcing</em>, und dazu habe ich vor einigen Wochen <a href=„https://www.heise.de/blog/Event-Sourcing-Die-bessere-Art-zu-entwickeln-10258295.html“>bereits einen Beitrag geschrieben</a>. Der Vorteil daran ist, dass Sie gleich drei Fliegen mit einer Klappe schlagen, wenn Sie fachliche Prozesse konsequent als Events formulieren:</p><ul class=„rtelist rtelist–unordered“><li>Erstens erhalten Sie ein viel besseres Verst&#228;ndnis daf&#252;r, worum es in der Anwendung fachlich geht.</li><li>Zweitens verbessern Sie die Kommunikation mit der Fachabteilung, weil Sie pl&#246;tzlich dasselbe Verst&#228;ndnis teilen und auch dieselben Begriffe nutzen.</li><li>Drittens legen Sie damit den Grundstein f&#252;r eine moderne und flexible Architektur auf Basis von Event Sourcing und m&#246;glicherweise auch auf Basis von <a href=„https://www.youtube.com/watch?v=hP-2ojGfd-Q“ rel=„external noopener“ target=„_blank“>CQRS</a>.</li></ul><p>&#220;brigens war ich vor ungef&#228;hr zehn Tagen in einem sehr interessanten Podcast zu Gast &#8211; dem <a href=„https://engineeringkiosk.dev/podcast/episode/183-event-sourcing-die-intelligente-datenarchitektur-mit-semantischer-historie-mit-golo-roden/“ rel=„external noopener“ target=„_blank“>Engineering Kiosk</a> &#8211;, wo wir uns eineinhalb Stunden lang ausf&#252;hrlich &#252;ber das Zusammenspiel all dieser Themen unterhalten haben. Wenn Sie das interessiert, schauen oder h&#246;ren Sie dort gerne einmal vorbei.(<a class=„redakteurskuerzellink“ title=„Rainald Menge-Sonnentag“>rme</a>)</p> <div class=„paywall-delimiter“> </div> </div> </div></div></div> </html>

Cookies helfen bei der Bereitstellung von Inhalten. Diese Website verwendet Cookies. Mit der Nutzung der Website erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Computer gespeichert werden. Außerdem bestätigen Sie, dass Sie unsere Datenschutzerklärung gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information