Aus Linux-Magazin 05/2024

Wie künstliche Intelligenz Programmierern unter die Arme greift

© Gunnar Pippel / 123RF.com

Künstliche Intelligenz unterstützt Programmierer zunehmend bei ihrer täglichen Arbeit. Eine Bestandsaufnahme zeigt, wie KI heute im Entwicklungsprozess hilft, wo ihre Grenzen liegen und warum ein unbedarfter Einsatz sogar gefährlich sein kann.

Entwickler nutzen seit Jahrzehnten in gewissem Umfang künstliche Intelligenz. Beispielsweise bieten selbst Texteditoren wie Kate ein Syntax-Highlighting und eine Autovervollständigung. Alle diese Hilfen basieren im Hintergrund auf vorgegebenen Regeln. Stößt der Editor etwa auf die Zeichenkette »for«, färbt er sie grün ein. Wesentlich intelligenter gehen moderne KI-Assistenten zu Werke und eröffnen damit Entwicklern ganz neue Möglichkeiten.

Eierlegende Wollmilchsau

Möchten Sie Ihren bestehenden Programmcode von C in das modernere Rust konvertieren? Kein Problem für CodeConvert [1]: Der Cloud-Dienst übersetzt Quellcode zwischen vielen Programmiersprachen (Abbildung 1). Darunter finden sich neben bekannten Vertretern wie Go und Python auch Exoten wie Ocaml, Cobol und Tcl. Legacy-Code lässt sich auf diese Weise schnell in eine moderne Sprache überführen. Das Tool ist keineswegs der einzige Dolmetscher – Refraction [2], Codeium [3] und Figstack [4] übersetzen ebenfalls zwischen zahlreichen Sprachen. Diese Werkzeuge können zudem noch deutlich mehr.

Abbildung 1: Bei CodeConvert laden Sie links den vorhandenen Quellcode ab, drücken auf einen Knopf und erhalten auf der rechten Seite das Gegenstück in Rust oder einer anderen Sprache.

Abbildung 1: Bei CodeConvert laden Sie links den vorhandenen Quellcode ab, drücken auf einen Knopf und erhalten auf der rechten Seite das Gegenstück in Rust oder einer anderen Sprache.

Zunächst klinken sie sich über ein Plugin in die Entwicklungsumgebung ein, überwachen dort im Hintergrund die Arbeit des Programmierers und schlagen dann während des Tippens möglichen Code vor. Die offerierten Ergänzungen komplettieren die angefangene Zeile und meist sogar den Rest einer kompletten Funktion. Die von Github Copilot [5] ausgespuckten Schnipsel halten sich obendrein an die Coding-Konventionen des restlichen Dokuments. Damit geht das sogenannte AI Coding deutlich über die herkömmliche regelbasierte Autovervollständigung hinaus.

Um eine Funktion selbstständig vollenden zu können, verwenden die Assistenten den vorhandenen beziehungsweise umgebenden Code als Anhaltspunkt. Tabnine [6] orientiert sich nicht nur an der Signatur einer Funktion, sondern zusätzlich an einem darüber stehenden Kommentar. Über entsprechende Zeilen können Programmierer die KI folglich zielgerichtet zum passenden Ergebnis leiten. Daher verwundert es etwas, dass viele Anbieter die Arbeitsweisen ihrer KI-Tools kaum beschreiben. So bleibt etwa bei Codeium (Abbildung 2) unklar, welche Zeilen der Assistent bei der Codeerzeugung berücksichtigt.

Abbildung 2: Im Codeium Playground auf der Codeium-Webseite lässt sich der KI-Assistent unverbindlich ausprobieren, allerdings nur an einer Handvoll Sprachen.

Abbildung 2: Im Codeium Playground auf der Codeium-Webseite lässt sich der KI-Assistent unverbindlich ausprobieren, allerdings nur an einer Handvoll Sprachen.

