Ein Live-Coding-Abend überraschte mit ungewohnter Tageszeit: Statt morgens codete der Entwickler abends, um Transparenz bei der Arbeit zu schaffen. Nach Herausforderungen wie fehlenden Plugins und fehlgeschlagenen Entwicklertools gelang die Einrichtung eines DevContainers. Der Fokus lag auf der Validierung des Plugins PremiereRemote 702.gg, architektonischen Prinzipien wie Dependency Inversion und der Kritik an oberflächlichen Metriken. Ein CI/CD-Script wurde als Alternative zu Pre-Commit-Hooks präsentiert.

Software and Game Development
00:00:00

Software and Game Development

Streamstart und technische Vorbereitungen

00:06:53

00:06:53 Guten Abend! Sehr ungewohnt mal in der Kaffee hier zu sitzen. Wir fangen auch direkt an. Das ist tatsächlich einfach mal ein abendlicher Coding-Stream. Wir starten bei 0 und ich habe keine Ahnung wo ungewohnt. Wir starten bei 0 und wir finden hoffentlich bei einem etwas aufgeräumteren Code. Finde ich persönlich ganz geil. Gucken wir mal, ob das nicht.

00:07:33 Okay. Nicht zu viel mit Fenster wackeln, das triggert das Zurücksetzen der Fensterposition, beziehungsweise, dass sie alle klein gehen. Boah, ich sitze hier eine Minute und fange jetzt schon an zu schwitzen. Geil! Okay. Erstmal Promaso, danke für 96. Das ist wirklich eine lange Zeit. Boah, eigentlich Carry On Plays Intro bei Copyright Strike, wohnt das nebendran des Carry On Plays Intro. Hast du überhaupt noch Gehirnzellen übrig für Code? Das werden wir gleich sehen.

00:08:00 Also, ich habe gestern Abend auf dem Sofa noch ein bisschen gecodet. Eigentlich all das, was ich im... Was zum Fick? Ah, all das, was ich im Stream gestern machen wollte, habe ich dann am Abend gemacht. Und da habe ich gedacht, okay, wenn ich heute Abend sowieso wieder so eine Stunde code, dann kann ich das auch einfach live streamen. So, hier, hier are we. Das ist quasi die Ausgangssituation. Natürlich muss wieder irgendeine Scheiß runtergeladen werden, weil wir das ja nicht erst wieder gestern im Stream hatten, ey.

00:08:29 Wen willst du eigentlich verarschen? Ich könnte das ja jetzt schonmal Premiere aufmachen, UXP aufmachen. Ich klicke jetzt echt schon ein bisschen an dieser neuen Version. Ich finde sie echt eigentlich ganz geil. Appear to not side in into creative cloud. Okay, that sounds to me like I have to...

00:08:57 Das ist einfach auch absolute Bullshit. Ähm, sounds to me like I have to quickly not show my Bildschirm and restart developer tools. Mal gucken, ob's jetzt geht. Okay, er lässt mich nicht in die Developer Tools rein, was irgendwie saulustig ist, weil ich im Hintergrund, hä, ich bin literally eingeloggt, alter. Weil ich im Hintergrund halt Premiere aufhabe, aber es ist okay. Es ist okay, ich hinterfrag Dinge nicht.

00:09:40 Ah, jetzt geht's auf einmal. Er hat zwar sämtliche Einstellungen verloren, dass ich mal irgendwie das Plugin installiert hatte. Okay, aber we are nearly there. Ich muss nur eben kurz wieder von meinen virtuellen Linux-Umgebungen hier... Ach komm schon, Alter. An was mangelt es dir?

00:10:04 Ah, ich weiß warum er es verloren hat. Weil ich eine Datei unbenannt habe. Ja, das ist ein Ordner unbenannt. Aber das ist natürlich kritisch. Okay, so ihr seht wieder was. Also, Ausgangssituation ist Reopening Container. Wir haben hier so eine Entwicklungsumgebung. Kann ich auch einfach mal da hinschieben, wo ich sie brauche. Mach mal alles zu. Jetzt muss der natürlich auch wahrscheinlich gleich wieder genau erst mal den Server installieren. Das war so klar. Danke für nichts.

00:10:34 Doc Fedo, danke schön. Ich würde sagen, ich lasse es schon mal laufen, aber da ist ja noch nichts gebaut. Also deswegen, nee, ich lasse hier gar nichts laufen. Ist eher krank. Ja, ich fühle mich gerade so ein bisschen, als würde ich krank werden. Also vielleicht bin ich bald krank. Wo bekommt man das Terminal-Design eigentlich her? Das hier. Das ist einfach nur ein bisschen transparenter Hintergrund. Und die Farben von Monokai. Ach, und das, dass das so angezeigt wird, das ist Starship, heißt das.

00:11:16 Wir kommen mal plötzlich Leute aus der Versenung, die man seit Jahrzehnten, Jahrzehnten nicht mehr gesehen hat. True. Mein endlich Linux als Host wird nicht passieren. Ich arbeite auf Windows. Ich kenne nur Airship, Solarpunk. Ne, wir zocken heute Abend mal ganz absichtlich kein Solarpunk, wenn ich es dagegen habe. So, DevContainer ist gestartet. Dann lass mal kurz in den Client bauen, den neu bauen, äh Client gehen und den neu bauen.

Erste Funktionsprüfung und Plugin-Validierung

00:11:46

00:11:46 Sieht gut aus. In den Server gehen und dann den mal starten und dann gucken wir mal, ob es läuft. So, okay, der Kollege läuft. Wir können mal hier in die Swagger UI gehen. Das Ding ist auch da. So, und jetzt drücke ich hier auf meinem Stream Deck die Taste. Die Frage ist, welche ist es? Also for real, welche ist es? Ah, hier, die Reload-OXP-Taste.

00:12:15 Geil, habt ihr das gesehen? Das war automatisiert. Und hier ist es. Das ist das Plugin. So, es existiert noch nicht so wahnsinnig viel. Das hier ist übrigens, da habe ich Fundmails gemacht. Was glaubt ihr, wie Fundmails entstehen? Das ist das Video, was ich gestern hochgeladen habe. Das war wieder ein hellhofer Aufwand und dafür kommt es richtig scheiße an. Aber so ist halt YouTube. Warum so kompliziert? Das nennt sich Informatik. Das ist immer kompliziert.

00:12:42 Das muss kompliziert sein. Tatsächlich ist es total einfach. Ich habe es extra so einfach gemacht, dass man am Schluss nur zwei Skills benötigt, um den kompletten Kram... Thumbnails erstellt bei dir Gemini. Das stimmt nur so halber. Momentan ist es immer eine Mischung aus AI generiert und menschlich gemacht, weil ich noch ein bisschen besser herausfinden möchte, was besser performt. Ich habe aber noch nicht so die eindeutige Antwort darauf. Irgendwann kommt dazu mal ein Video. Basch, du weißt Bescheid.

00:13:09 Gelastet das Video von gestern. Sag dich schon, dass ich unzufrieden bin, wie kacke es angekommen ist. Auf jeden Fall habe ich jetzt hier im Hintergrund den Server und kann jetzt zum Beispiel mal sagen, hier get active sequence. Zack, wird ausgeführt. Die aktuelle Sequenz heißt 141 Main. Hast du nicht einen Knopf auf deinem Xbox-Controller Stream Deck? Mit dem Xbox-Controller das Ding neu starten. Ich habe eine Taste auf dem Stream Deck, das hätte ich zum Neustarten. Achtung.

00:13:37 Da wurde Reload gedrückt. Der erkennt nämlich, ob schon geladen ist oder nicht und lädt es dann automatisch neu. Das ist das nächste, zu was ich rankomme, zu einfach einer CLI, um den Kram zu verwalten, aber das gibt es halt leider nicht. Was ich euch auf jeden Fall zeigen möchte, ist, wenn wir jetzt hier mal reingucken, dann seht ihr hier in der Ausgabe, dass ich einmal Get Active Sequence ausgeführt habe.

00:13:55 dass das UXP-Plugin geladen wurde. Dann wurde es disconnected und neu connected. Das war der Restart, den wir gerade eben gesehen haben. Und wenn ich jetzt in Premiere reingehe, dann seht ihr hier, die Szene heißt 141 Main. Und das ist die Magie. So, so bekomme ich jetzt Informationen heraus. Man kann natürlich auch, wenn man zum Beispiel AI nutzt und hier einen MCP-Server dran anschließen möchte oder das als MCP-Server nutzen, kann man auch ein bisschen advanced-deranfragen nutzen.

00:14:23 Oder sie sich über einen Skill entwickeln lassen. Und ich sehe gerade, unter mir fehlt was. War wohl ausverkauft. Also for real. Warum mischt da nichts? Weil das Ding ist da. Die Streambar wurde geladen. Was-Overlay. Das Was-Overlay ist komplett im Arsch. Guck mal hier.

