<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://paulheymann.de/feed.xml" rel="self" type="application/atom+xml" /><link href="https://paulheymann.de/" rel="alternate" type="text/html" /><updated>2025-04-01T13:55:22+00:00</updated><id>https://paulheymann.de/feed.xml</id><title type="html">Paul’’s Website</title><author><name>Paul Heymann</name></author><entry><title type="html">Moses 1.1, Tag 2 - Die Gedanken fliegen frei</title><link href="https://paulheymann.de/bible/moses-1/2024/01/03/moses-1-1-tag-2.html" rel="alternate" type="text/html" title="Moses 1.1, Tag 2 - Die Gedanken fliegen frei" /><published>2024-01-03T00:00:00+00:00</published><updated>2024-01-03T00:00:00+00:00</updated><id>https://paulheymann.de/bible/moses-1/2024/01/03/moses-1-1-tag-2</id><content type="html" xml:base="https://paulheymann.de/bible/moses-1/2024/01/03/moses-1-1-tag-2.html"><![CDATA[<figure style="" class="">
  <img src="/assets/img/de/bibel/moses-1/A_Sunday_on_La_Grande_Jatte.jpg" alt="Ein Sonntag Nachmittag auf der Insel La Grande Jatte by Georges Seurat" />
  <figcaption>Ein Sonntag Nachmittag auf der Insel La Grande Jatte by Georges Seurat; Source: <a href="https://en.wikipedia.org/wiki/File:A_Sunday_on_La_Grande_Jatte,_Georges_Seurat,_1884.jpg">Wikipedia</a></figcaption>
</figure>

<p><br /></p>

<blockquote>
  <p>Und Gott sprach: Es werde eine Ausdehnung inmitten der Wasser, und sie scheide die Wasser von den Wassern! Und Gott machte die Ausdehnung und schied die Wasser, welche unterhalb der Ausdehnung, von den Wassern, die oberhalb der Ausdehnung sind. Und es ward also. Und Gott nannte die Ausdehnung Himmel. Und es ward Abend und es ward Morgen: zweiter Tag.</p>
</blockquote>

<p><span class="first-letter">P</span>ointillismus. Jeder der sich noch an den Kunstunterricht erinnern kann weiß, dass Künstler sich hier mit kleinen Farbpunkten zum Ausdruck bringen. Formen und Dinge werden nicht direkt auf die Leinwand gebracht, sondern ein Meer aus Punkten geschaffen, die ich der Betrachter erst zu einem Gemälde zusammenfassen muss.</p>

<p>Ein Beispiel ist die sommerliche Szene im Park am Anfang des Textes. Abertausende von Farbpunkten formen Menschen, Tieren und den Park an sich. Gehe ich näher heran verschwinden alle diese Formen und ich sehe nur eine Unzahl an Punkten.</p>

<p>Und so ist es auch mit meiner Wahrnehmung. Alles das, was ich sehe, höre, rieche, oder taste sind Abermillionen kleine Punkte die mir ein Signal von <em>der Welt</em> liefern. Sie sind das unbekannte Chaos, was bei zu naher Betrachtung nicht sehr viel Sinn ergibt. Also macht mein Geist einen Schritt zurück und fasst alles zu einfacheren, materiellen Formen zusammen.</p>

<p>Dabei stehen sie aber nicht für sich alleine. Gleichzeitig ist es auch kein undifferenziertes großes Ganzes. Meine Welt wandert eher zwischen den Zuständen hin und her. Ich sehe den gesamten Park, dann fokussiere ich mich auf die Frau rechts im Bild, mit ihrem Schirm, Hut und einem Affen an der Leine.</p>

<p>Worauf will ich hinaus? Wenn die <em>Finsternis</em> gelichtet wird und ich die ersten Erfahrungen eines unbekannten Teils <em>der Welt</em> mache, erkenne ich welche Dinge sich darin befinden. Ich hebe das Erkannte aus dem Chaos, verbinde die einzelnen Details und nehme die gesamte Szene wahr.</p>

<!-- ![](Jusche-Fret-Nest-Collage-2019.jpg)<!-- {"width":359} -->
<!-- * [Jusche Fret](https://www.juschefret.de/index.php#werke) -->

<p>Dieses Netz ist es das einen <em>Himmel</em> aufspannt, indem sich meine <em>Gedanken</em> frei bewegen können. Somit habe ich jetzt auch wieder den Bogen zurück zur eigentlichen Geschichte geschlagen. Es sind meine Gedanken die wie Vögel über die erkannten Dinge fliegen und sie zu einem komplizierten Muster verbinden. Die Szene im Park erinnert mich zum Beispiel an Sommertage an der Hamburger Außenalster. In meinem Geist springt der Gedanken von einem zum anderen.</p>

<p>Jede neue Erkenntnis, jeder Sprung der Gedanken, schafft aber nicht nur Neues, sondern ändert auch das Wissen, das ich längst besitze. Meine Gedanken formulieren alte Wahrheiten kontinuierlich um, passen sie an und halten sie so am Leben. Und so entsteht ein sich ständig änderndes Netzwerk aus Ideen, Erinnerungen und Erkenntnissen das die Landkarte meines Ichs definiert.</p>

<div class="row">
  <div style="margin-bottom: 30px;" class="col-6">
    <figure style="" class="image-wrapper">
  <img src="/assets/img/de/bibel/moses-1/sictine_chapel_Dividing_water_from_Heaven.jpg" alt="Teil der Deckenmalerei der Sixtinischen Kapelle (Teilung von Wasser und Himmel) by Michelangelo" />
  <figcaption>Teil der Deckenmalerei der Sixtinischen Kapelle (Teilung von Wasser und Himmel) by Michelangelo; Source: <a href="https://en.wikipedia.org/wiki/File:Dividing_water_from_Heaven.jpg">Wikipedia</a></figcaption>
</figure>

  </div>
  <div class="col-6">
    <p style="margin-top: 0;">
      Es schafft meine erlebte Welt und so lange es im Kontakt mit <i>der Welt</i> bleibt sind beide im Einklang. Aber was ist, wenn ich einen Höhenflug habe? Was passiert, wenn meine Gedanken zu frei sind? Ich verliere den Kontakt, bin nicht mehr bodenständig, und schaffe Scheinwelten die jede sinnhafte Wahrheit über den Haufen werfen.
    </p>
  </div>
</div>

<p>Jeder kennt diesen Zustand. Als Kind wünsche ich mir etwas, ein Spielzeug oder einen Ausflug, und gehe fest davon es zu bekommen. Ich male mir aus wie es sein wird und was ich alles mache werde. Ich schaffe ganze Welten, nur um manchmal von <em>der Realität</em> enttäuscht zu werden. Schlimmer ist es, wenn diese Scheinwelt in unser aller Welt überschwappt. Im letzten Jahrhundert sind wir alle kollektiv in eine Wahnwelt, ungehindert von <em>Realität und Wahrheit</em> getreten und jeder hat dafür einen hohen Preis bezahlt.</p>

<div class="row">
  <div class="col-6">
    <p style="margin-top: 0;">
      Es sind aber auch diese Höhenflüge, durch die ich Neues wage, kreativ bin und in die <i>Finsternis</i> vorstoßen. Es ist das Versprechen nach etwas Besserem das mich verleitet an meine Grenzen zu gehen und vielleicht darüber hinaus. Das bedeutet, ohne sie erweitere ich nicht meinen Horizont, stagniere und sehe irgendwann <i>die Welt</i> an mir vorbeiziehen. Fliege ich hingegen zu hoch, lasse das Bekannte zurück und baue Luftschlösser, bricht diese Welt auf kurz oder lang über mir zusammen.
    </p>
  </div>
  <div style="margin-bottom: 30px;" class="col-6">
    <figure style="" class="image-wrapper">
  <img src="/assets/img/de/bibel/moses-1/The_Lament_for_Icarus.jpg" alt="The Lament for Icarus by Herbert James Draper" />
  <figcaption>The Lament for Icarus by Herbert James Draper; Source: <a href="https://en.wikipedia.org/wiki/File:Herbert_Draper_-_The_Lament_for_Icarus_-_Google_Art_Project.jpg">Wikipedia</a></figcaption>
</figure>

  </div>
</div>

<p>Somit finde ich eine Balance zwischen meinen progressiven und konservativen Kräften. Keine darf dominieren für das Wohl des Ganzen. Die eine entdeckt neues Wissen, während die andere es bewahrt.</p>

<h2 id="nachwort">Nachwort</h2>
<p>Ich spreche hier schon von Wissen und wie es aus dem Unbekannten gehoben wird. Das greift den dritten Tag vorweg, war aber notwendig, um das Entstehen von Gedanken zu beschreiben. Ich denke, dass eine passiert eh zusammen mit dem anderen. Das Format einer linearen Geschichte erlaubt nur leider nicht Gleichzeitigkeit darzustellen. Es ist somit auch einer erster Beweis für die Verzahnung der Geschichten in der Bibel. Spätere Geschichten haben ein Echo in früheren und umgekehrt.</p>

<h2 id="referenzen">Referenzen</h2>
<ul>
  <li>Voriger Post: <a href="/bible/moses-1/2024/01/02/moses-1-1-tag-1.html">Tag 1: Die Schaffung der eigenen Welt</a></li>
  <li>Zurück zur <a href="/bible/intro/2024/01/01/moses-1-1-intro.html">Übersicht</a></li>
</ul>]]></content><author><name>Paul Heymann</name></author><category term="bible" /><category term="moses-1" /><summary type="html"><![CDATA[Ein Sonntag Nachmittag auf der Insel La Grande Jatte by Georges Seurat; Source: Wikipedia]]></summary></entry><entry><title type="html">Moses 1.1, Tag 1 - Die Schaffung der eigenen Welt</title><link href="https://paulheymann.de/bible/moses-1/2024/01/02/moses-1-1-tag-1.html" rel="alternate" type="text/html" title="Moses 1.1, Tag 1 - Die Schaffung der eigenen Welt" /><published>2024-01-02T00:00:00+00:00</published><updated>2024-01-02T00:00:00+00:00</updated><id>https://paulheymann.de/bible/moses-1/2024/01/02/moses-1-1-tag-1</id><content type="html" xml:base="https://paulheymann.de/bible/moses-1/2024/01/02/moses-1-1-tag-1.html"><![CDATA[<figure style="" class="">
  <img src="/assets/img/de/bibel/moses-1/the-great-wave-off-the-coast-of-kanagawa.jpg" alt="Die große Welle vor Kanagawa by Katsushika Hokusai" />
  <figcaption>Die große Welle vor Kanagawa by Katsushika Hokusai; Source: <a href="https://de.wikipedia.org/wiki/Datei:Katsushika_Hokusai_-_Thirty-Six_Views_of_Mount_Fuji-_The_Great_Wave_Off_the_Coast_of_Kanagawa_-_Google_Art_Project.jpg">Wikipedia</a></figcaption>
</figure>

<p><br /></p>