Die meisten KI-Werkzeuge schreiben nicht nur Quellcode weiter, man kann sie auch explizit um die Lösung eines Programmierproblems bitten. Dabei beschreibt man der KI mit einem kurzen englischsprachigen Satz die Aufgabe und erhält dann umgehend den dazu passenden Code. So liefern die KI-Assistenten unter anderem den kompletten Code für einen Sortieralgorithmus oder einen Vorschlag für eine Klasse. Einige Tools wie Refraction können zudem aus einer Beschreibung wie “alle gültigen E-Mail-Adressen”, einen regulären Ausdruck ableiten oder zur Umschreibung einer SQL-Abfrage ein passendes Query liefern.

Halluzinationen

Glaubt man den vielen Videos und Marketing-Texten im Internet, schütteln die KI-Assistenten mühelos komplexe Codeschnipsel in unzähligen Sprachen aus dem Ärmel. Dabei übertrumpfen sich die Anbieter gegenseitig. So kennt Refraction nach eigenen Angaben 56 Programmiersprachen, Codeium sogar über 70. Das alles klingt fast zu schön, um wahr zu sein. Und wer die Werkzeuge in einem größeren Projekt ausprobiert hat, weiß: Das ist es häufig auch.

Einfache Funktionen wie Bubblesort oder den euklidischen Algorithmus aus Abbildung 3 schreiben die KI-Assistenten noch recht sicher auf. Dabei liefern sie sogar neue Lösungsansätze oder Implementierungsideen, an die manch ein Programmierer nicht gedacht hat. Wer jedoch komplexeren Code benötigt, bekommt oft lediglich unbrauchbare Vorschläge, die mitunter nicht einmal als solche zu erkennen sind (Abbildung 4).

Abbildung 3: Einmal ergänzt Codeium zielsicher die Funktion zur Berechnung des größten gemeinsamen Teilers.

Abbildung 3: Einmal ergänzt Codeium zielsicher die Funktion zur Berechnung des größten gemeinsamen Teilers.

Abbildung 4: Ein anderes Mal erhält man keine oder nur unbrauchbare Vorschläge.

Abbildung 4: Ein anderes Mal erhält man keine oder nur unbrauchbare Vorschläge.

Das liegt an der Arbeitsweise der KI-Tools: Im Hintergrund wird der Quellcode von neuronalen Netzen generiert, meist in Form von Large Language Models (LLM). Die Programmierassistenten verwenden somit dieselbe Technik, die auch hinter dem intelligenten Chatbot ChatGPT steckt. Anders als dort werden die neuronalen Netze nicht mit Alltagswissen aus der Wikipedia geschult, sondern (zusätzlich) mit existierendem Quellcode. Tabnine und einige Konkurrenten bieten zudem an, die dabei entstehenden Modelle auf ihre Kunden maßzuschneidern. Dazu trainieren sie ihre Modelle mit dem privaten Quellcode des jeweiligen Kunden nach.

In jedem Fall schlagen die neuronalen Netze immer solche Quellcodezeilen vor, die aus ihrer Sicht sehr wahrscheinlich zu den schon vorhandenen passen. Bei komplexem Code laufen die KI-Assistenten allerdings gern in die falsche Richtung. Der ausgespuckte Vorschlag besteht dann nur noch aus wirren Anweisungen oder erfüllt nicht mehr die Anforderung, was man teilweise aber erst bei genauem Hinsehen erkennt (Abbildung 5).

Abbildung 5: Refraction generiert Code, in dem der eigene Code Audit gleich mehrere Punkte moniert.

Abbildung 5: Refraction generiert Code, in dem der eigene Code Audit gleich mehrere Punkte moniert.

Schlimmer noch: Der generierte Quellcode kann Fehler und Sicherheitslücken aufweisen, beispielsweise wenn die KI die Nutzung einer veralteten API empfiehlt. Die Selbstsicherheit, mit der die Assistenten auftreten, verleitet viele Entwickler dazu, den Code ohne genaue Prüfung zu übernehmen. Wie schnell Bugs durchrutschen können, zeigt unter anderem der Entwickler Marcio Frayze in einem Blog-Beitrag [7].

Prüfungskommission