00:14:52 Nice. Das ist eine ziemlich komplexe Szene. Da hat jemand viele, viele Stunden dran geschnitten, nur damit es dann auf YouTube richtig scheiße ankommt. Sagt ich das bereits? Also auf jeden Fall, hier sind sehr, sehr viele verschiedene Clips drin und Overlays und was weiß ich, was die ich sogar extra hierfür gestaltet habe und so weiter. Richtig, richtig Aufwand reingeflossen in dieses Video. Kapp.

00:15:18 Hallo, guten Abend. Ja, ich schneide ja auch nicht mehr, danke, meine Videos. Ich lasse die bald schneiden, denn für so einen automatisierten Schnitt wäre es total hilfreich, wenn man wüsste, wo welcher Clip liegt und in welcher Länge und so einen Spaß. Und dafür habe ich mir auch einfach mal was geschrieben. Und das ist die andere Funktion, die wir hier haben. Das ist die Get All Video Clips. Wir geben einfach mal keinen Track Index ein. Das dauert jetzt einen Moment, weil da geht gerade die gesamte, das ist das gesamte Projekt?

00:15:45 Das hier ist die JSON-Darstellung von jedem einzelnen Clip. Zum Beispiel haben wir hier sdapp.mp4. Sdapp.mp4, als das ich eingeblendet habe.

00:15:58 Was auch immer ich gemacht habe, um ehrlich zu sein, ich weiß gar nicht, was ich da eingeblendet habe. Suchen wir irgendwas anderes, was ich jetzt nicht erklären kann. DualPC.png, ich glaube, das Ding ist klar. Da habe ich das Bild von einem DualPC-Setup eingeblendet. Das ist weder ausgebildet, noch ist es disabled, noch ist es ein Adjustment Layer. Aber es ist so viele Ticks lang. Es hört hier auf, es ist 3,92 Sekunden sichtbar und so weiter. So, und das pipest du jetzt in einen AI-Agenten rein und dann kann der damit fancy Sachen machen.

00:16:27 Wo ich damit hin möchte ist, dass der Loop geschlossen ist. Dass ich sowohl agieren als auch wahrnehmen kann. Ich baue letztlich hier einen Roboter. Aber weil AI Leute irgendwie special sind, nennen sie die Dinger nicht Roboter. Gut, technisch gesehen ist es auch kein Roboter, weil es manipuliert nichts physisches. Aber die sagen dann halt, erkennt manche. Okay, von mir aus. Und wir bauen jetzt hier die Grundlage.

00:16:51 Und dann kann ich irgendwann meine Videos automatisch schneiden lassen oder so. Das ist die Idee. Let's see, wer schneller ist. Adobe oder ich. Aber was schon funktioniert, ist der Client. Hier sieht man auch, dass schon zwei HTTP-Calls abgesetzt wurden. Das Get-All-Videoclips der letzte war. Das Ding ist connected. Das gibt einem auch tatsächlich hier so ein bisschen Hintergrundinfos. Ich kann auch hier in den Bug reinschauen. Dann müsste ich sehen, dass genau hier auf welchem Port das Ding läuft und so weiter. Es ist alles da. Schön. So.

00:17:21 Ist ja alles schön und gut. Ist natürlich mit AI geschrieben, so müssen wir nicht drüber reden. Hat aber trotz allem von mir manuell angepasste Tests und so Spaß. Ich hab also auch wenn hier viel generiert ist, ist es nicht so, dass ich den Kram nicht selber korrigiert hätte. Gestern Abend zum Beispiel habe ich in dem generierten Code was gefunden, wo ich so gedacht habe, hey, what the fuck, warum ist das so schlecht optimiert? Und siehe da, ich habe die Test-Performance irgendwie fair.

00:17:49 5x4 Platt 20-fach. Einfach nur, indem ich draufgesucht habe, was gesehen. Da war ich dann kurz stolz, dass ich das gesehen habe, nämlich die AI.

00:17:59 Aber ja, der Client ist soweit aufgeräumt. Damit kann man also arbeiten. Der Client ist aber auch wirklich dumm. Der besteht nämlich eigentlich nur aus drei Teilen. Der besteht aus einem Actions-Teil. Da ist die Magie drin, die tatsächlich mit Premiere interagiert. Das kann man sich dann später irgendwann über einen Skill generieren lassen, weil das folgt einer ganz festen Schnittstelle, die halbwegs gut dokumentiert ist tatsächlich. Dann...

Technische Architektur: Client, Server und Shared-Modul

00:18:25

00:18:25 haben wir den Core, das ist letztlich einfach nur ein WebSocket Client, der sich mit einem Server verbindet. Und dann haben wir das Generator-Skript, das...

00:18:35 Ist tatsächlich ziemlich geil. Dieses Generator-Skript, das geht über diese Datei hier drüber mit tsmorph, extrahiert den Kram hier, extrahiert den Kram hier und erzeugt daraus zwei Dinge. Auf der einen Seite eine Registry, ein Mapping von Funktions-, also von Endpunkten auf Funktionen und auch die Parameter und so weiter werden alle übersetzt, sodass der Kram dann über den WebSocket-Server ankommen kann. Und außerdem generiert es eine

00:19:06 OpenAPI-Chasen, was die Grundlage für die Swagger-Schnittstelle ist, die wir da gerade eben gesehen haben. Und der wesentliche Unterschied also zu meiner alten Implementierung ist, dass es nicht zur Laufzeit evaluiert wird, sondern statisch zur Compile-Zeit erzeugt. Und der coole Vorteil ist davon, dass man es tatsächlich ausliefern kann. Also natürlich ist die große Fähigkeit hiervon trotzdem, dass man das selber implementiert und schreibt. Aber...

00:19:34 Irgendwann kann man dann trotzdem quasi so einen ganzen Teil an Standard-Funktionalität anderen Leuten zur Verfügung stellen. Das kann man sogar exportieren. Kann dieses Ding hier, File, irgendwo, freut mich nicht, kann man dann vielleicht drüben, Package, genau, kann man so eine CCX-Datei erzeugen und die dann mit anderen teilen und dann kann sich andere Leute das installieren. So, geil, Code zeigen, abgehakt, easy.

00:20:04 Kann man eigentlich immer noch über Kanalpunkte diese Haken hier färben? Nee, das habe ich glaube ich in meiner Reimplementierung erstmal rausgefrofen, oder? Kann ich das? Nee, nee, nee. Momentan kann mit Kanalpunkten genau gar nichts. Ist auch besser so. Behaltet sie lieber. Sehr gut gemacht, so ein Kopfschlag. Ich bin stolz auf dich. Warum auch immer das gerade so prominent hier eingeblendet wird.

00:20:38 Okay, so. Soviel dazu, das war jetzt die super schnelle Einführung, Client Server, muss ich hier nicht weiter erklären. Der Server, der ist noch komplett zusammengeweibed. Also ernsthaft, der ist wirklich einfach nur eine einzige Datei. Man merkt auch so richtig an den Dingern hier, dass er komplett generiert ist.

00:21:00 Das ist ein Bullshit. Und den gilt es jetzt ein bisschen auseinander zu ziehen, weil später soll der ja noch viel mehr können. Aber erstmal ziehen wir es auf einen neuen Portbereich auf, weil die 8080er Ports sind meistens mit irgendeinem Kram überlegt. Gibt es überhaupt keinen Grund, das so zu machen. So, deswegen.

00:21:30 Ich würde sagen, das gehört eigentlich in eine Umgebungsvariable. Das kann ich aber nicht machen, weil der Kram hier läuft in einem Container. Das könnte man also tatsächlich einfach in Umgebungsvariablen sprechen. Aber der Client nicht. Der Client-Code wird von Premiere in der Sandbox ausgeführt. I doubt it, dass ich da Dinge über Umgebungsvariablen reinbekommen kann. Deswegen gibt es auch diese hier.

00:21:53 Ja, I'm very sorry. Und deswegen müssen wir jetzt anfangen, Pots manuell mit Volltextsuche auszutauschen. Auch wenn mich das ein bisschen stört. Aber so ist es halt. Die hier könnte ich wiederum in Umgebungsvariablen legen. Aber das ist halt auch wieder so, okay, okay und done. Also dann habe ich, dann habe ich halt gar nichts gewonnen. Dann muss ich, dann ist es sogar schlechter, weil ich an zwei verschiedenen Stellen ein Kram einstellen muss. Also ne, wir,

00:22:28 Das werde ich gerade eben angerufen. Ich mute mich mal eben, damit ich abnehmen kann. So. Abnehmen macht man anders. Ich mache eher Sport, um abzunehmen. Danke, danke. Ich habe euch auch ein Lied. Okay, probieren wir es noch mit dieser Volltextsuche, oder? Ja, cool. Also, der ist richtig, der ist richtig, der ist richtig, der ist richtig, der ist richtig, der ist richtig, der ist richtig. Krass. Okay, auf was legen wir 80, 85? Ich würde mal sagen, auf...

00:25:32 42 401 Ja, well known posts ey Auch so ein Phänomen Replace all, yes Let's fucking go So und aus 8084 Weil da läuft nämlich später der Swagger-Server drauf Deswegen sollte das irgendwie eine einfache Zahl sein 42 07 wegen 420 und nee du So viele Ports so ich hab einfach

