00:00:00.005 --> 00:00:03.888
Aber trotzdem war der Impact bei uns eigentlich eher gering,
00:00:04.271 --> 00:00:07.575
weil Coding war bei uns eigentlich auch nie so richtig der Flaschenhals.
00:00:07.575 --> 00:00:12.355
Es gibt halt noch sehr, sehr viel, was wir drumherum haben, was uns dann eher
00:00:12.355 --> 00:00:15.133
langsamer gemacht hat, als den eigentlichen Code zu schreiben.
00:00:20.885 --> 00:00:24.725
KI kann Code schreiben, das wissen wir alle. Aber wer im echten Entwicklungsteam
00:00:24.725 --> 00:00:27.799
arbeitet, der weiß auch, Codeschreiben war nie das Problem.
00:00:28.287 --> 00:00:31.932
Die Reibung steckt drumherum. Tickets verstehen, Tests schreiben,
00:00:32.188 --> 00:00:36.555
Tools einbinden, deployen, debuggen und dabei auch noch reviewbare Ergebnisse
00:00:36.555 --> 00:00:38.904
produzieren, das ist eine Herausforderung.
00:00:39.560 --> 00:00:44.535
Unser nächster Speaker, das ist Fabian Mayer. Er ist Chapter Lead und Software
00:00:44.535 --> 00:00:46.166
Engineer bei Eventim Tech.
00:00:46.462 --> 00:00:50.225
Er leitet das Vue Chapter, entwickelt Frontend-Engineers weiter und treibt
00:00:50.225 --> 00:00:51.988
technische Exzellenz voran.
00:00:52.372 --> 00:00:56.232
Als technischer Lead verantwortet er den Event im TIX Online-Shop,
00:00:56.348 --> 00:01:01.606
eine Ticketing-Plattform für über 100 Kunden aus Sport und Festivals. Kennen wir alle.
00:01:01.913 --> 00:01:05.905
Er und sein Team haben ihre KI-Tools wie neue Entwickler eingearbeitet.
00:01:05.905 --> 00:01:09.727
Mit Zugang zu GitLab und Jira, mit wiederverwendbaren Skills,
00:01:09.988 --> 00:01:13.175
mit klaren Standards, vom Ticket bis zum fertigen Feature.
00:01:13.587 --> 00:01:16.945
Wie das genau funktioniert, das wird er uns jetzt erzählen und ich freue mich
00:01:16.945 --> 00:01:20.240
sehr darauf, dass er heute hier ist. Hallo, herzlich willkommen Fabian.
00:01:20.896 --> 00:01:24.181
Ja, erstmal ein herzliches Moin aus Bremen.
00:01:25.545 --> 00:01:30.404
Ja, ich freue mich sehr, den Vortrag heute zu machen. Spec-Driven Development in der Praxis.
00:01:31.263 --> 00:01:36.279
Und ja, bin gespannt auf das Feedback und auch auf die Fragen am Ende.
00:01:36.813 --> 00:01:40.885
Und ja, freue mich heute hier zu sein. Ja, super, klasse. Dann würde ich sagen,
00:01:40.885 --> 00:01:42.065
fang einfach gleich mal an.
00:01:42.385 --> 00:01:46.635
Und genau, wenn ihr Fragen habt, schreibt sie in den Chat. Und am Ende spreche
00:01:46.635 --> 00:01:49.079
ich gerne mit dem Fabian noch einmal darüber. Bis gleich.
00:01:50.989 --> 00:01:54.927
Ja, Spec-Driven Development in der Praxis. Heute soll es so ein bisschen darum
00:01:54.927 --> 00:01:58.836
gehen, wie wir Spec-Driven Development bei Eventim leben.
00:02:00.977 --> 00:02:05.397
Noch ein kleiner Klick auf den richtigen Bildschirm, dann kann es auch losgehen. Ja, Who am I?
00:02:06.177 --> 00:02:11.417
Hendrik hat hier schon eine gute Einleitung gegeben, die hier schon einiges vorwegnimmt.
00:02:11.997 --> 00:02:15.125
Und ja, das Thema des Talks lässt natürlich auch durchblicken.
00:02:15.647 --> 00:02:20.447
Es ist eine gewisse Leidenschaft für Agentic Engineering und auch alle anderen
00:02:20.447 --> 00:02:26.787
KI-Themen dabei und privat auch immer einige Projekte.
00:02:26.787 --> 00:02:32.336
Ich bin Sportfan, ich mache sehr viel mit 3D-Druck und habe auch einen Homeserver
00:02:32.656 --> 00:02:37.377
zu Hause stehen, wo ich immer viele Projekte drauf mache. Da läuft unter anderem
00:02:37.377 --> 00:02:38.937
auch zum Beispiel ein Hermes-Agent.
00:02:39.277 --> 00:02:42.965
Wer das Ganze kennt, wer sich dafür interessiert, da kann ich auch gerne Fragen
00:02:43.337 --> 00:02:47.319
zu beantworten, wie gut sowas funktioniert und wo einem das auch was bringt.
00:02:49.136 --> 00:02:54.137
Genau, Eventim und Tix. Eventim ist Europas führender Ticketing-Anbieter und
00:02:54.537 --> 00:02:58.657
ich arbeite bei unserem Produkt Eventim Tix. Das ist unsere,
00:02:59.317 --> 00:03:04.070
wie schon gesagt, Ticketing-Plattform für Sport und Festivals, über 200 Kunden sogar.
00:03:04.797 --> 00:03:06.577
Da habe ich wohl einen kleinen Typo vorher gehabt.
00:03:07.600 --> 00:03:10.977
Ja, wir arbeiten hauptsächlich mit PHP, haben mehrere Vue-Frontends,
00:03:10.977 --> 00:03:18.159
wir haben auch so einen kleinen Legacy-Core und arbeiten mit fünf Teams zusammen auf einem großen GitLab,
00:03:19.617 --> 00:03:22.917
und entwickeln da unsere Plattform weiter.
00:03:22.917 --> 00:03:27.557
Große Kunden von uns, zum Beispiel fast jeder Verein in der Bundesliga ist tatsächlich
00:03:27.557 --> 00:03:30.640
bei uns, dass man das nicht so sehr sieht, ist Teil des Designs.
00:03:31.457 --> 00:03:36.177
Große Festivals, Rock am Ring, Rock am Park, Hurricane werden sicherlich einige
00:03:36.177 --> 00:03:39.939
kennen. Das ist so der Stack und die Kunden, mit denen wir arbeiten.
00:03:41.669 --> 00:03:46.988
Darum soll es heute allerdings nicht gehen, sondern um erstmal so einen Schritt
00:03:46.988 --> 00:03:51.378
zurück zu gehen, bevor wir jetzt in Spec-Driven Development einsteigen.
00:03:51.758 --> 00:03:55.426
Wie haben wir bei Eventim überhaupt mit KI angefangen?
00:03:56.801 --> 00:04:03.198
Ja, der Start war wahrscheinlich wie bei den meisten, ich nenne es hier die Chat-GPT-Ära,
00:04:03.718 --> 00:04:08.648
nach einigen Gesprächen mit unserer Datenschutz- und IT-Security-Abteilung haben
00:04:08.648 --> 00:04:09.938
wir es dann geschafft für uns,
00:04:10.678 --> 00:04:14.391
Chat-GPT-Enterprise zu bekommen, das haben wir dann auch,
00:04:14.942 --> 00:04:19.468
über unsere komplette Firma direkt ausrollen können und am Anfang war das Ganze,
00:04:19.468 --> 00:04:22.854
sage ich mal, für uns so ein Ersatz oder so ein Begleiter, den wir
00:04:23.295 --> 00:04:27.448
so, wofür wir sonst, sage ich mal, Stack Overflow und Google genutzt haben,
00:04:27.448 --> 00:04:31.558
ich habe hier ein Problem, ich habe da ein Problem, hat das schon mal jemand anderes gehabt,
00:04:32.816 --> 00:04:37.208
dafür haben wir dann hauptsächlich ChatGPT genutzt, auch hin und wieder hat
00:04:37.208 --> 00:04:40.208
man mal ein bisschen Code gemacht, man kopiert ein bisschen Code rein,
00:04:40.208 --> 00:04:43.678
kopiert ein bisschen Code raus, aber hat da noch sehr, sage ich mal,
00:04:43.978 --> 00:04:46.318
den Nachteil, dass man das dann selbst am Ende alles,
00:04:46.823 --> 00:04:48.958
zusammenwurschteln muss, sage ich jetzt mal,
00:04:49.993 --> 00:04:55.358
Und das war natürlich nicht sonderlich produktiv und hat bei uns in der Firma
00:04:55.358 --> 00:04:58.292
jetzt auch nicht den riesigen Impact gehabt, sage ich mal.
00:04:59.918 --> 00:05:04.158
Dann dazwischen, ich gehe nur ganz, ganz kurz drauf ein, war Copilot bei uns.
00:05:04.158 --> 00:05:06.779
Das war dann so ein bisschen autocomplete auf Steroiden.
00:05:07.848 --> 00:05:13.808
Das war allerdings nur ein sehr kurzer Akt bei uns. Wir hatten einmal 200 Lizenzen
00:05:13.808 --> 00:05:18.648
geholt, aber auch da war die Adoption unter den Entwicklern nicht sonderlich groß.
00:05:19.295 --> 00:05:24.409
Und dann kam, sage ich mal, der nächste große Schritt, Codex von ChatGPT und Claude Code.
00:05:24.804 --> 00:05:28.428
Da hatten wir dann das erste Mal Tools, die wirklich in die Code-Basis gehen
00:05:28.428 --> 00:05:31.897
konnten, sich in den richtigen Kontext sammeln konnten, okay,
00:05:32.362 --> 00:05:33.758
was passiert hier überhaupt?
00:05:33.758 --> 00:05:37.368
Dann haben wir so ein bisschen angefangen rumzuspielen, okay,
00:05:37.368 --> 00:05:40.797
es gibt irgendwie einen Planmodus, da kann man sich dann schon mal so ein bisschen,
00:05:41.728 --> 00:05:44.825
drauf vorbereiten, okay, was für eine Änderung möchte ich jetzt überhaupt machen?
00:05:45.313 --> 00:05:50.108
Und dann läuft Claude oder Codex halt los und implementiert das Ganze und da
00:05:50.108 --> 00:05:52.992
wird das Coding dann schon deutlich, deutlich schneller,
00:05:53.468 --> 00:05:57.428
und da haben wir dann hier und da mal einen Bug gefixt, kleinere Features gebaut,
00:05:57.768 --> 00:06:01.275
Refactorings, aber auch noch sehr, sehr im kleinen Rahmen,
00:06:01.856 --> 00:06:06.328
und natürlich auch einiges an Dokumentation geschrieben, wo wir vorher teilweise
00:06:06.328 --> 00:06:10.268
einfach ein bisschen zu faul für waren, kann man auch ganz ehrlich sein und
00:06:10.268 --> 00:06:13.640
das haben wir inzwischen über unsere komplette Firma ausgerollt.
00:06:14.808 --> 00:06:21.587
Jedenfalls bei uns in der Tech. Und ja, aber den großen Big Bang hatten wir da noch nicht.
00:06:22.011 --> 00:06:27.648
Es gibt ja auch zum Beispiel eine Metastudie, die sagt, am Anfang sind erfahrene
00:06:27.648 --> 00:06:33.058
Entwickler, also Senior und drüber, am Anfang 19% langsamer mit KI,
00:06:33.209 --> 00:06:36.082
denken aber tatsächlich selber, dass sie 20% schneller sind.
00:06:37.423 --> 00:06:40.018
Allerdings, wenn man sich einmal so richtig eingearbeitet hat,
00:06:40.018 --> 00:06:43.728
ist man dann wirklich diese 20% schneller, die man sich auch vorstellt.
00:06:43.728 --> 00:06:47.798
Natürlich gibt es viel, sage ich mal, auf LinkedIn und so. Der 10x Engineer,
00:06:47.798 --> 00:06:52.828
das stimmt natürlich nicht so 100%, aber man kann da schon, sage ich mal,
00:06:52.828 --> 00:06:54.842
merken, dass man doch deutlich schneller ist.
00:06:55.689 --> 00:06:58.592
Aber trotzdem war der Impact bei uns...
00:06:59.719 --> 00:07:03.735
Eigentlich eher gering, weil Coding war bei uns eigentlich auch nie so richtig
00:07:03.735 --> 00:07:07.608
der Flaschenhals. Es gibt halt noch sehr, sehr viel, was wir drumherum haben,
00:07:08.965 --> 00:07:12.530
was uns dann eher langsamer gemacht hat, als den eigentlichen Code zu schreiben.
00:07:13.459 --> 00:07:19.200
Und nochmal so ein paar Zahlen. Wir haben das über circa 350 aktive Nutzer ausgerollt.
00:07:19.717 --> 00:07:24.918
Wir nutzen hauptsächlich Claude Code und beziehen die Inference über AWS Bedrock,
00:07:25.226 --> 00:07:29.935
sodass das Ganze dann zwar amerikanische Modelle, aber in Deutschland gehostet
00:07:29.935 --> 00:07:31.286
und dadurch können wir halt auch,
00:07:31.751 --> 00:07:35.054
Anmeldungen mit Microsoft und solche Sachen machen in einer großen Firma.
00:07:35.402 --> 00:07:39.215
Ganz wichtig und auch wenn Tokens, sage ich mal, nicht die beste Metrik ist,
00:07:39.215 --> 00:07:43.195
damit man so ein bisschen Eindruck bekommt, wie weit das bei uns schon verbreitet ist.
00:07:43.195 --> 00:07:50.470
Bei uns verbrauchen wir derzeit circa so 3,7 Millionen Tokens am Tag mit diesen 350 Nutzern.
00:07:52.166 --> 00:07:57.332
Genau. Der Agent schreibt den Code, aber ich mache immer noch, oder du, alles andere.
00:07:58.150 --> 00:08:02.125
Ich muss immer noch in Jira reingehen und mir das Ticket anschauen.
00:08:02.125 --> 00:08:04.600
Okay, wie detailliert ist das Ganze jetzt?
00:08:04.960 --> 00:08:08.623
Ich muss mir im Kopf irgendwie einen Plan machen. Okay, ich möchte jetzt Feature X bauen.
00:08:08.948 --> 00:08:12.315
Da muss ich in das und das Repository rein und dann muss ich mir im Kopf so
00:08:12.315 --> 00:08:14.892
einen Plan machen, okay, wie gehe ich das Ganze an?
00:08:16.621 --> 00:08:21.699
Okay, dann mache ich so ein bisschen einen Plan und lasse Claude das Ganze umsetzen
00:08:21.699 --> 00:08:24.580
und teste das Ergebnis am Ende erstmal selber.
00:08:25.967 --> 00:08:30.199
So, der nächste Schritt ist dann, einen Merge-Request zu erstellen und Reviewer zuweisen.
00:08:30.617 --> 00:08:33.641
Da fangen die Probleme, sage ich mal, ein bisschen an. Ich kriege ein Code-Review,
00:08:33.897 --> 00:08:35.189
12 Open Threads, oh Gott.
00:08:36.300 --> 00:08:38.859
Und dann muss ich ein bisschen Babysitting in der Pipeline machen,
00:08:38.859 --> 00:08:41.809
vielleicht fehlt ein Linter, Code-Style, Unit-Test.
00:08:41.809 --> 00:08:45.109
Wir haben eine sehr große Pipeline in unserem Merge-Request,
00:08:45.429 --> 00:08:48.959
um ganz, ganz viele Checks durchzuführen und da merke ich dann so langsam,
00:08:48.959 --> 00:08:52.269
da hat es an einigen Stellen schon irgendwie ein bisschen gehapert und das Ergebnis
00:08:52.269 --> 00:08:54.834
war dann vielleicht doch nicht ganz so, wie ich mir das erhofft hatte.
00:08:55.438 --> 00:09:00.059
Dann muss ich am Ende noch deployen für unsere QA, dann schlägt vielleicht noch
00:09:00.059 --> 00:09:03.709
einer der automatisierten End-to-End-Tests fehl und am Ende habe ich da,
00:09:03.709 --> 00:09:08.749
sage ich mal, einen ganzen Haufen roter Pipelines, die ich am Ende jetzt trotzdem selber fixen muss.
00:09:08.749 --> 00:09:13.009
Also, ich habe den Code zwar super schnell erstellt, vielleicht in nur ein paar
00:09:13.009 --> 00:09:17.799
Minuten, aber am Ende muss ich dann trotzdem Stunden investieren,
00:09:17.799 --> 00:09:20.579
um das Ganze dann wieder so ein bisschen aufzuarbeiten.
00:09:20.579 --> 00:09:23.619
Das ist jetzt natürlich auch ein bisschen ins Extreme gezogen,
00:09:23.619 --> 00:09:25.850
aber ich glaube, ihr versteht, worauf ich hinaus will.
00:09:27.046 --> 00:09:29.699
Und so viel mehr kommt da noch dazu. Ups, da habe ich ein bisschen geschrumpft.
00:09:29.879 --> 00:09:33.605
Genau. Das Codeschreiben war nie so wirklich der Flaschenhals, zumindest bei uns.
00:09:34.093 --> 00:09:37.689
In Enterprise ist es eher der Prozess rund um den Code, wo man dann wirklich
00:09:37.689 --> 00:09:41.709
stecken bleibt und wo man dann noch ganz viel Einzelarbeit dazu machen muss.
00:09:43.409 --> 00:09:46.658
Genau, der Code wird schnell generiert, durch den Prozess kommen wir immer noch
00:09:46.658 --> 00:09:50.636
langsam. Dann war mein erster Gedanke, hm, dann werfen wir den Prozess halt weg, oder?
00:09:51.106 --> 00:09:53.538
Nee, das geht natürlich nicht und das wollen wir auch nicht,
00:09:53.538 --> 00:09:57.538
weil dieser Prozess ist über Jahre entstanden und es hat auch seine Gründe,
00:09:57.538 --> 00:10:02.705
warum wir da verschiedene Gates drin haben, warum wir Code Reviews machen, warum wir QA machen.
00:10:04.075 --> 00:10:07.128
Das ist dann sozusagen bei uns immer der Human in the Loop,
00:10:07.128 --> 00:10:10.378
also, dass wir halt beim Code Review und QA gucken, wir, okay,
00:10:10.378 --> 00:10:13.018
werden unsere Standards, Guardrails eingehalten,
00:10:13.961 --> 00:10:17.988
ist das Ganze sicher, können wir das jetzt so auf unser Produktionssystem deployen,
00:10:17.988 --> 00:10:19.998
ohne dass wir Security-Issues bekommen.
00:10:20.398 --> 00:10:24.338
Wir haben auch eine komplexe Infrastruktur. Wir haben sehr viele verschiedene
00:10:24.338 --> 00:10:28.932
Repos, die zusammen mit vielen Applikationen eine Plattform bilden.
00:10:29.547 --> 00:10:33.038
Und wir haben auch viele etablierte Prozesse in Jira, in GitLab,
00:10:33.038 --> 00:10:34.998
wie wir Merge Requests erstellen und alles.
00:10:35.671 --> 00:10:40.998
Das soll halt erstmal weiterhin so bleiben. Wir wollen Teilautomatisierung,
00:10:40.998 --> 00:10:43.681
sage ich jetzt mal, weil wir den Human in the Loop ja behalten wollen,
00:10:44.395 --> 00:10:47.402
aber wie kommen wir dahin, dass wir nicht nur den Code generieren,
00:10:47.698 --> 00:10:53.048
sondern wirklich den Software Development Lifecycle so ein Stück weit automatisieren,
00:10:53.048 --> 00:10:56.394
dass wir halt da nochmal ordentlich an Geschwindigkeit gewinnen.
00:10:59.012 --> 00:11:02.837
So, jetzt erstmal ein kleiner Überblick, was ist Spec-Driven Development?
00:11:03.499 --> 00:11:05.738
Ist es nur ein Buzzword? Jein.
00:11:09.098 --> 00:11:12.718
So ein bisschen ist es ein Buzzword, weil es am Ende eigentlich gar nicht so
00:11:12.718 --> 00:11:18.052
kompliziert ist, aber trotzdem halt in der Entwicklung wirklich sehr, sehr helfen kann.
00:11:18.731 --> 00:11:22.592
Im Grunde teilt sich das Ganze immer in drei Schritte auf.
00:11:23.074 --> 00:11:28.278
Spec Code Verify, das ist auch der Name von dem Workshop, der morgen stattfindet,
00:11:28.278 --> 00:11:31.276
deswegen dachte ich, benutze ich das nochmal, weil es einfach so perfekt passt.
00:11:31.990 --> 00:11:36.628
Also wir starten quasi ähnlich wie beim Plan Mode, nur bei Spec Driven Development
00:11:36.628 --> 00:11:38.884
nennt man es dann Spec oder Spezifikation.
00:11:39.302 --> 00:11:43.748
Der eine mag jetzt vielleicht so ein bisschen an Wasserfallmodell oder Pflichten-Lastenheft
00:11:43.748 --> 00:11:46.471
denken, aber glaub mir, es ist ein bisschen anders.
00:11:46.878 --> 00:11:49.888
Es läuft dann am Anfang so ab, dass ich einen detaillierten Plan,
00:11:49.888 --> 00:11:55.808
wie ich Feature X in CodeBase X implementieren will, zusammen mit meinem Agenten,
00:11:55.808 --> 00:12:00.020
ob das jetzt Claude Code ist oder Codex, ist am Ende eigentlich egal.
00:12:00.734 --> 00:12:06.378
Was allerdings noch wichtig ist, dieser Plan wird am Ende, die ganzen Entscheidungen,
00:12:06.378 --> 00:12:08.553
die da drin sind, die werden von mir getroffen.
00:12:09.064 --> 00:12:13.412
Der Agent stellt mir nur die Fragen, um das Ganze halt zu machen.
00:12:13.848 --> 00:12:17.578
Im nächsten Schritt lassen wir den Agenten das Ganze dann in einer neuen Session,
00:12:17.578 --> 00:12:22.282
da gehe ich gleich nochmal drauf ein, implementieren und das Ganze basiert dann auf der Spec.
00:12:22.868 --> 00:12:25.881
Und der letzte Schritt, wahrscheinlich auch mit Abstand der schwerste,
00:12:26.305 --> 00:12:31.936
verify, dass wir den Agenten den Code gegen mehrere Quality Gates verifizieren lassen.
00:12:32.371 --> 00:12:35.538
Quality Gates ist jetzt allgemein, das kann Code Review sein,
00:12:35.538 --> 00:12:40.398
Linting, Unit Test, so viel wie möglich, sage ich mal, um am Ende sicher gehen
00:12:40.398 --> 00:12:45.495
zu können, dass der Code, der da rauskommt, gut ist von der Qualität her und auch funktioniert.
00:12:47.905 --> 00:12:51.815
Warum das Ganze überhaupt? Warum machen wir überhaupt Spec-Driven Development?
00:12:51.815 --> 00:12:55.295
Was ist, sage ich mal, der Grund, dass das besser funktioniert,
00:12:55.295 --> 00:12:59.509
als einfach, ich prompte ein Prompt nach dem anderen, bis es funktioniert?
00:13:00.218 --> 00:13:03.225
Das kleine Bild, was ich euch hier eingeblendet habe, wenn ihr Claude Code nutzt,
00:13:03.225 --> 00:13:06.139
könnt ihr euch das auch anzeigen lassen mit Slash-Context.
00:13:06.754 --> 00:13:12.733
Das ist der Kontext. Jedes KI-Modell hat ein gewisses Kontext-Window,
00:13:13.505 --> 00:13:15.206
wo X-Tokens reinpassen.
00:13:15.485 --> 00:13:20.415
Bei den Claude-Modellen ist es normalerweise 200.000 Tokens oder eine Million
00:13:20.415 --> 00:13:23.008
Tokens, wenn man das Größere wählt.
00:13:23.519 --> 00:13:27.008
Ich glaube, bei Codex sind es 276.000 oder sowas.
00:13:27.942 --> 00:13:31.895
Und das Ganze ist so, je voller dieser Kontext ist, desto schlechter ist die
00:13:31.895 --> 00:13:34.065
Qualität vom Output des LLMs.
00:13:34.065 --> 00:13:37.325
Das kommt einfach dadurch, das ist so ein bisschen wie beim Menschen,
00:13:37.325 --> 00:13:40.855
wenn ich acht Stunden gearbeitet habe und dann in der letzten halben Stunde
00:13:40.855 --> 00:13:42.778
versuche nochmal ein Code Review zu machen,
00:13:43.191 --> 00:13:46.407
dann ist mein Kopf von dem ganzen Tag schon so voll mit Informationen,
00:13:46.807 --> 00:13:49.715
dass dieses Code Review wahrscheinlich am Ende nicht das Beste ist.
00:13:50.133 --> 00:13:54.325
Und mit dem Agenten ist es ganz ähnlich. Solange der Kontext noch leer ist,
00:13:54.325 --> 00:14:01.345
da ist es 7 Uhr morgens, zwei Kaffee getrunken, man ist total dabei und kann
00:14:01.345 --> 00:14:04.181
jedes Detail verstehen und noch ganz viel Informationen aufnehmen.
00:14:04.872 --> 00:14:09.895
Sobald der Tag zu Ende ist oder der Nachmittag kommt, ist es dann schon ein bisschen schwieriger.
00:14:09.895 --> 00:14:14.439
Und Spec-Driven Development gibt uns halt die Möglichkeit, durch dieses Spec
00:14:14.718 --> 00:14:19.835
quasi eine neue Unterhaltung mit dem Agenten zu starten, wo er dann eine Datei
00:14:19.835 --> 00:14:23.704
hat, wo eigentlich schon alle Infos drinstehen, die er am Ende wissen muss.
00:14:24.249 --> 00:14:29.615
Und die Qualität dieses Plans oder dieser Spec ist auch sehr stark verbunden
00:14:29.615 --> 00:14:32.162
mit der Qualität des Codes, der am Ende dabei rauskommt.
00:14:34.896 --> 00:14:35.656
Es gibt verschiedene,
00:14:37.876 --> 00:14:41.356
Spec-Driven Development Frameworks da draußen. Ich habe jetzt hier mal so ein
00:14:41.356 --> 00:14:46.034
paar aufgelistet. OpenSpec, BMAD, PlanAct, SpecKit von GitHub.
00:14:46.818 --> 00:14:51.404
Die haben alle verschiedene Schritte, die meist durch Skills implementiert werden.
00:14:52.222 --> 00:14:56.196
Aber wenn man sich so ein bisschen die Namen des Ganzen durchliest,
00:14:56.196 --> 00:15:02.376
Discover, Specify, Validate, dann haben wir Brainstorm, Architect,
00:15:02.676 --> 00:15:06.311
Plan, Reflect, Spec, Test, Ship.
00:15:07.292 --> 00:15:11.766
Was fällt dabei auf? Am Ende ist es eigentlich immer derselbe Vorgang.
00:15:11.766 --> 00:15:15.193
Wir haben irgendeine Spezifikation oder Plan, der dabei rauskommt.
00:15:15.477 --> 00:15:20.316
Der Agent implementiert das Ganze und am Ende versuchen wir zu reflektieren,
00:15:20.316 --> 00:15:22.304
zu verifizieren, zu validieren.
00:15:23.236 --> 00:15:26.976
Da kann man dann, kann man am Ende nennen, wie man will, aber im Grunde sind
00:15:26.976 --> 00:15:30.036
es immer diese drei Schritte, die das Ganze durchläuft.
00:15:31.450 --> 00:15:34.504
Genau. Da kann man noch mehrere Schritte dazwischen packen.
00:15:35.616 --> 00:15:42.079
Das ist so ein bisschen dann auch nach Gusto. Genau. Für uns waren die ein guter Startpunkt.
00:15:42.764 --> 00:15:46.876
Wir haben einige davon ausprobiert, haben auch hin und wieder mal was angepasst.
00:15:47.623 --> 00:15:51.570
Und das ist, glaube ich, auch ein ganz wichtiger Schritt, den ich jedem ans Herz legen würde.
00:15:52.795 --> 00:15:57.216
Guckt euch die Sachen mal an, geht auch wirklich rein in die Skills, die da drinstehen.
00:15:57.216 --> 00:16:02.266
Am Ende sind das alles nur Textdateien, sage ich mal. Da steckt wirklich keine
00:16:02.266 --> 00:16:05.606
Magie drin und man braucht auch keine Angst zu haben, da hin und wieder mal
00:16:05.606 --> 00:16:09.990
was zu verändern, um sich an seinen eigenen Workflow anzupassen.
00:16:11.964 --> 00:16:15.121
Für uns passte aber nichts davon so richtig.
00:16:15.941 --> 00:16:18.911
Viele Frameworks haben irgendwie schon eingebaut, dass sie so ein bisschen von
00:16:18.911 --> 00:16:21.077
einem Workflow in GitHub ausgehen.
00:16:21.537 --> 00:16:25.258
Das hatten wir allerdings nicht. Wir nutzen GitLab und Jira für unsere Tickets.
00:16:26.069 --> 00:16:31.441
Viele gehen auf das Thema Deploy gar nicht ein oder haben ein sehr einfaches
00:16:31.441 --> 00:16:35.699
Deploy da drin. Wir hingegen hatten eine sehr komplexe Multi-App-Infrastruktur,
00:16:36.122 --> 00:16:38.485
die wir halt auch irgendwo hin deployen müssen.
00:16:40.447 --> 00:16:44.412
Oft sind die konzipiert für die Arbeit in einem einzelnen Repository,
00:16:44.638 --> 00:16:49.331
aber wie es in vielen größeren Firmen so ist, hat man eine ganze Armada von
00:16:49.331 --> 00:16:52.651
Repositories, die mit unterschiedlichen Beziehungen zueinander sind.
00:16:52.651 --> 00:16:56.951
Das eine ist eine Library für was anderes, die sind über eine API verbunden,
00:16:56.951 --> 00:16:58.652
die kommunizieren Event-Driven.
00:16:59.331 --> 00:17:04.840
Diese ganzen Infos, sage ich mal, muss man auch noch irgendwie mit einbinden,
00:17:05.287 --> 00:17:06.771
damit das Ganze gut funktioniert.
00:17:08.299 --> 00:17:12.751
Und sie setzen meistens auch einen relativ flexiblen Prozess insgesamt in der
00:17:12.751 --> 00:17:16.031
Softwareentwicklung voraus, während wir halt, ich möchte nicht sagen starr,
00:17:16.031 --> 00:17:19.611
aber einen etablierten Enterprise-Prozess halt haben, den wir in unserem Team
00:17:19.611 --> 00:17:20.763
halt auch entwickelt haben.
00:17:22.272 --> 00:17:27.351
Und wir wollten diesen Prozess nicht aufgeben, sondern wollten ihn teilautomatisieren
00:17:27.659 --> 00:17:29.721
und haben uns am Ende dann dafür
00:17:29.721 --> 00:17:33.251
entschieden, dass wir unser eigenes Spec-Driven-Development-Framework
00:17:33.251 --> 00:17:36.521
bauen wollen, damit wir auch verstehen, womit wir arbeiten.
00:17:36.521 --> 00:17:41.471
Das ist uns persönlich immer ganz wichtig. Wir nutzen auch im Code selten Frameworks,
00:17:41.471 --> 00:17:44.771
die, sage ich mal, viel Magic in Anführungszeichen haben.
00:17:44.771 --> 00:17:50.461
Wir wollen immer bis zum, sage ich mal, letzten Punkt alles verstehen und dachten
00:17:50.461 --> 00:17:53.111
dann, okay, wir bauen jetzt unser eigenes, dann verstehen wir,
00:17:53.111 --> 00:17:56.555
womit wir arbeiten und haben etwas, was genau auf uns zugeschnitten ist.
00:17:58.848 --> 00:18:01.774
Ja, und Henrik hat es ja am Anfang schon so ein bisschen eingeleitet.
00:18:02.093 --> 00:18:05.584
Wir haben uns dann echt mal gefragt, welche Infos braucht unser Agent,
00:18:05.584 --> 00:18:10.644
um produktiv zu sein und haben da so einige Parallelen zur generellen Einarbeitung
00:18:10.644 --> 00:18:12.089
von Entwicklern bei uns gesehen.
00:18:12.774 --> 00:18:16.884
Der Agent braucht erstmal den Zugang zu Jira. Er muss irgendwie Tickets lesen
00:18:16.884 --> 00:18:19.467
können, er muss hier und da auch mal einen Kommentar machen können,
00:18:19.763 --> 00:18:23.577
Tickets verschieben von Open zu In-Development und zu Ready-for-Review.
00:18:24.129 --> 00:18:27.634
Er braucht Zugang zu unserem GitLab, muss Branches erstellen können,
00:18:27.634 --> 00:18:30.826
Merge-Requests aufmachen, Pipelines ansehen, Code-Review machen.
00:18:31.651 --> 00:18:34.675
Er muss unsere komplexen Multi-App-Deployments ausführen können.
00:18:35.354 --> 00:18:38.727
Er braucht auch ein Pipeline-Monitoring, sodass er auch eine Merge-Request,
00:18:39.151 --> 00:18:42.669
die er erstellt hat, sich anschauen kann, auf Fehler entsprechend reagieren kann.
00:18:43.429 --> 00:18:47.104
Und er sollte am Ende, so wie wir das auch machen, Dokumentation schreiben und
00:18:47.104 --> 00:18:48.677
zwar genau so, wie wir das machen.
00:18:50.024 --> 00:18:54.134
Und am Ende, was sonst vielleicht der nette Kollege ist, der einem zur Einarbeitung
00:18:54.134 --> 00:18:57.774
zugewiesen ist, ist hier dann der Human in the Loop, was so ein bisschen das
00:18:57.774 --> 00:18:59.039
Pairing repräsentiert.
00:18:59.898 --> 00:19:03.619
Das brauchen wir alles und das klingt am Ende schon sehr stark danach,
00:19:03.828 --> 00:19:07.973
als wir bauen, wir arbeiten einen neuen Kollegen ein. Und im Grunde ist es auch,
00:19:08.658 --> 00:19:12.965
sehr nah da dran. Nur nutzen wir da ein wenig andere Tools für.
00:19:14.462 --> 00:19:19.657
Es gibt da zwei große Sachen, die man dafür nutzen kann, Agent-Skills und MCP.
00:19:20.417 --> 00:19:24.342
Skills sind, sage ich mal, der Low-Effort-Way, das ist eigentlich relativ easy,
00:19:24.342 --> 00:19:27.185
das sind am Ende einfach Markdown-Dateien mit Anweisungen.
00:19:27.789 --> 00:19:30.782
Deswegen habe ich auch gesagt, bei den Spec-Driven-Development-Frameworks,
00:19:30.782 --> 00:19:33.232
die man da draußen findet, einfach mal reingucken.
00:19:33.232 --> 00:19:38.192
Am Ende ist das alles nur, sage ich mal, Prompts in Text-Dateien oder in Markdown-Dateien
00:19:38.192 --> 00:19:43.222
in dem Fall. Das ist halt super, um Teamworkflows und Prozesse abzubilden.
00:19:43.222 --> 00:19:46.202
Die sind auch sehr leicht zu reviewen, weil es am Ende halt einfach nur Text ist.
00:19:46.794 --> 00:19:51.342
MCP ist dann schon ein leicht höheres Investment. Das würde ich empfehlen,
00:19:51.342 --> 00:19:54.370
wenn die Tool-Anbindung so ein bisschen komplizierter ist.
00:19:55.732 --> 00:19:58.915
Zum Beispiel GitHub bietet einen guten MCP GitLab auch.
00:19:59.710 --> 00:20:03.867
Da ist es nur wichtig, darauf zu achten, je mehr Tools so ein MCP hat,
00:20:04.610 --> 00:20:08.325
desto voller wird der Kontext halt automatisch.
00:20:09.079 --> 00:20:13.782
Wir nutzen tatsächlich beides. Wir benutzen hauptsächlich Skills für große Teile
00:20:13.782 --> 00:20:16.532
unseres Prozesses und auch für einige Tools.
00:20:16.532 --> 00:20:19.932
Man kann Skills auch sehr gut benutzen, um gewisse CLI-Tools,
00:20:19.932 --> 00:20:23.526
bei GitLab zum Beispiel G-Lab, es gibt auch für Jira einige CLI-Tools,
00:20:24.321 --> 00:20:26.712
da sieht dieser Skill dann so aus, dass er so ein bisschen erklärt,
00:20:26.712 --> 00:20:32.162
wie ist das Ganze zu benutzen und MCP dann entsprechend für komplexere Anbindungen,
00:20:32.162 --> 00:20:34.863
wie zum Beispiel Logs aus Grafana auslesen.
00:20:36.767 --> 00:20:39.812
Genau, dann haben wir uns noch Gedanken gemacht, okay, wie können wir jetzt
00:20:39.812 --> 00:20:44.362
unseren Prozess abbilden? Wie lesen wir die Jira-Tickets? Welche Details stehen
00:20:44.362 --> 00:20:46.908
da drin? Wie refined sind unsere Tickets eigentlich?
00:20:47.425 --> 00:20:51.285
Wie dokumentieren wir genau? Welche Guidelines und Guardrails haben wir?
00:20:51.697 --> 00:20:55.542
Welche Commands muss der Agent auch ausführen können, wo er möglichst dann nicht
00:20:55.542 --> 00:20:59.432
uns nochmal fragen muss, ob wir das Ganze machen und er muss irgendwie unser
00:20:59.432 --> 00:21:01.932
gesamtes Developer-Setup bedienen können.
00:21:02.361 --> 00:21:05.722
Da ist es auch wichtig, lokale Ausführungen zu bevorzugen, weil dann kann der
00:21:05.722 --> 00:21:10.512
Agent einfach schneller iterieren auf dem Ganzen, als wenn er jetzt jedes Mal,
00:21:10.512 --> 00:21:14.470
sage ich mal, zu GitLab gehen muss und gucken muss, wie die Pipeline aussieht.
00:21:15.504 --> 00:21:20.782
So, unser SDD-Framework. Das ist, wie ihr schon vorher wahrscheinlich vermutet
00:21:20.782 --> 00:21:26.892
habt, gibt es da drei Phasen, die sich in mehrere Skills aufteilen und das sieht dann konkret so aus.
00:21:27.269 --> 00:21:30.912
In unserem Spec-Skill holen wir das Jira-Ticket, recherchieren,
00:21:31.412 --> 00:21:35.123
in der Code-Basis, das kann ein oder mehrere Repositories sein,
00:21:35.547 --> 00:21:40.282
dann spezifizieren wir gemeinsam und das ist tatsächlich auch ein relativ langer
00:21:40.282 --> 00:21:43.652
Teil, also es ist dann nicht so, dass man zwei, drei Fragen beantwortet,
00:21:43.652 --> 00:21:46.202
sondern das kann bei einem komplexen Feature auch mal so sein,
00:21:46.202 --> 00:21:48.532
dass da so 70 Fragen rauskommen.
00:21:48.532 --> 00:21:51.092
Das ist kein Scherz, das dauert dann wirklich ein bisschen, da muss man sich
00:21:51.092 --> 00:21:54.912
hinsetzen, so wie früher, wenn man sich, sage ich mal, mit dem ganzen Team vielleicht
00:21:54.912 --> 00:21:58.123
überlegt hat, okay, wie wollen wir dieses große neue Feature,
00:21:58.932 --> 00:22:03.692
umsetzen, setzt man sich jetzt mit seinem Claude Code oder seinem Codex hin und,
00:22:04.172 --> 00:22:07.271
versucht gemeinsam halt ein Shared Understanding zu bekommen,
00:22:07.544 --> 00:22:09.262
wie das Ganze jetzt am Ende aussehen soll.
00:22:09.530 --> 00:22:13.877
Und der Output davon ist dann die strukturierte Spec als Kontext-Artefakt.
00:22:14.923 --> 00:22:18.451
Als nächstes kommt dann der Codeschritt. Da machen wir eine neue Session auf,
00:22:18.451 --> 00:22:20.210
um den Kontext zu schonen.
00:22:21.131 --> 00:22:25.851
Wir arbeiten da ausschließlich nach TDD. Da gehe ich gleich nochmal drauf ein,
00:22:25.851 --> 00:22:29.511
warum das für die Agents sehr hilfreich ist. Wir nutzen Conventional Commits.
00:22:29.511 --> 00:22:32.883
Wir lassen den Agenten auch direkt auf unser GitLab pushen.
00:22:33.063 --> 00:22:36.360
Natürlich nicht auf den Main, sondern auf seinen Feature-Branch dann.
00:22:36.958 --> 00:22:41.555
Und der Agent arbeitet dann im SDD-Framework autonom, bis alle Tasks erledigt sind.
00:22:42.322 --> 00:22:46.111
Und am Ende steht dann der Verify-Step. Wir gleichen ab mit der Spec,
00:22:46.111 --> 00:22:49.151
die wir vorher geschrieben haben. Haben wir jetzt wirklich das implementiert,
00:22:49.151 --> 00:22:50.809
was wir auch implementieren wollten?
00:22:51.267 --> 00:22:54.901
Lassen lokale Checks oder auch Remote-Checks durchlaufen, je nachdem,
00:22:54.901 --> 00:22:56.261
wie das Ganze aufgestellt ist.
00:22:56.261 --> 00:22:59.571
Wir lassen dann Code-Review wieder durch einen frischen Agenten oder eine frische
00:22:59.571 --> 00:23:03.581
Session durchführen, damit das Ganze auch nicht beeinflusst ist von dem Ganzen,
00:23:03.581 --> 00:23:05.161
was er da vorgemacht hat.
00:23:05.161 --> 00:23:09.771
Und der letzte Schritt, der auch nochmal sehr viel bringt, aber auch der komplizierteste
00:23:09.771 --> 00:23:11.167
teilweise umzusetzen ist,
00:23:11.503 --> 00:23:14.901
er nutzt Playwright, um wirklich auf unsere Development-Maschinen zu gehen,
00:23:14.901 --> 00:23:18.621
wo das Feature dann deployed ist und das dann wirklich so zu testen,
00:23:18.621 --> 00:23:22.711
wir nennen es bei uns mal DevTest, ich gehe auf die Maschine und mache den Idiotentest,
00:23:22.711 --> 00:23:24.767
funktioniert das Ganze überhaupt, was ich hier gebaut habe,
00:23:25.167 --> 00:23:27.721
das macht Claude dann auch entsprechend automatisch.
00:23:28.917 --> 00:23:29.776
Gehen wir ins Detail.
00:23:31.581 --> 00:23:35.048
Genau, für die Spec. Wir müssen erstmal Kontext sammeln. Was wollen wir tun?
00:23:35.048 --> 00:23:36.863
Wir müssen den Kontext aus Jira holen.
00:23:37.188 --> 00:23:41.019
Was ist das Ticket, das Feature, was für Akzeptanzkriterien gibt es,
00:23:41.385 --> 00:23:44.978
Beschreibungen, verlinkte Tickets, eventuell noch Screenshots,
00:23:44.978 --> 00:23:47.144
die der Agent dann entsprechend runterladen kann.
00:23:49.088 --> 00:23:52.898
Womit arbeiten wir gerade überhaupt das heißt, er muss sich die Code-Basis angucken,
00:23:52.898 --> 00:23:57.378
verwandte Komponenten, Patterns, Architektur in dem Teil, wo das Ganze eingebaut wird,
00:23:58.046 --> 00:24:02.608
und dann kommt wie gesagt das Brainstorming und QA, der Agent erstellt Empfehlungen
00:24:03.038 --> 00:24:06.098
also es gibt dann immer quasi, man hat dann das bestimmt schon mal gesehen,
00:24:06.098 --> 00:24:10.878
so eine Fragenauswahl und es gibt auch immer eine Sache, die der Agent empfiehlt
00:24:10.878 --> 00:24:14.741
aber da muss man vorsichtig sein, da darf man sich nicht immer drauf verlassen,
00:24:15.477 --> 00:24:19.288
und das Ziel des Ganzen ist, ein gemeinsames Verständnis zu erarbeiten,
00:24:19.288 --> 00:24:21.276
wie das Ganze am Ende implementiert wird.
00:24:21.816 --> 00:24:25.898
Und der Output ist dann die strukturierte Spec, die enthält die Recherche,
00:24:25.898 --> 00:24:29.461
Einschränkungen, Anforderungen, Entscheidungen, die wir getroffen haben,
00:24:29.821 --> 00:24:33.748
Aufgaben, Verifikationskriterien, quasi alles, was der Agent braucht,
00:24:33.748 --> 00:24:35.800
um das später dann auch wirklich umzusetzen.
00:24:36.954 --> 00:24:40.165
Genau, die Spec ist am Ende dann der Transfer des ganzen Kontexts.
00:24:40.717 --> 00:24:44.420
Ohne die müssten wir dann in der nächsten Session quasi alles nochmal herleiten.
00:24:45.802 --> 00:24:49.206
Genau, ich habe jetzt hier mal so ein bisschen aufgebaut, wie das Ganze dann
00:24:49.206 --> 00:24:54.036
ungefähr aussieht im Claude Code. Bei uns heißt der Skill, den wir dafür nutzen,
00:24:54.036 --> 00:24:59.086
G-Plan, weil unser Team, das Grizzlies-Team, heißt, wir haben immer so die Teamnamen
00:24:59.086 --> 00:25:00.226
von gewissen Sportteams.
00:25:01.667 --> 00:25:05.666
Und ja, Tix ist dann in dem Fall unser Jira-Projekt, also geht es dann los,
00:25:05.666 --> 00:25:10.443
er lädt das Ganze aus Jira, okay, wir sollen eine Event-Filter-Komponente hinzufügen.
00:25:11.198 --> 00:25:14.866
In den Akzeptanzkriterien steht, okay, da muss es einen Datumsfilter geben,
00:25:14.866 --> 00:25:17.373
einen Kategoriefilter und einen Filter nach dem Ort.
00:25:18.209 --> 00:25:21.146
Dann geht er in den Code rein, liest wirklich die Komponenten,
00:25:21.146 --> 00:25:25.883
die wirklich was damit zu tun haben. Es existiert schon eine Filter-Bar in Vue und eine Eventlist.
00:25:26.371 --> 00:25:27.932
Diese Komponenten findet er dann.
00:25:28.954 --> 00:25:34.716
Dann jetzt das interaktive Q&A in sehr, sehr klein. Wie wollen wir den Filterstate
00:25:34.716 --> 00:25:35.932
in der URL persistieren?
00:25:36.262 --> 00:25:38.863
Ja, lass uns das als Query-Parameter machen, das klingt gut.
00:25:39.519 --> 00:25:42.586
Was sollen wir machen, wenn keine Ergebnisse angezeigt werden?
00:25:42.586 --> 00:25:44.802
Dann machen wir einen Empty State mit Reset Link.
00:25:46.347 --> 00:25:49.963
Und dann wird am Ende die strukturierte Spezifikation geschrieben.
00:25:50.422 --> 00:25:54.334
Und was dann auch noch ganz cool ist, eine Zusammenfassung der ganzen Spezifikation
00:25:54.334 --> 00:25:57.957
postet er dann noch als Kommentar an unser Jira-Ticket, sodass wir später auch
00:25:58.276 --> 00:26:00.116
das Ganze entsprechend dokumentiert haben.
00:26:00.749 --> 00:26:04.084
Und dieses Spec ist dann am Ende der Vertrag zwischen dir und dem Agenten.
00:26:04.084 --> 00:26:06.074
Der ist natürlich an der Stelle nicht rechtsbindend.
00:26:07.558 --> 00:26:12.758
Genau, schauen wir uns mal an, wie das dann aussieht. Wir haben hier am Ende eine Markdown-Datei.
00:26:13.211 --> 00:26:16.934
Und wie das Ganze hier aussieht, kann man natürlich frei festlegen,
00:26:16.934 --> 00:26:21.664
das ist dann später Part von dem Specify-Skill, bei uns hat das Ganze einen
00:26:21.664 --> 00:26:23.274
Titel, einen Status, welche,
00:26:23.934 --> 00:26:29.064
Jira dazu gehört, wie der Branch heißen wird und auch eine Liste von Repositories.
00:26:29.511 --> 00:26:33.544
Das hier ist jetzt natürlich sehr stark runtergedampft, damit wir da jetzt gemeinsam
00:26:33.544 --> 00:26:36.544
raufgucken können, normalerweise steckt hier sehr, sehr viel Detail drin und
00:26:36.544 --> 00:26:38.138
das kann auch über mehrere Seiten gehen.
00:26:39.200 --> 00:26:42.014
Sehen wir, der Online-Shop zeigt Events ohne Filtermöglichkeit an.
00:26:42.014 --> 00:26:44.221
Kunden brauchen Datum, Kategorie, Ortfilter.
00:26:44.558 --> 00:26:48.244
Jetzt hat er hier seine Research Findings aus dem ganzen Code.
00:26:48.511 --> 00:26:51.684
Dann hat er hier seine Requirements. Okay, wir brauchen Datumfilter,
00:26:51.684 --> 00:26:54.397
Kategoriefilter, Ortfilter und so weiter und so fort.
00:26:55.036 --> 00:27:00.174
Daraus leitet er dann verschiedene Tasks ab und guckt auch, wie er das Ganze
00:27:00.174 --> 00:27:02.501
angeht und wann das auch wirklich fertig ist.
00:27:04.039 --> 00:27:08.524
Und am Ende hat er dann seine Verifikations-Step. In dem Fall führt er die Test-Suite
00:27:08.524 --> 00:27:13.094
aus, macht ein Linting, macht ein Type-Check und hat hier auch Akzeptanzkriterien,
00:27:13.094 --> 00:27:15.921
die dann wiederum verbunden sind mit den Requirements.
00:27:16.519 --> 00:27:19.770
Hier steht das für Must-Have, Should-Have und Won't-Do.
00:27:20.077 --> 00:27:23.380
Also er macht jetzt zum Beispiel kein serverseitiges Caching der Filterkombination.
00:27:23.613 --> 00:27:26.405
Diese kommen dann aus dem entsprechenden Q&A vorher.
00:27:28.308 --> 00:27:32.395
Genau, dann implementieren wir das Ganze. Das ist tatsächlich am Ende der einfachste Teil.
00:27:32.847 --> 00:27:36.534
Der Agent liest einfach die Spec und hat auch einen entsprechenden Skill,
00:27:37.346 --> 00:27:40.806
mit dem er das dann bearbeitet und er hat eigentlich schon alles, was er braucht.
00:27:40.916 --> 00:27:45.205
Und da nutzt er jetzt TDD, in unserem Fall in einem vereinfachten Cycle.
00:27:45.205 --> 00:27:47.482
Normalerweise ist es ja Red-Green-Refactor.
00:27:48.178 --> 00:27:51.563
In unserem Fall ist es dann einfach nur Red-Green, weil wir gemerkt haben,
00:27:51.882 --> 00:27:57.461
da haben wir einen zusätzlichen Schritt drin, der dem Agenten jetzt nicht so wirklich weiterhilft.
00:27:57.942 --> 00:28:02.715
Aber das Gute an TDD ist, dadurch hat er schon während der Implementierung automatisch
00:28:02.715 --> 00:28:06.455
so einen Verifikationsloop, mit dem man sehen kann, okay, ist der Code,
00:28:06.455 --> 00:28:09.156
den ich jetzt überhaupt, den ich baue, überhaupt funktional?
00:28:09.481 --> 00:28:13.165
Und ich sag mal, am Anfang, wenn man das Ganze noch ein bisschen weniger automatisiert
00:28:13.165 --> 00:28:16.675
laufen lässt, ist das auch ein super Punkt, um zwischendurch mal reinzugucken,
00:28:16.675 --> 00:28:20.035
hey, kriege ich hier die Ergebnisse, die ich wirklich haben möchte,
00:28:20.035 --> 00:28:22.699
sehen die Tests so aus, wie ich sie vielleicht auch schreiben würde.
00:28:24.197 --> 00:28:27.216
Und kann dann da an der Stelle theoretisch auch schon mal intervenieren.
00:28:28.185 --> 00:28:32.345
Genau, wir nutzen Conventional Commits und ich glaube, mit allen Sachen,
00:28:32.345 --> 00:28:34.835
die ähnlich sind wie Conventional Commits, wenn man das jetzt,
00:28:34.835 --> 00:28:37.575
sage ich mal, über die Firma ausrollt, ist es vielleicht ein bisschen Aufwand.
00:28:37.575 --> 00:28:41.805
Für den Agenten ist jede Art von Dokumentation in Nullzeit gemacht.
00:28:41.805 --> 00:28:46.225
Also gerne so viel Dokumentation hinzufügen, wie es sinnvoll ist natürlich,
00:28:46.225 --> 00:28:50.195
auch nicht einfach nur, um sie zu haben, sondern wo es Sinn ergibt,
00:28:50.195 --> 00:28:55.782
aber das ist eine super Möglichkeit, auch um neue Habits im Entwickeln mit einzubinden.
00:28:56.444 --> 00:29:02.825
Und am Ende pusht er zum Remote auf den Feature-Branch und hat dann seinen ersten
00:29:02.825 --> 00:29:04.623
Done-State quasi erreicht.
00:29:05.343 --> 00:29:08.525
Das ist wirklich der einfachste Schritt, weil in der Spec schon so detailliert
00:29:08.525 --> 00:29:12.935
beschrieben ist, was am Ende implementiert werden muss, dass der Agent da eigentlich
00:29:12.935 --> 00:29:17.335
gar keine Fragen mehr hat. Der läuft dann auch komplett da durch und muss keine
00:29:17.335 --> 00:29:18.530
Rückfragen mehr stellen.
00:29:18.686 --> 00:29:23.715
In 95% der Fälle natürlich gibt es auch Fälle, wo dann doch nochmal eine Rückfrage
00:29:23.715 --> 00:29:27.249
ist und man da reingehen muss und dann schauen muss, okay, wo hapert es jetzt?
00:29:28.532 --> 00:29:33.588
Wir können uns das Ganze auch nochmal in Aktion angucken und da sehen wir nochmal,
00:29:34.119 --> 00:29:37.749
die Spec ist nicht das Einzige, was er liest. Was in der Spec halt nicht drin
00:29:37.749 --> 00:29:40.223
steht, ist, was projektspezifisch ist.
00:29:40.565 --> 00:29:45.719
Dafür kann man die CLAUDE.md nutzen oder halt auch noch weitere Dokumentationen
00:29:45.719 --> 00:29:47.537
im Projekt, das ist auch sehr wichtig.
00:29:48.007 --> 00:29:51.569
Das ist auch, da kann ich mal so einen kurzen Ausflug machen,
00:29:51.569 --> 00:29:54.909
wenn das Ganze jetzt über mehrere Repositories ist, ist das Ganze so,
00:29:54.909 --> 00:29:56.604
dass wir quasi einen Ordner haben,
00:29:57.156 --> 00:30:01.359
der bei jedem gleich ist, wo alle Repositories drin sind und darin steckt dann
00:30:01.359 --> 00:30:06.466
auch die entsprechende Dokumentation, wie diese Repositories miteinander interagieren.
00:30:06.797 --> 00:30:10.413
Ist das hier eine Bibliothek, ist das eine Verbindung über eine API,
00:30:10.860 --> 00:30:15.049
das steht dann alles entsprechend eine Ebene drüber, wir nennen das Meta-Root,
00:30:15.049 --> 00:30:17.652
ist aber kein offizieller Begriff, sage ich mal.
00:30:18.767 --> 00:30:23.119
Genau. Wenn er dann den Kontext gelesen hat, schiebt er das Ticket in Development,
00:30:23.119 --> 00:30:28.095
so wie wir es als Entwickler auch machen würden und fängt dann mit dem TDD-Zyklus an.
00:30:28.531 --> 00:30:32.675
Drei Tests fehlgeschlagen und am Ende, ja, sind die Tests dann grün.
00:30:33.053 --> 00:30:38.341
Der Lint wurde bestanden, damit ist das Feature fertig, er committet das Ganze und pusht am Ende.
00:30:39.194 --> 00:30:42.569
Ich habe das hier jetzt weitestgehend, sage ich mal, auf Deutsch übersetzt.
00:30:42.569 --> 00:30:46.779
Ich würde allerdings jedem empfehlen, bei Claude Code, wer kann mit Englisch
00:30:46.779 --> 00:30:50.399
zu arbeiten, das spart Tokens, man kommt nicht so schnell in die Limits.
00:30:51.576 --> 00:30:55.222
Das funktioniert meistens etwas besser, weil er es intern übersetzen muss.
00:30:56.489 --> 00:31:00.204
Genau, das Ganze ist so designt, dass keine Interaktion normalerweise nötig
00:31:00.204 --> 00:31:01.754
ist, bis alle Tasks fertig sind.
00:31:01.754 --> 00:31:05.574
Er ist dazu angehalten, in diesen Skills halt auf dem Ergebnis immer wieder
00:31:05.574 --> 00:31:09.954
zu iterieren und jeden Task zu committen und das Ganze so lange zu wiederholen,
00:31:09.954 --> 00:31:12.924
bis er alle Tasks halt bestanden hat.
00:31:12.924 --> 00:31:17.467
Nur wenn wirklich ein sehr grobes Problem auftritt, muss man da nochmal rangehen.
00:31:18.517 --> 00:31:22.894
Genau. Kommen wir zu Verify. Das ist am Ende wirklich der schwierigste Schritt.
00:31:23.150 --> 00:31:25.094
Der erste Part ist noch relativ einfach.
00:31:25.419 --> 00:31:28.966
Wir gleichen einfach den Code ab mit der Spec. Da hat man sonst dann vielleicht,
00:31:29.378 --> 00:31:32.564
nachdem man das Ganze implementiert hat, nochmal ins Jira-Ticket geguckt.
00:31:32.564 --> 00:31:37.564
Okay, habe ich jetzt überhaupt das gebaut, was der Produktmanager sich da am Ende vorgestellt hat?
00:31:37.564 --> 00:31:41.464
Das macht der Agent oder Claude Code in dem Fall jetzt automatisch.
00:31:41.464 --> 00:31:45.064
Ist das wirklich der Intent, der da ursprünglich gegeben war?
00:31:45.064 --> 00:31:47.914
Erfüllt das alle Anforderungen, alle Akzeptanzkriterien?
00:31:48.651 --> 00:31:52.639
Dann die lokalen Checks, Linting, Testing, Typecheck, Kompilieren,
00:31:52.941 --> 00:31:54.671
kommt natürlich ganz auf das Projekt an.
00:31:55.118 --> 00:31:58.606
Alles, was lokal geht und Autofix bei entsprechenden Fehlern.
00:31:59.831 --> 00:32:03.784
Dann kommt das Code Review, da jagen wir dann nochmal einen frischen Agent da
00:32:03.784 --> 00:32:06.954
drauf, da kann man auch so ein bisschen experimentieren, möchte man ihm die
00:32:06.954 --> 00:32:10.697
Spec zur Verfügung stellen, dass er schon weiß, worum geht es hier überhaupt,
00:32:10.819 --> 00:32:14.621
oder lässt man ihn tatsächlich ohne die Spec da drauf, einfach nur, sage ich mal,
00:32:14.923 --> 00:32:17.104
wirklich ein stumpfes Code Review, ich weiß gar nicht direkt,
00:32:17.104 --> 00:32:20.101
worum es geht, ich schaue mir den Code an, ergibt das alles Sinn,
00:32:20.862 --> 00:32:24.316
und er geht dann auch hin und macht automatisch Kommentare auf GitLab,
00:32:24.890 --> 00:32:27.195
die dann halt wieder gefixt werden.
00:32:29.354 --> 00:32:32.779
Genau. Der letzte Teil ist dann der DevTest. Das ist der härteste Teil.
00:32:33.011 --> 00:32:36.471
Das unterscheidet sich auch je nach Projekt. Bei uns ist eigentlich alles webbasiert.
00:32:36.907 --> 00:32:38.798
Da nutzen wir Playwright.
00:32:39.298 --> 00:32:43.448
Das funktioniert ziemlich gut. Je nach Komplexität der Anwendung muss man da
00:32:43.448 --> 00:32:44.928
auch noch so ein bisschen Kontext liefern.
00:32:44.928 --> 00:32:48.008
Okay, wie bediene ich jetzt dieses Produkt?
00:32:48.008 --> 00:32:52.228
Aber zum Beispiel unser Ticket-Online-Shop, da kann man den Agenten einfach
00:32:52.228 --> 00:32:53.938
drauf loslassen, der weiß,
00:32:54.699 --> 00:32:57.678
wie ein Shop generell funktioniert, es gibt eine Auswahl von Dingen,
00:32:57.678 --> 00:33:00.958
die ich in den Warenkorb legen kann und dann muss ich Versand,
00:33:00.958 --> 00:33:03.312
Zahlung und so weiter auswählen.
00:33:03.620 --> 00:33:07.318
Da kann man ihn halt wirklich alleine durchlaufen lassen, da braucht man meistens
00:33:07.318 --> 00:33:10.768
nur so ein bisschen Anlauf, dass er sich halt anmelden kann und alles,
00:33:10.768 --> 00:33:15.397
aber sobald er dann erstmal drin ist, funktioniert das wirklich schon out of the box sehr, sehr gut.
00:33:16.995 --> 00:33:20.974
Genau, jede dieser Schicht hat einen Autofix-Loop, also immer wenn ein Fehler
00:33:20.974 --> 00:33:25.011
erkannt wird, wird der Agent dann in dem entsprechenden Skill dazu angehalten,
00:33:25.348 --> 00:33:26.695
das Ganze wieder zu fixen
00:33:27.118 --> 00:33:31.384
und dann weiterzumachen, sodass wir halt möglichst viel Automatisierung da drin
00:33:31.384 --> 00:33:34.954
haben und nur an den Schritten, wo wir wirklich, sag ich mal,
00:33:34.954 --> 00:33:38.531
wollen, dass wir manuell reingehen, das dann auch tun.
00:33:39.802 --> 00:33:43.914
Genau, schauen wir uns das nochmal an. Wir haben den gepushten Code auf dem
00:33:43.914 --> 00:33:48.874
entsprechenden Branch aus dem G-Dev-Skill, dann gehen wir in Verify rein und
00:33:48.874 --> 00:33:54.006
er createt erstmal eine Draft Merge Request, prüft die auf Vollständigkeit und Anforderungen,
00:33:54.437 --> 00:33:58.824
dann macht er lokal die Tests, Lint, Unit, Build, funktioniert alles,
00:33:58.824 --> 00:34:02.712
Self-Review, findet was, eine fehlende Nullprüfung in Zeile 47,
00:34:03.235 --> 00:34:07.794
fixt das Ganze automatisch, pusht nochmal hin, dann ist die Pipeline grün und
00:34:07.794 --> 00:34:10.038
wir updaten den Merge-Request auf Ready.
00:34:10.427 --> 00:34:13.614
Und das ist dann der Punkt, wo wir dann quasi tätig werden und wir sehen dann
00:34:13.614 --> 00:34:17.424
auch auf unserem Jira-Board, hey, hier ist dieses Ticket auf Ready for Review
00:34:17.424 --> 00:34:18.717
und unserem Team zugewiesen.
00:34:19.059 --> 00:34:22.784
Dann gehen wir auf GitLab, schauen uns die Kommentare an, was halt richtig cool
00:34:22.784 --> 00:34:25.904
ist. Automatisch macht der Agent dann auch, schon wenn er die Merge-Request
00:34:25.904 --> 00:34:29.294
erstellt, meistens eine sehr gute Beschreibung, was hier passiert ist.
00:34:29.294 --> 00:34:32.091
Also wir können dann schon direkt sehen, okay, das und das wurde gemacht.
00:34:34.135 --> 00:34:36.674
Und haben es dann sogar beim Review noch ein bisschen einfacher.
00:34:36.674 --> 00:34:40.244
Aber wir sind noch an dem Punkt, wo wir wirklich noch die Tickets am Ende reviewen,
00:34:40.244 --> 00:34:42.604
auch wenn sich das natürlich hin und wieder mal ein bisschen staut.
00:34:44.275 --> 00:34:47.745
Genau, dann kommt der Dev-Test. Obwohl das auch Part von Verify ist,
00:34:48.774 --> 00:34:51.975
ist es halt der härteste Teil, deswegen haben wir das nochmal in den eigenen
00:34:51.975 --> 00:34:54.167
Skill ausgelagert, der dann GQA heißt,
00:34:54.753 --> 00:34:58.805
das heißt, unser Agent nutzt noch einen anderen Skill, den wir gebaut haben,
00:34:58.805 --> 00:35:01.405
TIXX-Deploy heißt der in diesem Fall, der halt,
00:35:02.496 --> 00:35:06.295
ein Branch oder ein Ticket, der zieht sich die Branches dann entsprechend aus
00:35:06.295 --> 00:35:10.408
dem Ticket und kann dann auf ein bestimmtes Environment das Ganze deployen.
00:35:10.959 --> 00:35:13.865
Dafür, wir hatten schon eine UI, mit der wir deployen können,
00:35:13.865 --> 00:35:16.415
die wir uns selber gebaut haben. Da haben wir dann ein Skill erstellt,
00:35:16.415 --> 00:35:18.384
die ihm beibringt, wie er diese UI bedient.
00:35:20.207 --> 00:35:24.405
Und dann öffnet er mit Playwright hier einen Headless, einen echten Browser
00:35:24.405 --> 00:35:28.295
und geht halt wirklich rein in den Shop, geht dann auf die Events,
00:35:28.295 --> 00:35:31.184
testet die Filter aus, die er da findet,
00:35:31.579 --> 00:35:35.480
funktioniert das alles, gibt es Fehler in der Dev-Konsole, im Browser,
00:35:36.397 --> 00:35:39.427
das checkt er halt alles und dokumentiert das Ganze.
00:35:39.845 --> 00:35:43.215
Und das ist dann wirklich so einer der Momente, wo es so ein bisschen magisch
00:35:43.215 --> 00:35:46.265
war, wenn man in das Ticket dann reinguckt und dann sieht man da drin schon
00:35:46.265 --> 00:35:50.462
Screenshots von einem funktionierenden Feature, was der Agent dann angehangen hat.
00:35:50.880 --> 00:35:54.182
Da denkt man sich schon wirklich, oha, das ist schon krass.
00:35:55.845 --> 00:35:58.925
Genau, sollte er Fehler finden, dann versucht er den Code zu fixen,
00:35:58.925 --> 00:36:01.845
das Ganze neu zu deployen und das Ganze erneut zu testen.
00:36:02.222 --> 00:36:05.685
Und dann, wenn das Ganze durch ist, geht das Ticket bei uns Ready for QA und
00:36:05.685 --> 00:36:07.805
der Mensch macht dann die finale QA.
00:36:08.145 --> 00:36:11.237
Aber der Agent hat schon quasi die komplette Vorarbeit geleistet.
00:36:12.932 --> 00:36:15.847
So, kommen wir langsam so ein bisschen zum Ende.
00:36:15.847 --> 00:36:20.477
Was sind jetzt unsere Erfahrungen, wo wir das jetzt seit Anfang des Jahres,
00:36:20.477 --> 00:36:24.667
sage ich mal, sind wir komplett mit Spec-Driven Development unterwegs und allgemein
00:36:24.667 --> 00:36:27.851
versuchen wir über die ganze Company AI-First zu entwickeln,
00:36:28.455 --> 00:36:33.107
also dass wirklich jeder mit Claude Code seine Entwicklungen macht,
00:36:33.107 --> 00:36:36.106
das ist nach einigen Ausprobieren unser Tool der Wahl.
00:36:36.570 --> 00:36:40.447
Wir haben allerdings auch eine kleine Codex-Lizenz noch, für das man hin und
00:36:40.447 --> 00:36:41.603
wieder mal vergleichen kann.
00:36:43.362 --> 00:36:46.837
Wir haben tatsächlich mit externem Mentoring auch angefangen.
00:36:46.837 --> 00:36:49.753
Da möchte ich einen Shoutout an Hackers & Wizards geben.
00:36:50.334 --> 00:36:53.037
Könnt ihr gerne googeln, das war sehr, sehr gut. Dadurch haben sich,
00:36:53.037 --> 00:36:56.677
sage ich mal, einige motivierte Engineers bei uns dann gefunden,
00:36:56.677 --> 00:36:58.941
die das dann auch weiter in der Firma getragen haben.
00:36:59.795 --> 00:37:04.427
Und bei uns hat das halt dazu geführt, dass wir dieses ganze Framework dazu entwickelt haben,
00:37:05.256 --> 00:37:09.147
allerdings hatten wir hin und wieder auch das Gefühl, wir over-engineeren es
00:37:09.147 --> 00:37:12.885
ein bisschen und jeder Dev hat seine eigenen Präferenzen,
00:37:13.587 --> 00:37:18.255
deswegen haben wir das Framework so ein bisschen auch angepasst immer wieder,
00:37:18.683 --> 00:37:23.997
um halt auch so ein bisschen individuelle Freiheit für jeden Entwickler zu machen,
00:37:23.997 --> 00:37:26.417
aber dass wir halt alles, was wir im Team, sage ich mal,
00:37:27.177 --> 00:37:30.507
zusammen auf die gleiche Weise machen sollen, ist dann ein Shared Skill Set,
00:37:30.507 --> 00:37:35.007
was wir über ein Repository teilen, was dann wiederum ein Claude Marketplace
00:37:35.007 --> 00:37:37.707
macht, sodass sich diese Skills auch updaten können automatisch.
00:37:39.427 --> 00:37:43.417
Was ist uns noch aufgefallen? Tempo. Alles entwickelt sich extrem schnell.
00:37:43.417 --> 00:37:46.711
Wir haben jede Woche einen Austausch bei uns im Team.
00:37:46.920 --> 00:37:50.472
Es gibt immer ein neues Thema. Es gibt hier ein neues Modell, da ein neues Modell.
00:37:51.004 --> 00:37:53.957
Ich habe das hier ausprobiert, ich habe das ausprobiert und ich kann euch wirklich
00:37:53.957 --> 00:37:56.472
sagen, regelmäßiger Austausch ist da essentiell.
00:37:57.337 --> 00:38:01.501
Und es ist auch schwer, ein gewisses Vertrauen in das, was man hat,
00:38:01.698 --> 00:38:06.208
aufzubauen, weil es sich halt stetig weiterentwickelt, aber wir kommen da immer mehr hin.
00:38:07.496 --> 00:38:10.771
Und eine ganz wichtige Sache am Ende, Ownership.
00:38:11.021 --> 00:38:16.047
Am Ende besitzt du oder ihr oder ich am Ende trotzdem den Output.
00:38:16.047 --> 00:38:21.067
Bugs, die entstehen, Architektur-Drift, Security, alles bleibt in der Verantwortung
00:38:21.067 --> 00:38:23.281
der Entwicklung und nicht bei dem Agenten.
00:38:24.888 --> 00:38:29.149
Genau. Aber perfekt ist der Feind von gut genug. Liefern, lernen, iterieren.
00:38:30.246 --> 00:38:35.086
Was hat uns geholfen? Weniger ist mehr. Kurze, fokussierte Skills sind besser
00:38:35.086 --> 00:38:37.305
als ewig lange Textblocks.
00:38:38.042 --> 00:38:41.596
Coding Guidelines mussten wir nochmal deutlich verschärfen und deutlich klarer
00:38:41.596 --> 00:38:44.009
machen, um halt Regeln für Mensch und Agent zu haben.
00:38:44.607 --> 00:38:47.776
Viele Tests. Wir haben sehr, sehr viele Tests mit der KI geschrieben.
00:38:47.776 --> 00:38:51.586
Da muss man wirklich drauf achten, dass man wirklich auch immer das Verhalten
00:38:51.586 --> 00:38:55.589
testet. Der Agent neigt gerne dazu, den Code zu testen, anstatt des Verhaltens.
00:38:57.261 --> 00:39:02.266
Wir haben unsere ADRs in die Repositories teilweise gepullt,
00:39:02.266 --> 00:39:06.183
damit der Agent auch vergangene Architekturentscheidungen und Einschränkungen versteht.
00:39:06.816 --> 00:39:11.086
Wir versuchen mehr in Richtung DDD zu gehen. Das ist halt auch super für Agenten,
00:39:11.086 --> 00:39:15.906
weil Du hast einen kleinen Kontext, klare Grenzen und er weiß genau,
00:39:15.906 --> 00:39:18.252
wo er arbeiten darf und wo er nicht arbeiten soll.
00:39:19.059 --> 00:39:24.346
Saubere Architektur generell, sehr, sehr wichtig, um dem Agenten das Ganze zu machen.
00:39:24.346 --> 00:39:28.366
Da wird der Legacy Talk bestimmt noch drauf eingehen. Der Agent kopiert halt
00:39:28.366 --> 00:39:31.556
gerne, was er drumrum sieht. Und wenn das halt nicht gut ist,
00:39:31.556 --> 00:39:34.430
dann produziert er halt auch keine gute Architektur.
00:39:35.632 --> 00:39:39.150
Nichts davon ist wirklich neu, aber alles davon wird jetzt immer wichtiger.
00:39:41.460 --> 00:39:43.829
Mit Blick auf die Zeit muss ich mich, glaube ich, ein bisschen beeilen.
00:39:44.101 --> 00:39:47.760
So, wie war der Einfluss auf die Zusammenarbeit? Ich gehe da mal so ein bisschen
00:39:47.760 --> 00:39:51.049
schneller durch. Am meisten haben wir es natürlich bei unserem Produktmanager gemerkt.
00:39:51.362 --> 00:39:54.870
Wir waren jetzt ein bisschen schneller unterwegs und er musste versuchen mitzuhalten.
00:39:54.870 --> 00:39:57.225
Also, was haben wir gemacht? Wir haben uns einmal mit ihm hingesetzt,
00:39:57.777 --> 00:40:01.170
unsere ganzen relevanten Repos bei ihm auf dem Rechner aufgesetzt,
00:40:01.170 --> 00:40:05.730
Claude Code installiert und mit ihm auch so ein paar eigene Jira-Skills,
00:40:05.730 --> 00:40:08.835
mit denen er refinen kann und sowas aufgesetzt.
00:40:09.242 --> 00:40:12.410
Und das Coole ist, er kann jetzt oft einfach auch Claude fragen,
00:40:12.410 --> 00:40:14.652
anstatt dass er einen Entwickler direkt fragen muss,
00:40:15.790 --> 00:40:19.980
um halt die ganze Security sowohl bei der Entwicklung als auch in der Applikation
00:40:19.980 --> 00:40:24.510
halt hochzuhalten, haben wir auch gemeinsam Skills mit unserem Security-Team entwickelt.
00:40:26.082 --> 00:40:30.680
Bei QA und UX haben wir ähnlich das wie bei dem Produktmanager gemacht und wir
00:40:30.680 --> 00:40:33.370
haben auch eine größere Überlappung festgestellt.
00:40:33.370 --> 00:40:36.840
Unser PM kriegt immer mehr technisches Wissen, wie die Applikation funktioniert
00:40:36.840 --> 00:40:41.593
und wir müssen durch das schnellere Arbeiten halt auch immer mehr Produktentscheidungen selber treffen.
00:40:42.359 --> 00:40:45.650
Und was man auch merkt, wenn man sich das Ganze durchliest, zwar hat man an
00:40:45.650 --> 00:40:48.476
einigen Stellen weniger Zusammenarbeit, wenn man mit dem Agenten ist,
00:40:49.202 --> 00:40:53.852
aber man kann auch Inselwissen abbauen, indem man halt mit den verschiedenen,
00:40:54.484 --> 00:40:56.232
Parts halt eigene Skills entwickelt.
00:40:57.120 --> 00:41:02.450
Wo anfangen? Um das Ganze selber zu implementieren, ich würde einen sparsamen
00:41:02.450 --> 00:41:07.860
erstmal Spec- und Dev-Skill entwickeln und damit halt starten und dann nach
00:41:07.860 --> 00:41:11.220
und nach die Quality Gates dazuholen. Da stelle ich auch am Ende was zur Verfügung.
00:41:12.004 --> 00:41:16.660
Noch einfacher, einfach den Plan-Mode ausprobieren, aber einfach mit dem kleinen
00:41:16.660 --> 00:41:20.967
Satz, interview mich bis ins letzte Detail, wie wir das implementieren wollen.
00:41:21.124 --> 00:41:24.500
Das macht schon sehr, sehr viel und was dann immer ganz cool ist,
00:41:24.500 --> 00:41:26.910
wenn die Session vorbei ist und das hat gut funktioniert für euch,
00:41:26.910 --> 00:41:30.140
könnt ihr eben einfach sagen, mach mir daraus direkt einen Skill und das könnt
00:41:30.140 --> 00:41:31.375
ihr dann immer wieder wiederverwenden.
00:41:32.954 --> 00:41:36.712
Und der eine oder andere mag jetzt denken, okay, da passiert so viel automatisch,
00:41:36.712 --> 00:41:40.193
brauchen wir noch Entwickler. Aber ich würde sagen, Entwickler sind wichtiger denn je.
00:41:40.750 --> 00:41:45.364
Niemand wird ersetzt werden. Man muss mit der Zeit gehen, das war in diesem Feld aber immer so.
00:41:46.187 --> 00:41:50.252
Und der Change, der kommt, in Zukunft entwickeln wir Agenten und Spec-Driven
00:41:50.252 --> 00:41:54.083
Development Frameworks und alles drumherum, anstatt die Applikation selbst.
00:41:55.476 --> 00:41:59.582
Ja, vielen, vielen Dank fürs Zuhören. Ich beantworte gerne noch ein paar Fragen.
00:41:59.582 --> 00:42:02.802
Auf meinem GitHub findet ihr die eben erwähnten Starter-Skills.
00:42:03.182 --> 00:42:07.192
Um selber zu starten und in dem Workshop morgen gehen wir natürlich nochmal
00:42:07.192 --> 00:42:11.318
richtig ins Detail, wie ihr das Ganze implementieren könnt. Vielen Dank.
00:42:11.893 --> 00:42:15.732
Ja, vielen Dank dir, Fabian. Schön, dass du auch nochmal auf den Workshop verwiesen
00:42:15.732 --> 00:42:18.452
hast, denn da geht es dann, glaube ich, so wirklich ans Eingemachte.
00:42:18.923 --> 00:42:21.242
Ich habe tatsächlich auch Fragen hier.
00:42:21.762 --> 00:42:24.682
Ich fange mal an mit dem Tobias. Ups, jetzt springt es wieder,
00:42:24.682 --> 00:42:25.796
weil noch Fragen reinkommen.
00:42:26.655 --> 00:42:30.132
Ihr seid ja ein Frontend-Team. Wie macht ihr das mit Features,
00:42:30.132 --> 00:42:34.497
die auch Backend-Änderungen erfordern? Wird das dann zum Bottleneck eventuell am Ende?
00:42:36.061 --> 00:42:41.071
Das ist tatsächlich vom Titel nicht so richtig erkennbar, aber bei uns ist tatsächlich
00:42:41.071 --> 00:42:46.531
so gut wie jeder Fullstack und ich habe sozusagen eine zweigeteilte Rolle.
00:42:46.531 --> 00:42:51.131
Ich bin der Chapter-Lead für Vue, also für Frontend, aber das Team,
00:42:51.131 --> 00:42:55.241
in dem ich Delivery mache und Tech-Lead bin, arbeitet tatsächlich Fullstack.
00:42:55.241 --> 00:43:00.101
Also das wird für uns nicht zum Bottleneck. Wir entwickeln die Sachen dann gemeinsam.
00:43:00.101 --> 00:43:05.861
Also wir nehmen dann die API und das Frontend und bauen das Feature halt zusammen.
00:43:05.861 --> 00:43:10.028
Also wir haben am Ende dann eine Spezifikation, wo quasi beides abgedeckt wird.
00:43:11.189 --> 00:43:15.421
Super, alles klar. Ingo hat noch eine Frage. Wo landen die generierten Specs?
00:43:15.421 --> 00:43:19.258
Wird die entstehende Markdown-Datei direkt mit eingecheckt?
00:43:19.758 --> 00:43:23.781
Das ist eine sehr, sehr gute Frage. Da gibt es verschiedene Ansätze.
00:43:24.221 --> 00:43:29.173
Da hatte ich auch einen Artikel gewesen auf martinfowler.com tatsächlich, glaube ich.
00:43:30.201 --> 00:43:36.491
Wir sind aktuell mit Spec First, nennt man es, unterwegs, wo wir das Ganze nicht einchecken.
00:43:36.491 --> 00:43:42.331
Wir haben am Anfang die Specs eingecheckt, dass sie halt da sind und man sich
00:43:42.331 --> 00:43:44.501
im Nachhinein nochmal das Ganze angucken kann.
00:43:44.501 --> 00:43:48.331
Am Anfang haben wir sogar die Brainstorming-Session noch persistiert.
00:43:48.331 --> 00:43:52.631
Also, was für Fragen wurden gestellt, welche Antworten, Möglichkeiten gab es
00:43:52.631 --> 00:43:55.550
und welche haben wir gewählt, um wirklich alles nachvollziehen zu können.
00:43:56.531 --> 00:44:00.401
Aber wir haben gemerkt, dass das halt durch die Entwicklung ganz schnell halt
00:44:00.401 --> 00:44:05.201
outdated ist und wir das halt auch nicht, wir wollen das natürlich nicht aktuell halten,
00:44:05.661 --> 00:44:09.751
und am Ende, da der Agent automatisch auch sehr detailliert ist bei Commit Messages,
00:44:09.751 --> 00:44:13.461
Kommentare schreibt in Code, haben wir einfach nicht den Sinn gesehen,
00:44:13.821 --> 00:44:17.597
diese ganzen Dateien noch zu behalten, aber da gibt es auch andere Ansätze.
00:44:18.897 --> 00:44:24.017
Cool, danke dir vielmals. André hat die Frage, wie setzt ihr Coding-Guides um?
00:44:27.157 --> 00:44:32.223
Eigentlich nicht groß anders als vorher. Also wir setzen uns mit dem Team zusammen
00:44:32.223 --> 00:44:35.400
und schauen dann, wie wollen wir entwickeln.
00:44:37.323 --> 00:44:42.563
Im PHP-Space ist es so, dass wir hauptsächlich PSR12, das ist so ein Standard,
00:44:42.563 --> 00:44:48.733
wie kurz geschrieben wird, so vom Style her nutzen und da noch so ein paar kleine Anpassungen machen.
00:44:48.733 --> 00:44:53.463
Im Vue-Bereich haben wir halt relativ umfangreiches Linting und alles,
00:44:53.463 --> 00:44:56.930
sag ich mal, was man automatisieren kann, was dann am Ende über irgendein Skript
00:44:57.278 --> 00:45:01.527
funktioniert, ist halt am besten, weil das ist dann ganz klar für den Agenten,
00:45:01.632 --> 00:45:03.240
es funktioniert oder es funktioniert nicht.
00:45:05.503 --> 00:45:09.863
Ansonsten verlinken wir das dann entsprechend in eine CLAUDE.md oder packen das
00:45:09.863 --> 00:45:12.400
in einen eigenen Skill, das kommt so ein bisschen drauf an.
00:45:13.468 --> 00:45:17.723
Okay, und ganz kurz mal zwischendurch, hier kommt auch noch ein lobendes,
00:45:18.083 --> 00:45:20.743
sehr guter Vortrag. Dankeschön.
00:45:22.739 --> 00:45:27.083
Genau. Und Ingo hat noch eine Frage zu den Kosten, falls du dazu Einblick geben
00:45:27.083 --> 00:45:31.073
kannst. Habt ihr Daten zu den Kosten? Vor allem zum Vergleich Entwicklung durch
00:45:31.073 --> 00:45:33.333
Agent versus Entwicklung durch den Menschen.
00:45:33.716 --> 00:45:37.973
Was ist für euch der größte Mehrwert? Mehr Entwicklungskapazität,
00:45:37.973 --> 00:45:41.923
bessere Resultate oder tatsächlich geringere Kosten?
00:45:43.346 --> 00:45:49.235
Das ist eine ausgezeichnete Frage. Also, da ich ja am Anfang die Zahlen genannt
00:45:49.235 --> 00:45:53.435
habe, also wir fahren das tatsächlich so, das machen, glaube ich, auch wirklich wenige.
00:45:53.638 --> 00:45:59.115
Bei uns gibt es keine Limits. Jeder kann so viel KI-Tokens nutzen, wie er möchte.
00:45:59.115 --> 00:46:02.365
Natürlich, wenn man sehr, sehr viel nutzt, gibt es auch hin und wieder mal eine
00:46:02.365 --> 00:46:04.535
Nachfrage, hey, wofür war das?
00:46:04.535 --> 00:46:08.045
Hat das Sinn ergeben? Aber solange es Sinn ergeben hat, ist es auch okay,
00:46:08.045 --> 00:46:12.785
wirklich mal 500 Dollar an einem Tag zu verbraten, sage ich jetzt mal so.
00:46:12.785 --> 00:46:16.475
Und wir sind da schon sehr weit oben.
00:46:16.475 --> 00:46:24.485
Also das liegt schon im sechsstelligen Bereich, was wir da im Monat an AWS in dem Fall zahlen müssen.
00:46:24.485 --> 00:46:30.105
Das ist schon recht viel. Und ich würde sagen, der Hauptbenefit ist wirklich,
00:46:30.105 --> 00:46:33.275
dass wir ein bisschen mehr Kapazität dadurch kriegen.
00:46:34.099 --> 00:46:38.718
Ich würde sagen, die Qualität ist in etwa gleich.
00:46:39.101 --> 00:46:43.445
So, ich würde jetzt nicht sagen, dass die KI deutlich besseren Code schreibt,
00:46:43.445 --> 00:46:45.620
als jetzt zum Beispiel ein Seniorentwickler.
00:46:45.945 --> 00:46:50.479
Allerdings, wenn man es mit einem Junior vergleicht, ist es natürlich deutlich, deutlich darüber.
00:46:51.587 --> 00:46:54.333
Genau, also die Kapazität würde ich sagen, ist der größte Benefit.
00:46:55.407 --> 00:46:58.385
Ich danke dir nochmal vielmals für deinen Vortrag. Ich bin mir sicher,
00:46:58.385 --> 00:47:01.299
dass die Leute auch morgen im Workshop noch so einiges mitnehmen können.
00:47:01.827 --> 00:47:04.755
Und ja, ich würde sagen bis zum nächsten Mal.
00:47:05.735 --> 00:47:07.151
Ja, bis dann.
00:47:24.255 --> 00:47:27.218
Rheinwerkverlag.de slash Newsletter.