Github Copilot versucht diese Probleme mit Filtern zu mildern. Mit ihrer Hilfe klopft es den generierten Codeschnipsel auf typische problematische Muster ab. Dazu zählen laut Github unter anderem SQL Injections und hartkodierte Zugangsdaten (Credentials). Sollte Copilot ein Problem entdecken, blockiert es seinen Vorschlag oder weist zumindest den Entwickler auf das Problem hin. Darüber hinaus ergreift die KI jedoch keine weiteren Sicherheitsmaßnahmen. Github empfiehlt hier seine anderen Werkzeuge wie Github Advanced Security.

Programmierer müssen folglich den generierten Quellcode immer noch einmal selbst prüfen. Darauf weisen Github Copilot und CodeConvert sogar explizit im Kleingedruckten beziehungsweise in den FAQ hin. Ein zweiter Blick empfiehlt sich ganz besonders, wenn ein Feature noch als Beta oder gar als experimentell gilt, wie bei Codeium die Funktion Codeium Command, die zu einer natürlichsprachigen Beschreibung passenden Code erzeugt.

Die Qualität der Vorschläge hängt maßgeblich vom Wissen der Assistenten und somit von den Trainingsdaten ab. Woher die stammen, bleibt jedoch durchweg im Dunkeln. Nur selten weisen die Anbieter eine Quelle aus. Zu den rühmlichen Ausnahmen zählen Tabnine und Github. Beide KIs lernen aus dem Quellcode in öffentlich zugänglichen Repositories, einschließlich denen auf Github. Dort findet sich allerdings deutlich mehr Quellcode in C als in weniger beliebten Sprachen wie D oder Cobol. Dank des somit größeren Wissens über C können sie in dieser Sprache deutlich komplexeren Code erzeugen, während sie bei D schon in einfachen Situationen Zeichensalat fantasieren.

Aus diesem Grund driften die Erfahrungen vieler Entwickler auseinander: Während die einen ihr KI-Tool nicht mehr missen möchten, erweist es sich für andere als nicht zu gebrauchen. Wer sich für die verschiedenen Erfahrungen interessiert, sollte unbedingt einen Blick in die entsprechenden Diskussionen bei Reddit werfen, etwa in die zu Github Copilot [8].

Rechtliche Stolperfalle

Die Trainingsdaten bergen noch ein weiteres Problem: Nutzer der KIs können sich nie sicher sein, ob der auf Zuruf generierte Quellcode Lizenzen, Urheberrechte oder sogar Patente verletzt.

Das Problem verschärft sich, wenn die KI einfach Codeschnipsel aus den Trainingsdaten kopiert und sie als ihre eigenen ausgibt. Laut Github passiert das bei Copilot vor allem dann, wenn im Editor des Programmierers erst wenig eigener Code existiert oder wenn man die KI nach allgemein bekannten Lösungen fragt, beispielsweise nach einem Bubblesort-Algorithmus. Quellcode enthält zudem häufig persönliche Daten wie die E-Mail-Adressen der beteiligten Entwickler. Derlei Informationen finden sich prinzipiell ebenfalls im Gedächtnis der KIs.

Die Ausgabe von E-Mail-Adressen versucht Github mit einem Filter zu blockieren, schließt aber nicht aus, dass doch welche durchrutschen. Eine Duplikaterkennung soll Codekopien verhindern. Dabei sucht die Github-KI den von ihr erzeugten Codeschnipsel in allen öffentlichen Github-Repos. Wird sie dort fündig, blockiert sie entweder ihren Vorschlag oder meldet die Fundstelle nebst Lizenz. Entwickler können dann selbst entscheiden, ob der vorgeschlagene Code und die Lizenz zu ihrem Projekt passen.

Sorgenfrei nutzen lässt sich Copilot damit trotzdem nicht: So funktioniert die Duplikaterkennung nur dann, wenn der Codeschnipsel in einem öffentlichen Github-Repository auftaucht, mindestens 150 Zeichen umfasst und der Entwickler mit Visual Studio Code arbeitet. Im Kleingedruckten weist Github darauf hin, dass man stets selbst prüfen muss, ob die Vorschläge von Copilot die Rechte anderer Parteien verletzen. Bei aktiver Duplikaterkennung verspricht Github immerhin Unterstützung für Copilot-Anwender, denen ein Copyright-Verstoß vorgeworfen wird. Wie weit diese Hilfe reicht, führt Github nicht aus.