<blockquote>
  <p>Im Anfang schuf Gott die Himmel und die Erde. Und die Erde war wüst und leer, und Finsternis war über der Tiefe; und der Geist Gottes schwebte über den Wassern. Und Gott sprach: Es werde Licht! und es ward Licht. Und Gott sah das Licht, daß es gut war; und Gott schied das Licht von der Finsternis. Und Gott nannte das Licht Tag, und die Finsternis nannte er Nacht. Und es ward Abend und es ward Morgen: erster Tag.</p>
</blockquote>

<p><span class="first-letter">W</span>as sind die Grundbausteine meiner Welt? In der Schule lernen wir, dass sie aus Atomen, Molekülen und anderen Elementarteilchen besteht, aber nichts davon kann ich sehe, riechen, oder fühlen. Womit ich jedoch jeden Tag konfrontiert werde, ist das Bekannte und das Unbekannte. Daraus baue ich meine Welt auf.</p>

<p>Ich kenne meine Heimat, meine Familie und Freunde sowie die vielen Dinge meines Alltags. Der Rest besteht aus allen den Dingen, die mir fremd sind. Wie fliegt man ein Flugzeug oder besteigt einen hohen Berg? Davon weiß ich nichts. Aber völlig unbekannt sind sie mir auch nicht. Ich muss irgendeine Art von Wissen vom Fliegen oder Bergsteigen haben, um sagen zu können “Ich verstehe es nicht” und wenn es nur das Wort ist.</p>

<p>Was mache ich aber mit den Dingen, von denen ich noch nicht einmal weiß, dass ich sie nicht weiß? Sie sind weniger als unbekannt. Sie existieren für mich nicht. Ich bin nicht in der Lage ein einzelnes Wort, Bild, oder Gefühl für sie zu artikulieren.</p>

<p>Meine Welt besteht somit nicht nur aus dem Bekanntem und Unbekanntem, sie ist auch umgeben von dem, was für mich nicht existiert.</p>

<p>Was hat das Ganze jetzt aber mit der Bibel und der Schaffung <em>der Welt</em> zu tun? Das ist der Bogen, den ich versuche zu schlagen und ich glaube, die Symbole <em>Finsternis</em>, <em>Wasser</em> und <em>Erde</em> spiegeln genau diese Grundbausteine meiner wahrgenommenen Welt wider.</p>

<div class="row">
  <div style="margin-bottom: 30px;" class="col-6">
    <figure style="" class="image-wrapper">
  <img src="/assets/img/de/bibel/moses-1/flower.jpg" alt="Banksia coccinea by Ferdinand Bauer" />
  <figcaption>Banksia coccinea by Ferdinand Bauer; Source: <a href="https://en.wikipedia.org/wiki/File:Banksia_coccinea_%28Illustrationes_Florae_Novae_Hollandiae_plate_3%29.jpg">Wikipedia</a></figcaption>
</figure>

  </div>
  <div class="col-6">
    <p style="margin-top: 0;">
      Wenn ich sehe, fühle, rieche, höre, schmecke, in kurz, erfahre, wird mein Geist mit <i>Licht</i> und Farbe geflutet. Jetzt ist <i>die Welt</i> da draußen aber so groß und detailliert, dass mich nur der kleinste Teil von ihr erreicht. Der Rest ist abwesend. Er ist in <i>Finsternis</i> gehüllt. Das ist der Teil, von dem ich noch nicht einmal weiß, dass ich ihn nicht kenne. Ein Beispiel: Selbst so augenscheinlich simple Dinge wie eine Blume geben sich nie vollständig preis.
    </p>
  </div>
</div>

<p>Was ich sehe, ist die rote Blüte und die grünen Blätter, die Formen und einzelnen Details. Aber was ist mit den Zellen? Mit den Molekülen, Atomen, und was auch immer darunter liegt? Alle die Feinheiten und Dynamik gehen an mir verloren. Ich sehe nur ein simples Ding.</p>

<p>Wenn ich meine Aufmerksamkeit aber auf einen Teil diese <em>Finsternis</em> richte, mir ein Mikroskop nehme und das Blatt darunter beobachte, wird sie verband und an ihre Stelle treten unzählige neue Eindrücke. Ich entdecke eine Welt voll Dynamik, Komplexität, Form und Muster. Ich verstehe ein wenig mehr, aber erkenne gleichzeitig, was ich noch nicht weiß. Das nicht Existente wird zum Unbekanntem reduziert.<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup></p>

<div class="row">
  <div class="col-6">
    <p style="margin-top: 0;">
      Finsternis ist somit das, was ich nie wahrgenommen habe. Es ist das Symbol für das, was für mich nicht existiert. Erst der Akt des Nachschauens lässt mich das Unbekannte entdecken. Es bringt diese Erfahrungen in meinen Geist. Bringt <i>Licht</i> in das Dunkel.
    </p>
    <p>
      <i>Wasser</i> wiederum ist das ideale Symbol für dieses Unbekannte. Es ist materiell, hat Struktur, aber keine Permanenz. Alles, was ich erkenne, verschwindet im nächsten Augenblick wieder und somit kann ich es nie voll greifen oder verstehen.<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>
    </p>

  </div>
  <div style="margin-bottom: 30px;" class="col-6">
    <figure style="width: 80%;" class="image-wrapper">
  <img src="/assets/img/de/bibel/moses-1/creation_of_Light.png" alt="Creation of Light by Gustaaf Sorel" />
  <figcaption>Creation of Light by Gustaaf Sorel; Source: <a href="https://en.wikipedia.org/wiki/File:Creation_of_Light.png">Wikipedia</a></figcaption>
</figure>

  </div>
</div>

<p>Das wird nur möglich durch Stabilität. Die <em>Erde</em> als fester Grund scheint mir genau das Symbol dafür zu sein. Sie hat Struktur, die bleibt und ist vorhersagbar. Mit anderen Worten, sie ist Ordnung. Erde ist das, was ich verstehe und kenne.</p>

<p>Woher aber kommt sie? Bin ich es, der die Ordnung schafft? Ich glaube nicht. Wäre die Welt da draußen nicht inhärent voll mit Mustern und Stabilität könnte ich keine Struktur erkennen. Was sich nicht vorhersagen lässt, ändert diese Eigenschaft auch nicht, egal wie lange ich darauf starre. Vielmehr ist es das Chaos aus dem nicht Existentem (<em>Finsternis</em>) und dem Unbekanntem (<em>Wasser</em>), dass reif mit Struktur ist, die noch erkannt werden will. Das ist es, was mein Geist tut, wenn er sich dem Chaos stellt. Für einen kurzen Moment trennt er die Union.</p>

<p>Aber keine zwei Personen sehen dieselbe Welt. Jede ist subjektiv. Was für mich noch Chaos ist, ist vielleicht für eine andere bereits Ordnung. Somit ist Chaos die Abwesenheit von eigener Ordnung. Es ist das, was außerhalb meines Geistes liegt.</p>

<p>Die Schaffung meiner erlebten Welt ist somit auch gleich die Schaffung <em>der Welt im gesamten</em>. Wenn zwei Personen in Beziehung stehen, teilen sie das Subjektive. Ihre Welten interferieren, passen sich an und werden zu einer. Und so verschmelzt das gesamte Netzwerk aus Beziehung alle unsere Welten und schafft einen physischen, sozialen, psychologischen, rationalen, kreativen, in kurz, rein menschlichen Kosmos. Was er aber nicht ist, ist die Welt an sich. Ich weiß nicht, was die echte Realität ist, noch werde ich es je wissen. Ich sehe nur ihr Licht durch alle unsere Augen.</p>

<p>Als nächstes in der Serie: <a href="/bible/moses-1/2024/01/03/moses-1-1-tag-2.html">Tag 2: Die Gedanken sind frei</a></p>

<h2 id="nachwort">Nachwort</h2>
<p>Es ist mein Geist, der in die <em>Finsternis</em> vordringt und einen Teil <em>der Welt</em> wahrnimmt. Dadurch wird das Unbekannte freigelegt und somit schwebt er über der <em>Tiefe des Wassers</em>. Noch habe ich keine Permanenz erkannt und somit bleibt meine <em>Welt wüst</em>. Erst die nächsten Tage werden das Bekannte aus diesem Meer heben.</p>

<p>Wenn ich am Anfang einer der Geschichten stehe, frage ich mich manchmal, wie viel schon in so wenig Text enthalten sein kann. Wie viel Wissen kann man in wenige Sätze komprimieren? Und immer wieder bin ich von den vielen Seiten voller Notizen überrascht. Mein Verstand, jeder Verstand, ist gefüllt mit Eindrücken und Erkenntnissen und diese Geschichten scheinen ein Schlüssel zu sein, sie alle freizulegen.</p>

<h2 id="referenzen">Referenzen</h2>
<ul>
  <li>Zurück zur <a href="/bible/intro/2024/01/01/moses-1-1-intro.html">Übersicht</a></li>
</ul>

<div class="footnotes" role="doc-endnotes">
  <ol style="font-size: 1em">
    <li id="fn:1" role="doc-endnote">
      <p>Dem aufmerksamen Leser fällt hier sicherlich auf, dass ich bekannte Konzepte verwende, um das nicht Existente zu beschreiben. Leider hat das was nicht existiert die unangenehme Eigenschaft, sich jeder Beschreibung zu entziehen. Damit ich trotzdem noch etwas zu schreibe habe, muss ich also auf inadäquate Hilfsmittel zurückgreifen.&nbsp;<a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
    </li>
    <li id="fn:2" role="doc-endnote">
      <p>Es gibt natürlich Simulationen und mathematische Näherungsverfahren (siehe Navier-Stokes Gleichungen in der Strömungsmechanik), aber sie werden häufig nur für kleine Volumen eingesetzt oder brauchen riesige Mengen an Rechenleistung. Eine vollumfängliche Beschreibung und Vorhersage von Fluiden so wie Wasser bleibt eine Herausforderung.&nbsp;<a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
    </li>
  </ol>
</div>]]></content><author><name>Paul Heymann</name></author><category term="bible" /><category term="moses-1" /><summary type="html"><![CDATA[Die große Welle vor Kanagawa by Katsushika Hokusai; Source: Wikipedia]]></summary></entry><entry><title type="html">Einleitung</title><link href="https://paulheymann.de/bible-intro/2024/01/01/einleitung.html" rel="alternate" type="text/html" title="Einleitung" /><published>2024-01-01T00:00:00+00:00</published><updated>2024-01-01T00:00:00+00:00</updated><id>https://paulheymann.de/bible-intro/2024/01/01/einleitung</id><content type="html" xml:base="https://paulheymann.de/bible-intro/2024/01/01/einleitung.html"><![CDATA[<p><span class="first-letter">O</span>bwohl Religion in meinem Zuhause weniger präsent war, war meine Kindheit und Jugend trotzdem damit durchzogen. Ich war Teil des Religionsunterrichts, ging zu schulischen Weihnachtskonzerten in die Kirche, oder machte meinem Zivi in einer kirchlichen Einrichtung.</p>

