Entwickeln mit KI: IntelliJ IDEA, Visual Studio IntelliCode und Tabnine im Test

KI-Systeme zur Textkomplettierung sind alltäglich. Ob sie auch als Programmierhilfe überzeugen, testen wir anhand zweier IDEs und der KI-Erweiterung Tabnine.

In Pocket speichern vorlesen Druckansicht 5 Kommentare lesen
Lesezeit: 18 Min.
Von
  • Bernhard Steppan
Inhaltsverzeichnis

JetBrains IntelliJ IDEA und Microsofts Visual Studio Code bieten von Haus aus gute Programmierhilfen. IntelliJ IDEA enthält bereits eine durch maschinelles Lernen gestützte Codevervollständigung, während Visual Studio Code sich mit dem KI-Tool IntelliCode wappnet. Darüber hinaus gibt es für beide einige externe KI-Erweiterungen wie Kite und Tabnine, die versprechen, die Produktivität von Entwicklerinnen und Entwicklern nochmals zu steigern.

Die genannten KI-Erweiterungen funktionieren wie die Textvorschläge, die man auf einem Smartphone während der Texteingabe im Editor bekommt. Man tippt einen Text ein und der Editor bietet mehrere Vorschläge an, mit denen man den Text fortsetzen könnte. In der Programmierung ist das als Autocomplete bekannt. Die normale Codevervollständigung listet jedoch nur die nächste sinnvolle Ergänzung auf, wie sie sich zum Beispiel über eine Codeinspektion ermitteln lässt. KI-Erweiterungen können das übertreffen, wenn sie mit passenden Programmbeispielen angelernt wurden. Dann sind sie in der Lage, komplette Textblöcke ohne Nacharbeit zu ergänzen, was die Programmiergeschwindigkeit erheblich steigert.

Um das zu testen, haben wir zwei unterschiedliche Testsuiten zusammengestellt. Die darin enthaltenen Tests prüfen, wie die Tools sich in sehr unterschiedlichen Aufgabenstellungen bewähren. Die erste Testsuite besteht aus einem Java-Programm zum rekursiven Kopieren von Verzeichnisbäumen und prüft, wie technisch orientierte Klassen mit Konzepten wie Konstruktoren, Getter- und Setter-Methoden und Ausnahmebehandlung ergänzt werden. Zudem untersucht sie mit Refactoring, ob die KI-Funktionen beim Extrahieren von Methoden und beim Umbenennen ins Trudeln kommen.

iX-TRACT
  • IDEs wie IntelliJ IDEA und Visual Studio Code enthalten Programmierhilfen wie eine Codevervollständigung, die Entwicklern die Arbeit erleichtern.
  • Zusätzliche KI-Erweiterungen wie Tabnine gehen über die reguläre Codevervollständigung hinaus, indem sie nicht nur die nächste sinnvolle Ergänzung listen, sondern ganze Textabschnitte.
  • Zwei zum Vergleich dieser IDEs erstellte Testsuiten ermitteln, wie die IDEs Klassen ergänzen, wie die KI-Tools sich beim Extrahieren von Methoden verhalten und auf Klassen ohne Datenbasis reagieren.

Die zweite Testsuite ist ein fachlich orientiertes Java-Programm zur Bestellaufnahme mit Klassen in deutscher Sprache. Die Tests sind anders ausgerichtet als die des ersten Durchlaufs: Sie versuchen herauszufinden, wie die KI-Tools auf Klassen reagieren, auf die sie mit hoher Wahrscheinlichkeit gar nicht trainiert werden konnten. Hintergrund der Tests dieser Suite ist der Umstand, dass viele Firmen für die Geschäftslogik ihrer Programme fachlich benannte Klassen- und Methodennamen verwenden, auf die man KI-Tools schlecht vorbereiten kann. Der Quellcode solcher Klassen ist meistens nicht öffentlich zugänglich. Es ist zudem nicht ungewöhnlich, diese Programme in der jeweiligen Landessprache zu schreiben. Daher sind die Klassen, Methoden und Variablen dieses Tests bis auf die Java-Schlüsselbegriffe durchgängig in deutscher Sprache verfasst. Der Test soll vor allem untersuchen, ob die KI-Erweiterungen durch solche fachlichen Klassen aus dem Tritt kommen und ob sich in dem vergleichsweise kurzen Zeitraum im Rahmen dieses Artikels überhaupt ein Lerneffekt zeigt.