Selbst mit einer solchen Prüfung stellt sich stets die Frage, unter welcher Lizenz der generierte Codevorschlag steht. Github selbst erhebt explizit keine Urheberrechtsansprüche auf den von Copilot erzeugten Code, andere Anbieter schweigen sich darüber aus. Das und alle übrigen Probleme sprechen nicht gerade für den Einsatz der KI-Assistenten. Dennoch gibt es mehrere Bereiche, in denen die Werkzeuge punkten können.

Nützliche Schriftsteller

Als lästige Pflicht sehen zahlreiche Entwickler die Dokumentation ihres Quellcodes an. Genau diese Aufgabe übernehmen die KI-Assistenten erstaunlich treffsicher. So müssen Programmierer Codeium, Refraction und Konsorten lediglich bitten, eine Funktion zu erklären, und schon liefert die KI einen Kommentar mit einer kurzen passenden, natürlichsprachigen Beschreibung (Abbildung 6). Wie viele andere Vertreter verfasst die von JetBrains [9] für seine IDEs entwickelte KI zudem automatisch Commit-Texte. Sämtliche generierten Texte erfordern zwar noch leichte Nacharbeit, wie zahlreiche Entwickler bestätigen,sie beschleunigen aber dennoch essenziell die Arbeit.

Abbildung 6: Dokumentation erzeugen die KIs relativ zielsicher. Hier hat Codeium einen korrekten Kommentar für die Berechnung des größten gemeinsamen Teilers geschrieben.

Abbildung 6: Dokumentation erzeugen die KIs relativ zielsicher. Hier hat Codeium einen korrekten Kommentar für die Berechnung des größten gemeinsamen Teilers geschrieben.

Darüber hinaus können Sie sich von den KI-Assistenten vorhandenen Code erklären lassen (Abbildung 7). Auf diese Weise bekommen Sie schnell heraus, was zum Teufel diese eine Funktion eines längst aus dem Unternehmen ausgeschiedenen Kollegen veranstaltet. Unter anderem Codeium, Tabnine und den Github Copilot dürfen Sie sogar Fragen über den Quellcode stellen – beispielsweise, wie eine Funktion eine andere verwendet oder welche Muster ein kryptischer regulärer Ausdruck abdeckt. Figstack ermittelt außerdem die Laufzeit des Quellcodes in der O-Notation.

Abbildung 7: Hier erklärt Refraction ausführlich den Code auf der linken Seite.

Abbildung 7: Hier erklärt Refraction ausführlich den Code auf der linken Seite.

Solche Hilfen unterstützen darüber hinaus Neulinge beim Einstieg in eine neue Sprache (Abbildung 8). Sie können sich von den KI-Assistenten Beispiele ausgeben lassen und Verständnisfragen zum vorhandenen Code stellen. Manch eine KI bietet hier spezielle Handreichungen: Refraction erstellt auf Wunsch eine Einführung zu einem beliebigen Programmierthema, während JetBrains KI durch den Funktionsumfang in den hauseigenen IDEs führt. Die Texte der KI-Werkzeuge lesen sich allerdings teilweise wie ein trockenes Referenzhandbuch. Einige Entwickler weichen daher in solchen Fällen gern auf ChatGPT aus.

Abbildung 8: Codeium liefert hier Wissen über das in Go enthaltene Package Fmt.

Abbildung 8: Codeium liefert hier Wissen über das in Go enthaltene Package Fmt.

Test, Test, 1, 2, 3