<p>Schon immer habe ich aber auch eine Abneigung gegenüber willkürlicher Autorität. Religion und ihre Institution Kirche waren da für mich das Paradebeispiel. Starre Regeln, alte Strukturen und Gott der die ultimative Form der absolut unbändigen Autorität ist. Mit anderen Worten, der Kontakt mit Religion hat mich zum Atheisten werden lassen. Erst unbewusst, dann aber mehr und mehr ausgesprochen.</p>

<p>Mit meinem Erwachsenwerden, dem Verlassen der Schule und Heimat endete aber auch jede Auseinandersetzung mit dem Thema. Ich ließ es hinter mir zusammen mit vielen anderen Dingen der Jugend. Jahre später sitze ich aber auf einmal hier und lese die Bibel. Noch mehr, ich schreibe über sie. Warum?</p>

<p>Der Sprung aus der Jugend in ein eigenes Leben ist aufregend, befreiend, aber auch schwer. Alle die kleinen und großen Probleme des Alltags sind jetzt die eigenen. Keine Familie oder Schule mehr die vieles abfängt.</p>

<p>Und dann sind da noch die großen Fragen wie “Was ist das Ziel?” oder “Wie gehe ich mit eignen oder dem Tod von anderen um?”. In der Schule und Uni war ich “unsterblich”. Der Tod war kein Ding, das Leben geht immer weiter, und der Sinn lag im Bestehen der nächsten Prüfung und darin Spaß zu haben. Jetzt, mit einer eigenen Familie und keinen einfachen Zielen mehr, wie das Sammeln von Noten, was ist die Antwort? Unsterblich bin ich schon lange nicht mehr.</p>

<p>Irgendwie hatten mich diese Fragen immer wieder zu alten Texten und Büchern geführt, und immer wieder kam ich in Kontakt mit den Geschichten in der Bibel.</p>

<p>Es sind Geschichten, die vielleicht so alt sind wie wir Menschen selbst. Geschichten, die wir mühsam am Leben erhalten und weitertragen schon so lange wie Menschen gedenken. Generation um Generation hat seine eigenen Ansichten und Ideen eingearbeitet, bis dieses Destillat entstand. Aber Destillat wovon?</p>

<p>Ist es ein Werk der Philosophie? Der Theologie oder Psychologie? Vielleicht der Sozialkunde, Geschichte, Poesie oder Literatur? Es trägt Aspekte von alledem und noch vielem mehr und doch scheinen sie alle auf eine Frage ausgerichtet zu sein: Was heißt es Mensch zu sein? Diese Frage ist es die alle die Hürden des Alltags aber auch die großen Fragen in sich vereint. Die Antworten darauf sind komplex und immer persönlich.</p>

<p>Das bedeutet aber auch, dass die Geschichten keine einfachen Rezepte für den blinden Konsum sind. Eine wortwörtliche Auslegung führt einen eher in die Irre. Es ist eine Abstraktion voll mit Symbolen. Ein Konzentrat von tausenden von Jahren menschlicher Erfahrung. Es zu nehmen wie geschrieben heißt die unzähligen Details aber auch das größere Ganze zu ignorieren. Dann bleibt es, wie damals in der Schule, ein langatmiges Buch, dass in der hintersten Ecke verstaubt.</p>

<p>Interpretation ist was die Erkenntnisse alle dieser Generationen freilegt und mit dem eigenen Leben verbindet. Die Reise durch die Geschichten ist somit auch eine Reflexion des eigenen Geistes. Am Ende wird es ein Mischung aus beidem sein.</p>

<p>Diese Textserie ist meine persönliche Reflexion in den Geschichten der Bibel.</p>
<h2 id="meine-ziele">Meine Ziele</h2>
<p>Eine persönliche Interpretation zu schaffen, Leitmotive zu finden, und daraus hilfreiche Prinzipien für den Alltag abzuleiten. Es soll zudem eine Übung sein, um meinen Geist zu trainieren. So wie Sport den Körper stärkt und gesund hält, braucht der mein Geist Stärkung. Er braucht eine Herausforderung, an der er sich messen und wachsen kann.</p>
<h2 id="mein-vorgehen">Mein Vorgehen</h2>
<p>Ich setze mir selber ein paar Spielregeln im Umgang mit der Bibel:</p>

<ol>
  <li>Wenn Erzählungen in der Bibel mit wissenschaftlichen Erkenntnissen in Konflikt stehen gewinnt die Wissenschaft. Immer. Die Menschheit ist nicht aus Adam und Eva hervorgegangen. Die Erde ist nicht nur ein paar tausend Jahre alt. Evolution ist ein Ding. Kurzum, die Bibel ist gefüllt mit Symbolen nicht wissenschaftlichen Erkenntnisse.</li>
  <li>Die Symbolik existiert nicht nur in den Texten, sondern auch in der Kunst oder Architektur. Europäische und Deutsche Kultur wurde so lange vom Christentum geprägt, dass wir überall Symbole und Interpretationsoberflächen finden. Deshalb versuche ich auch diese Aspekte einzuarbeiten.</li>
  <li>Die Definition für Gott, die ich habe, führt mich direkt zum Atheismus was hier erstmal nicht zuträglich ist. Deshalb werde ich vorerst Gott nicht erwähnen, nicht in seiner personifizierten Form wie er vor allem im Alten Testament oder den Kirchen beschrieben wird. Mir ist schlussendlich nicht klar was das Wort bedeutet.</li>
  <li>Ich verwende die <a href="https://de.wikipedia.org/wiki/Elberfelder_Bibel">Elberfelder Übersetzung</a> in verschiedenen Versionen. Warum? Sie ist eine der wortgetreueren Übersetzungen aus dem hebräischem oder griechischem und hält je nach Version viele Hinweise auf alternative Wortbedeutungen. Das vergrößert die Interprationsfläche im Gegensatz zu anderen Übersetzungen die vereinfachen oder modernisieren.</li>
</ol>]]></content><author><name>Paul Heymann</name></author><category term="bible-intro" /><summary type="html"><![CDATA[Obwohl Religion in meinem Zuhause weniger präsent war, war meine Kindheit und Jugend trotzdem damit durchzogen. Ich war Teil des Religionsunterrichts, ging zu schulischen Weihnachtskonzerten in die Kirche, oder machte meinem Zivi in einer kirchlichen Einrichtung.]]></summary></entry><entry><title type="html">Moses 1.1 - Die Schaffung der Welt aus Chaos und Ordnung</title><link href="https://paulheymann.de/bible/intro/2024/01/01/moses-1-1-intro.html" rel="alternate" type="text/html" title="Moses 1.1 - Die Schaffung der Welt aus Chaos und Ordnung" /><published>2024-01-01T00:00:00+00:00</published><updated>2024-01-01T00:00:00+00:00</updated><id>https://paulheymann.de/bible/intro/2024/01/01/moses-1-1-intro</id><content type="html" xml:base="https://paulheymann.de/bible/intro/2024/01/01/moses-1-1-intro.html"><![CDATA[<figure style="" class="">
  <img src="/assets/img/de/bibel/moses-1/sixtine-chapel.jpg" alt="Sixtinische Kapelle und ihre Darstellung der Schaffung der Welt by Michelangelo" />
  <figcaption>Sixtinische Kapelle und ihre Darstellung der Schaffung der Welt by Michelangelo; Source: <a href="https://en.wikipedia.org/wiki/File:CAPPELLA_SISTINA_Ceiling.jpg">Wikipedia</a></figcaption>
</figure>

<p><br /></p>

<p><span class="first-letter">D</span>ie Schaffung der Welt. Was bleibt von der ersten Geschichte, wenn ich die einfachste aller Interpretationen, die Geburt unserer physischen Welt durch einen Gott, außen vor lasse? Wie lassen sich die Symbole noch verstehen? Das ist die Frage, die ich in den folgenden Posts versuche zu beantworten.</p>

<blockquote>
  <p>Im Anfang schuf Gott die Himmel und die Erde. Und die Erde war wüst und leer, und Finsternis war über der Tiefe; und der Geist Gottes schwebte über den Wassern. Und Gott sprach: Es werde Licht! und es ward Licht. Und Gott sah das Licht, daß es gut war; und Gott schied das Licht von der Finsternis. Und Gott nannte das Licht Tag, und die Finsternis nannte er Nacht. Und es ward Abend und es ward Morgen: erster Tag.</p>
</blockquote>

<p><a href="/bible/moses-1/2024/01/02/moses-1-1-tag-1.html">Moses 1: Tag 1: Die Schaffung der eigenen Welt</a></p>

<blockquote>
  <p>Und Gott sprach: Es werde eine Ausdehnung inmitten der Wasser, und sie scheide die Wasser von den Wassern! Und Gott machte die Ausdehnung und schied die Wasser, welche unterhalb der Ausdehnung, von den Wassern, die oberhalb der Ausdehnung sind. Und es ward also. Und Gott nannte die Ausdehnung Himmel. Und es ward Abend und es ward Morgen: zweiter Tag.</p>
</blockquote>

<p><a href="/bible/moses-1/2024/01/03/moses-1-1-tag-2.html">Moses 1: Tag 2: Die Gedanken fliegen frei</a></p>

<blockquote>
  <p>Und Gott sprach: Es sammeln sich die Wasser unterhalb des Himmels an einen Ort, und es werde sichtbar das Trockene! Und es ward also. Und Gott nannte das Trockene Erde, und die Sammlung der Wasser nannte er Meere. Und Gott sah, daß es gut war. Und Gott sprach: Die Erde lasse Gras hervorsprossen, Kraut, das Samen hervorbringe, Fruchtbäume, die Frucht tragen nach ihrer Art, in welcher ihr Same sei auf der Erde! Und es ward also. Und die Erde brachte Gras hervor, Kraut, das Samen hervorbringt nach seiner Art, und Bäume, die Frucht tragen, in welcher ihr Same ist nach ihrer Art. Und Gott sah, daß es gut war. Und es ward Abend und es ward Morgen: dritter Tag.</p>
</blockquote>

<blockquote>
  <p>Und Gott sprach: Es werden Lichter an der Ausdehnung des Himmels, um den Tag von der Nacht zu scheiden, und sie seien zu Zeichen und zur Bestimmung von Zeiten und Tagen und Jahren; und sie seien zu Lichtern an der Ausdehnung des Himmels, um auf die Erde zu leuchten! Und es ward also. Und Gott machte die zwei großen Lichter: das große Licht zur Beherrschung des Tages, und das kleine Licht zur Beherrschung der Nacht, und die Sterne. Und Gott setzte sie an die Ausdehnung des Himmels, um auf die Erde zu leuchten, und um zu herrschen am Tage und in der Nacht und das Licht von der Finsternis zu scheiden. Und Gott sah, daß es gut war. Und es ward Abend und es ward Morgen: vierter Tag.</p>
</blockquote>