Mehr zu Künstlicher Intelligenz

Der erste Kandidat ist die integrierte Entwicklungsumgebung (IDE) IntelliJ IDEA. Sie ist seit 2001 auf dem Markt und liegt in einer kostenfreien Community Edition als Open Source und in der etwas leistungsfähigeren, aber kostenpflichtigen Ultimate Edition vor. Diese IDE ist für Windows, macOS und Linux verfügbar. Dem Test liegt die Community Edition für macOS in der neuesten Version 2021.1.2 zugrunde. Die Testprojekte sollte IntelliJ zunächst ohne eine externe KI-Erweiterung absolvieren, da die Entwicklungsumgebung bereits über umfangreiche Autovervollständigungs- und Refactoring-Funktionen verfügt. Darunter befindet sich auch die KI-Funktion namens Machine-Learning-Assisted Code Completion.

Die erste Testsuite soll das Kopierprogramm für Verzeichnisbäume implementieren, das aus zwei Java-Klassen besteht. Die erste Klasse, CopyProcess, enthält den Kopieralgorithmus, die zweite Klasse, TransferApp, die Verarbeitung der Eingabeparameter und den Aufruf der rekursiven Kopierfunktion. Das Implementieren des Kopieralgorithmus gestaltet sich sehr einfach: Für das Anlegen des Ziel-Packages kann man entweder den Bezeichner des Pakets direkt in die neue Klasse schreiben und anschließend die Klasse per Refactoring in das korrekte Package verschieben. Oder man legt das Package im Projektmanager an und erzeugt danach gleich dort die Klasse.

Die stets sinnvollen und syntaktisch richtigen Vorschläge unterstützen das Implementieren der rekursiven Kopiermethode sehr gut. Die erste Abbildung zeigt ein Beispiel für das Ermitteln eines Arrays mit Elementen des Typs String. Bei Kontrollstrukturen wie Schleifen reicht es aus, im Editor ein Java-Schlüsselwort wie for einzufügen. Die IntelliJ-Programmierhilfe bietet daraufhin die zwei möglichen For-Schleifenarten von Java zum Generieren an.

Die Codevervollständigung von IntelliJ IDEA sortiert ihre Vorschläge so, dass sich die besten oben befinden. Hier liefern die beiden ersten Funktionen wie gewünscht ein String-Array.

Try-Catch-Blöcke und Throws-Statements ergänzt IntelliJ nicht einfach während des Schreibens, was meistens auch nicht sinnvoll ist. Um bei der Ausnahmebehandlung mit wenig Schreibarbeit zum Ziel zu kommen, ist es am besten, zunächst den Methodenaufruf zu schreiben, der eine Exception auslösen kann. Danach gilt es zu entscheiden, ob IntelliJ den erforderlichen Try-Catch-Block erzeugen oder die Exception von der aufrufenden Methode behandelt werden soll. Um aus ganzen Blöcken Code zu generieren, bietet IntelliJ viele Templates an, die sich per Shortcuts oder Kontextmenü einsetzen lassen. So implementieren Entwicklerinnen und Entwickler Konstruktoren, Getter- und Setter-Methoden und andere Codefragmente mit wenig Schreibarbeit. Wählen sie den anderen Weg und tippen Anweisungen direkt in den Editor ein, enthalten die Vorschläge zum Vervollständigen meist keine größeren Codeblöcke, sind dafür aber stets syntaktisch korrekt.