Auch beim Testen versprechen die KI-Assistenten nützliche Unterstützung. Insbesondere erzeugen sie auf Knopfdruck automatisch Testfälle beziehungsweise Unit-Tests. Die von JetBrains für seine IDE entwickelte KI orientiert sich dabei nicht nur am Quellcode, sondern auch an der Dokumentation. Refraction wiederum fügt auf Wunsch automatisch Debug-Texte in den Code ein, etwa “Alle Elemente abgearbeitet”. Die Texte leitet die KI dabei aus den Namen von Funktionen, Variablen und anderen Elementen ab, weshalb sie häufiger etwas Nacharbeit erfordern. Einige KIs erkennen typische oder potenzielle Programmierfehler und schlagen Alarm. Das gelingt teilweise schon während des Tippens. Refraction erklärt sogar noch, wie der Fehler entstanden ist und wie Sie ihn beheben. Einen komplett fehlerfreien Code garantiert jedoch keiner der KI-Assistenten.

Gerade, wenn es schnell gehen muss, entsteht immer noch gern Spaghetti-Code mit Variablen, deren Namen bloß aus einem Buchstaben bestehen. Dieses Codeknäuel entzerren einige KI-Tools und formatieren es direkt passend zum Styleguide. Refraction liefert neben optimiertem Code natürlichsprachliche Verbesserungshinweise. So moniert die KI beispielsweise eine fehlende Prüfung von Eingaben und nichtssagende Variablennamen. Unter anderem Refraction und Codeium können den Code automatisch refaktorisieren (Abbildung 9). Refraction überführt zudem hartkodierte Strings und Zahlen selbstständig in Variablen und trägt fehlende Typen nach. Erneut hängt die Qualität der Ergebnisse stark von der Komplexität des Quellcodes ab.

Abbildung 9: Refraction hat hier älteren Rust-Code refaktorisiert und ihn dabei gleichzeitig an aktuelle Rust-Versionen angepasst.

Abbildung 9: Refraction hat hier älteren Rust-Code refaktorisiert und ihn dabei gleichzeitig an aktuelle Rust-Versionen angepasst.

Tarifbindung

Die meisten intelligenten Programmierhilfen gibt es ausschließlich als mietbaren Cloud-Dienst, den dann die Plugins für die Entwicklungsumgebungen konsultieren. Alternativ sprechen Sie mit der KI direkt im Browser, müssen dann aber stetig Quellcode hin und her kopieren. Tabnine gehört zu den wenigen Anbietern, dessen Modelle Sie selbst hosten dürfen (On-Premises).

Eventuell vorhandene kostenlose Angebote sind entweder zeitlich begrenzt oder im Funktionsumfang stark eingeschränkt. Die Gebühren variieren zudem recht stark zwischen den Diensten. Professionelle Entwickler zahlen bei Refraction mindestens 80 US-Dollar pro Jahr, Github Copilot verlangt 19 US-Dollar pro User und Monat. Sonderkonditionen gibt es häufig für Schüler, Lehrer und Entwickler von Open-Source-Projekten.

Quelloffene Programmierassistenten muss man nicht nur mit der Lupe suchen, ihre Inbetriebnahme gestaltet sich obendrein deutlich aufwendiger. Wie bei Tabby [10] und FauxPilot [11] fahren Sie dabei meist einen Server-Dienst in einem Docker-Container hoch. Im Hintergrund arbeiten bekannte, auf die Programmierung zugeschnittene Open-Source-Modelle. Tabby spannt zum Beispiel Code Llama, StarCoder oder CodeGen ein.

Befragen lassen sich die KI-Assistenten über eine API, bei Tabby beispielsweise per OpenAPI. Möchten Sie diese Schnittstellen nicht umständlich via Curl ansprechen, benötigen Sie einen passenden Client oder ein Plugin für die eigene IDE. Das Tabby-Projekt stellt erfreulicherweise selbst einige Plugins bereit. Bei FauxPilot müssen Sie entweder zu Plugins von Drittentwicklern greifen oder mit Tricks das offizielle Visual-Studio-Code-Plugin für den Github Copilot zur Zusammenarbeit überreden (Abbildung 10). Alternativ zu Tabby und FauxPilot können Sie direkt das Framework Ollama [12] installieren und damit ein quelloffenes Modell wie Code Llama lokal ausführen. Wer sich für diesen extrem steinigen Weg entscheidet, findet in Privy [13] ein passendes Visual-Studio-Code-Plugin.