<blockquote>
  <p>Und Gott sprach: Es wimmeln die Wasser vom Gewimmel lebendiger Wesen, und Gevögel fliege über der Erde angesichts der Ausdehnung des Himmels! Und Gott schuf die großen Seeungeheuer und jedes sich regende, lebendige Wesen, wovon die Wasser wimmeln, nach ihrer Art, und alles geflügelte Gevögel nach seiner Art. Und Gott sah, daß es gut war. Und Gott segnete sie und sprach: Seid fruchtbar und mehret euch und füllet die Wasser in den Meeren, und das Gevögel mehre sich auf der Erde! Und es ward Abend und es ward Morgen: fünfter Tag.</p>
</blockquote>

<blockquote>
  <p>Und Gott sprach: Die Erde bringe hervor lebendige Wesen nach ihrer Art: Vieh und Gewürm und Getier der Erde nach seiner Art! Und es ward also. Und Gott machte das Getier der Erde nach seiner Art, und das Vieh nach seiner Art, und alles, was sich auf dem Erdboden regt, nach seiner Art. Und Gott sah, daß es gut war. Und Gott sprach: Lasset uns Menschen machen in unserem Bilde, nach unserem Gleichnis; und sie sollen herrschen über die Fische des Meeres und über das Gevögel des Himmels und über das Vieh und über die ganze Erde und über alles Gewürm, das sich auf der Erde regt! Und Gott schuf den Menschen in seinem Bilde, im Bilde Gottes schuf er ihn; Mann und Weib schuf er sie. Und Gott segnete sie, und Gott sprach zu ihnen: Seid fruchtbar und mehret euch und füllet die Erde und machet sie euch untertan; und herrschet über die Fische des Meeres und über das Gevögel des Himmels und über alles Getier, das sich auf der Erde regt! Und Gott sprach: Siehe, ich habe euch gegeben alles samenbringende Kraut, das auf der Fläche der ganzen Erde ist, und jeden Baum, an welchem samenbringende Baumfrucht ist: es soll euch zur Speise sein; und allem Getier der Erde und allem Gevögel des Himmels und allem, was sich auf der Erde regt, in welchem eine lebendige Seele ist, habe ich alles grüne Kraut zur Speise gegeben. Und es ward also. Und Gott sah alles, was er gemacht hatte, und siehe, es war sehr gut. Und es ward Abend und es ward Morgen: der sechste Tag.</p>
</blockquote>

<p>Übrigens ist hier ein <a href="https://www.csv-bibel.de/bibel/1-mose-1">Link zu der digitalen CSV Version</a>, mit einer Fülle an alternativen Übersetzungen.</p>

<h2 id="referenzen">Referenzen</h2>
<ul>
  <li>Zurück zur <a href="/articles/bible.html">Gesamt-Übersicht</a></li>
  <li>Zitat: <a href="https://www.bibel-online.net/buch/elberfelder_1905/1_mose/1">Bibel-Online.net</a></li>
  <li>Detailierte Übersetzung: <a href="https://www.csv-bibel.de/bibel/1-mose-1">1. Mose 1 :: Elberfelder Bibelübersetzung Edition CSV</a></li>
</ul>]]></content><author><name>Paul Heymann</name></author><category term="bible" /><category term="intro" /><summary type="html"><![CDATA[Sixtinische Kapelle und ihre Darstellung der Schaffung der Welt by Michelangelo; Source: Wikipedia]]></summary></entry><entry><title type="html">Contract Testing for MVPs (and Legacy Systems)</title><link href="https://paulheymann.de/engineering/2023/12/01/cdc-testing.html" rel="alternate" type="text/html" title="Contract Testing for MVPs (and Legacy Systems)" /><published>2023-12-01T00:00:00+00:00</published><updated>2023-12-01T00:00:00+00:00</updated><id>https://paulheymann.de/engineering/2023/12/01/cdc-testing</id><content type="html" xml:base="https://paulheymann.de/engineering/2023/12/01/cdc-testing.html"><![CDATA[<p>Writing tests isn’t particularly cheap so they fall down on my priority list when creating for example prototypes or MVPs. To some degree rightly so. I don’t know <em>What</em> I am doing yet, therefore, the <em>How</em> (my implementation) is changing regularly. Having to constantly add and adjust tests, a specification of something that is still in flow, feels like a drag at this point.</p>

<p>But eventually, it culminates in something tangible. The <em>What</em> and <em>How</em> become clearer and now I sit there with a bunch of untested code. The only way that I can know that it works is by manually testing it. Every. Time. This is the real drag now.</p>

<h2 id="our-mvp-example">Our MVP example</h2>
<p>Okay, but how would we go about it? First, let’s add a small example. We build a prototype of a movie database. Think IMDB minus all the features. After some back and forth the first MVP looks like this:</p>

<p><img class="gif" src="/assets/img/cdc-example-app.gif" /></p>

<p>It won’t win a design award but it works. Under the hood, it is a basic React app (code <a href="https://github.com/pheymann/paulheymann-website/tree/a3a713903954208e0cd691b133fa93c5e0da3ad1/examples/cdc/app">here</a>) talking to a Golang backend (code <a href="https://github.com/pheymann/paulheymann-website/tree/a3a713903954208e0cd691b133fa93c5e0da3ad1/examples/cdc">here</a>). Of course, you can substitute that tech stack with whatever you want. What we will talk about in the following isn’t tied to a language or framework.</p>

<p>Now I could go in and add a whole bunch of unit and integration tests but at the same time, this MVP just shipped. People seem to use it (don’t ask me why). We have to fix bugs, add features, and grow the product before we run out of time, money, or both.</p>

<p>So, as it happens, we have to find another, less time-consuming path. Instead of focusing on each class and function why not look at it from a higher level? What happens when we test from the perspective of a user? I mean, at this moment, we are doing that anyway. Manually testing, or acting like a user, is the only tool that we have. So why not make that an automated process to speed up things?</p>
<h2 id="a-simple-user-interaction-test">A simple user interaction test</h2>
<p>What is it a user would see when they open our app?</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">test</span><span class="p">(</span><span class="dl">"</span><span class="s2">Case: User opens the app and sees multiple movies</span><span class="dl">"</span><span class="p">,</span> <span class="k">async</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="k">await</span> <span class="nx">render</span><span class="p">(</span>
    <span class="o">&lt;</span><span class="nx">MemoryRouter</span> <span class="nx">initialEntries</span><span class="o">=</span><span class="p">{[</span><span class="dl">'</span><span class="s1">/</span><span class="dl">'</span><span class="p">]}</span><span class="o">&gt;</span>
      <span class="o">&lt;</span><span class="nx">App</span>  <span class="nx">fetch</span><span class="o">=</span><span class="p">{</span> <span class="nx">mockFetch</span> <span class="p">}</span> <span class="sr">/&gt;</span><span class="err">,