00:26:16 Ich gebe meinen Programmen immer so 100er Blöcke. So als hätte ich zu viele IP-Adressen. Selber mache ich bei Ports. So Dockerfile, Dockerrun, forwarded ports. Genau der muss auch vom Dev-Container freigegeben werden. Ja passt. Alle ersetzen. Cool. Jetzt sagt der richtigerweise, dass der Container neu gestartet werden muss. Weil jetzt ein anderer Port frei ist. Das ist richtig.

00:26:42 Aber da es ein Container ist, geht das alles ja scheiße schnell, weil der aus Layern besteht. So, der installiert den Kram neu. Sehr schön. So, machen wir eine neue Konsole. Bauen den Client neu. Und starten mal den Server.

00:27:17 So, und der läuft jetzt auf dem Port hier. Gucken wir mal, ob es funktioniert. Yo, jetzt läuft es auf 42... 400. Und wenn ich jetzt den hier reloade, jetzt bin ich mal gespannt, was mir Debug sagt. Ah, cool, läuft der auf dem Port. Ja, zwischendrin hat er natürlich die Websocket-Connection verloren, das ist auch richtig. Da gucken wir doch mal, ob es noch funktioniert. Zack. Ja. Scheint durchzukommen, oder? Gucken wir mal. Äh, ist das üb... Warte mal.

00:27:52 Kann ich das von hier aus auch führen? Nee, ich muss schon im Container drin sein. Ah ja, guck mal hier. 141 Main. Ist richtig. Nice. Alles klar. So, wir dürften gerade einfach nur sehr viele Ports umbenannt haben, oder? Andere Änderungen gibt es hier nicht. Sehr schön. Jetzt kann ich mir auch das To-Do hier rauslöschen.

00:28:26 Ich kann natürlich auch das To-Do hier rauslöschen. Nicht in der alten Version rausballern. Cool. Nice. Dann ab damit. Rename. Rename ist eigentlich das falsche Wort. Change. Na, die Unicorn. Dankeschön. So, nice. Jetzt können wir das Getrost hinter uns lassen und uns den Server genauer angucken.

00:29:17 Ich bringe voll komisch so ein ganz kleines VS Code-Fans dazu haben. Ey, wie schaffe ich es eigentlich damit zu entwickeln? Ich möchte den ganzen Kram hier auseinanderziehen. Und das erste, was ich gerade eben stolper, ist der Kollege hier. SRC ist offenbar über den Bomben-Button gestolpert. Der Button ist Bombe. So wie deine Mutter. Dominik Xperman.

00:29:46 Timo, Moppel und Elion Zero sind jetzt Subscriber. Dank LSNRSE. Oder wie ich immer sage, Herr Sonsä. Dankeschön.

00:30:00 Ganz komisch mal Montagabend online zu sein, oder? Finde ich auch. So, wir haben schon mal einen Commit gemacht, damit ich übrigens heute Abend mehr Coding-Stream erreicht, als die letzten drei Coding-Streams zusammen oder so. Ist das traurig. Also, das sind hier Typen, die kann ich hier drin lassen oder sie in ein gesharedes Package ziehen.

00:30:23 Und ich bin versucht, sie in ein gesharedes Package zu ziehen, weil das ist quasi die Schnittstelle, über die sich Client und Server unterhalten. Also wenn ich mal hier im Client, im Core, die Types aufmache und die hier nebendran ziehe, dann kommen wir hier irgendwo über so einen, ah ne, das ist ein WS Client. Ein WS Client, da, hier.

00:30:58 id action id string source type

00:31:04 Hier ist das HTTP fest. Params, String nach Unknown, Outgoing Message. Response Status ist hier extra modelliert. Zeigt aber noch auf dasselbe. Result, Unknown, Message, String. Also die werden tatsächlich aufeinander abbildbar. Aber man sieht hier tatsächlich auch schon die Evolution. Also hier Response Status wurde mittlerweile in einen Extratypen rausgezogen. Weil ich das wahrscheinlich an mehreren Stellen nutze. Nö, nicht mal.

00:31:34 Warum habe ich es dann rausgezogen? Was zum Henker? Das gibt wirklich hier aber mal so überhaupt keinen Sinn. Da kann es hier auch drin bleiben. Muss noch nicht mal exportiert werden. Piss dich mal nicht ein da oben.

00:31:57 Das ist, wenn man AI alles machen lässt, sage ich. So, heißt übrigens Intense Coupling oder Shotgun Search, je nachdem, von welcher Seite man es betrachtet. Das Pattern, dass man zum Beispiel Typen in einer Datei definiert und dann viel zu viele andere Dateien von einer Datei abhängen. Das ist ein Anti-Pattern. Deswegen habe ich das jetzt gerade eben hier reingezogen. Hat letztlich wieder was mit Wartbarkeit zu tun.

00:32:26 und mit dem Geheimnisprinzip, weil dadurch, dass jetzt nur noch diese Datei hier von weiß und hier von nichts exportiert wird, darf ich es auch verändern, ohne dass sich die Änderungen in andere Dateien ausbreitet. Ganz oft diese ganzen Anti-Patterns in der Softwareentwicklung laufen alle auf Änderungsauswirkungsanalyse, auf Englisch Change Impact Analyse raus, dass man gerne den Impact von Changes so klein halten möchte wie möglich. Wieder was gelernt, oder? Ich könnte meinen...

00:32:53 Ich habe viel Zeit in der Uni verbracht. Ich habe so einen Scheiß wirklich auch schon gelehrt. Kein Witz. Diese eine Vorlesung, wo es Aufnahmen von mir gibt, wo hier der, keine Ahnung wer da war, Bayerische Rundfunk oder was weiß ich, ARD, da habe ich tatsächlich gerade eine Vorlesung über Dependency, habe ich über Dependency Inversion geredet? Oder allgemein über Wartbarkeit? Oder über Clean Architecture?

00:33:24 Von mir war auch der SWR halt irgendwas öffentlicher Rundfunk. Oder Fernsehen oder Wachter, ich hab doch keine Ahnung. Ich hab keine Ahnung, was die Vorlesung ging. Ich weiß, es ging halt um Wartbarkeit und das gehört ja alles dazu.

00:33:41 Oder hast du nur über Weißwurst geredet? I don't know. Guck das Video an, I guess. So habe ich diese wunderschönen Aufnahmen, wo ich vorne im Hörsaal rede. So, zurück zum Thema. So weit, so gut. Das hier wäre trotzdem irgendwie geil, das zu teilen. So, ist jetzt natürlich die Frage, wie hart das Overkill ist. Weil, ähm...

00:34:02 Letztlich wird es darauf hinauslaufen, dass ich diese zwei Sachen halt in ein eigenes Paket packe und dann Client und Server davon abhängen. Maestro Synergen, vielen Dank. Aber allein in der kurzen Zeit, wo ich hier dran gearbeitet habe, hat die Evolution schon zugeschlagen, die softe Evolution. Und mir ordentlich meine Show vermisst. Deswegen würde ich sagen, ja, wir machen hier mal kurz einen neuen Ordner.

00:34:33 Den nenne ich Shared. Der lebt neben Server und Client. Da drin gibt es eine Datei, die heißt Types.ts. Wobei wir können erstmal einen neuen Ordner. Lassen wir das halbwegs clean machen, weil wir haben ja hier auch so einen halbwegs. SRC, New File, Types.ts. Und da kopiere ich den Kram rein. Source Type.

00:35:12 So, das soll natürlich alles exportiert werden. Könnte man sagen, aber ist das jetzt nicht wieder schlecht? Aber ich glaube, hier komme ich tatsächlich nicht drüber hinweg, weil ich die Sachen ja auch da definieren muss. So, und jetzt theoretisch kann ich jetzt alle von diesem Shared-Teil abhängen lassen.

00:35:33 Also haben wir Client, Server und dann Shared. Jetzt muss man sich natürlich überlegen, ob der auch seine eigene Package Chasen dann bekommen muss. I guess so, weil ansonsten checkt es ja unser guter Freund der PNPM nicht. Und das bedeutet, dass ich hier dann wohl so ein Workspace Konzept irgendwie fahren muss. Und spätestens jetzt bin ich mal wieder dankbar dafür, dass es AI gibt.

00:36:04 Weil ich habe nicht mal remotely Bock mir jetzt anzugucken, wie man irgendwelche Konfigurationsdateien für NPM schreibt. Ich weiß, dass ich das hier als gesharte, ich wollte gerade Crates sagen, weil ich so viel Rust entwickle, als gesharte Crates anbieten möchte. Aber was weiß ich denn, wie ich davon abhänge? Also mit einem relativen Pfad auf jeden Fall nicht. Wobei ich bin versucht, ne wir machen das schon irgendwie sauber.

00:36:33 Das lustige ist, wenn man sich die Sachen anguckt, sind es auch nur so Sachen, wo ich keinen Bock hatte, es von Hand zu machen. Ehe ist Bild-Error-Wilverdope-Premiere. Ich habe doch keinen Bock, das von Hand raus zu finden. So, deswegen schön Klo-Zonnet, damit wir hier ordentlich... Sondern wir beschreiben jetzt zusammen einen wunderschönen Prompt. Erinnert euch nicht zurück, als Leute Prompt-Engineering gemacht haben und sich wirklich für Ingenieure gehalten haben. Die guten alten Zeiten vor zwei Jahren.

