Künstliche Intelligenz hat mit dem Release von ChatGPT im November 2022 einen riesigen noch immer andauernden Hype erfahren. Vor allem im Bereich der Softwareentwicklung wurde und wird ihr viel Potenzial zugeschrieben. Allerdings merkt man beim reinen Vibe Coding sehr schnell, wo die Grenzen liegen und dass nachhaltige Lösungen, vor allem im Enterprise-Umfeld, doch mehr als nur generierten Quellcode benötigen. Wo KI hier wirklich Mehrwert liefert und wo eher nicht, speziell für die tägliche Arbeit von Senior Entwickler:innen, soll der folgende Erfahrungsbericht zeigen.

AI Assisted Coding

Hier soll es explizit nicht um Vibe Coding gehen. Bei AI Assisted Coding geht es darum, Programmiertätigkeiten zu automatisieren und dem Entwickler Arbeit abzunehmen. Dieser bleibt im Lead und gibt genau vor, was das erwartete Ergebnis ist und wie dieses zu erreichen ist.

Code Completion

Eine einfache Form von KI-gestützter Entwicklung ist die Möglichkeit der Codevervollständigung. Diese geht deutlich über die zuvor bereits etablierten Varianten der Autovervollständigung von einzelnen Zeilen hinaus. Dadurch, dass dem KI-Modell Kontextwissen über die Codebasis zugänglich ist, ist das automatische Generieren von ganzen Codeblöcken problemlos möglich. Bei repetitiven Aufgaben wie dem Herunterschreiben von Mapping-Methoden oder CRUD-Operationen erspart dies viel Tipparbeit. Je generischer die Anforderung ist, desto besser sind die Ergebnisse. Viel wiederkehrender Code findet sich in den Trainingsmengen der KI-Modelle.

Auch das Umsetzen von bekannten Algorithmen funktioniert aufgrund der Trainingsdaten sehr gut. Häufig muss man nur eine Methodensignatur schreiben und erhält umgehend den Autovervollständigungs-Vorschlag.

Repetitive Task

Aufgaben, die in einer Codebasis immer wieder anfallen, lassen sich gut mit KI-gestützter Entwicklung umsetzen. So kann man den Code etwa für CRUD-Operationen und Datenbankzugriffe problemlos generieren lassen. Die initiale Umsetzung sollte man von Hand ausführen. Hier arbeitet man alle für seinen Bedarf notwendigen technischen Details aus. Bei nachfolgenden Aufgaben kann man dem LLM diese Blaupause als Referenz mitgeben, an der es sich orientieren soll.

Prompt: Implement a database repository “RolesRepository” for the entity “userrole”. Use the existing implementation of “UsersRepository” as a reference.

Auch Namen für Klassen oder Methoden kann man in seinem Prompt definieren. Je mehr Vorgaben man einem LLM gibt, desto geringer ist die Wahrscheinlichkeit für Halluzinationen.

Refactorings

Bei Refactorings, die über reines Renaming hinausgehen, kann eine KI viele Aufgaben übernehmen. Mit klaren Vorgaben, was anzupassen ist und was nicht und einem überschaubaren Scope, trifft man sehr schnell das gewünschte Ergebnis. Durch eine hohe Testabdeckung bleibt sichergestellt, das die Funktionalität nach dem Refactoring nicht gebrochen ist.

Vorgehen

Um erfolgreich Arbeit an einen KI-Agenten abgeben zu können, müssen die Anforderungen klar formuliert sein. Neben den reinen fachlichen Anforderungen, die z.B. in einer Userstory festgehalten werden, muss man auch technische Details beschreiben. Was zuvor möglicherweise nur implizites Wissen aller Beteiligter war, die an einem Softwareprojekt mitwirken, muss nun explizit aufgeschrieben und dem LLM zugänglich gemacht werden.

Auch Entwickler müssen mehr Zeit in das Verfassen von Task investieren, um diese sinnvoll von einer KI umsetzen zu lassen. Auch hier empfiehlt es sich, sehr kleinschrittig vorzugehen. Userstories werden in viele kleine technische Task heruntergebrochen, die einen sehr beschränkten Scope haben. Diese kann man seiner KI dann zum Abarbeiten übergeben. Durch das Herunterbrechen auf kleine Task reduziert man auch den Blast-Radius, den eine KI hinterlässt, wenn sie anfängt, in dutzenden Dateien Änderungen vorzunehmen. Nachdem die KI dann alle Task einen nach dem anderen umgesetzt und zu jedem Task dedizierte Tests geschrieben hat, kann sie einen Pull-Request stellen. Als Entwicklungs-Team muss man danach die PRs reviewen und vor allem die Qualität des generierten Codes sicherstellen. Auch hier gilt weiterhin die Anforderung, dass der Code nicht nur korrekt sondern auch wartbar sein muss. Auch zukünftig werden wir mehr Quellcode lesen als schreiben, vielleicht in noch viel größerem Maße als bisher.

Neben den Task kann man einer KI technische wie fachliche Informationen über ein Softwaresystem in einer AGENTS.md-Datei zur Verfügung stellen. Diese wird bei jedem Prompt implizit eingelesen und bei der Generierung der Antwort berücksichtigt.

Grenzen von AI Coding

Was nicht funktioniert sind One-Shots zum Umsetzen ganzer Features oder gar das Generieren ganzer Systeme. Auch wenn dabei Ergebnisse herauskommen, sind diese zu weit weg von dem gewünschten Ziel, der Architektur oder auch nur den Coding-Guidelines, die man im Team verfolgt.

Mitunter ist es auch zeitlich kein Vorteil, eine KI auf ein Problem zu werfen. Im Agentic Mode kann eine KI durchaus eine Stunde mit einer einzelnen Aufgabe verbringen, die ein erfahrener Entwickler mit dem entsprechenden Wissen über das Projekt in wenigen Minuten problemlos hätte umsetzen können. Auch die Zeit, die das formulieren von guten Prompts einnimmt, sollte man nicht vernachlässigen.

Coding ist nicht das Bottleneck

Die reine Schreiben von Quellcode ist nicht der limitierende Faktor bei der Entwicklung von Software. Bereits ohne KI liegt die Coding-Zeit von Senior Entwicklern bei 30-40%. Daher ist der Einsatz von künstlicher Intelligenz nicht der Heilsbringer, den manche vielleicht in ihr sehen. Aber sie verschiebt die Arbeit von Entwicklern, noch weiter weg vom Coding in Richtung Planung, Vorbereitung und Review.

Für erfahrene Entwickler sehe ich in AI Developer Tools ein gutes Werkzeug, um einfachere und repetitive Aufgaben automatisiert umsetzen zu lassen. Für Junior Devs ist es daher umso wichtiger, sich nicht auf reines Prompting und Vibe Coding zu verlassen, sondern eben jene Erfahrung und Expertise aufzubauen, um sinnvoll mit Hilfe von KI Software zu entwickeln.