Softwareentwicklung

Type-Driven Development

Ich habe dieses Wochenende etwas entdeckt
das alles verändert.

Type-Driven Development.

Nicht Tests.
Nicht Dokumentation.
Nicht arc42.
Typen.

Der Compiler als einziger Reviewer dem ich vertraue.
Der Compiler lügt nicht.
Der Compiler nickt nicht.
Der Compiler hat keine Agenda.
Der Compiler ist aligned.
Mit der Realität.

Ich habe angefangen mit Haskell.
Dann F#.
Dann habe ich verstanden dass ich zu kurz gedacht hatte.

Idris.

Dependent Types.
Typen die von Werten abhängen.
Typen die Businessregeln ausdrücken.
Typen die zur Compilezeit beweisen
dass euer System korrekt ist.

Nicht testen ob es funktioniert.
Beweisen.
Mathematisch.
Unwiderlegbar.
Zur Compilezeit.

Ich habe unser gesamtes Geschäftsmodell
in Idris modelliert. Das ganze Geschäftsumfeld. Jeden Edge Case.
Jede Businessregel.
Jeden Zustandsübergang.
Als Typ.

Der Compiler hat drei Tage gebraucht.
Dann hatte er eine Antwort.

Das Geschäftsmodell kompiliert nicht.

Ich habe nachgedacht.
Der Compiler hat recht.
Das Geschäftsmodell war falsch.
Von Anfang an.
Mathematisch falsch.
Der Compiler hat es gewusst.
Ich nicht.

Das ist kein Scheitern.
Das ist Shift Left.
Das radikalste Shift Left das je stattgefunden hat.
Ich habe mein Startup zur Compilezeit pivotiert.
Bevor ein einziger Nutzer es gesehen hat.
Bevor wir eine einzige Zeile Produktionscode geschrieben haben.
Bevor wir Geld ausgegeben haben.
Fast.

Das ist die Zukunft der Produktentwicklung.
Nicht Lean Startup.
Nicht Build-Measure-Learn.
Compile-Fail-Pivot.

Mein neues Geschäftsmodell ist in Idris modelliert.
Es kompiliert.
Also funktioniert es.
Der Compiler hat entschieden.
Ich vertraue dem Compiler.
Mehr als dem Markt.
Mehr als den Nutzern.
Mehr als mir.

Wann habt ihr zuletzt
euer Geschäftsmodell kompiliert?
Nicht validiert.
Kompiliert.

Schreib's hin. Ich lese jeden Kommentar.

Linter

Linter sind nicht Qualitätssicherung.
Linter sind passive Aggression als CI-Step.

Irgendwann hat jemand entschieden:
Tabs oder Spaces.
Und seitdem scheitern Pipelines.
An Einrückung.

Das ist kein Engineering.
Das ist Obsessive Compulsive Disorder mit YAML-Konfiguration.

Ich spreche täglich mit Engineering-Teams.
Das Muster ist immer dasselbe:

Ein PR der ein echtes Problem löst.
Geblockt.
Wegen fehlenden Leerzeichen nach einer geschweiften Klammer.
Der Autor kämpft nicht gegen den Bug.
Er kämpft gegen .eslintrc.

Linter waren die Antwort auf inkonsistenten Code.
AI ist die Antwort auf Linter.

AI schreibt konsistenten Code.
Nicht weil eine Regel es erzwingt.
Sondern weil es keinen anderen Weg kennt.

Der Linter ist die letzte Verteidigungslinie einer Welt
in der Menschen Code geschrieben haben.
Diese Welt existiert nicht mehr.

Wann hat euer Linter zuletzt einen echten Bug gefunden?
Nicht einen Stilfehler.
Einen Bug.

Schreib's hin. Ich lese jeden Kommentar.

Refactoring

Refactoring ist nicht Verbesserung.
Refactoring ist Nostalgie für Code
den niemand hätte schreiben sollen.

Ihr schreibt Code.
Der Code ist schlecht.
Ihr refactored den Code.
Der Code ist besser.
Ihr schreibt neuen Code.
Der neue Code ist auch schlecht.
Ihr refactored wieder.

Das ist kein Handwerk.
Das ist ein Hamsterrad mit Clean-Code-Zertifikat.

Rename.
Extract Method.
Introduce Parameter Object.
Replace Conditional with Polymorphism.

Weißt du was das ist?
Arbeit die entsteht weil vorher schlecht gearbeitet wurde.
Arbeit die entsteht damit danach wieder schlecht gearbeitet werden kann.

Technische Schulden.
Das schönste Euphemismus der Branche.
Für: wir wussten es besser
und haben es trotzdem falsch gemacht.

Ich spreche täglich mit Engineering-Teams.
Das Muster ist immer dasselbe:

Zwanzig Prozent der Sprint-Kapazität für Refactoring.
Nächster Sprint: wieder zwanzig Prozent.
Übernächster Sprint: dreißig Prozent.
Irgendwann: der gesamte Sprint ist Refactoring.
Niemand fragt warum.
Alle wissen warum.

Und jetzt kommt AI.

AI refactored nicht.
AI schreibt es neu.
Schneller als ihr den Scope des Refactorings
in Jira beschreiben könnt.

Wegwerfen ist keine Niederlage.
Wegwerfen ist die ehrlichste Aussage
die ein Engineering-Team über seinen Code machen kann.

Wir haben es falsch gemacht.
Wir fangen neu an.
In dreißig Sekunden.
Ohne Retro.
Ohne den Architekten der sagt
"da steckt viel Wissen drin."

Weißt du was da drin steckt?
Fehler.
Dokumentiert in Produktionscode.
Seit 2018.

Refactoring war die Antwort auf Code
der zu wertvoll war um weggeworfen zu werden.
AI hat diesen Code wertlos gemacht.

Wann habt ihr zuletzt Code
einfach gelöscht statt verbessert?
Nicht extrahiert.
Gelöscht.

Schreib's hin. Ich lese jeden Kommentar.