</span>    <span class="o">&lt;</span><span class="sr">/MemoryRouter</span><span class="err">&gt;
</span>  <span class="p">);</span>

  <span class="nx">expect</span><span class="p">(</span><span class="nx">screen</span><span class="p">.</span><span class="nx">getByText</span><span class="p">(</span><span class="sr">/Harry Potter and the Sorcerer's Stone/i</span><span class="p">)).</span><span class="nx">toBeInTheDocument</span><span class="p">();</span>
  <span class="nx">expect</span><span class="p">(</span><span class="nx">screen</span><span class="p">.</span><span class="nx">getByText</span><span class="p">(</span><span class="sr">/Harry Potter and the Chamber of Secrets/i</span><span class="p">)).</span><span class="nx">toBeInTheDocument</span><span class="p">();</span>
  <span class="nx">expect</span><span class="p">(</span><span class="nx">screen</span><span class="p">.</span><span class="nx">getByText</span><span class="p">(</span><span class="sr">/Create Movie/i</span><span class="p">)).</span><span class="nx">toBeInTheDocument</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now, we could mock all requests via <a href="https://github.com/pheymann/paulheymann-website/blob/a3a713903954208e0cd691b133fa93c5e0da3ad1/examples/cdc/app/src/cdc_tests/cdc.js#L44">mockFetch</a> but we would need to write additional, independent tests for the backend too. The appeal of manual end-to-end tests is that we know that the whole thing works when we are done testing. So instead of having separate sets of data, we put it all into a central file shared between the frontend and the backend.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">name</span><span class="pi">:</span> <span class="s">User opens the app and sees multiple movies</span>
<span class="na">view</span><span class="pi">:</span> <span class="s">/</span>
<span class="na">app</span><span class="pi">:</span>
  <span class="na">textShouldExist</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s">Harry Potter and the Sorcerer's Stone</span>
    <span class="pi">-</span> <span class="s">Harry Potter and the Chamber of Secrets</span>
<span class="na">callChain</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">request</span><span class="pi">:</span>
      <span class="na">uri</span><span class="pi">:</span> <span class="s">/api/movie/all</span>
      <span class="na">method</span><span class="pi">:</span> <span class="s">GET</span>
      <span class="na">headers</span><span class="pi">:</span>
    <span class="na">response</span><span class="pi">:</span>
      <span class="na">type</span><span class="pi">:</span> <span class="s">success</span>
      <span class="na">status</span><span class="pi">:</span> <span class="m">200</span>
      <span class="na">body</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">id</span><span class="pi">:</span> <span class="s2">"</span><span class="s">0"</span>
          <span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Harry</span><span class="nv"> </span><span class="s">Potter</span><span class="nv"> </span><span class="s">and</span><span class="nv"> </span><span class="s">the</span><span class="nv"> </span><span class="s">Sorcerer's</span><span class="nv"> </span><span class="s">Stone"</span>
          <span class="na">releaseYear</span><span class="pi">:</span> <span class="m">2001</span>
        <span class="pi">-</span> <span class="na">id</span><span class="pi">:</span> <span class="s2">"</span><span class="s">1"</span>
          <span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Harry</span><span class="nv"> </span><span class="s">Potter</span><span class="nv"> </span><span class="s">and</span><span class="nv"> </span><span class="s">the</span><span class="nv"> </span><span class="s">Chamber</span><span class="nv"> </span><span class="s">of</span><span class="nv"> </span><span class="s">Secrets"</span>
          <span class="na">releaseYear</span><span class="pi">:</span> <span class="m">2002</span>
</code></pre></div></div>

<p>That is our contract between both systems and the representation of a user interaction.</p>

<p>Our test code becomes:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">test</span><span class="p">(</span><span class="dl">"</span><span class="s2">Case: User opens the app and sees multiple movies</span><span class="dl">"</span><span class="p">,</span> <span class="k">async</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="c1">// helper function to load contracts from disk</span>
  <span class="kd">const</span> <span class="nx">contract</span> <span class="o">=</span> <span class="nx">loadContract</span><span class="p">(</span><span class="dl">'</span><span class="s1">home/no_movies_found.yaml</span><span class="dl">'</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">mockFetch</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MockFetch</span><span class="p">(</span><span class="nx">contract</span><span class="p">.</span><span class="nx">callChain</span><span class="p">);</span>

  <span class="k">await</span> <span class="nx">render</span><span class="p">(</span>
    <span class="o">&lt;</span><span class="nx">MemoryRouter</span> <span class="nx">initialEntries</span><span class="o">=</span><span class="p">{[</span><span class="dl">'</span><span class="s1">/</span><span class="dl">'</span><span class="p">]}</span><span class="o">&gt;</span>
      <span class="o">&lt;</span><span class="nx">App</span>  <span class="nx">fetch</span><span class="o">=</span><span class="p">{</span> <span class="nx">mockFetch</span> <span class="p">}</span> <span class="sr">/&gt;</span><span class="err">,
</span>    <span class="o">&lt;</span><span class="sr">/MemoryRouter</span><span class="err">&gt;
</span>  <span class="p">);</span>

  <span class="nx">app</span><span class="p">.</span><span class="nx">textShouldExist</span><span class="p">.</span><span class="nx">forEach</span><span class="p">((</span><span class="nx">text</span><span class="p">,</span> <span class="nx">_</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="nx">expect</span><span class="p">(</span><span class="nx">screen</span><span class="p">.</span><span class="nx">getByText</span><span class="p">(</span><span class="nx">text</span><span class="p">)).</span><span class="nx">toBeInTheDocument</span><span class="p">()</span>
  <span class="p">});</span>
  <span class="nx">expect</span><span class="p">(</span><span class="nx">screen</span><span class="p">.</span><span class="nx">getByText</span><span class="p">(</span><span class="sr">/Create Movie/i</span><span class="p">)).</span><span class="nx">toBeInTheDocument</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>To not repeat ourselves all the time I will extract all that contract loading and rendering into a separate function called <a href="https://github.com/pheymann/paulheymann-website/blob/a3a713903954208e0cd691b133fa93c5e0da3ad1/examples/cdc/app/src/cdc_tests/cdc.js#L8">runContract</a>. Now we end up with the following:</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">runContract</span><span class="p">(</span><span class="dl">"</span><span class="s2">home/multiple_movies_found.yaml</span><span class="dl">"</span><span class="p">,</span> <span class="p">(</span><span class="nx">app</span><span class="p">,</span> <span class="nx">_</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">expect</span><span class="p">(</span><span class="nx">screen</span><span class="p">.</span><span class="nx">getByText</span><span class="p">(</span><span class="sr">/Create Movie/i</span><span class="p">)).</span><span class="nx">toBeInTheDocument</span><span class="p">()</span>

  <span class="nx">app</span><span class="p">.</span><span class="nx">textShouldExist</span><span class="p">.</span><span class="nx">forEach</span><span class="p">((</span><span class="nx">text</span><span class="p">,</span> <span class="nx">_</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="nx">expect</span><span class="p">(</span><span class="nx">screen</span><span class="p">.</span><span class="nx">getByText</span><span class="p">(</span><span class="nx">text</span><span class="p">)).</span><span class="nx">toBeInTheDocument</span><span class="p">()</span>
  <span class="p">});</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Let’s take the same YAML and try to test the backend with it. We have a chain of request and response pairs. What we can do is simply run all requests through our business logic and see if it produces the expected outcome.</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">func</span> <span class="n">Test_CDC_HomeMultipleMoviesFound</span><span class="p">(</span><span class="n">t</span> <span class="o">*</span><span class="n">testing</span><span class="o">.</span><span class="n">T</span><span class="p">)</span> <span class="p">{</span>
  <span class="n">contract</span> <span class="o">:=</span> <span class="n">MustLoadCDC</span><span class="p">(</span><span class="n">cdcPath</span><span class="p">)</span>

  <span class="n">t</span><span class="o">.</span><span class="n">Logf</span><span class="p">(</span><span class="s">"Case: %s"</span><span class="p">,</span> <span class="n">contract</span><span class="o">.</span><span class="n">Name</span><span class="p">)</span>

  <span class="n">movieServiceMock</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="n">mockMovieService</span><span class="p">{</span><span class="n">movies</span><span class="o">:</span> <span class="err">???</span><span class="p">}</span>

  <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">requestAndResponse</span> <span class="o">:=</span> <span class="k">range</span> <span class="n">contract</span><span class="o">.</span><span class="n">CallChain</span> <span class="p">{</span>
    <span class="n">request</span> <span class="o">:=</span> <span class="n">httptest</span><span class="o">.</span><span class="n">NewRequest</span><span class="p">(</span>
      <span class="n">requestAndResponse</span><span class="o">.</span><span class="n">Request</span><span class="o">.</span><span class="n">Method</span><span class="p">,</span>
      <span class="n">requestAndResponse</span><span class="o">.</span><span class="n">Request</span><span class="o">.</span><span class="n">Uri</span><span class="p">,</span>
      <span class="n">cdcutil</span><span class="o">.</span><span class="n">createBodyReader</span><span class="p">(</span><span class="n">requestAndResponse</span><span class="p">),</span>
    <span class="p">)</span>

    <span class="n">cdcutil</span><span class="o">.</span><span class="n">setHeaders</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">requestAndResponse</span><span class="p">)</span>

    <span class="n">responseWriter</span> <span class="o">:=</span> <span class="n">httptest</span><span class="o">.</span><span class="n">NewRecorder</span><span class="p">()</span>

    <span class="n">ctx</span> <span class="o">:=</span> <span class="n">listmovies</span><span class="o">.</span><span class="n">Context</span><span class="p">{</span><span class="n">Movies</span><span class="o">:</span> <span class="n">movieServiceMock</span><span class="p">}</span>
    <span class="n">ctx</span><span class="o">.</span><span class="n">Handle</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>

    <span class="n">response</span> <span class="o">:=</span> <span class="n">responseWriter</span><span class="o">.</span><span class="n">Result</span><span class="p">()</span>
    <span class="n">body</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">io</span><span class="o">.</span><span class="n">ReadAll</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">Body</span><span class="p">)</span>
    <span class="n">assert</span><span class="o">.</span><span class="n">NoError</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>

    <span class="n">assert</span><span class="o">.</span><span class="n">Equal</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">requestAndResponse</span><span class="o">.</span><span class="n">Response</span><span class="o">.</span><span class="n">StatusCode</span><span class="p">,</span> <span class="n">response</span><span class="o">.</span><span class="n">StatusCode</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">requestAndResponse</span><span class="o">.</span><span class="n">Response</span><span class="o">.</span><span class="n">Type</span> <span class="o">==</span> <span class="s">"success"</span> <span class="o">&amp;&amp;</span> <span class="n">requestAndResponse</span><span class="o">.</span><span class="n">Response</span><span class="o">.</span><span class="n">Body</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
      <span class="n">cdcutil</span><span class="o">.</span><span class="n">AssertEqualInterface</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="o">*</span><span class="n">requestAndResponse</span><span class="o">.</span><span class="n">Response</span><span class="o">.</span><span class="n">Body</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
    <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="n">requestAndResponse</span><span class="o">.</span><span class="n">Response</span><span class="o">.</span><span class="n">Type</span> <span class="o">==</span> <span class="s">"error"</span> <span class="p">{</span>
      <span class="n">assert</span><span class="o">.</span><span class="n">Equal</span><span class="p">(</span>
        <span class="n">t</span><span class="p">,</span>
        <span class="n">requestAndResponse</span><span class="o">.</span><span class="n">Response</span><span class="o">.</span><span class="n">ErrorBody</span><span class="p">,</span>
        <span class="kt">string</span><span class="p">(</span><span class="n">body</span><span class="p">),</span>
        <span class="s">"error body does not match"</span>
      <span class="p">)</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>That is a mouthful. Let’s take it apart. After loading the contract file we create a mock for our movie database. Then we iterate through all the request and response pairs and evaluate if our code produces the same response as is stored in the YAML.</p>

<p>But wait. What do we put into the mock database? That is a piece of information we have to put into our contract too.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">name</span><span class="pi">:</span> <span class="s">User opens the app and sees multiple movies</span>
<span class="na">view</span><span class="pi">:</span> <span class="s">/</span>
<span class="na">database</span><span class="pi">:</span>
  <span class="na">movies</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">id</span><span class="pi">:</span> <span class="s2">"</span><span class="s">0"</span>
      <span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Harry</span><span class="nv"> </span><span class="s">Potter</span><span class="nv"> </span><span class="s">and</span><span class="nv"> </span><span class="s">the</span><span class="nv"> </span><span class="s">Sorcerer's</span><span class="nv"> </span><span class="s">Stone"</span>
      <span class="na">releaseYear</span><span class="pi">:</span> <span class="m">2001</span>
    <span class="pi">-</span> <span class="na">id</span><span class="pi">:</span> <span class="s2">"</span><span class="s">1"</span>
      <span class="na">title</span><span class="pi">:</span> <span class="s2">"</span><span class="s">Harry</span><span class="nv"> </span><span class="s">Potter</span><span class="nv"> </span><span class="s">and</span><span class="nv"> </span><span class="s">the</span><span class="nv"> </span><span class="s">Chamber</span><span class="nv"> </span><span class="s">of</span><span class="nv"> </span><span class="s">Secrets"</span>
      <span class="na">releaseYear</span><span class="pi">:</span> <span class="m">2002</span>
<span class="na">app</span><span class="pi">:</span>
  <span class="na">textShouldExist</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s">Harry Potter and the Sorcerer's Stone</span>
    <span class="pi">-</span> <span class="s">Harry Potter and the Chamber of Secrets</span>
<span class="na">callChain</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">request</span><span class="pi">:</span>
      <span class="na">uri</span><span class="pi">:</span> <span class="s">/api/movie/all</span>
      <span class="na">method</span><span class="pi">:</span> <span class="s">GET</span>
    <span class="s">...</span>
</code></pre></div></div>

<p>Now we can modify our test code like this:</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">func</span> <span class="n">Test_CDC_HomeMultipleMoviesFound</span><span class="p">(</span><span class="n">t</span> <span class="o">*</span><span class="n">testing</span><span class="o">.</span><span class="n">T</span><span class="p">)</span> <span class="p">{</span>
  <span class="n">contract</span> <span class="o">:=</span> <span class="n">MustLoadCDC</span><span class="p">(</span><span class="n">cdcPath</span><span class="p">)</span>

  <span class="n">t</span><span class="o">.</span><span class="n">Logf</span><span class="p">(</span><span class="s">"Case: %s"</span><span class="p">,</span> <span class="n">contract</span><span class="o">.</span><span class="n">Name</span><span class="p">)</span>

  <span class="n">movieServiceMock</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="n">mockMovieService</span><span class="p">{</span><span class="n">movies</span><span class="o">:</span> <span class="n">contract</span><span class="o">.</span><span class="n">Database</span><span class="o">.</span><span class="n">Movies</span><span class="p">}</span>
  <span class="o">...</span>
</code></pre></div></div>

<p>And with a little cleaning up we get the following:</p>

<div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">func</span> <span class="n">Test_CDC_HomeMultipleMoviesFound</span><span class="p">(</span><span class="n">t</span> <span class="o">*</span><span class="n">testing</span><span class="o">.</span><span class="n">T</span><span class="p">)</span> <span class="p">{</span>
  <span class="n">RunContracts</span><span class="p">(</span>
    <span class="n">t</span><span class="p">,</span>
    <span class="s">"/home/multiple_movies_found.yaml"</span><span class="p">,</span>
    <span class="k">func</span><span class="p">(</span><span class="n">r</span> <span class="o">*</span><span class="n">http</span><span class="o">.</span><span class="n">Request</span><span class="p">,</span> <span class="n">w</span> <span class="n">http</span><span class="o">.</span><span class="n">ResponseWriter</span><span class="p">,</span> <span class="n">movieService</span> <span class="n">movie</span><span class="o">.</span><span class="n">MovieService</span><span class="p">)</span> <span class="p">{</span>
      <span class="n">ctx</span> <span class="o">:=</span> <span class="n">listmovies</span><span class="o">.</span><span class="n">Context</span><span class="p">{</span><span class="n">Movies</span><span class="o">:</span> <span class="n">movieService</span><span class="p">}</span>

      <span class="n">ctx</span><span class="o">.</span><span class="n">Handle</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
    <span class="p">}</span>
  <span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>All that utility code was extracted into <a href="https://github.com/pheymann/paulheymann-website/blob/a3a713903954208e0cd691b133fa93c5e0da3ad1/examples/cdc/internal/cdc/runcontract.go#L18">RunContracts</a>.</p>

<p>That is it. Now we can simply add more YAML contracts and add those small test cases to the app and backend. Of course, you can also test different endpoints in a single contract or for example, make sure authentication is honored when doing certain operations. Those contracts do not become more complicated. Have a look at a bigger example <a href="https://github.com/pheymann/paulheymann-website/blob/a3a713903954208e0cd691b133fa93c5e0da3ad1/examples/cdc/cdc/create_movie/created.yaml">here</a>.</p>

<p>And has all that a name? Yes, <strong>Consumer Driven Contract</strong> (short: CDC) <strong>testing</strong>.</p>
<h2 id="legacy-systems">Legacy Systems</h2>
<p>In my title, I also hinted at legacy systems. Sometimes we end up with that old piece of software. Nobody knows anymore how it works, there is no test coverage whatsoever, and to be frank the code is not in a shape that we can easily add unit tests. What can we do about it?</p>

<p>Writing a full test suite will take forever and getting that through might not be feasible. So what is the next best thing? Right, specify a bunch of interactions that you know the system needs to fulfill. Over time you can add all the edge cases you discover and through that grow your coverage. That is also one of the reasons why I like CDC testing for those scenarios. It neatly follows the Pareto principle. I get 80% of the return (test coverage) for 20% of the investment (engineering time) because I only define interaction contracts on a higher level and don’t tie my tests immediately to an implementation.</p>]]></content><author><name>Paul Heymann</name></author><category term="engineering" /><summary type="html"><![CDATA[Writing tests isn’t particularly cheap so they fall down on my priority list when creating for example prototypes or MVPs. To some degree rightly so. I don’t know What I am doing yet, therefore, the How (my implementation) is changing regularly. Having to constantly add and adjust tests, a specification of something that is still in flow, feels like a drag at this point.]]></summary></entry><entry><title type="html">(Anti)Library</title><link href="https://paulheymann.de/2023/11/24/antilibrary.html" rel="alternate" type="text/html" title="(Anti)Library" /><published>2023-11-24T00:00:00+00:00</published><updated>2023-11-24T00:00:00+00:00</updated><id>https://paulheymann.de/2023/11/24/antilibrary</id><content type="html" xml:base="https://paulheymann.de/2023/11/24/antilibrary.html"><![CDATA[<p>As far back as my memory reaches as far back I see books. I remember being (more than once) an irritation to others by taking a book about fusion reactors to the beach in the spring when my family visited the eastern sea. Or sitting in my room at home and reading about the Peloponnesian War when other kids watched TV.</p>

<p>Books always accompany me, they enrich my life, and so I thought: Why not share some of their names so other people might enjoy them too? That is what this page is all about. It is a collection of titles in no particular order but with some rough classifications.</p>

<p>But more than that this page also holds a list of books I still want to read. In some sense my digital antilibrary.</p>

<h2 id="essentials">Essentials</h2>
<p>They are essential to me. They changed how I see the world and how I operate as a human being.</p>

<ul>
  <li>A Treatise of Human Nature; David Hume, 1739</li>
  <li>Meditations; Marcus Aurelius, 161-180</li>
  <li>The Wealth of Nations; Adam Smith, 1776</li>
  <li>Crime and Punishment; Fyodor Dostoyevsky, 1866</li>
  <li>War and Peace; Leo Tolstoy, 1865</li>
  <li>Debt - The first 5000 years; David Graeber, 2011</li>
  <li>Bible</li>
  <li>How to read a book; Mortimer J. Adler, 1972</li>
</ul>

<h2 id="well-rounded">Well Rounded</h2>
<p>Some I like. With some, I disagree. Some are a slug to read. But not having read them would have been a net negative.</p>

<ul>
  <li>Trotzdem Ja zum Leben sagen (Man’s search for meaning); Viktor Frankl, 1946</li>
  <li>Siddharta; Hermann Hesse, 1922</li>
  <li>Brave new World; Aldous Huxley, 1931</li>
  <li>The Stranger; Albert Camus, 1942</li>
  <li>Republic; Plato, 375 BCE</li>
  <li>The Count of Monte Cristo; Alexandre Dumas, 1844</li>
  <li>The Brothers Karamazov; Fyodor Dostroyevsky, 1879</li>
  <li>The Idiot, Fyodor Dostroyevsky, 1868</li>
  <li>The Adventures of Huckleberry Finn; Mark Twain, 1884</li>
  <li>1984; George Orwell, 1949</li>
  <li>Iliad; Homer, 8th century BC</li>
  <li>The Odyssey; Homer, 8th century BCE</li>
  <li>Mrs. Dalloway; Virgina Woolf, 1925</li>
  <li>Animal Farm; George Orwell, 1945</li>
  <li>Solaris; Stanislaw Lem, 1961</li>
  <li>The old man and the sea; Enerst Hemingway, 1952</li>
  <li>The Black Swan; Nassim Nicholas Taleb, 2007</li>
  <li>Consolations; David Whyte, 2014</li>
  <li>Histories; Herodotus, 340 BCE</li>
  <li>Romeo and Juliet; William Shakespear, 1597</li>
  <li>Hamlet; William Sharespear, 1599</li>
  <li>Die Verwandlung (The Metamorphosis); Franz Kafka, 1912</li>
  <li>In der Strafkolonie (In the Penal Colony); Franz Kafka, 1919</li>
  <li>Kabale und Liebe (Intrigue and Love); Friedrich Schiller, 1784</li>
  <li>Faust; Johann Wolfgang von Goethe, 1772</li>
  <li>The Futurological Congress; Stanislaw Lem, 1971</li>
  <li>An Anthropologiest on Mars; Oliver Sacks, 1995</li>
  <li>What’s our Problem? A Self-Help Book for Societies; Tim Urban, 2023</li>
</ul>

<h2 id="just-plain-fun">Just plain fun</h2>
<p>Not every story changes how I see the world. Some just bring me joy. They carry me to a foreign place or let me have a break. They are a small vacation.</p>

<ul>
  <li>The Lord of the Rings; J.R.R. Tolkien, 1954
    <ul>
      <li>The Fellowship of the Ring</li>
      <li>The Two Towers</li>
      <li>The Return of the King</li>
    </ul>
  </li>
  <li>Foundation Cycle; Isaac Asimov
    <ul>
      <li>Foundation; 1951</li>
      <li>Foundation and Empire; 1952</li>
      <li>Second Foundation; 1953</li>
    </ul>
  </li>
  <li>Pride and Prejudice; Jane Austen, 1813</li>
</ul>

<h2 id="didnt-age-well">Didn’t age well</h2>
<p>While publicly celebrated I find their value questionable.</p>

<ul>
  <li>Sapiens; Yuval Noah Harari, 2011
    <ul>
      <li><em>There is academic critique going around about this book (see <a href="https://aipavilion.github.io/docs/hallpike-review.pdf">here</a> for an example).</em></li>
    </ul>
  </li>
  <li>Thinking, Fast and Slow; Daniel Kahnemann, 2011
    <ul>
      <li><em>Some experimental results enumerated in his book are <a href="https://replicationindex.com/2020/12/30/a-meta-scientific-perspective-on-thinking-fast-and-slow/">proven wrong</a> by now. Besides that, I always compare his book to Hume’s Magnus Opus which isn’t particularly fair but still strikes me as astonishing that Hume uncovered many of the insights shared in Kahnemann’s book. But Hume did so already hundreds of years ago. So what I am left with is a book that stands on a shaky scientific foundation and provides me with insights that have been known for a long time.</em></li>
    </ul>
  </li>
</ul>

<h2 id="antilibrary">Antilibrary</h2>
<p>A list of my literary and academic blind spots. Books I haven’t read (yet). This list has only one goal: always be longer than all the lists above combined. My antilibrary should stay true to Aristotle’s exclamation <em>”The more you know, the more you realize you don’t know”</em>.</p>

<p>Entries marked with 📕 are already in my collection.</p>

<ul>
  <li>Lighthouse; Virginia Wolfe, 📕</li>
  <li>Trust; Hernan Diaz</li>
  <li>Wittgenstein’s Mistress; David Markson</li>
  <li>The Dawn of Everything; David Graeber, David Wengrow 📕</li>
  <li>Gödel, Escher, Bach: an Eternal Golden braid; Douglas R. Hofstadter</li>
  <li>Shogun; James Clavell</li>
  <li>East of Eden; John Steinbeck</li>
  <li>Dune; Frank Herbert</li>
  <li>Clear and Simple as the Truth: Writing Classic Prose; Noel, Turner</li>
  <li>The Hidden Life of Trees; Peter Wohlleben</li>
  <li>The Plague; Albert Camus, 1946, Robin Buss translation</li>
  <li>Der Traum vom Mond (The Dream); Johannes Kepler</li>
  <li>Jenseits von Gut und Böse; Friedrich Nietzsche</li>
  <li>On Anger; Seneca</li>
  <li>Das Kapital; Marx</li>
  <li>On the Origin of Species; Charles Darwin 📕</li>
  <li>The Categories; Aristotle, Revised Oxford Translation</li>
  <li>Leviathan; Thomas Hobbes</li>
  <li>A Thousand Brains; Jeff Hawkins</li>
  <li>The Extended Phenotype; Richard Dawkins</li>
  <li>The Selfish Gene; Richard Dawkins 📕</li>
  <li>Elements; Euclid, Heath translation</li>
  <li>The Pale King; David Foster Wallace</li>
  <li>The Picture of Dorian Grey; Oscar Wilde</li>
  <li>The Waste Land; T.S. Eliot</li>
  <li>The Natural House; Frank Lloyd Wright</li>
  <li>Tractatus Logico-Philosophicus; Ludwig Wittgenstein</li>
  <li>Principia Mathematica; Isaac Newton, 1686</li>
  <li>Phaedo; Plato</li>
  <li>Tao Te Ching; 4th century BCE</li>
  <li>Capitalism and Freedom; Milton Friedman, 1962</li>
  <li>The History of the Peloponnesian War; Thucydides, 5th century BCE</li>
  <li>City of God; St. Augustine, 5th century</li>
  <li>The Song of Roland; 11th century</li>
  <li>Niebelungenlied; 12th century</li>
  <li>The Prince; Niccolo Machiavelli, 1532</li>
  <li>Also sprach Zarathustra (Thus spoke Zarathustra); Friedrich Nietzsche, 1883</li>
  <li>Anna Katarina; Leo Tolstoy</li>
  <li>Farewell to Arms; Ernest Hemingway</li>
  <li>For Whom the Bell Tolls; Ernest Hemingway</li>
  <li>Notes from Underground; Fyodor Dostoyevsky</li>
  <li>Play, Dreams, and Imitation; Jean Piaget</li>
  <li>Enuma Elis; 900-200 BCE, Der babylonische Weltschöpfungsmythos Enuma Elisch - Kämmerer und Metzler translation</li>
  <li>Upanisads; 700-200 BCE, Oxford Classics - Pattrick Ollivelle translation</li>
  <li>The City of God, Augustine of Hippo, 5th century, Bettenson translation</li>
  <li>The Divine Names, Dionysius the Areopagite,</li>
  <li>The Incoherence of the Philosophers, al-Ghazali, 11th century</li>
  <li>The Philosophical Writings of Descartes</li>
  <li>Ethik (Ethics), Baruch de Spinoza, Gebhardt translation</li>
  <li>Candide, Voltaire, 1759, Penguin Classics</li>
  <li>Discourse on the Origins and Foundations of Inequality among Men, Rousseau</li>
  <li>Discourse on Political Economy, Rousseau</li>
  <li>On the Social Contract, Rousseau</li>
  <li>Emile, Rousseau</li>
  <li>On Writing, Steven King</li>
  <li>The Divine Comedy, Dante, 1321</li>
  <li>Name of the Rose, Umberto Eco, 1980</li>
  <li>Determined: Life without Free Will, Robert Sapolsky</li>
  <li>Three-Body Problem, Liu Cixin, 2008</li>
  <li>Paradies lost, John Milton, 1667</li>
  <li>Notes on Complexity, Neil Theise</li>
  <li>Rigor of Angels, William Eggington</li>
  <li>Excellent Advice for the Living, Kevin Kelly</li>
  <li>The New Essential Guide to Electronics in Shenzhen, https://www.bunniestudios.com/blog/?p=6886</li>
</ul>]]></content><author><name>Paul Heymann</name></author><summary type="html"><![CDATA[As far back as my memory reaches as far back I see books. I remember being (more than once) an irritation to others by taking a book about fusion reactors to the beach in the spring when my family visited the eastern sea. Or sitting in my room at home and reading about the Peloponnesian War when other kids watched TV.]]></summary></entry><entry><title type="html">Project Drivers - Distributed Ownership</title><link href="https://paulheymann.de/engineering/2023/06/23/project-driver.html" rel="alternate" type="text/html" title="Project Drivers - Distributed Ownership" /><published>2023-06-23T00:00:00+00:00</published><updated>2023-06-23T00:00:00+00:00</updated><id>https://paulheymann.de/engineering/2023/06/23/project-driver</id><content type="html" xml:base="https://paulheymann.de/engineering/2023/06/23/project-driver.html"><![CDATA[<p>So far I discussed what in my experience is (1) a good approach to software engineering projects (<em>Ready</em>, <em>Learn</em>, <em>Do</em>) and (2) how to adapt roadmap planning to leverage the experience of all members of your team. What I think is still missing is a discussion about responsibilities. Who is driving the <em>Ready</em>, <em>Learn</em>, <em>Do</em> process for a pitch we committed to? The answer to this question is part of this post.</p>