Abbildung 10: Einige Werkzeuge wie Github Copilot bieten nicht nur IDE-Plugins, sondern lassen sich auch über ein Kommandozeilenwerkzeug befragen.

Abbildung 10: Einige Werkzeuge wie Github Copilot bieten nicht nur IDE-Plugins, sondern lassen sich auch über ein Kommandozeilenwerkzeug befragen.

Datenschutz

Um qualitativ guten Quellcode für verschiedene Sprachen erzeugen zu können, braucht es große neuronale Netze und riesige Mengen Trainingsdaten. Die notwendige Rechenleistung und finanziellen Mittel besitzen vor allem die großen Konzerne wie Google, Amazon oder Microsoft zusammen mit OpenAI. Kleinere Anbieter von Programmierwerkzeugen geraten wie der einstige Pionier Kite [14] unter die Räder oder weichen notgedrungen auf die Vorleistung der Global Player aus. Beispielsweise nutzt Refraction aus Portugal angepasste Modelle von OpenAI.

Das wiederum führt zu einem Datenschutzproblem: Um unmittelbar Vorschläge liefern zu können, beobachtet die KI den Entwickler bei seiner Arbeit und sendet Teile des Quellcodes zur Auswertung in die Cloud. Wer etwa seinen kompletten Quellcode von CodeConvert übersetzen lässt, hat einem indischen Unternehmen die Interna seines kompletten Programms geschickt. Meist erhalten die Anbieter außerdem weitere Informationen. So erhebt Github Copilot verschiedene Metriken wie die von der Entwicklungsumgebung gemeldeten Fehler und die dort aktivierten Features.

Was in der Cloud mit den Daten passiert, liegt in der Hand des Anbieters. Insbesondere könnten der Quellcode und damit wichtige Unternehmensinterna als Trainingsmaterial in die KI einfließen. Folglich würden die Assistenten dann das Wissen des Unternehmens anderen Nutzern anbieten. Im schlimmsten Fall tauchen dort sogar Codefragmente auf. Die Hersteller gehen mit diesem Problem unterschiedlich um, entsprechende Informationen verbergen sich häufig im Kleingedruckten. Github Copilot garantiert beispielsweise nur für den Business-Tarif, dass der in die Cloud geschickte Quellcode nicht als Trainingsdaten zum Einsatz kommt. Github behält sich zudem vor, dass Mitarbeiter am Copilot-Projekt die Anfragen einsehen dürfen. Dazu zählen Angestellte von Microsoft und OpenAI.

Wer aufgrund des Datenschutzes damit liebäugelt, Tabnine selbst zu betreiben oder eine quelloffene KI wie Tabby einzusetzen, stolpert unweigerlich über die Technik: Auch wenn man diese Modelle nicht mehr selbst trainieren muss, verlangt das Ausführen dennoch nach leistungsfähiger Hardware. Idealerweise steckt eine leistungsfähige Nvidia-Grafikkarte mit viel Speicher im System, die sich per CUDA-Schnittstelle ansprechen lässt. Diese Konfiguration setzt die Schnellstartanleitung von FauxPilot sogar zwingend voraus.

Fazit

Automatisch generierte Tests und Hinweise auf Best Practices – das wünschen sich laut einer Umfrage der Go-Entwickler besonders viele Programmierer von einem KI-Assistenten [15]. Zumindest mit den meisten kommerziellen Diensten gehen diese Wünsche in Erfüllung. Automatisch komplexen Code zu implementieren, gelingt derzeit jedoch noch keiner KI. In der Praxis erledigen die Assistenten ihre Arbeit vor allem als aufgebohrte Autovervollständigung, Dokumentationshilfe und Unit-Test-Generator. In diesen Bereichen nehmen die Tools dem Entwickler lästige Routinearbeiten ab, sofern man ihre Ergebnisse immer noch einmal kontrolliert. (csi)

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben