<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Martini Labs Blog</title>
        <link>https://www.martini-labs.de/blog</link>
        <description>Insights, Tutorials und Geschichten aus der fabelhaften Welt des Codes</description>
        <lastBuildDate>Mon, 30 Mar 2026 14:10:19 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>de</language>
        <image>
            <title>Martini Labs Blog</title>
            <url>https://www.martini-labs.de/images/logo-full.webp</url>
            <link>https://www.martini-labs.de/blog</link>
        </image>
        <copyright>© 2026 Martini Labs GmbH</copyright>
        <item>
            <title><![CDATA[High-Tech Transfer: Warum wir mit dem „Schwälmer Softwarehaus“ ein regionales Produkt-Label starten]]></title>
            <link>https://www.martini-labs.de/#/blog/schwaelmer-softwarehaus</link>
            <guid isPermaLink="false">https://www.martini-labs.de/#/blog/schwaelmer-softwarehaus</guid>
            <pubDate>Mon, 29 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Enterprise-Architektur trifft auf den lokalen Mittelstand. Wie wir unsere Expertise aus Großprojekten nutzen, um regionale Digitalisierung neu zu denken.]]></description>
            <content:encoded><![CDATA[<p>Bei <strong>Martini Labs</strong> beschäftigen wir uns täglich mit komplexen Herausforderungen: Hochverfügbarkeit, Datensicherheit und skalierbare Architekturen für Enterprise-Kunden und den öffentlichen Sektor. Das ist unsere DNA. Wir bauen Lösungen, die unter hoher Last stabil laufen müssen.</p><p>Doch wir haben eine Marktlücke identifiziert, die technologisch oft vernachlässigt wird: Der regionale Mittelstand.</p><p>Oft stehen kleine und mittlere Unternehmen (KMU) vor der Wahl zwischen starrer Standard-Software, die nicht passt, und teuren Agentur-Lösungen, die das Budget sprengen. Professionelle Software-Architektur und moderne Sicherheitsstandards sind oft den "Großen" vorbehalten.</p><p>Wir sind der Meinung: Das muss sich ändern.</p><h2>Launch des „Schwälmer Softwarehauses“</h2><p>Deshalb freuen wir uns, den Start unseres neuen Labels <strong>Schwälmer Softwarehaus</strong> bekannt zu geben.</p><p>Diese neue Marke fungiert als dedizierte Schnittstelle für regionale Kunden hier in Nordhessen. Das Ziel ist ein direkter Technologietransfer: Wir nehmen die Methoden, Sicherheitsstandards und die Stabilität, die wir bei Martini Labs für Enterprise-Kunden entwickelt haben, und kondensieren sie in pragmatische, effiziente Produkte für das lokale Gewerbe.</p><h2>Aus Projekten werden Produkte</h2><p>Während Martini Labs weiterhin für technologische Exzellenz und komplexe Problemlösungen steht, fokussiert sich das Schwälmer Softwarehaus rein auf operative Exzellenz im KMU-Bereich. Wir verpacken unsere "Enterprise-Power" in nutzerfreundliche Werkzeuge.</p><p>Das bedeutet für unsere Kunden vor Ort:</p><ul><li><strong>Sicherheit:</strong> Enterprise-Grade Security auch für kleine Teams.</li><li><strong>Stabilität:</strong> Robuste Architekturen statt "Bastel-Lösungen".</li><li><strong>Effizienz:</strong> Automatisierungstechnologien, die bisher Konzernen vorbehalten waren.</li></ul><h2>Ein Bekenntnis zum Standort</h2><p>Martini Labs operiert digital und überregional. Doch mit dem Schwälmer Softwarehaus stärken wir bewusst unseren physischen Standort. Wir glauben, dass echte digitale Transformation im Mittelstand nicht nur Code braucht, sondern auch Verständnis für lokale Wirtschaftskreisläufe und persönliche Ansprechpartner.</p><p>Wir sind gespannt auf die Synergien, die zwischen High-Tech-Forschung und pragmatischer Anwendung entstehen werden.</p><p><em>Erfahrt mehr über die neue Initiative unter: <a href="https://schwaelmer-softwarehaus.de" target="_blank">schwaelmer-softwarehaus.de</a></em></p><p>Oder guckt euch das <a href="/projekte#schwaelmer-softwarehaus">Projekt in unserem Portfolio</a> an.</p>]]></content:encoded>
            <author>contact@martini-labs.de (Martini Labs)</author>
            <enclosure url="https://www.martini-labs.de/images/blog/schwaelmer-softwarehaus.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Debugging your company. Oder wie du den richtigen Flaschenhals findest]]></title>
            <link>https://www.martini-labs.de/#/blog/debuggen-deines-unternehmens</link>
            <guid isPermaLink="false">https://www.martini-labs.de/#/blog/debuggen-deines-unternehmens</guid>
            <pubDate>Mon, 28 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Das dringendste Problem ist selten das wichtigste, genauso wie eine Error-Message selten die Fehlerursache zeigt.]]></description>
            <content:encoded><![CDATA[<p>Das gilt für die Aufgaben-Priorisierung nach der Eisenhower-Matrix, fürs Debuggen deines Source-Codes, aber genauso auch für das Arbeiten an deinemUnternehmen - sprich dessen Wachstum.</p><p>Es gibt immer eine Engstelle, die das weitere Vorankommen maximal ausbremst. Das dringendste Problem ist aber üblicherweise nicht das Ursächliche.</p><blockquote>Das dringendste Problem ist selten die Ursache für Stagnation.</blockquote><p>Zudem ist Ansatz sich immer auf die dringendsten Probleme zu stürzen nur eine Form der Symptombekämpfung [→ <a href="/blog/losungen-und-probleme">Lösungen und Probleme</a>].</p><p>Für dein Unternehmen hießt das: “Ok, ich kann also nicht skalieren, weil ich an den falschen Problemen arbeite. Beim Debuggen ist das relativ einfach, ich muss nur nachvollziehen wo und welche Daten wo lang fließen und stoße zwangsläufig auf eine Stelle, an der irgendwas nicht passt - Fehler gefunden. Aber wie finde ich bitte heraus welches der ursächliche Flaschenhals für mein persönliches oder mein Unternehmenswachstum ist?”</p><p>Das ist so einfach wie es schwer ist. Oder anders gesagt, mit der richtigen Methode wird es relativ einfach das herauszufinden.</p><p>Okay, du fragst dich jetzt sicher: "Ja ok, die richtige Methode. Aber wie zum Teufel soll die denn funktionieren?" </p><p>Keine Sorge, ich hab da was für dich. Es ist wie eine Schatzsuche, nur dass der Schatz dein größtes Wachstumshindernis ist. Klingt komisch? Ist es auch, aber es funktioniert.</p><p><strong>Hier ist dein Fahrplan zur Ursachenforschung:</strong></p><p>1. Brainstorming deluxe: Schnapp dir einen Stapel Post-its und schreib ALLE Probleme auf, die dir einfallen. Ja, wirklich alle. Von "Kaffee ist alle" bis "Umsatz stagniert" - alles muss raus.</p><p>2. Sherlock Holmes Time: Jetzt wird's spannend. Für jedes Problem fragst du dich: "Warum passiert das?" Sei wie ein neugieriges Kleinkind und hinterfrage alles.</p><p>3. Verbinde die Punkte: Hier kommt dein innerer Verschwörungstheoretiker zum Einsatz. Zieh Linien zwischen den Problemen und ihren Ursachen. Du wirst sehen: Viele Wege führen nach Rom, oder in diesem Fall zu einer Handvoll Kernursachen.</p><p>4. Ursachen-Tetris: Jetzt wird geclustert. Bring ähnliche Ursachen zusammen, als würdest du ein Puzzle legen. Am Ende hast du weniger, dafür dickere Ursachen-Brocken.</p><p>5. Inception der Problemlösung: Wir gehen tiefer. Frag dich für jede Ursache: "Und warum ist DAS so?" Du bist jetzt im Ursachen-Kaninchenbau.</p><p>6. Rinse and Repeat: Mach das Ganze nochmal. Und nochmal. Bis du nur noch eine Mega-Ursache übrig hast, die sich anfühlt wie der Endgegner in einem Videospiel.</p><p>Klingt nach viel Arbeit? Ist es auch. Aber hey, niemand hat gesagt, dass Unternehmenswachstum ein Spaziergang ist. Diese Methode ist wie eine Zeitreise in die Zukunft deines Unternehmens. Du siehst nicht nur die Symptome, sondern kriegst einen Röntgenblick für die wahren Knackpunkte.</p><p>Am Ende stehst du da mit DER Ursache in der Hand. Es fühlt sich an, als hättest du den heiligen Gral gefunden - nur dass dieser Gral dir sagt, woran du wirklich arbeiten musst, um voranzukommen.</p><p>Also, Ärmel hochkrempeln und los geht's! Dein Unternehmen wird es dir danken, wenn du nicht mehr wie ein kopfloses Huhn von einem dringenden Problem zum nächsten rennst, sondern gezielt den Finger in die richtige Wunde legst. Und wer weiß, vielleicht findest du dabei sogar heraus, warum der Kaffee wirklich immer alle ist.</p><p>‍</p>]]></content:encoded>
            <author>contact@martini-labs.de (Martini Labs)</author>
            <enclosure url="https://www.martini-labs.de/images/blog/debugging-hero.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[How to fuck up a software project 🤯]]></title>
            <link>https://www.martini-labs.de/#/blog/how-to-fuck-up-a-software-project</link>
            <guid isPermaLink="false">https://www.martini-labs.de/#/blog/how-to-fuck-up-a-software-project</guid>
            <pubDate>Mon, 28 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Tipps und Tricks für ein erfolgreiches Projekt!! (nicht)]]></description>
            <content:encoded><![CDATA[<h1>Wie man ein Software-Projekt vor die Wand fährt</h1><p>🤷‍♂️ Warum müssen Software-Projekte eigentlich immer erfolgreich sein?</p><p>💡 Ein Projekt erfolgreich abschließen kann jeder, das ist maximal langweilig. Also warum nicht mit minimalem Aufwand und ein bisschen Geschick das Projekt komplett vor die Wand fahren?</p><p>❓ Wie schaffe ich es als Verantwortlicher mein Projekt zu verkacken?</p><p>☝️🧐 Dieser Frage möchte ich in diesem Artikel auf den Grund gehen.</p><h1>Mindset</h1><p>Der Kunde hat keine Ahnung - von nichts, kann nichts und liegt immer falsch - aber wird das niemals einsehen. Vermeide es gemeinsam mit ihm Lösungen zu erarbeiten, ihr könntet Gefahr laufen Missverständnisse aufzudecken.</p><h3>Keine Enterprise-Patterns!</h3><p>Das Sind nur alles nur leere buzz words! Es gibt keine wiederkehrende Arten von Problemen, oder gar Lösungsansätze die sich auf ähnliche Probleme adaptieren ließen. Jedes Problem muss von Grund auf als einzigartig von vorher nie dagewesen angesehen werden.</p><h1><strong>Vorbereitung</strong></h1><ol><li>Sorge dafür, dass bei den Stakeholdern und dir selbst KEIN Konsens über das Projektziel besteht. Jeder Beteiligte sollte eine unterschiedliche Vorstellung von den Anforderungen haben. So legst du den Grundstein für Missverständnisse, auseinanderlaufende und widersprüchliche Anforderungen.</li><li>Starte so schnell wie möglich mit der Implementierung und Verschwende keine Zeit mit, zB:some text<ul><li>Machbarkeitsstudien</li><li>Wireframes/Mockups/Klickdummy</li><li>Prototypen</li><li>Du könntest sonst Probleme vermeiden, die das Projekt später zuverlässig torpedieren können.</li></ul></li></ol><h1><strong>Fundament</strong></h1><ol><li>Mach dir keine Mühe vor der Implementierung die Architektur der Anwendung zu gestalten. Das würde zu einer stabilen Basis führen, die spätere Fehler großzügig verzeiht und die Umsetzung beschleunigt.</li><li>Vergiss CI/CD-Pipelines!some text<ol><li>Deine Tests und Deployments in einer robusten Pipeline zu automatisieren würde dir nicht enorm viel manuelle Arbeit ersparen. Was aber noch viel schlimmer ist, wertvolle Bugs würden es nicht mehr in die Produktiv-Umgebung schaffen.</li><li>Vermeide Automatisierungen ganz besonders beim Deployment. Wenn euer Code per FTP ins Prod-System geladen wird, und nur eine einzige Person die Zugänge dazu hat, spielt ihr in der Königsklasse.</li></ol></li><li>Benutze niemals gut erprobte und dokumentierte externe Libraries! Es reicht nicht aus das Rad neu zu erfinden. Erfinde auch das Werkzeug neu um ein neues Rad zu Erfinden! Not invented here? No thanks!</li><li>Es ist viel zu einfach Linter und Prettifier zu benutzen. Lass diene Entwickler:innen ihren Code formatieren wie sie wollen. Umso länger und kompliziert die Zeile, &nbsp;umso besser! Methoden sollten möglichst nicht weniger als 200 Zeilen und 7 Einrückungsstufen haben.</li></ol><h1><strong>Rahmenbedingungen</strong></h1><ol><li>Erstelle KEINE User-Stories oder Tasks. Beschreibe das Ziel so wage und triff so viele Annahme wie möglich. Mach das unter der Prämisse, dass alle Entwickler den gleichen Wissensstand haben wie du selbst und ihr daher alle die gleichen Schlussfolgerungen trefft. So werden alle Feature garantiert falsch umgesetzt und du sorgst für ein Höchstmaß an Rückfragen und Missverständnissen.</li><li>Lass alle Entwickler selbst herauszufinden, welche Tasks, wie umzusetzen sind. Anderenfalls wüssten sie genau was, wann, wie zu tun ist und ihre Produktivität könnte sich vervielfältigen.</li><li>Lehne Komplexitäts-Schätzungen kategorisch ab. Zeit-basierte Schätzungen erhöhen den Druck auf die Entwickler, täuschen dem Kunden Sicherheit vor und können bei größeren Projekten garantiert nicht eingehalten werden.</li></ol><h1>Allgemeine <strong>Vorgehensweise</strong></h1><ol><li>Versuche auf keinen Fall einen Überblick des Projekts, dessen Stand oder den Stand der Entwickler zu behalten, sonst läufst du Gefahr frühzeitig Engpässe zu erkennen und könntest diese dem Kunden gegenüber kommunizieren oder gar auflösen.<strong>Bonus:</strong> dadurch kannst du ganz leicht allen (neuen) Beteiligten eine falsche Auskunft über den Fortschritt des Projekts geben. So hast du es auch sehr leicht Externe, die das Projekt retten sollen, unter der Angabe falscher Voraussetzungen mit rein zu holen.</li><li>Setze ausschließlich unerfahrene Entwickler auf die grundlegenden Teile des Systems an - sprich System- und Software-Architektur. So garantierst du maximale Instabilität, sowie komplizierten, redundanten und unstrukturierten Code, der genauso schwer zu lesen, wie zu warten oder zu erweitern ist.</li><li>Dein Prozess und deine Vorgehensweise sind perfekt. Schuld an Problemen hat entweder der Entwickler, weil er anders denkt als du (siehe Punkt 3.a) oder der Kunde, weil er unsinnige Anforderungen hat (siehe Punkt 1.a).</li></ol><h1><strong>Umsetzung/Durchführung</strong></h1><ol><li>Benutze KEINE Standard-Bibliotheken oder Frameworks bei der Umsetzung. Das würde die Produktivität nur unnötig steigern.</li><li>Sorge dafür dass Wissens-Inseln entstehen. Alle Entwickler sollten nur ihren eigenen kleinen Teil der Software kennen und keine Zeit in den Wissenstransfer verschwenden. Das würde zu unerwünschten Synergie-Effekten führen oder Entwickler sogar austauschbar machen, für den Fall dass sie mal ausfallen.</li><li>Eine verlässliche Methode um Punkt 2) zu erreichen ist das Verbot von Reviews.</li><li>Lass nicht zu, dass APIs geplant oder gar dokumentiert werden. So können nette Pläusche zwischen den Front- und Backend-Entwicklern entstehen und du kannst sie davon abhalten produktiv zu sein. Im Optimalfall können APIs und Calls zu diesen sogar stark auseinander laufen.</li><li>Alle Beteiligten (Entwickler, Stakeholder, Domänenexperten, Kunden, ...) sollten so viel und unabhängig voneinander wie möglich kommunizieren. Das garantiert Missverständnisse und generiert ein Höchstmaß an unproduktiver Zeit.</li><li>Die Ergebnisse aus 5) sollten auf keinen Fall dokumentiert werden. Anderenfalls könnten mehrfache Absprachen oder gar auseinander laufende Ergebnisse verhindert werden.</li><li>Verbiete Dailies und Absprachen jeglicher Art zwischen mehreren Entwicklern. In Kombination mit dem Verbot von Ticket-Systemen schaffst du ideale Voraussetzungen für doppelte parallele Arbeit.</li><li>Delegieren/Beauftragen: Hat dein Kunde Sonderwünsche, lass diese nur soweit implementieren, wie deine Entwickler sagen können: “Works on my machine... 🤷‍♂️”</li><li>Tests führen nur unnötigerweise dazu, dass Fehler frühzeitig erkannt werden.</li><li>Verbiete, wie in 2.4) erwähnt, den Einsatz von Lintern, Prettifiern oder sonstigen Tools, die mit einfachen Mitteln helfen Konventionen einzuhalten. So schaffst du ausreichend Streitpotenzial über Code-Style und beugst zusätzlich Reviews vor, weil niemand Lust hat das Kauderwelsch der anderen zu lesen.</li><li>Kaum etwas sorgt so zuverlässig für einen Misserfolg im Projekt wie das tägliche umwerfen des Projektplans und reinschieben neuer Aufgaben, während noch an Features gearbeitet wird. Erziehe auch deinen Kunden dahingehend, dass er unentwegt neue Anforderungen mit oberster Priorität generiert. So wird dir/euch die Arbeit nie ausgehen.</li><li>Keine der obigen Anstrengungen werden jedoch von Misserfolg gekrönt sein, wenn deine Entwickler durchgängig konzentriert arbeiten können. Es dauert im Schnitt ca. 20 Minuten bis man sich gut in ein Problem eingedacht hat und produktiv programmieren kann. Erzeuge für deine Entwickler mindestens alle 30 Minuten eine größere Ablenkung, so dass sie aus ihrer Konzentration rausgerissen werden.</li></ol><p>Vielen Dank für die Aufmerksamkeit. Kritik, Ergänzungen und Anregungen sind erwünscht. </p><p>Dieser Artikel könnte Spuren von Sarkasmus hinerlassen haben - folgen Sie diesen. Sie könnten ins Licht führen.</p><h2>‍</h2>]]></content:encoded>
            <author>contact@martini-labs.de (Martini Labs)</author>
            <enclosure url="https://www.martini-labs.de/images/blog/while-true-drive.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Die Liebe Bürokratie]]></title>
            <link>https://www.martini-labs.de/#/blog/die-liebe-burokratie</link>
            <guid isPermaLink="false">https://www.martini-labs.de/#/blog/die-liebe-burokratie</guid>
            <pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Eine Unternehmensgründung dauert zwar dank der Mühlen der Bürokratie ewig... aber es ist geschafft!]]></description>
            <content:encoded><![CDATA[<h1>August → September → Oktober → November</h1><p>So lange kann es dauern in Deutschland ein Unternehmen zu Gründen. Ich könnte jetzt hier einen endlosen Behörden-Rant vom Zaun brechen, stattdessen habe mich dazu entschlossen mich zu freuen.</p><p>Na jedenfalls ist die Martini Labs GmbH endlich im Handelsregister eingetragen!!! </p><p>Also, los gehts:</p><p>‍</p><pre></pre><p>‍</p><h1>🎉🎊🥳🎊🎉</h1><figure class="w-richtext-figure-type-video w-richtext-align-fullwidth" style="padding-bottom:75%" data-rt-type="video" data-rt-align="fullwidth" data-rt-max-width="" data-rt-max-height="75%" data-rt-dimensions="640:480" data-page-url="https://www.youtube.com/watch?v=DOkdccLCmJk"><div><iframe allowfullscreen="true" frameborder="0" scrolling="no" src="https://www.youtube.com/embed/DOkdccLCmJk" title="The Ren & Stimpy Show - Happy Happy Joy Joy"></iframe></div></figure>]]></content:encoded>
            <author>contact@martini-labs.de (Martini Labs)</author>
            <enclosure url="https://www.martini-labs.de/images/blog/buerokratie-hero.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Love it, leave it or change it: eine Fallstudie]]></title>
            <link>https://www.martini-labs.de/#/blog/love-it-leave-it-or-change-it-ne-fallstudie</link>
            <guid isPermaLink="false">https://www.martini-labs.de/#/blog/love-it-leave-it-or-change-it-ne-fallstudie</guid>
            <pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Eine Architekturentscheidung stellt sich als desaströs heraus. Was jetzt?]]></description>
            <content:encoded><![CDATA[<p>Der beste Zeitpunkt für eine (Um-)Entscheidung ist immer genau “jetzt”. Auch wenn es schwer fällt, sich oder dem Team eingestehen zu müssen, dass der bisherige Weg ein durchaus schlechter war. Bei großen Software-Projekten können da durchaus 7-stellige Beträge auf dem Spiel stehen.</p><h2>Gibt es ein “zu spät” um eine schlechte Entscheidung zu revidieren?</h2><p>Bzw., was passiert wenn im laufenden Projekt festgestellt wird, dass eine weitreichende Architekturentscheidung, die eingangs getroffen wurde, falsch war?</p><p>Wir betrachten hier ein Szenario, bei dem es genau um eine solche Entscheidung ging.</p><h2>Szenario (Problem):</h2><ul><li>Eine Single-Page-Application wurde ohne richtiges Framework umgesetzt.</li><li>Stattdessen sollten nur mit Stencil erstelle WebComponents benutzt werden.</li><li>Übliche Framework-Funktionen fehlten (State-Management, Event-Handling, Data-Binding, ...).</li><li>Es wurde viel eigener Code geschrieben, um einige dieser Funktionen nachzubilden.</li><li>Eine flexible und erweiterbare Komponenten-Library war nicht vorhanden.</li><li>Es mussten eigene Frontend-Komponenten gebaut werden, um die WebComponents zu handhaben.</li><li>Das Gros der User-Stories war noch offen.</li><li>Die Velocity war viel zu gering, um das Projekt auch nur ansatzweise zum geforderten Zeitpunkt abschließen zu können.</li></ul><h2>Aufgabe (Ziel):</h2><p>Das Projekt soll sowohl monetär, als auch temporal im Budged bleiben. </p><p><strong>Sprich:</strong></p><p>→ Prod-Deployment + Feature Complete in 4 Monaten</p><p>→ Abschluss und Veröffentlichung in 6 Monaten</p><p><strong>Zwei Möglichkeiten:</strong></p><ol><li>So weitermachen wie bisher:<ul><li>Nachimplementierung von Framework-Features.</li><li>Anpassung der vorhandenen WebComponents (durch das separate zuständige Team).</li><li>Beides sehr zeitaufwändig und fehleranfällig.</li><li>Beides muss aufwändig getestet werden.</li><li>Weiterhin großer Aufwand beim Umsetzen der restlichen User-Stories mit niedriger Velocity</li></ul></li><li>Vollständige Neuimplementierung unter Verwendung eines etablierten Frameworks:<ul><li>Feature-Freeze über 2 Sprints</li><li>Einführung des Frameworks, samt Linter, Prettier, Konfiguration, Paketen, Pipeline(s), ...</li><li>Nachimplementierung der bereits umgesetzten User-Stories.</li><li>Umsetzen der restlichen User-Stories mit stark erhöhter Velocity.</li><li>Gefahr mehr als zwei Sprints zu brauchen.</li></ul></li></ol><p>Wichtig zu erwähnen ist, dass für die Neuimplementierung von vorn herein nur zwei Sprints zur Verfügung standen.</p><h2>Ansatz (Lösung)</h2><p>Als ersten haben wir Entwickler einen Schlachtplan ausgearbeitet, diskutiert, vorgestellt und durchgeführt:</p><ul><li>Gegenüberstellung der geschätzten Aufwände beider Ansätze bezüglich der Fertigstellungsfrist</li><li>Vorstellungen der Ergebnisse bei ProductOwner, Projektleitung und Kunden. </li></ul><p>Da letzterer ein Vetorecht hatte, war es entscheidend die Argumentation entsprechend schlüssig und nachvollziehbar aufzubauen.</p><p>Besonders interessant an dieser Stelle war der Vergleich der potenziellen mit der bisherigen Velocity:</p><ul><li>Status Quo: 2 Entwickler, 12 Sprints</li><li>Neu-Implementierung: 6 Entwickler, 2 Sprints</li></ul><p>Rein rechnerischer Performance-Gewinn: <strong>+100%</strong></p><h2>Ergebnis</h2><p>Der Vergleich hatte gezeigt, dass trotz des Feature-Freeze nur durch die Einführung eines Frameworks das Projekt annähernd fristgerecht hätte abgeschlossen werden können. Daher wurde die Einführung beschlossen. In einer weiteren Front-End-Runde wurde sich zudem speziell für Vue.js entschieden. </p><p>Die initiale Implementierung, samt Wiederherstellung des Entwicklungsstandes wurde in den dafür veranschlagten 2 Sprints abgeschlossen. Entsprechend hat sich die Velocity wie erhofft ca. verdoppelt und das Projekt konnte mit minimaler Verzögerung abgeschlossen werden.</p><blockquote>Zwei Tage vor Projektabschluss ist es sicherlich zu spät um eine ineffiziente Implementierung durch eine effizientere auszutauschen. Hat man aber noch ein paar Sprints offen, ergibt es allemal Sinn eine objektive Gegenüberstellung der Möglichkeiten zu erheben.</blockquote><p>PS:</p><p>Die Anwendung ging live, der Kunde war happy, das Projekt war ein voller Erfolg - und wird weitergeführt.</p>]]></content:encoded>
            <author>contact@martini-labs.de (Martini Labs)</author>
            <enclosure url="https://www.martini-labs.de/images/blog/coders-at-work.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Parallax effect Angular 8+]]></title>
            <link>https://www.martini-labs.de/#/blog/parallax-effect-angular-8</link>
            <guid isPermaLink="false">https://www.martini-labs.de/#/blog/parallax-effect-angular-8</guid>
            <pubDate>Thu, 29 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Muss das hier vom Design angepasst werden??]]></description>
            <content:encoded><![CDATA[<p>Parallax effects on Single Page Applications are definitely an old hat. However there’s always a first time to use something. After testing out a lot, which didn’t work like I needed it, I came up with a solution, based on a <a href="https://medium.com/fove/angular-parallax-d1c2de9f07a6" target="_blank">blog entry</a> by <a href="https://medium.com/@gauravkumarfoujdar" target="_blank">Gaurav Foujdar</a>. But with a different way to move the elements.</p><h2>TLDR</h2><p>Implement the parallax effect with an Angular directive, which works on the translate-y property of CSS3.</p><p>See the <a href="https://stackblitz.com/edit/angular-8-parallax-directive" target="_blank">demo on Stackblitz</a> or <a href="https://github.com/hpmartini/angular-8-parallax-directive" target="_blank">check out from GitHub</a>.</p><figure class="w-richtext-figure-type-video w-richtext-align-fullwidth" style="padding-bottom:56.25%" data-rt-type="video" data-rt-align="fullwidth" data-rt-max-width="" data-rt-max-height="56.25%" data-rt-dimensions="0:0" data-page-url=""><div><iframe src="https://stackblitz.com/edit/angular-8-parallax-directive?embed=1" allowfullscreen="" frameborder="0"></iframe></div></figure><p><strong>angular-8-parallax-directive</strong></p><p>hpmartini ⋅ 5 years ago</p><h2>The parallax effect…</h2><p>… not explained. I won’t bother you with boring explainations about that effect, which you can read for yourself on <a href="https://en.wikipedia.org/wiki/Parallax" target="_blank">wikipedia</a> if you feel the urge.</p><h3>Prerequisites</h3><p>First you have to have <code>node.js</code> running on your system.</p><h4>For Mac users</h4><p>If you’re lucky to have a Mac, just run this:</p><pre></pre><p>If you don’t have <code>homebrew</code> installed already, go to <a href="https://homebrew.sh/" target="_blank">homebrew.sh</a> or run this:</p><pre></pre><h4>For anyone else</h4><p>Sorry for that, but please visit <a href="https://nodejs.org/" target="_blank">nodejs.org</a> for further instructions. I don’t have another system at hand right now.</p><h3>Ahead with angular cli</h3><p>Install Angulars command line interface with this, if you dont’t have it already:</p><pre></pre><h3>Setup the Angular project</h3><p>Go to the projects directory of your desire and run this command to create an Angular project:</p><pre></pre><p>This creats your awesome parallax project in the directory called… I guess you know it already. The CLI fills up the project with everything needed to get it running. So start it up:</p><pre></pre><p>The “-o” is not recommended, it just opens the angular app in your default browser.</p><h2>Now the fun part starts</h2><p>Lets generate a new directive:</p><p>Copy<code>ng generate directive common/parallax</code></p><p>This command puts the new directive in the sub directory <code>common</code>, which is not necessary, but I like to have a clean structure.</p><p>The CLI also registers the directive in the <code>app.modules.ts</code>, along with the default components and services.</p><h3>parallax.directive.ts<code>‍</code></h3><pre></pre><p><code>‍</code><a href="https://github.com/hpmartini/angular-8-parallax-directive/blob/master/src/app/common/parallax.directive.ts" target="_blank">view on GitHub</a></p><ul><li>The <code>factor</code> of how fast the element will move relative to the scroll position is passed through an <code>@Input</code> decorator. By default (factor = 1) the effect will be just a bitt slower then a linear scrolling element.</li><li>The class <code>ElementRef</code> is the recommended way to manipulate elementes, because directly accessing the DOM could promote XSS attacs.</li><li>The <code>Renderer2</code> takes the <code>ElementRef</code> and sets the desired property in the DOM.</li><li>We just set the <code>translateY</code> CSS property of our element by multiplying the current scroll position with the passed <code>factor</code>. I devide that by 10, because the movement would be to fast or we could not work with integers in the HTML.</li><li>The <code>@HostListener('window:scroll')</code> will be triggered when you scroll - what a surprise - and the <code>translate</code> propery will be updated.</li></ul><h3>app.component.html </h3><pre></pre><p><code>‍</code><a href="https://github.com/hpmartini/angular-8-parallax-directive/blob/master/src/app/app.component.html" target="_blank">view on GitHub</a></p><h3>app.component.css </h3><pre></pre><p><code>‍</code><a href="https://github.com/hpmartini/angular-8-parallax-directive/blob/master/src/app/app.component.css" target="_blank">view on GitHub</a></p><p>Nothing special here, the <code>container</code> is set to <code>100vh</code> so we can scoll at all. The same goes for the positioning of the two strings at the bottom.</p><p>That’s it.</p><p>Just to remember, you can watch the <a href="https://angular-8-parallax-directive.stackblitz.io/" target="_blank">demo on Stackblitz</a> or <a href="https://github.com/hpmartini/angular-8-parallax-directive" target="_blank">check out from GitHub</a>.</p><p>‍</p><p>(gif from <a href="https://abetteruserexperience.com/" target="_blank">https://abetteruserexperience.com</a>)</p>]]></content:encoded>
            <author>contact@martini-labs.de (Martini Labs)</author>
            <enclosure url="https://www.martini-labs.de/images/blog/parallax.gif" length="0" type="image/gif"/>
        </item>
        <item>
            <title><![CDATA[🐈‍⬛ JavaScript Immutability]]></title>
            <link>https://www.martini-labs.de/#/blog/javascript-immutability</link>
            <guid isPermaLink="false">https://www.martini-labs.de/#/blog/javascript-immutability</guid>
            <pubDate>Thu, 29 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Wenn man nicht aufpasst, passiert schnell eine Mutation deiner Objekte Hier sind ein paar Tipps um dem vorzubeugen!]]></description>
            <content:encoded><![CDATA[<h2>Mutationen verhindern</h2><p>Was bei DC und Marvel ziemlich cool ist, kann im Entwickler-Alltag leicht zu Frust und Zeitverschwendung führen: Mutability von Objekten.</p><p>Was haben denn bitte Comics mit Programmieren zu tun?! Ganz einfach, Quantenphysik.</p><p>⚛️ Objekte und und ihre Pointer sind ein bisschen wie verschränkte Teilchen. Ändert man ein Objekt an der einen Stelle im Code, ändert es sich auch an der anderen. Damit kennen wir dessen Zustand nicht mehr, ohne genau hinzuschauen - wir haben also erfolgreich Schrödingers Katze implementiert 🙀 Sprich das Gesetz der Dekohärenz ist umgangen und das Objekt befindet sich in Superposition. Will keiner, denn die nächste Messung wird erst stattfinden, wenn uns die nächste Fehlermeldung um die Ohren fliegt.</p><p> 🤨 What...</p><p>In Redux ist es verboten und in NgRx schlich nicht möglich Objekte im Store zu verändern.</p><p>Manchmal ist es aber ziemlich übertrieben ein State Management einzuführen. Objekte, trotz fehlenden Zwangs, als immutable zu behandeln kann aber trotzdem eine gute Idee sein. </p><p>Also getreu dem Reactive Programming Paradigma: "Create new, don't alter"</p><pre></pre><p>⚠️ Zonk! Problem: Das verschränkte Objekt (ja ok, es ist dasselbe!) hält sich auch noch außerhalb der Methode auf. Wird es nach dem Aufruf von <code>setLocalState()</code> verändert, ändert sich auch die Property <code>localState</code> &nbsp;in unserer Klasse</p><p>Also besser so:</p><pre></pre><p>☝️🧐 So haben wir schnell ein neues Objekt erzeugt und unschönen Seiteneffekten vorgebeugt.</p><p>Ich weiß, die Beispiele sind komplett an den Haaren herbeigezogen. Hat aber halt Spaß gemacht, den Artikel so zu schreiben... 🤷‍♂️</p>]]></content:encoded>
            <author>contact@martini-labs.de (Martini Labs)</author>
            <enclosure url="https://www.martini-labs.de/images/blog/immutability.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Level-up]]></title>
            <link>https://www.martini-labs.de/#/blog/level-up</link>
            <guid isPermaLink="false">https://www.martini-labs.de/#/blog/level-up</guid>
            <pubDate>Wed, 28 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Die Gründung ist in den Startröhren und bald geht es los!]]></description>
            <content:encoded><![CDATA[<p>Hell yeah! Bald ist es soweit, die Martini Labs GmbH steht in den Startlöchern, genauso wie “unser” erster Mitarbeiter. Er kann es genauso wenig erwarten loszurocken, wie ich! 🤘</p><blockquote>Momentan ist noch die Holding (Martini Holding GmbH) in Gründung - das Amtsgericht lässt sich Zeit. Danach folgt die Gründung der operativen GmbH (Martini Labs GmbH)</blockquote><p>Nach über drei Jahren Arbeiten als Freelancer, ist es jetzt für mich soweit den Sprung in die Untiefen des Unternehmertums zu wagen. </p><p>Nach dem Motto “wenn’s rockt, dann rollt’s” werden wir die Welt des IT-Consultings von hinten aufrollen 🚀</p>]]></content:encoded>
            <author>contact@martini-labs.de (Martini Labs)</author>
            <enclosure url="https://www.martini-labs.de/images/blog/rakete.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Lösungen und Probleme]]></title>
            <link>https://www.martini-labs.de/#/blog/losungen-und-probleme</link>
            <guid isPermaLink="false">https://www.martini-labs.de/#/blog/losungen-und-probleme</guid>
            <pubDate>Wed, 28 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Es ist oft sinnvoller sich richtig an ein Problem zu setzen, anstelle einer quick-n-dirty Lösung, auch wenn es länger dauert]]></description>
            <content:encoded><![CDATA[<p>Es ist egal welche Ursachen ein Problem hat, wenn wir nur die Symptome bekämpfen - so kommen wir nicht zur Lösung.</p><p>In der Hektik des täglichen Arbeitsgeschehens ist man schnell dazu geneigt für akute Probleme die erstbeste Lösung zu akzeptieren. Problem gelöst → nächste Problem muss her.</p><p>Zu schnelle “hacky” Lösungen führen aber oft im späteren Verlauf zu noch größeren Problemen.</p><p>Man sollte genau abwägen wann es angebracht sein kann quick-n-dirty zu arbeiten und wann es sinnvoller ist sich Zeit zu nehmen um eine saubere Lösung zu entwerfen.</p><p>So ist es in der Softwareentwicklung, wie auch im Geschäftsleben.</p><h2>‍</h2>]]></content:encoded>
            <author>contact@martini-labs.de (Martini Labs)</author>
            <enclosure url="https://www.martini-labs.de/images/blog/sport-gehirn.webp" length="0" type="image/webp"/>
        </item>
        <item>
            <title><![CDATA[Software von der Wiese]]></title>
            <link>https://www.martini-labs.de/#/blog/software-von-der-wiese</link>
            <guid isPermaLink="false">https://www.martini-labs.de/#/blog/software-von-der-wiese</guid>
            <pubDate>Wed, 28 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Es ist wichtig sich Gedanken zum Projekt zu machen, bevor es überhaupt los, geht für ein erfolgreiches Projekt]]></description>
            <content:encoded><![CDATA[<p>Beginnt man ein neues Softwareprojekt, will man das natürlich auch erfolgreich abschließen - aber was genau soll “erfolgreich” eigentlich heißen? </p><p>Während die Frage, zumindest intuitiv, relativ einfach zu beantworten ist - man bleibt im Budget und erfüllt die Anforderungen - schwingt da noch eine viel schwieriger zu beantwortende Frage mit. Wie zur H***e wird ein Projekt erfolgreich?</p><p>Auf eine Sache können wir uns schon mal einigen: scheitert ein Softwareprojekte ist es erstmal egal ob das Budget gesprengt wurde, das Entwickler-Team jahrelang mindestens auf Alarmstufe Gelb gearbeitet hat oder der Kunde sich gnadenlos verkalkuliert und wegen einer überzogenen Time-to-Market Insolvenz anmelden musste. All das sind No-Gos!</p><p>Vielleicht stimmen wir auch mit der nächsten Aussage überein: alle gescheiterte Projekte haben einige signifikante Gemeinsamkeiten. Die fundamentalste ist, dass sich während der initialen Planung über einige entscheidende Punkte wenig bis keine Gedanken gemacht wurde. Das hat zwei Gründe:</p><ol><li>Alle Stakeholder haben naturgemäß unterschiedliche Vorstellungen der Anforderungen.</li><li>Dessen sind sie sich nicht bewusst oder unterschätzen die Konsequenzen.</li></ol><p>Dann kommt es zu immer neuen Iterationen an Änderung, weil a) das Entwicklerteam die genauen Vorstellungen der Stakeholder nicht kennt und b) auch die Stakeholder sich untereinander nicht einig sind. Mit den Implikationen daraus könnte man Bücher füllen.</p><p>Also konzentrieren wir uns vorrangig darauf, wie wir ein starkes Fundament in einem neuen Projekt legen können, damit aus der fancy Produktvision kein Fire-Fighting-Projekt wird.</p><h2>tl;dr</h2><p>Betrachten wir unseren Ansatz wie ein Softwareprojekt innerhalb des Budgets, zur vollen Zufriedenheit der Kunden, die an die Software gesteckten Anforderungen erfüllt.</p><figure class="w-richtext-figure-type-image w-richtext-align-center" data-rt-type="image" data-rt-align="center"><div><img alt="https://app.diagrams.net/#G1Ei3CVLtA2hdkUV5_HEi8eMSM2A5_sU7O" src="/images/blog/software-wiese-diagram.webp" width="auto" height="auto" loading="auto"></div></figure><h2>Planung</h2><p>Zum Projektstart werden ein bis zwei Workshops abgehalten. Dabei soll der Rahmen des Projekts abgesteckt werden. Ziel ist es, dass alle Beteiligten ein einheitliches Bild des Projektumfangs haben und eindeutig definiert ist wann und durch welche Kriterien das Projekt als erfolgreich gilt.</p><ol><li><strong>Workshop: Strategie/Konzeption</strong>some text<ul><li>Zieldefinition - Wann ist das Projekt erfolgreich?<br>Am Anfang steht das Ende. Die Definition wird sich im Laufe des/der Workshops noch ändern, aber jeder sollte gleich zu Anfang die Vorstellungen der Anderen darüber kennen, damit nicht in unterschiedliche Richtungen gearbeitet wird.<br>Jeder hat unterschiedliche Vorstellungen davon, was ein erfolgreiches Projekt ist. Die Beteiligten müssen sich über die gegenseitigen Sichten Bewusst sein, damit die Umsetzung den Vorstellungen der Entscheider gerecht werden kann. Dabei wird zudem auch klar, ob diese Vorstellungen überhaupt umsetzbar sind.<br>Erarbeitet wird die Definition klassisch mit Zettelchen, die an eine Wand geklebt werden.<br>Umsetzung durch: Sticky Notes</li><li>Was soll mit der Software erreicht werden?<br>Im Endeffekt muss die Anwendung bedient werden. Hier muss sich jeder in die Rolle des Users versetzen und überlegen welche Funktionen für die User einen Mehrwert bieten. Festgehalten wird das natürlich in User Stories. Die Sitemap dient dazu die Stories in ein Gerüst für die spätere Userführung einzuarbeiten und den nächsten Schritt vorzubereiten.<br>Ergebnis: User Stories per Stift und Papier, Sitemap</li></ul></li><li><strong>Workshop: Feinkonzept</strong>some text<ul><li>Funktionsdefinition - Was ist nötig, um den Usern einen Mehrwert zu bieten, so dass sie die Software langfristig nutzen wollen?<br>Selbst wenn im Vornherein viel darüber geredet wurde, hat üblicherweise jeder noch immer andere Bilder der fertigen Anwendung im Kopf. Diese entscheiden aber im Wesentlichen über den Umfang des Projekts.Hier werden Wireframes der einzelnen Screens angefertigt. Allein die Anzahl wird gerne unterschätzt, aber auch die Funktionen der Screens werden hier erst deutlich. Aus ihnen ist schon sehr gut die Usability ablesbar, aber auch die Anforderungen an die Geschäftslogik werden deutlich.<br>Ergebnis: Wireframes</li><li>Wie soll die Anwendung das definierte Ziel erreichen?<br>Hier steht die Qualität der Anwendung im Vordergrund, sprich ihre Beschaffenheit. Wie soll sie aussehen? Wie soll sie mit dem User interagieren?<br>Mit Mockups beschreiben wir wie die Anwendung aussehen soll. Ohne schon das genaue Design festzulegen, sollen die Mockups vorab einen guten visuellen Eindruck der späteren Anwendung vermitteln.<br>Der Klickdummy soll die Abläufe und Interaktionen der Anwendung demonstrieren, ohne alle Funktionen abzubilden.<br>Ergebnis: Mockups, Klickdummy</li></ul></li></ol><p>Bei der Umsetzung der Wireframes, Mockups und Klickdummies kann es durchaus Sinn machen diese Außerhalb der Workshops fertigzustellen. Hier sollten die Zwischenschritte aber durch einen Kundenvertreter oder besser einen der Entscheider vor-abgenommen werden, bevor sie final präsentiert werden.</p><blockquote>In den weiteren Schritten gehe ich nicht allzu tief ins Detail, da die Themen eigener Artikel würdig sind.</blockquote><h2>Prototyp </h2><p>Der Prototyp sollte die zentralen Elemente und Customer Journeys so abbilden, dass die Entscheider einen möglichst genauen Eindruck davon bekommen, wie die fertige Anwendung aussieht und sich anfühlt. Dazu gehört auch die Ausarbeitung eines Design Systems, nach welchem der Prototyp entworfen werden kann. Welche Funktionen der Prototyp genau beinhalten und wie weit er das Design abbilden soll, wird schriftlich festgehalten.</p><p>Die Beteiligten sollten sich jetzt, durch die vorhergegangenen Schritte, gut in den User hineinversetzen können und finden eine detaillierte Simulation des finalen Produkts vor - natürlich mit eingeschränktem Funktionsumfang. Diese können sie jetzt begutachten und letzte Feinschliffe beauftragen, bevor sie "in Produktion" geht.</p><p>Prototypen sind allerdings nicht immer nötig. Gerade bei kleineren Anwendungen kann es sein, dass man sich gegenüber der direkten Implementierung nicht viel Zeit spart, sondern eher doppelte Arbeit hat. Wenn der Tech-Stack es zulässt kann es durchaus Sinn machen den Prototypen mit einem Low-/No-Code-Tool umzusetzen, welches erlaubt den Code für die weitere Umsetzung zu exportieren. </p><h2>Umsetzung</h2><p>Kern der Umsetzung sind die Ausarbeitung eines Architektur-Konzepts, Konzipierung und Einrichtung einer CI/CD-Pipeline, samt Testautomatisierung und natürlich die Entwicklung. </p><p>Den Rahmen gibt allerdings das Projektmanagement vor - auch bei selbstorganisierenden Teams (PO und Scrum-Master). Es muss dafür sorgen, dass die Leute arbeiten können, den Status im Auge haben, Probleme aus dem Weg schaffen, auf Veränderungen reagieren... Aber auch hierfür ist ein eigener Artikel nötig. </p><p>Soll im Rahmen des Projekts ein Produkt entstehen, oder auch bei Anwendungen, die einer breiten User-Basis zur Verfügung stehen werden, macht es Sinn zuerst ein MVP zu entwickeln, um möglichst schnell User-Feedback einzuholen und entsprechend zu reagieren.</p><h2>Fazit</h2><p>Abschließend bleibt zu sagen, dass natürlich nicht alle Planungsschritte für jedes Projekt zwingend nötig sind. Man sollte aber nicht bei den falschen Schritten sparen. Gerade die Definition eines erfolgreichen Projekts ist für selbiges essenziell. Bei den Wireframes, Mockups und dem Klickdummy bietet es sich eher an diese in einem Tool zu erstellen, welches alle drei erstellen kann. Zumindest aber die wichtigsten Wireframes sollten im Workshop auf Papier gezeichnet werden.</p><p><strong>PS:</strong> je nach Größe des Projekts variiert natürlich auch der Umfang der einzelnen Schritte.</p><h2>‍</h2>]]></content:encoded>
            <author>contact@martini-labs.de (Martini Labs)</author>
            <enclosure url="https://www.martini-labs.de/images/blog/software-wiese.webp" length="0" type="image/webp"/>
        </item>
    </channel>
</rss>