<p><img src="/assets/img/driver_bottleneck.jpeg" alt="watercolor drawing: senior people in a team are often bottlenecks" /></p>

<p>In my experience, the higher the risk the higher the seniority to own a project. While that makes sense in general it led to situations where more junior members of a team were starved out of the opportunity to learn and grow. Being responsible for something that is above your comfort zone is what pushes you to the next level.</p>

<p>There is also the bus factor. If larger or risky projects stay with a few senior people a lot of the highly critical work is dependent on them. If they are unavailable, the team starts to scramble to pick up those tasks. In the end, we siloed a lot of knowledge and experience into a few members which in my experience never ended well for the team.</p>

<p><img src="/assets/img/driver_distributed.jpeg" alt="watercolor drawing: instead you can also distribute some of the responsibility across the team" /></p>

<p>But I think it is an issue that is rather easy to fix. We already opened up roadmap planning to all members, so why not do the same for project lead responsibilities? I pitch an idea that is above my comfort zone but believe I can do it and so do other senior members of the team. In that case, I become the <em>Driver</em> and take on ownership(E1).</p>

<h2 id="responsibilities">Responsibilities</h2>
<p>But what responsibilities come with that role? It is not about building everything on your own, but it is about making sure we successfully iterate through the remaining steps of <em>Ready</em>, <em>Learn</em>, <em>Do</em>. That means a Driver makes sure:</p>