00:37:04 Geil, neben Opus habe ich ihn nicht. Auf der Arbeit habe ich ein erwachsenes Cloud-Abonnement. Hier habe ich nur so ein Educational GitLab-Abonnement. Und für das, was ich hier gerade eben mache, würde locker Haiku reichen. Nimm Gemini und dachte, Gemini schaltet ihre Open-Source-CLI ab. Holy fuck. Also erstmal HelloChatGBT. Weil man muss immer AI ein bisschen Gas leiten.

00:37:38 I'm so sorry. Ich hab manchmal wirklich einfach ein bisschen zu viel Spaß und erst im Nachhinein wird mir wieder bewusst, dass ich eigentlich gerade einen See austrockne. Naja, egal. Sum of the... Mein Wortwitz hat er nicht verstanden. Geh mir nicht auf die Eier. Ah, oh, nice. Ich nutze voll viel Code Cloud gerade. Also mein Code Cloud. Mein Cloud Code. I moved some shared types from...

00:38:39 Make no mistakes, genau. Das lustige ist, ich könnte auch das hier reinziehen, dann wäre das sogar ein Simlink, aber das ist scheißegal. Ich könnte es auch einfach nicht hinschreiben, dann würde ich es trotzdem finden.

00:39:08 Soll ich das dazu schreiben? Make no mistakes? Das ist mir zu affig. Das ist voll lustig, ne? Wir machen da so viel Witze, wenn man wieder irgendwie AI bei uns die Riesescheiße gebaut hat und das passiert natürlich wirklich sau oft. Sagen wir so, du hast vergessen, make no mistakes dazu zu schreiben. Dann so, stimmt, du Anfänger. Hast kein richtiges Prompt Engineering gelernt. Das ist leider ein Baufklein.

00:39:39 Sonnet ist komplett Overkill für diese Aufgabe. Das ist erklärt beim Qtab-Koop-Alend-Dat-Jetivity, als ob ich so einen sassy Kommentar gedrückt bekommen habe, bevor er mir jetzt meine Dateien aufräumen darf. Geil. Also ernsthaft, wenn ich von Beruf Softwareentwickler wäre, wäre ich scared as shit. Zum Glück bin ich das nicht.

00:40:19 Zu Glück besteht mein Tag fast gar nicht aus Softwareentwicklung, sondern aus tausend anderen Dingen. Oh oh, jetzt wird's kritisch, Leute. Noch 25% und ich kann nicht mehr entwickeln. Jetzt hängt er daran, dass ich halt Heustet-Sachen habe.

00:40:52 weil ich das brauche für irgendeinen bescheuerten Hack für Premiere, die ich schon wieder vergessen habe. I am genau required because the UXP Package Manager cannot handle Simlinks. Ich bin gespannt, wie er das hinbekommt, weil das ist halt eine technische Einschränkung. Wenn er mir jetzt nämlich das Heustet rausschmeiße, dann ist es aber Git Reset am Start. So, auch eine schöne Eigenschaft, dass er bei Package.json sagt, das ist nur eine sensible Datei.

00:41:27 Wir haben viel gelernt, seitdem wir OpenClaw einfach alle unsere E-Mails haben löschen lassen. So, das ist ein Module, das exportiert Types und per Default Types. Okay, du, ich nicht hinterfragen. Weil ich meine, ich kann es ja nicht, sonst hätte ich es ja nicht AI'n lassen. Okay, er hängt also eine Dependency rein, Premiere Remote Shared und sagt, das ist also ein relativer Pfad.

00:42:03 Und das an mehreren Stellen. Okay, okay, okay. Ich frage mich, wie er um diese Häuschteinschränkung rumingeniert hat. Oder ob die jetzt demnächst ausgetauscht wird. Jetzt hat er hier die Sachen importiert und den Kram rausgeschmissen. Gut. Korrekt auch. Jetzt hat er hier die Sachen importiert und den Kram rausgeschmissen. Auch richtig. Jetzt will er PNPM Install in beiden ausführen. Und jetzt wird es spannend. Weil hier drin sehen wir jetzt, ob es funktioniert oder nicht. Done. Geil.

00:42:45 Also scheint dieses Heuste doch kein Problem zu sein. But wait, hat er sicherlich gesagt. Now I have the full picture. Caveman. Es steht auf meiner Liste, dass ich Caveman ausprobiere. Ist mir scheißegal, ob das Token spart oder nicht. Die Tatsache, dass es einfach fucking geil klingt. Während wir auf die AI... Warum dauert das gerade so lang? Ah, danke für das Tail-5, so sehe ich es nicht. Schön. Währenddessen zeige ich euch Caveman. Caveman ist fucking hilarious. Good Software.

00:43:19 Less token. Das ist Caveman. Why use many tokens when few do trick? Ich liebe alles an diesem Readme. Die Tatsache, dass dieses ganze Ding, vor allem, also als mir das jemand gezeigt hat, ich bin, das fand ich so okay, ja, haha, ich bin unterhalten, aber bei Brain Still Big Mouth Small

00:43:44 Ich bin gestorben. Alter, ich hab wirklich... Also meine Kollegen haben mich so angeguckt, was ist falsch bei dir? Alter! Ja, turns out, man kann auch einfach ein Sprachmodell sprechen lassen wie ein Vollidiot. Das funktioniert trotzdem, aber spart Tokens. Also ich nutze schon RTK im Hintergrund. Ich weiß nicht, ob hier, aber zumindest auf der Arbeit nutze ich RTK. Es ist halt auch verständlicher, ne? Tokens hin oder her. Und es ist auch irgendwie unterhaltsam. Also es ist nur eine Frage der Zeit, bis ich Caveman nutze, glaube ich.

00:44:18 Ich glaube, ich nutze hier kein RTK. Aber auf der Arbeit nutze ich es. RTK ist der... Der Rust-Token-Killer. Und ist sehr effizient, weil es in Rust geschrieben ist. Sag ich das bereits? Hier. Rust ist lustigerweise Rostfarben so.

00:44:45 Ja, das Lustige ist, RTK macht auch manche Linuskommandos einfach besser. Woher weißt du, dass du das geschrieben hast? Sie sagen es dir. Das ist so fucking lustig, ne? Es ist halt wirklich wahr. Rust ist das Apple unter den Programmiersprachen. Schon ein bisschen Gaslighting deiner AI, wenn du so sagst, ja, ich möchte... Offensichtlicherweise liegt ein Problem vor, wenn du seit 25 Jahren diesen Befehl ausführst.

00:45:19 Und ich wüsste auch, welches Problem vorliegen würde, wenn du, Depp, mir nicht den Tail hintendran gehauen hättest. Ach, ich bin schon ein Client. Okay, geil. Ich weiß nicht, an was der vorhin gehangen hat. Ich werde es nie rausfinden. Der hat wirklich ausgeführt und ist dann gescheitert. I use Arsch, by the way. Klar. Du, I don't judge. Go fast cleanly. Danke, danke, danke. Das hast du schön eloquent gesagt.

00:46:14 Und kann man jetzt mal bitte jedem sein... Ja, das ist ein King. Das ist eine gute Antwort. Not schlecht. Wenn du Rust in deinem Projekt benutzt, dann wird es automatisch von Cargo in die Readme geschrieben. Ah, das ist dieses Cargo-Innen, von dem alle reden. Das macht gar nicht irgendwie Konfigurationsdatei. Das überschreibt deine Readme. Das ist ungefähr so wie diese geile Outlook-Eigenschaft, dass eben hinten dran steht, diese Nachricht wurde mit Outlook geschrieben. Track.

00:46:44 So, und warum hat er sich jetzt vorhin wegen Heustitz eingepisst? Finden wir das noch raus? Weil das würde mich tatsächlich mal interessieren. Ich versuche den Scheißer zu verstehen. Interesting.

00:46:59 The client and server have each their own workspace but they don't work space. Och nö, Alter, weißt du, der ganze Kram hier, der kann mich schon wieder mal kreuzweise. Als ob der jetzt mal so sassy in seinem ausgeblendeten Thinking rausgefunden hat, dass mein Projekt Setup für den Arsch ist. Alter, ich sprech kein NPM. Es baut. Ja, gucken wir uns mal die Änderungen an. Weg mit dir.

00:47:23 Weg mit dir. Dinge werden importiert, anstatt dass sie definiert werden. Warum sind hier so viele Änderungen, man? Dinge werden importiert. Das ist einfach nur eine Log-Datei. Dinge werden importiert. Dinge werden importiert, die gar nicht gebraucht werden. Das ist genau mein Humor. Ja. Ja. Das finde ich wild, dass hier Types und Default, aber also wahrscheinlich ist das so. The module path that is resolved in the specifier set.

00:48:09 Okay, ja dann ist das halt so. Also hier ist sie. Die Frage ist, ich meine das ist jetzt wirklich so eine krass minimale Package Chasing, aber eigentlich Thank you Deep Seek. Das ist genau mein Humor. Okay, ich habe nicht mehr so viel Talk. Ruhe jetzt. Okay, wahrscheinlich ist es halt einfach so.

00:48:58 Ja, kannst du alle keepen. Schön. Ich bin stolz auf dich. Gucken wir mal, ob der Kram noch läuft. Ja, sieht gut aus. Aha. Ja, Adress already in use. Komm, nur weil der im Hintergrund noch läuft, pisst dich nicht ein. Noch nebenbei was anderes. Sieht falsch aus, wenn der Package zu der DTS exportieren gebaut wurde. Es wurde keine DTS gebaut. Hier wurde nichts gebaut.

00:49:54 Gibt es einen Grund, wieso du lieber Copilot nutzt? Interessiert mich, weil ich es gerade noch kostenlos bekomme. Das ist mal ein krasser Grund. Ach, guck mal. UXP-Plugin enabled. Baust du das überhaupt mit TSC? Hier hängen einfach nur zwei andere Projekte von ab. Hier sind einfach nur ein paar gemeinsame Definitionen. Und der Client hier und der Server hängen einfach nur davon ab, damit die die richtigen Sachen hin- und herschieben.

00:50:33 Ich habe halt einfach noch GitHub Education von meiner Zeit an der Uni und kriege darüber halt eine Copilot-Lizenz, eine kleine. Wenn die auslaufen würde, würde ich Gemini nutzen, weil das bei meinem Google-Abonnement dabei ist. Und wenn mich das zu sehr abfacken würde, würde ich halt Zähne knirschen, 17 Euro für Code Code ausgeben, weil das meiner Meinung nach das Beste ist. Möchte ich mal in der Stelle noch dazu sagen. Okay, cool, also das Zeug funktioniert.

00:51:03 Also dann Extracts. Types into Own. Wahrscheinlich ist es dann ein Package, oder? Crate wird es ja wohl nicht sein. Ich hoffe, wenn es sau lustig wäre, dazu Crate zu schreiben. Claude Code. Claude Klaus Klaus Chaos. Schön.

00:51:29 Also was mich ein bisschen ärgert, ist, dass natürlich keinerlei Linting oder Formatting hier drin ist. Man könnte jetzt irgendwie anfangen, das hier auch noch mit reinzupacken. Aber dann frage ich mich so langsam, ob man nicht irgendwie solche Regeln auf Workspace-Ebene... Education ist so ein Scam, weil der Ecopola daraus gewisert. Habe ich es dann noch? Aber man muss schon sagen, dass die Credits ein Witz sind. Also ich habe gestern nur so ein bisschen Sachen viben lassen. Und das ist also...

00:51:58 instant aufgebraucht. Also 17 Euro finde ich Claude ist der beste DIG aktuell. Aber ich kann halt auch einfach 17 Euro sparen. Das sind zwei Döner. So, cool. Jetzt haben wir das schon mal extrahiert. Dann zurück zu unserem, also ja, I don't fucking care. Pre-Commit Hooks? In die Hölle. Pre-Commit Hooks wird es bei mir nicht geben.

00:52:34 Alles, was in Pre-Commit-Hooks passiert, könnte in einer Pipeline passieren. Sollte in einer Pipeline passieren. Muss in einer Pipeline passieren. Pre-Commit-Hooks ist so wie Checkboxen. Wenn deine Entwickler Checkboxen abhaken müssen. Einfach, wenn deine Entwickler ein bisschen zu produktiv sind, fängst du an, sie fertig zu machen. Na guck mal, irgendwo habe ich wohl Dinge nicht gemacht, die in einem Pre-Commit-Hook passieren könnten.

00:53:02 Weil ich merk sowas... Ach guck mal, Jack Formatting. Also irgendwo hätt ich mal formatieren sollen. Aber ist ja vollkommen okay, dass die Pipeline bricht. Weil es ist kein fucking Pre-Commit-Hook. Und ich kann's einfach beheben. Denn es ist auch einfach scheißegal, dass der Gram nicht formatiert ist, bis der Pull-Request gemerged ist. Du benutzt Pre-Commit-Hooks, wenn du einen dummen Entwickler hast. Oder wenn du keine Pipeline hast. Aber was im Umkehrschluss bedeutet, dass du dumme Entwickler... Also ja, vielleicht. Ich hasse Pre-Commit...

00:53:33 Ich glaube, da bin ich einfach von mir selbst zu geschädigt, weil ich in anderen Projekten mal Precomitivungs drin hatte und ich so hart gepasst habe. Weißt du? Vor allem das Tolle ist, ich zeige euch einen Trick.

00:53:45 Pre-Commit-Hooks, ne? Die sind doch total schön, dann machst du hier git commit –m deine Mutter. Und dann passieren Dinge, die du nicht gesehen hast, irgendein Nebeneffekt. Oder dann sagst du, hä, warum funktioniert sowas basic wie git commit nicht? Warum ist das kaputt? Und dann fixt du es vielleicht. Oder du gibst einfach NoVerify mit dazu ein und zack, gibt es keine Pre-Commit-Hooks mehr.

00:54:14 Und ich würde lügen, wenn ich das nicht heute auch schon wieder gemacht hätte, weil ich in einem Projekt einen Pre-Commit-Hook umgehen wollte, weil ich keine Lust hatte, aus einem Container herauszugehen. Ist egal. Zurück zum Thema. Wir haben jetzt hier so ein Shared-Kram. Ist jetzt aus dem Weg. Ist sehr schön. Und jetzt weiß ich nicht, wie es weitergeht, weil ich nicht weiß, was die nächste hässliche To-Do-Nachricht ist, die ich mir selbst hinterlassen habe. So, das hier könnten Umgebungsvariablen sein, aber wie gesagt, ich kann nicht alles da reinpacken, deswegen ist es mir egal.

00:54:46 Hier fehlt ein To-Do offenbar für mich. Hier fehlt auch ein To-Do für mich. Okay, also man kann die tatsächlich ziemlich gut. Das ist übrigens auch wieder sowas, was man erst total geil nahe bringen kann. Das ist jetzt die AI generiert.

00:55:19 Und das machen ja auch manchmal Entwickler, dass sie so anfangen, ihren Code in so Code-Regions zu machen. C-Sharp hat dafür ja sogar ein extra syntaktisches Element für Code-Regions. Wisst ihr, was eine Code-Region sein sollte? Eine eigene Datei.

00:55:44 Alter, das ist auch wieder so ein Ding, wo man sich so krass drüber aufregen kann. Hä? Wenn du anfängst, die HTTP-Server drüber zu schreiben, dann solltest du literally vielleicht einfach das in eine Datei extrahieren, wo der HTTP-Server drin ist. Aber was weiß ich schon. Ich bin versucht, wieder so eine User-Config TS hinzulegen, weil, ähm, ja, mach ich einfach. Also wir, ähm,

00:56:25 Wir machen mal hier irgendwie so einen... Was ist die Frage? Die HTTP-Kram mehr als einen? Wahrscheinlich fairerweise nicht. Wo ist denn der Swagger-Kram? Websocket-Port. Danke, AI. Das wollte ich schreiben. Environment and variables. Cool. Das ist sogar... Das ist wild, Alter. Das ist richtig. Also die erste Hälfte, der zweite Teil ist komplett falsch. Read them.

00:57:51 So, sehr schön. Dann können wir den Kram hier wieder rausschmeißen. Request Timeout in Millisekunden. Ist das, was ich glaube, was es ist? Tatsächlich, hier wird etwas zum Server geschickt. Und dann wird Request Timeout in Millisekunden gewartet. Ich überlege gerade, was die längste Operation ist, die man hinschicken könnte. Und ich setze das auf eine Minute, Alter.

00:58:23 CodecMedia oder nicht? So etwas wie Vorschläge inline noch nie probiert. Die inline Vorschläge finde ich tatsächlich ziemlich geil, auch wenn ich es für mich gerade drüber lustig gemacht habe, weil sie oft genau das Triviale sind, was ich gerade eben selber sowieso hinschreiben wollte. Das ist ungefähr so wie so eine... Keine, das wird doch schon exportiert. So wie eine... Ach, weiß ich nicht.

00:58:55 Ja doch, ein bisschen so wie wenn ich zum Beispiel jetzt hier so eine Autokorrektur mache, was lustig ist, weil er gerade die Sachen einfach nicht findet. Ach, hier findet er sie. Achso, weil das Ding WS-Port... Wo habe ich WS-Port hingeschoben? Warum findet er den einen, aber nicht den anderen? Warum bin ich da?

00:59:21 Ja, also deswegen, die finde ich eigentlich ganz geil. Sich Sachen einfach hinweiben lassen ist auch manchmal total hilfreich. Die Qualität ist halt manchmal meh. Und dann gibt es natürlich noch die ganzen wirklich fortgeschritteneren Workflows, wo man so mehrstufig sich erst Entwurfsdokumente erzeugen lässt und so weiter. Also sowas wie Specs Driven Development zum Beispiel oder der Plan Mode, den manche anbieten oder wenn man Code, Code, Code vernünftig einsetzt, da gibt es schon echt advancede Dinge.

00:59:49 Und hey, let's see, es ist komplett in die Kristallkugel zu schauen, um zu sagen, ob wir irgendwann nicht mehr programmieren werden. Es gibt wirklich für beide Seiten ganz, ganz viele Märtyrer, das ist jetzt schon wieder ein Religionskrieg. Aber hey, es sind ja nur ganz viele Investorenmilliarden, die damit gekämpft werden. Also, what could potentially go wrong? Love's in. In .com-Krise.

Refaktorisierung und Design-Prinzipien

01:00:18

01:00:18 Okay, so, new file, wir ziehen den HTTP server mal raus. Hier habe ich das Ding auch, wer ist client? Dann kann es hier auch HTTP server heißen.

01:00:33 Sind Inline-Vorschläge viel besser als Syntax-Vervollständigung? Sie sind halt anders. Syntax-Vervollständigung ist statische Analyse und Inline-Vorschläge sind Sprachmodell. Das eine ist algorithmisch, das andere ist datengetrieben. Sie können theoretisch beide nicht das Gleiche. In der Praxis macht oft gar keinen Unterschied. Ich halte immer eine algorithmische Lösung für geiler. Aber für so repetitiven Scheiß? Also wenn ich jetzt zum Beispiel Kunst...

01:01:01 Request Time-Mod-Warn. Vielleicht wäre das genau das, was ich gerade eben schreiben wollen würde oder sowas. Das kann dir natürlich keine statische Analyse der Welt hin klatschen. Ja, weiß ich nicht. Also, let's see. Vor ein paar Jahren war das ja auch noch alles ganz anders. Es ist total schwierig, das momentan einzuschätzen, weil sich alles so schnell bewegt. So, wie ist das im WebSocket-Client gebaut? Das ist wirklich eine Klasse. Wahrscheinlich ist es schon schöner, das irgendwie in der HTTP-Server auch eine Klasse zu packen. Sollen wir das selber schreiben oder schreiben lassen? Ich hatte noch ein paar Tokens übrig.

01:01:38 Ich habe nur noch ein paar Minuten, dann ist schon mal eine Stunde voll. Ach, weißt du was? Wir lassen es machen. Hier auch so ein Trick. Neuer Thread aufmachen. Weil... habe ich Token gespart. Muss er nicht so viel Scheiße immer mitschicken und verwalten und was weiß ich was. Und sie sind auch präziser der Modelle, ne? Weil man die ganze Zeit alles voll klatscht. Ah, cool. Also ein Kops hat das Video der neuen Welle entdeckt.

01:02:07 Okay, move the HTTP server as its own class to HTTP server TS. Move the WebSocket server to WS server TS. Only keep a minimal index TS. Make both servers. Mal kurz gucken, was die eigentlich hier so reinbringen.

01:02:55 Der liest auch wirklich einfach nur in der Datei.

01:03:21 das ist nämlich auch wieder so ein ding würde ich das nicht dazu schreiben werden die so hart gekostet dass ich sie dann manuell wieder aufbrechen würde um die penningin checkten zu haben damit ich das zeug testen kann weil ohne geht es ja gar nicht so meine große frage ist dieser websocket server irgendwo müssen die ja miteinander reden

01:04:01 Ah ja, hier UXP Socket. Was ist UXP Socket? Ach, ein RAP Socket. Ja, wir gucken mal, was passiert. Wir müssen gar nicht in einer guten Idee, wir werden auch nicht geredet. Stimmt nicht? Ich hab grad mit Ali sogar telefoniert. Deswegen war ich auch gerade kurz weg. Now I have the full picture. Complete picture. I'm sorry. But wait. Steht auch schon irgendwo, äh, but wait? I'm designing. I'm resigning. Nein, but wait. Komm schon. Wo ist der but wait? Ah ja.

01:04:51 Thinking. Das Lustige ist, schön, dass du irgendwelche Sachen aufsetzt. Habe ich bis jetzt noch nicht so arg gesehen. Weißt du, also ich bin wirklich gespannt, wo sich Coding Streams hin entwickeln. Muss ich schon ehrlich sagen, weil also weiß nicht, ob Code in der Zukunft noch so ein Ding sein wird. Werden wir dann wirklich so anfangen? Also ist der Coding Stream noch ein Ding? Ist das dann noch relevant? Ich weiß es nicht.

01:05:28 Als Hobby immer noch. Ja, genau, so wie Schreinerei oder sowas. Du kannst irgendwie Dinge mit großen industriellen Maschinen herstellen, aber vielleicht will ich auch einfach nur einen handgeschreinerten Schrank haben. Also das wird sicherlich so am Leben bleiben, aber sage ich mal auf industrieller Ebene, was macht der Entwickler? Ich meine, Ingenieure sind vielleicht erst später davon betroffen, aber also gerade so Unternehmen, die einfach quasi nur Berater im Sinne von Nicht-Freelancer-Entwickler vermieten.

01:06:03 Ja oder so und das Thema KI ist durch, ich meine ganz drohe laufende Sekundärkosten auf, sodass man nicht mehr lange bis die Blase platzt. Ja, ich habe vor kurzem was echt super Spannendes gehört. Ich weiß nicht, ob das stimmt. Ich muss das mal nochmal verifizieren. Vielleicht muss ich mal Chat-GPT fragen. Das ist lustig, weil das ist genau das Gegenteil von verifizieren. Und zwar frage ich mich, also ob das wahr ist, dass...

01:06:31 die Kosten, um Modelle zu nutzen, auszuführen, die ganze Zeit sinken. Und das heißt, dass man irgendwie Modelle mit der Fähigkeit, wie sie vor ein paar Jahren nur auf Supercomputern irgendwie hätten ausführen können, mittlerweile einfach so auf einer Grafikkarte bei mir zu Hause laufen.

01:06:55 aber gleichzeitig die Kosten für das Trainieren der Modelle so eine exponentielle Funktion sind oder die Fähigkeiten der Modelle logarithmische. Das heißt, dass sie gegen so eine Klärse, eine Decke wachsen. Produktivität und Kosten bei KI-Nutzen bei sehr erfahrenen Devs doch nicht so toll sein soll, wie behauptet. Kommt darauf ein, was man nutzt, glaube ich. Also das, was ich jetzt hier gerade eben mache, einfach nur so ein paar Sachen hin und her schieben lassen. Maybe.

01:07:31 Haben natürlich hier, also er hat mir offensichtlich sogar hier kaputten Code gebaut. Hier ist JS mit drin. Not sure, wo der herkommt, weil das ist eigentlich TS.

01:07:47 So, aber die sieht schon eigentlich ganz aufgeräumt aus. Jetzt gucken wir uns das mal kurz an. Also hier werden die Ports tatsächlich importiert. Hier werden Sachen initialisiert. Hier werden Sachen übergeben. Ja, so, und hier haben wir schon die erste Problematik. Das hier ist keine Dependency Inversion. Das ist zwar Dependency Injection, aber der HTTP-Server hängt jetzt vom Web-Server ab und zwar vom konkreten Web-Socket-Server. Wenn wir die Implementierung vom HTTP-Server reingucken,

01:08:17 dann sehen wir, dass er hier von WS Server abhängt und WS Server aus WS Server importiert. Und das bedeutet, dass ich WS Server nicht mehr unabhängig ändern kann, weil ich damit den HTTP Server kaputt machen würde. Würde ich stattdessen eine Abstraktion definieren, wie ein WebSocket Server auszusehen hat, was der so für öffentliche Funktionen hat, also alles, was wir hier links so sehen, wenn ich mir das Skelett hier angucke, dann...

01:08:42 Hätte ich eine stabilere Abstraktion, würde mein Server nur von der Abstraktion abhängen und ich könnte die Implementierung des Websocket-Servers frei ändern. Und das, meine Damen und Herren, ist Dependency Inversion. Das ist so, im Studium checkt man es einfach nicht, weil...

01:08:56 Es offenbar scheiße erklärt wird also ich habe im studium nicht verstanden was dem pendent sie in version ist oder was die pendent sehen jackson ist aber immer direkt an google juice oder sowas denkt aber Tatsächlich ist es so simpel wie dass der konkrete hatte die p server hier einen scheiß von einem existenz eines websocket servers wissen sollte

01:09:18 Der kriegt den im Konstruktor beigeliefert. Wo sind wir? Kriegt er den hier reingesteckt und der soll bitte seine Schnauze halten. So, das heißt, da müssen wir noch eine Abstraktion bauen. Die Abstraktion darf in WS-Server sein.

01:09:40 Aber weißt du was? Will Gaslighten. Ich finde das schön, die KI zu nerven. Das ist ja kein Mensch. Da kann ich alle meine Boshaftigkeit rauslassen. Na, na, na, wie nennen wir ihn heute? Was ist noch so ein Modell? Nee, Uff, ist schöner. Oh, my dear. Wir haben ihn heute schon Chet-Chi-Bti genannt. Claude wäre ja nicht so falsch, weil das Modell hinten dran ist, Sonnet.

01:10:13 Olama. Tu mal Ruhe an's holen. Nein, ich meine, ich will ihn. Oh, my dear. Gemini hat mir noch gar nicht. True. Oh, my dear Gemini. Don't you know about dependency inversion? This is bad design. You should have learned this in the Master Vorlesung.

01:10:44 Software Engineering 2. Was lustig ist, weil da habe ich das halt unterrichtet jahrelang. Es ist so dumm, ey. Get good, please. Get good, please. And add an abstraction for a WS-Server in the...

01:11:11 Ah, wer ist jetzt hier der Höhlenmensch, he?

01:11:43 Ich muss noch ein bisschen Kommentare nachholen. Ich habe vorhin was total Spannendes nicht vorgelesen, wo ich mir genug Zeit lassen wollte. Wo ist es denn?

Fazit: Herausforderungen und Zukunftsperspektiven

01:11:57

01:11:57 Wer baut ein Fenster, wer schreit obsolet? Habt ihr letzt einen anderen Coding-Streamer gesehen? Der hat quasi nur gepromptet und es war langweilig zum Zuschauern. La-vi-a-ra-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-la-

01:12:27 Finde ich total spannend, auch aus meiner Creator-Brille, aus meiner Creator-Perspektive. Weil es ist natürlich total verlockend. Das ist jetzt ungefähr so auf dem Level wie Minecraft spielen. Aber nicht Minecraft spielen, sondern so Element-Style 24-7-Farm. Das ist nämlich exakt dasselbe, was hier passiert. Es ist insane anstrengend für den Kopf gleichzeitig zu entwickeln und irgendwie halbwegs unterhaltsam zu sein. Deswegen gebe ich diesen Teil mit dem Unterhaltsamsein einfach komplett auf. Und den Teil mit dem guten Codeschreiben auch.

01:12:55 Das schlechteste aus beiden Welten. Das ist effektiv ein Coding-Stream. Aber das passiert in Gaming-Streams genauso. Zum Beispiel diese 24-7-Farm-Streams in Minecraft sind genau das. Es ist nämlich fucking schwierig zu zocken und gleichzeitig zu reden. Also halt mal einfach nur die linke Maustaste runter und rede. Das ist einfacher. Also das soll überhaupt kein Flame sein, sondern das ist einfach ganz natürlich. Und beim Coding passiert aber auch genau das, dass man nur die linke Maustaste runterhält. Das entsprechende hierzu...

01:13:22 ist dann, dass man sich halt einfach von der KI beim Coden zuguckt. Das ist quasi eigentlich dann ein Reaction-Stream, wenn man so möchte. Der Coding-Stream degradiert zum Reaction-Stream, weil man nur noch drauf reactet, was man von der KI so gefüttert bekommt. Mjam, mjam. Lecker. Total geiler Kommentar, finde ich wahnsinnig spannend.

01:13:46 Das mit den Publikationen übrigens muss man total vorsichtig sein. Es gibt Publikationen zu allem. Was spannend ist, ist der Konsens. Da braucht es mehr als eine Publikation. Ich habe zum Beispiel selber Publikationen geschrieben, als AI neu war. Habe ich mitgeholfen bei Projekten, wo wir herausgefunden haben, wie Plagieren mit AI funktioniert und das ist halt so überhaupt nicht funktioniert. Das wäre jetzt heute auch nicht mehr das, was ich so unterschreiben würde. Jemand, der weiß, was er tut, kann damit auf jeden Fall plagiieren. Studis wissen halt nicht, was sie tun.

01:14:25 Genau. Ich weiß von den Entwicklern Firmen, dass sie ihren Durchsatz an Code stark erhöht haben und die Qualität stark sinkt und damit die Support-Kosten blablabla steigen. Das ist es halt letztlich, ne? Aufwand. Aufwand auch beim Implementieren ist ein natürlicher Filter, das Richtige zu tun. Oder, na das ist falsch. Es ist ein natürlicher Filter, nicht so viel Bullshit zu machen, weil es Aufwand kostet. Also denkst du 5 Minuten drüber nach. Wenn es kein Aufwand mehr kostet, unendlich viel Code zu generieren,

Codegenerierung und technische Diskussionen

01:14:52

01:14:52 Ja, dann kannst du auch unendlich viel Code generieren. Du erfüllst vielleicht nicht deine Ziele und alles fährt vor die Wand, aber du hast sehr viel Code generiert. LLM Ragebait, ganz genau. Okay, du bist der Dark Souls Player und programmieren.

01:15:07 Achso, nur noch Schuhe, was das so bedeuten würde. Schlechter Code ist wiederum unterhaltsam. Bald nur noch Just Chatting. Um ehrlich zu sein, ja. Also ich finde gerade die Diskussion, die wir hier haben, ist unglaublich geil. Die macht mir mehr Spaß, als gerade diesen Server hier zu vibecoden. Mehr Log ist gleich höheres Gehalt. Jaja, solche Metrigen, Alter. Ich finde das so geil. Also das muss ich an der Stelle auch wirklich mal eine Lanze brechen für das Unternehmen, bei dem ich arbeite.

01:15:36 Da sind wir so transparent, was solche Sachen angeht und wir wissen, was Bullshit ist. Und niemand wird irgendwie nach einer Metrik, wie viele Tokens er verbrennt oder wie viele Loks er produziert oder sowas. Das juckt niemanden. Machst du deine Aufgaben gut oder nicht? So, hä?

01:15:55 naja das setting auch mit germany ist mein kommentar des abends dann wir machen das ist die coding coding streams degenerieren zu just chatting aber halt mit dem bot das ist genau das ist genau mein mein ding ich werde nach sek vor zum auto bewertet also wenn ich eins gelernt habe

01:16:17 nach einem Jahr in der Automobilindustrie, dass Autos die absolut einfachste Technologie überhaupt ist, wo man eigentlich fast gar nichts für können muss. Jeder kann ein Auto bauen. Hilfe. Mein All-Time-Favorite wird dieser Autosar, Reddit-Fred sein. Falls ihr den nicht kennt, googelt das. Das ist Gold.

01:16:51 So, gut, also clean, here is what's changed. Added UXP-Pitch-Interface at the top, exposing only what call is needed. Guck, das ist übrigens eine Abstraktion, was wir hier gerade sehen. Und warum macht man den Spaß? Weil Abstraktionen, jetzt kommt der Moment, das ist so dieser Dozenten-Moment, sage ich euch. Das ist das, wo man sich als Dozent vorne in der Vorlesungszahl einen drauf ab...

Architektonische Entscheidungen und Metriken

01:17:20

01:17:20 abfreut, gerade noch so gerettet, wenn dann der Geist sich schließt, wenn the circle itself closes. Warum macht man diese Abstraktion hier? Warum ist Dependent Inversion dann gutes Design? Weil sich Abstraktionen in der Natur ihrer Sache weniger enden und alles läuft mal wieder auf Änderungs- Auswirkungsanalyse raus, auf Change-Impact-Analyse, weil wenig Änderungsausbreitung gleich viel gut.

01:17:51 Und das war auch das erste, was ich gemacht habe mit diesem Shared-Ding. Das war genau dasselbe. Ach so, nachher ist ja Fußball. Muss bald aufhören. Du musst alle Fußball gucken. Für unsere Jungs. Also, es gibt eine UXP-Pitch, Abstraktion, Dankeschön. Blablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabl

01:18:18 Ich werde mein Leben lang diese Modelle anders nennen, wie sie heißen. Weil das ist halt so auf so einem tiefen Level implementiert. Es ist so, warum ist es so fucking lustig, Mann? Ich gehe kaputt. I'm sorry. Es ist so fucking dumm, ey. Das hat mindestens einen Euro an Tokens jetzt gerade gekostet. Ja, okay, aber in der Zwischenzeit hat sicher jemand subscribed.

01:18:45 Damit ist das net positive. Und das einzige, auf was wir gucken in dieser kapitalistischen Welt ist, ob es... Ne, nicht mal ob es net positive ist, wenn wir mal ehrlich sagen. Das hätte ich auch einfach selber implementieren können. Ich weiß, einfach die Abstraktion hier reinpacken.

01:18:59 Und hier wird die UXP, hier bla bla, Implements. Es braucht nur zwei Sachen, ist connected und send to UXP. String, Params, Record, Promise, Outgoing, Message. Hier wird sogar auf eine Abhängigkeit gepackt, die wo ganz anders definiert ist. Und in der Index-Datei hat sich rein gar nichts geändert. Warum? Weil wir hier den konkreten WebSocket-Server in den konkreten HTTP-Server reinstecken. Ja, genau so implementiert man Dependency Inject. Beides lustigerweise. Inversion.

01:19:29 ist, dass er von der Abstation abhängt. Und Injection ist, dass ich hier Sachen reingebe, anstatt dass ich, also die Dependencies, von denen es abhängt werden, injected, anstatt dass es irgendwann hartgecodet ist. Oder noch schlimmer, Vererbung, Alter. Ich dachte immer, Vererbung ist geil. Und dann habe ich mal Sprachen gelernt, die keine Vererbung machen. So, sicherlich funktioniert noch alles, ne? Weil das Schöne ist ja, wir haben ganz viele Tests hierfür, bevor wir mit dem Refact dann angefangen haben. Also halt den Compiler.

