Im ersten Artikel dieser Serie AI in Software Engineering habe ich Codeassistenten wie JetBrains AI Assistant und GitHub Copilot sowie deren Implikationen beschrieben. Wiederholt war ich von deren Fähigkeiten beeindruckt. Während die Vorteile von Suchmaschinen wie Google für Internetnutzer offensichtlich erscheinen, sind das Konzept und die Anwendung für andere schwer greifbar. Ähnliches gilt für Codeassistenten: Sie bieten Entwicklern eine derart breite Unterstützung, dass sich eine einfache Erklärung schwierig gestaltet. Dieser Text beschreibt einige persönliche Erfahrungen mit diesen Werkzeugen, erhebt jedoch keinen Anspruch auf Vollständigkeit. Der Zweck ist vielmehr, ein klareres Bild zum aktuellen Stand der Codeassistenten zu vermitteln – einem Stand, der angesichts der rasanten Entwicklungen schnell veraltet sein könnte.
AI in Software Engineering - II
Beispielsanwendungen
Integration
Anders als ChatGPT, das nur über den Browser bedient wird, sind Codeassistenten direkt in die Entwicklungsumgebung integriert. Neben Chatfenster und mehrzeiliger Autovervollständigung bieten sie weitere Funktionalitäten. Auf Knopfdruck erklärt JetBrains AI Assistant unbehandelte Exceptions, die den Programmfluss stören, und schlägt mögliche Lösungswege vor. Commit-Nachrichten werden auf Basis der Änderungen generiert, und über das Kontextmenü AI Actions lassen sich weitere Funktionen ausführen. Explain Code, Suggest Refactoring, Find Problems, Write Documentation, Generate Unit Tests, Generate Code sind die derzeit relevantesten Funktionen. Nutzer können zudem nach Bedarf weitere Befehle konfigurieren.
Generierter Code genügt selten den Qualitätsansprüchen des Entwicklers, und er ist mitnichten immer funktional. Dennoch kann er als Orientierungshilfe nützlich sein.
Boilerplate
Beim Umgang mit Boilerplate Code helfen sowohl der Chat als auch die mehrzeilige Autovervollständigung. Unter Boilerplate verstehen Entwickler repetitive Teile innerhalb des Codes, die gewissen Mustern folgen. Oft werden sie mittels Copy-and-Paste und kleiner Anpassungen erstellt. Dieser Prozess ist fehleranfällig.
Sprachmodelle brillieren beim Erkennen von Mustern. So lässt sich ein solcher Code sowohl erstellen als auch auf Fehler überprüfen. Beispielsweise ist es möglich, Testdaten oder Beispiel-HTTP-Anfragen-Befehle zu generieren. Inkohärenzen innerhalb beliebiger Dateien oder Tippfehler werden zuverlässig detektiert.
Sinnvolle Testdaten lassen sich einfach generieren. Querverweise wie passende UUID zwischen verschiedenen Tabellen werden anhand des Kontextes erkannt. In diesem Beispiel erscheint die UUID des Nutzers ‘John Doe’ in den Konten ‘Bank1’ und ‘Bank2’.
Review
Das Aufdecken von Inkohärenzen ist wesentlicher Bestandteil eines Code Review. Codeassistenten sind in der Lage, Fehler zu detektieren und Verbesserungsvorschläge zu machen. Bei der Analyse zeigen sie Fähigkeiten, die weit über syntaktische Codeanalyse hinausgehen. Fehler bei Rekursions- und Iterationsabläufen werden erkannt, und auch falsche Programmrückgabewerte werden im Kontext der Klassen-, Funktions- und Variablennamen beurteilt. Die Funktionalität kann sowohl zur Fehlersuche als auch zum Review genutzt werden. Codeassistenten können das Codereview durch einen Peer (vorerst) nicht ersetzen, aber entlasten.
Der ternäre Ausdruck ist verkehrt implementiert. Anstelle der sensiblen Daten blendet er alle anderen aus. Jetbrains AI Assistant detektiert den Logikfehler, obwohl dieser syntaktisch korrekt ist und den Programmfluss nicht stört. Nur die Ausgabe des Programms ist berührt.
Autovervollständigung
GitHub Copilot bot zunächst Autovervollständigung an. Diese Funktion allein ohne Chat war bereits äusserst populär. Anhand des Kontexts in Form von Kommentaren oder angefangenen Codeblöcken schlägt der Codeassistent mehrere Zeilen möglichen Codes vor. Besonders bei Konfigurationsdateien erweist sich dies als nützlich. Doch auch im Source Code wiederholen sich oft Muster.
Nach der Eingabe von 'mysql' in einer Docker-Compose-Datei schlägt GitHub Copilot einen kompletten Serviceblock vor. Darin enthalten sind die passende Portfreigabe, Volume-Mount-Pfade und Umgebungsvariablen.
Suchmaschine
Nutzen wir eine Suchmaschine, formulieren wir zuerst die Suche, sichten dann die Suchergebnisse, und nach der Auswahl eines oder mehrerer Suchresultate evaluieren wir sie jeweils kurz. Danach wenden wir die gefundene Dokumentation oder das Anwendungsbeispiel auf unsere Situation an. Wir ersetzen gewisse Referenzen und Begriffe des Beispiels durch diejenigen unserer Umgebung, fügen weitere Teile hinzu oder entfernen nicht Notwendiges.
Mit Codeassistenten formulieren wir zuerst das Problem, wobei korrekte Suchbegriffe eine weniger gewichtige Rolle spielen. Ist die genaue Bezeichnung unbekannt, können wir das Konzept auch umschreiben. Daraufhin wird eine auf die aktuelle Umgebung massgeschneiderte Antwort generiert. Dies bedeutet deutlich weniger Anpassungen. Falls die Antwort unvollständig ist oder die Frage missverstanden wurde, beginnen wir anders als die Suchmaschine nicht von Neuem, sondern verfeinern die Frage iterativ.
JetBrains AI Assistant generiert ein SQL-Statement zur Erstellung einer Tabelle auf Basis unseres Source Codes und des SQL-Statements zur Generierung der Testdaten. Auf den Hinweis, nicht Hibernate zu verwenden, ändert sich die Konfiguration. Die Anfrage wird iterativ modifiziert und nicht von Neuem gestartet.
Zuverlässigkeit
Nutzer von ChatGPT dürften beide Erfahrungen gemacht haben: Teils sind die Fähigkeiten von ChatGPT verblüffend gut, teils jedoch auch ernüchternd schlecht. Halluzinationen, bei denen Sprachmodelle falsche Angaben erfinden, ohne dies zu kommunizieren, sabotieren die Zuverlässigkeit der Sprachmodelle als Informationsquelle.
Eine offensichtlich falsche Antwort. Beide Codeausschnitte sind identisch. Schaden entsteht dennoch keiner, denn die Fehlinformation wird rasch als solche erkannt.
Gleich verhält es sich mit den Codeassistenten im Programmierumfeld. Teils ist der generierte Code, die vorgeschlagene Konfiguration oder das Review direkt nutzbar. Teils wird die Frage falsch verstanden oder fehlerhafter und unbrauchbarer Code generiert. Halluzinationen sind in ihrer Wirkung bei Codeassistenten jedoch beschränkter. Entwickler erkennen entweder direkt durch ihre Kenntnis der Materie oder in einem späteren Schritt, beim Ausführen, ob die Antwort sinnvoll war. Dennoch ist wie bereits früher bei der Internetrecherche von blindem Kopieren aus Sprachmodellen abzuraten. Ein Verständnis der eigenen Lösung ist unabdingbar.
Die erste Anfrage wurde mit einer Halluzination beantwortet. Mit einer präzisierten Nachfrage konnte die gewünschte Antwort erstellt werden.
Nutzen
Eine Studie von GitHub zeigt, dass Codeassistenten nicht nur die Produktivität, sondern auch die Zufriedenheit der Nutzer steigern. Ihre Rolle lässt sich mit der eines sehr schnellen, jedoch unbeaufsichtigten Junior-Entwicklers vergleichen. Während bestimmte Aufgaben zur vollsten Zufriedenheit ausgeführt werden, werden andere vielleicht missverstanden oder aufgrund von Überforderung nicht gelöst. Dies stellt keine Kritik an unerfahrenen Arbeitskräften dar. Vielmehr sind diese ein unverzichtbarer Teil vieler Organisationen. Es ist entscheidend, die Fähigkeiten der Mitarbeitenden richtig einzuschätzen und zu wissen, wann zusätzliche Kontrolle und Anleitung angebracht sind.
Die führenden Codeassistenten sind für zweistellige Beträge pro Monat und Nutzer erhältlich, was bei europäischen Lohnkosten kaum ins Gewicht fällt. Herausforderungen bestehen noch in der teilweise unbefriedigenden Situation bei der Datensicherheit und der noch ausbaufähigen Bekanntheit, die einer weiteren Verbreitung im Weg stehen. Doch wer würde seinen Entwicklern nicht für 20 Franken im Monat die Unterstützung eines Juniors bieten wollen?
Ausblick
Innerhalb kurzer Zeit haben sich die Fähigkeiten der Generativen AI beachtlich verbessert, und bisher ist noch kein Sättigungseffekt zu beobachten. Die nächste Generation der grossen Sprachmodelle ist bereits angekündigt und teilweise schon veröffentlicht. Im Gleichschritt mit deren Fähigkeiten werden auch neue Anwendungsgebiete entdeckt. Man darf erwarten, dass diese Werkzeuge bei fast allen informationsverarbeitenden Schritten Einzug finden werden. Für die Informatik dürfte die Unterstützung bei der Entwicklung erst der Anfang gewesen sein. Auch bei Operations und Quality Assurance ist das Aufkommen populärer Produkte eine Frage der Zeit.
Für weitergehende Informationen und eine individuelle Beratung stehen Ihnen unsere unabhängigen Experten gerne zur Verfügung.