<ul>
  <li>stakeholder communication happens,</li>
  <li>reports about the state of the project are shared regularly,</li>
  <li>members of the project team know what to work on next,</li>
  <li>that the project makes the expected progress,</li>
  <li>that we do not get stuck while making decisions (tiebreaker)</li>
</ul>

<p>The Driver is also the go-to person when people outside the project have a question. In short, they act as a leader.</p>

<h2 id="read-on">Read on</h2>
<ol>
  <li><a href="/engineering/2023/06/12/ready-learn-do.html">Dealing with uncertainty: Ready, Learn, Do</a></li>
  <li><a href="/engineering/2023/06/20/pitching-ideas.html">Pitching Ideas</a></li>
</ol>

<h2 id="epilogue">Epilogue</h2>
<p>(E1): The team and its leaders have to ensure a <em>Driver</em> is set up to succeed. If we agree I drive project <code class="language-plaintext highlighter-rouge">X</code> but they know I am not up to the task, even with their help, this will be a frustrating experience for all people involved.</p>]]></content><author><name>Paul Heymann</name></author><category term="engineering" /><summary type="html"><![CDATA[So far I discussed what in my experience is (1) a good approach to software engineering projects (Ready, Learn, Do) and (2) how to adapt roadmap planning to leverage the experience of all members of your team. What I think is still missing is a discussion about responsibilities. Who is driving the Ready, Learn, Do process for a pitch we committed to? The answer to this question is part of this post.]]></summary></entry><entry><title type="html">Roadmap planning - Pitching Ideas</title><link href="https://paulheymann.de/engineering/2023/06/20/pitching-ideas.html" rel="alternate" type="text/html" title="Roadmap planning - Pitching Ideas" /><published>2023-06-20T00:00:00+00:00</published><updated>2023-06-20T00:00:00+00:00</updated><id>https://paulheymann.de/engineering/2023/06/20/pitching-ideas</id><content type="html" xml:base="https://paulheymann.de/engineering/2023/06/20/pitching-ideas.html"><![CDATA[<p><img src="/assets/img/pitch_collect_ideas.jpg" alt="watercolor drawing: every member of a team adds their ideas to the pool" /></p>

<p>When I introduced <em>Ready</em>, <em>Learn</em>, <em>Do</em> for software development (1) I left a hint of how it might also change team operations. <em>Ready</em>(ing) an idea means understanding its cost and value. So what we got is a way to transmit motivation to invest in a problem (or not). In other words, we got a pitch.</p>

<p>By using <em>Ready</em>, <em>Learn</em>, <em>Do</em> we bake roadmap planning for teams and organizations into the process. How that is done in detail is the focus of this post.</p>

<h2 id="get-ready--pitch">Get Ready … Pitch</h2>
<p>You are a Product Owner and see an opportunity for a new feature. You take a day and collect as much information as you can to construct a value proposition and a rough map of potential space (2). During the next planning, it is go-time and you present your idea. Or maybe you are an engineer on the same team and you think it is time to revamp your deployment setup. So you go ahead, take some time, and ready your pitch.</p>

<p><img src="/assets/img/pitch_vote.jpeg" alt="watercolor drawing: vote on ideas to put them in the backlog" /></p>

<p>The basic idea is that the discovery of opportunity is distributed across the team. No single lead is responsible for figuring out what comes next (E1). Instead, you leverage the experience and creativity of the team. From a junior engineer to the most senior member everyone can pitch in an idea for a project or task. Nothing is too big or too small.</p>

<h2 id="when-to-pitch">When to Pitch?</h2>
<p>In my experience, having some fixed points in your calendar is always good. Be it for 1-1s, reviews, or in this case pitching new ideas. I assume most teams have some kind of backlog refinement anyway. So why not use that? You come in, some people prepared and already shared the ideas they want to show, and now it is time to discuss them. Do you see more unknowns? Do you agree with the cost and value proposition?</p>

<p>If you agree, as a team, that it is a worthwhile effort go to the next step otherwise you, who presented the idea, put it aside. Maybe now is not the right time or there are some more points you have to consider. It could also mean that it is just not valuable enough to do which is also good to know.</p>

<h2 id="how-to-prioritize">How to Prioritize</h2>
<p>Of course, there are almost always more good ideas than time to work on them. So what do you do with the rest? Just putting it all in a backlog means you create a graveyard. The number of ideas grows and most of them are stuck in there forever. So we prioritize and remove what gets too old.</p>

<p>Is this change impacting your team, other teams, or your users? Is its effort low or high? Is the impact low or high? There are rough qualitative measures that tell you where to place a task or project in value space.</p>

<p><img src="/assets/img/pitch_value_space.jpeg" alt="watercolor drawing: locate your idea in value space to properly prioritize it" /></p>

<p>Is feature <code class="language-plaintext highlighter-rouge">A</code> impacting your users a lot but to make it work will take months? We should probably do it but maybe focus on <code class="language-plaintext highlighter-rouge">B</code> first which is a low-hanging fruit in comparison. Or maybe you do some high-impact work that improves how you operate as a team.  For me, there is no clear-cut rule on how to decide what is most important. In the end, it depends on your team’s context and it is something you have to reevaluate every time.</p>

<p>Based on that classification you can order your work and from here everyone just starts to pick from the top.</p>

<p><img src="/assets/img/pitch_remove_old_ideas.jpg" alt="watercolor drawing: remove ideas that get too old" /></p>

<p>To address the graveyard problem we just have to add one constraint to this structure. Whatever gets older than <code class="language-plaintext highlighter-rouge">X</code> months is removed. What <code class="language-plaintext highlighter-rouge">X</code> you feel comfortable with depends on you. Maybe you move fast and 3 months is your limit. Or you are a bit more conservative and aim for 12 months instead. Whatever it is make it explicit and stick to that rule (E2).</p>