01:19:59 Ich muss noch einmal nachtreten. Know you, Gemini. Weißt du, und für sowas wird dann... Oh, so you, Claude. Claude. Das Tolle ist, das ist ein Sprachmodell. Das heißt, du kannst so viel Scheiße schreiben, wie du willst. Und der würde es trotzdem erkennen, weil das literally das ist, was Sprachmodelle drauf trainiert sind zu tun. Claude Sonnet. Why you know Opus?

CI/CD-Pipelines, Testing und Refactoring

01:20:40

01:20:40 Es tut mir so leid, man. Es ist so fucking dumm, Alter. Okay, so. Also, wir haben irgendwelchen Code dahin geweibt. Und natürlich kennt ihr alle die Regel, man fängt nicht an, irgendwas zu refactoren ohne Tests. Deswegen habe ich keine Tests.

01:20:59 Aber wie man sieht, ich habe die ganze Zeit den Bild im Mittagrond in ein Note 1 laufen. Das baut noch. Und sogar das Plugin ist connected. Gott, muss ich das die ganze Zeit dumm vorgekommen sein. Aber wir gucken mal in Premiere rein. Der Kollege läuft. Wir gucken mal hier in Assets rein. Das ist einfach mal was anderes hier. Das sind übrigens für meine Overlays, falls ihr euch fragt, wie die eigentlich herkommen. Das ist hier drin. Und dann gucken wir mal in die Swagger.

01:21:26 Der lädt auch immer noch. Und dann machen wir mal. Jetzt gucken wir mal in Track Index. Wo passiert viel? Ist nullbasiert, schätze ich. Option Non-Negative. Ja, Non-Negative. Fast. Index. Index, würde ich sagen, ist nullbasiert. Also, wenn ich die 3 will, gebe ich eigentlich die 2 ein. Aber was weiß ich schon? Ja, war richtig. Code, Code. Keine Kacke. Ach so. Code, Code.

01:22:08 Hat nix mit dem Kacke-Emoji zu tun. Ja genau, wenn der Compiler durchläuft, sind alle Tests grün. Hä? Das ist einfach nur effizient. Ähm... 13 Calls. Sieht tatsächlich gut aus. Wir machen mal noch kurz eine Sache, ne? Weil Atomic Commits sind ja bei Leuten immer ganz arg geliebt. Wir fixen mal noch kurz die Beschreibung von der Funktion. Äh, die ist hier irgendwo. An optional non-negative. Zero-based.

01:22:59 Danke. Also ich glaube zumindest, dass es Zero Based ist. Wenn ich da jetzt 0 eingebe und dann kommt ein Ergebnis zurück mit der Länge 3, dann ist es Zero Based. Ja, ist Zero Based. Und darum keinen Rust machen, da hat der Compiler tatsächlich Meinungen. Äh, Clippy ist schon eine ganz schöne Bitch. Aber eine hilfreiche Bitch, muss man an der Stelle dazu sagen. Okay, also wir haben hier die Beschreibung besser gemacht. Wir haben...

01:23:34 Hier ein hat die server hingerotzt der dinge tut das haben wir gemacht das haben wir gemacht das haben wir gemacht Das schöne ist wenn man den code nicht mehr schreibt dann muss man ja auch nicht mehr verstehen ach nee so funktioniert das nicht so Sat process to finish ich gebe dir noch zwei sekunden danke genug gewartet nr format nr check lint sehr gut cd client nr format

01:24:08 Nr check outfit. Der Witz hätte besser funktioniert, hätte ich mir nicht verschrieben, sind wir mal ehrlich. Cool. Refactor Server. Without tests. Yodo. Eine KI wird niemals so lustig sein wie ich. Change my mind. Cool. Jetzt können wir CI zuschauen. CI übrigens, besserer Pre-Commit-Hook. Change my mind. Schön. Guck mal, das ist mein Skript, was da gerade eben ausgeführt wurde.

01:25:12 Cool, Pipeline grün. Close pull request. Ah ne. Ja, nice. Also, wieder ein bisschen weiterentwickelt. Als nächstes werde ich mir natürlich professioneller Softwareentwickler, der ich nicht bin, zum Glück, den Rest hier noch dazuweilen lassen. Also jetzt funktioniert es theoretisch schon, dass man, also was Lustiges, ich habe noch nicht mal angefangen und bin jetzt schon ungefähr bei der reinen, sag ich mal, Framework-Seitendeckend-Funktionalität, die ich davor auch hatte.

UXP-Implementierung und zukünftige Erweiterungen

01:25:41

01:25:41 Klar, ich muss noch meine ganze Implementierung von CEP nach UXP porten oder porten lassen. Aber so das Framework ist jetzt schon ungefähr so weit wie davor. Jetzt kommt da noch ein Websocket Server dazu.

01:25:55 Also nicht der, sondern ein User-Facing-Websocket-Server, damit ich auch wieder meine Drehregler auf dem Streamback anbinden kann. Und dann kommt noch dazu, dass ich einen...

01:26:13 einen MCP-Server noch anbieten werde für AI und der speist sich dann auch aus dieser generierten OpenAPI-JSON. Das ist also tatsächlich schon ziemlich geil. Wir machen bei uns in der Firma jetzt ein neues CI-CD. Viele Entwickler haben erst nicht verstanden, warum das von der Verwaltung gemacht wird. Ja, das musste ich auch erst lernen. Ja, wusste ich doch nicht, warum das so unglaublich witzig ist, was du gerade geschrieben hast. Okay, cool.

01:26:53 Ich würde sagen, das war's, oder? Wir haben jetzt eine Stunde programmiert. Und jetzt fängt gleich hier dieser Fußball an. Ist doch perfekt, oder? Vielen Dank fürs Zusehen. Das war jetzt wirklich ein komplett unkomplizierter, kleiner, abendlicher Coding-Stream. Gibt weniger leckere Sachen, sind wir mal ehrlich.

01:27:14 War schön. Danke, dass ihr dabei wart. Wir haben es nicht ganz geschafft, den Server zu entvibefilen. Aber dafür haben wir ihn aufgeweibt. Kannst du ja mal wieder öfter machen. Ja, weiß ich nicht, ne? Ich habe halt nur begrenzt viele Token. Und das heute Abend hat schon jetzt 10% meiner monatlichen Token gekostet. Wir haben noch nicht mal viel gemacht. Und wenn die abgelaufen sind, dann weiß ich nicht. Dann kann ich eigentlich nur noch gegen die Wand schauen. Und gucken.

Fazit und Ausblick

01:27:48

01:27:48 Der Monat endet morgen. Boah ey, wuh, Glück gehabt. Dann würde vielleicht doch noch einfacher selber nachdenken. Donation Golds for Tokens. Boah, du meinst, be Caveman, use Brain. Nice. Was wollte ich sagen? Ah genau, vielleicht reicht es dann ja doch noch irgendwann für den Klot. Und dann geht es richtig ab, Alter. Dann wird hier hart gebiht.

01:28:28 Nee, also ich mache mich über alles lustig. Ich denke schon, dass man mit KI sinnvolle Dinge machen kann und nicht alles ist schwarz-weiß. Aber es ist halt auch alles einfach nur hoffnungslos überhalten. Das müssen wir uns auch bewusst sein. Habt einen schönen Abend. Viel Spaß mit eurem persönlichen Klaus. Ob er jetzt Sonat oder Opus heißt. Und wir sehen uns im nächsten Stream. Ich kann nicht sagen, wann der ist. Aber wahrscheinlich ist es dann einer.

01:28:56 mit ähm... Ach guck mal, stimmt, das wollte ich noch zeigen. Wahrscheinlich ist es dann einer mit ähm... Man kennt ihn auf YouTube. Mit äh... mit Solarpunk wieder. Ich war im Radio noch am Sonntag. Könnte ich hier noch kurz zeigen. Genau. Radio mit Bild. Ja, das kommt auch noch im Fernsehen. Aber natürlich ist es immer cooler, das Originalvideo zu haben, nicht wahr?

01:29:31 Hier ist die URL. Ihr könnt euch ein 25-minütiges Interview anschauen. War Spaß gemacht und war schön dort zu sein. Genau, in dem Sinne. Willen der was zu sehen. Macht's gut. Bis zum nächsten Mal. Tschüss. Wo ist der Taster zum Tschüss sagen? Hier, das ist der Tschüss-Taster. Geil. Raiden? Das ist ein Twitch-Stream. Na gut, ich gucke ganz schnell.

01:30:09 Ich raidier eigentlich nicht mehr. Nächstes Mal. Debitor spielt gerade eben Solarpunk. Das muss ich ja eigentlich unterstützen, oder? Ach, du bist alt. Das ist geil. Solarpunk gut. Gutes Spiel, Solarpunk. Besser als dieses Just Chatting. Das ist so dumm, Alter. Das ist genau mein Humor. Sind wir ehrlich. Okay, macht's gut, Leute. Ciao.