<h2 id="pitching-upwards">Pitching upwards</h2>
<p>As long as tasks stay small deciding within your team what to work on is fine but what if you try to commit to some months-long journey or you do need the support of other teams? In that case, you have to pitch upwards. If it is affecting your domain address the domain lead. If it is even bigger they have to bubble it up to the highest rank appropriate (E3).</p>

<p>And then there are those really large projects that are often shifts in how the product or company works. Often they come from the top and ripple down the organization. But at the beginning, I said that pitching allows a team to leverage the experience of all members. I believe the same is true for your whole organization. Why not open up the floor for big ideas for everyone and not just senior leadership?</p>

<p>What would need to change is to have some fixed point in your calendar where everyone can book a 5min slot to present their idea. From leadership to junior members. What counts is your idea and not your rank. Of course, that also requires that decision-makers join those meetings and are willing to commit time to ideas that look promising. The hurdle to do that should be lower tho when <em>Ready</em>, <em>Learn</em>, <em>Do</em> is applied.</p>

<p>Unfortunately, that last process I haven’t experienced or seen implemented anywhere so far but it is an idea I would like to try out at some point.</p>

<p>Coming to an end, the result of the <em>Ready</em> phase should be a pitch for your idea. A summary of the unknowns, costs, and values that could be gained. You might just do that in 10min because it is a small thing, or you want to go big and prepare a “real” pitch deck. In the end, the idea is that everyone can participate in setting the course of their team and organization.</p>

<h2 id="read-on">Read on</h2>
<ol>
  <li><a href="/engineering/2023/06/12/ready-learn-do.html">Dealing with uncertainty: Ready, Learn, Do</a></li>
  <li><a href="/engineering/2023/06/04/potential-space.html">Potential Space</a></li>
  <li><a href="/engineering/2023/06/23/project-driver.html">Project Driver</a></li>
</ol>

<h2 id="epilogue">Epilogue</h2>
<p>(E1): They are still accountable tho. They have to make sure the team goes in the right direction. Now they just open up the floor for those kinds of discussions to all members.</p>

<p>(E2) Now you might say “But don’t we lose good ideas which we might implement later on?”. Maybe. In my experience, if it really is a good idea or issue that needs resolution, it comes back later anyway just that the context changed in a way that we can actually invest time in it.</p>

<p>Or it isn’t as worthwhile as you believe. If a task stays in your backlog for let’s say 12 months untouched is it really that valuable?</p>

<p>What I have soon almost everywhere is a backlog with hundreds of items and nobody really has an overview anymore of what is going on. So you go back and slug through the whole thing every now and then to figure out what is still needed. To me that was always more a distraction than it helped.</p>

<p>(E3): Before you pitch up make sure to pitch your idea within your team. That way you gain early feedback and the backing of your team when it comes to bringing it to the next level. Otherwise, there is a good chance that your pitch isn’t tuned in enough and might not receive the full appreciation.</p>

<p>As an aside, leads of a team, domain, etc should be responsible to figure out if a pitch needs buy-in from more senior leadership.</p>]]></content><author><name>Paul Heymann</name></author><category term="engineering" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Emerging Dragon</title><link href="https://paulheymann.de/thought/2023/06/12/emerging-dragon.html" rel="alternate" type="text/html" title="Emerging Dragon" /><published>2023-06-12T00:00:00+00:00</published><updated>2023-06-12T00:00:00+00:00</updated><id>https://paulheymann.de/thought/2023/06/12/emerging-dragon</id><content type="html" xml:base="https://paulheymann.de/thought/2023/06/12/emerging-dragon.html"><![CDATA[<p>He is the beast of chaos living deep within.</p>

<p>A marriage to hope and fear<br />
That it may not sleep forever.<br />
You pushed yourself too hard,<br />
Lost control,<br />
Look at its rearing head.</p>

<p>How magnificent its emergence</p>

<p>Out of order.</p>

<p>So sudden</p>

<p>Breaking through understanding,<br />
Ripping it apart,<br />
Losing knowing altogether.</p>

<p>Swallowing you alive,<br />
Flooding your world with chaos,<br />
And for that, you pay a bitter price.</p>

<h2 id="read-on">Read on</h2>
<ul>
  <li><a href="/thought/2022/12/01/dragon.html">Dragon</a></li>
</ul>]]></content><author><name>Paul Heymann</name></author><category term="thought" /><summary type="html"><![CDATA[He is the beast of chaos living deep within.]]></summary></entry><entry><title type="html">Navigating Uncertainty in Software Engineering - The Ready-Learn-Do Approach</title><link href="https://paulheymann.de/engineering/2023/06/12/ready-learn-do.html" rel="alternate" type="text/html" title="Navigating Uncertainty in Software Engineering - The Ready-Learn-Do Approach" /><published>2023-06-12T00:00:00+00:00</published><updated>2023-06-12T00:00:00+00:00</updated><id>https://paulheymann.de/engineering/2023/06/12/ready-learn-do</id><content type="html" xml:base="https://paulheymann.de/engineering/2023/06/12/ready-learn-do.html"><![CDATA[<p>Now that I have written a bit more on the abstract side with Potential Space (1) and Leadership and Management (2) I want to have a look at how to actually navigate through that space and towards a solution.</p>

<p>In the beginning, we don’t have the full picture yet and the number of possible solutions is huge. Therefore our goal has to be to narrow down that space. For that, we first have to get <em>Ready</em>.</p>

<h2 id="ready">Ready</h2>
<p>This step is about doing one’s homework. We have to understand what kind of problem we are dealing with. In the end, we should have a rough map of the terrain.</p>

<p><img src="/assets/img/ready_learn_do_1.jpeg" alt="watercolor drawing: Ready - potential space with many paths and solutions" /></p>

<p>What does that mean in practice? Gather information and write them down. Talk to people who know, watch videos, read texts, and understand code. Do whatever is necessary to understand the problem but keep in mind to not waste too much time on it. In my experience, work that is heavy on learning and discovery tends to eat all your time and then some, therefore, commit to a deadline. Your understanding doesn’t have to be perfect. A rough sketch of potential space is enough for now.</p>

<p>By now you should know the following:
	* Is this problem solvable? Is there a potential path?
	* Is it worthwhile? What would change for the better and how?
	* What isn’t clear yet?
	* What guardrails exist?
	* What decisions need to be done?
	* Who are your stakeholders?
	* What are your resources?</p>

<p>And with that, we reached the first decision point. After you wrote down your findings you, your team, or the organization have to make a decision if it makes sense to invest more time into this endeavor.</p>

<h2 id="learn">Learn</h2>
<p>Once you got the go take all your findings and fill in the holes and again we commit to a deadline.</p>

<p><img src="/assets/img/ready_learn_do_2.jpeg" alt="watercolor drawing: Learn - potential space gets less noisy. Solutions and paths disappear" /></p>

<p>The point of this step is to narrow down potential space even more so we end up with a handful of paths or even just one toward a solution. It is about resolving assumptions and unknowns and reducing risk (aka surprises). It is also another hurdle to check if we actually focus on the right thing.</p>

<p>For that we build cheap prototypes we throw away in the end. We also talk to people again to remove decision points we identified while we got <em>Ready</em> or showed up in the meantime.</p>

<p>By the end of <em>Learn</em> you should know the following:
	* What does the solution look like?
	* How do we get there?
	* How much time will it roughly take?
	* What will change for the better and how?</p>

<p>You should also have all the necessary resources at this point. That can be a budget, help from other teams, access, etc.</p>

<p>Another decision point is reached. Do we still want to continue? Is it worth our time?</p>

<h2 id="do">Do</h2>
<p>If the answer is still “yes“ we go right into the last phase: <em>Do</em>. Here, we will create the actual solution. But keep in mind to track new unknowns that pop up in the meantime. It has to be transparent to you and everyone else if we misjudged the terrain and have to do more and more <em>Learn</em>(ing). If that is the case, a reevaluation is due, and a decision of whether we still want to continue.</p>

<p><img src="/assets/img/ready_learn_do_3.jpeg" alt="watercolor drawing: Do - potential space is reduced to a single solution and a handful of paths" /></p>

<p>To make sure we have that transparency we report state on a regular basis, for example, every week on a certain day. There is a balance to be struck about the frequency here. Feel out what works for you.</p>

<p>Another signal we get is when we reach the estimated end of the project. Did we finish it already? Will it be done in time or do we miss the mark and have to continue? Coming closer to the end the answer shouldn’t be a surprise if we had regular reports. Now we have yet another decision point. And don’t fall for the lure of sunken cost. It can still be better to just stop and accept that it didn’t work out instead of hemorrhaging more and more of your time. You learned something and that has to be enough.</p>

<p>But let’s assume it all worked out in the end and you get your solution. You are not done yet. It still has to be rollout and you have to prove that this effort was worthwhile. Here, the question “What will change for the better and how?” comes in handy. Release your solution to your users and measure what happens. Did it work? This is yet another important signal. For one, it gives the final validation for our value proposition. But it also tells us if our process works correctly.</p>

<p>If we didn’t make it rinse and repeat. Ready yourself and make a point that it is worthwhile to continue and sketch out a new potential space.</p>

<h2 id="apply-it-everywhere">Apply it Everywhere</h2>
<p>I used this or similar approaches for different-sized work and at different stages. For example, when you want to fix something which you think takes you roughly 2 days you might hit up a colleague and discuss the What, How, and Why. That might take 15min and you covered your get <em>Ready</em> part. Now you answer those remaining questions like “How can I reproduce the issue in a test?” (“Learn”) and finally you fix it (“Do”). All the while you set yourself some time limits.</p>

<p>And then you have those large projects that take months to finish. The same approach applies now just on multiple levels. While your project itself goes through those phases you will work on different tasks or sub-projects all in their own state. You can repeat that down to a single task.</p>

<p>Another thing where you can apply it is in “normal” team operations. Instead of the usual refinement, why aren’t you picking up on some idea you had and making it ready? When you meet, show your sketch; when it sticks, let’s move into <em>Learn</em> and <em>Do</em>. This way everyone can contribute to the roadmap and influence where the team goes.</p>

<p>This is just to say it is turtles all the way down. I think you can apply the same approach on many levels successfully.</p>

<p>To wrap it up, to better deal with uncertainty and its symptoms like feature creep or never-ending projects <em>Ready, Learn, Do</em> might be a good path out of this hole. It limits the time you invest and gives you as a team transparency where you are at any moment.</p>

<p>Do you think that makes sense? Does this approach bring something new to the table? Let me <a href="/imprint.html">know</a></p>

<h2 id="read-on">Read on</h2>
<ol>
  <li><a href="/engineering/2023/06/04/potential-space.html">Potential Space</a></li>
  <li><a href="/engineering/2023/06/04/leadership-and-management.html">Leadership and Management</a></li>
  <li><a href="/engineering/2023/06/20/pitching-ideas.html">Idea Pitches</a></li>
</ol>]]></content><author><name>Paul Heymann</name></author><category term="engineering" /><summary type="html"><![CDATA[Now that I have written a bit more on the abstract side with Potential Space (1) and Leadership and Management (2) I want to have a look at how to actually navigate through that space and towards a solution.]]></summary></entry></feed>