Beliebte Suchanfragen
//

KI-Tools zum Lernen neuer Programmiersprachen: Ein Erfahrungsbericht

4.9.2023 | 7 Minuten Lesezeit

Einleitung

KI-Tools, die die Arbeit des Softwareentwicklers unterstützen – oder eventuell sogar ganz ersetzen – sorgen im Moment für Schlagzeilen. In diesem Artikel möchte ich einen ganz persönlichen Erfahrungsbericht schreiben, wie es mir erging, als ich experimentell ChatGPT benutzt habe, um in Programmiersprachen, die ich bis dato nicht kannte, eine Anwendung zu entwickeln. Ich möchte hier zeigen, wie man ChatGPT – oder auch andere Large Language Models (LLMs) – als Werkzeug einsetzen kann, was es kann und wo die Grenzen liegen.

Ich habe bei meinem Experiment sowohl GPT-3.5 als auch GPT-4 Models verwendet. Der Unterschied war nicht groß, aber gefühlt vorhanden.

Das Experiment

Go und Rust sind zwei Programmiersprachen, die mir grundsätzlich bekannt sind: Ich weiß, dass es sie gibt und ich weiß in etwa, was die Besonderheiten der Sprachen sind. In beiden Sprachen habe ich vor etwa zwei Jahren mal „Hello World“-Programme geschrieben, aber viel weiter bin ich nicht gekommen.

Zu Beginn meines Experiments war mir bei beiden Sprachen noch nicht einmal klar, wie ich jeweils ein Source-File strukturiere, es kompiliere oder automatisierte Tests schreibe. Und da dachte ich mir, könnte mir die Welt der KI helfen.

Ich habe also insgesamt zwei Konversationen gestartet, eine für Rust und danach eine für Go.

Der Prompt macht die Musik

Grundsätzlich ist es immer eine gute Idee, ChatGPT zu Beginn einer Konversation über Szenario und Erwartungshaltung zu informieren. Teile dem System mit, was du von ihm erwartest. Ich habe jede meiner Konversationen mit so einem einleitenden Prompt begonnen:

"You are a specialist in the programming language Rust and you are also a teacher in that language. I am a newbie who wants to learn Rust by developing an application. You shall guide me through that process. As a start, I want to know how a simple Rust program is structured, how I compile it and how I run it."

In beiden Fällen waren die Antworten extrem hilfreich. Mir wurde Beispielcode gezeigt und ich bekam Links auf die Webseiten, von wo ich Compiler und andere Tools herunterladen konnte.

Tatsächlich konnte ich, den Erklärungen 1:1 folgend, in beiden Fällen ein lauffähiges Programm erzeugen, starten und mein „Hello, World!“ bewundern.

Ab hier ist es übrigens sinnvoll, in der jeweiligen ChatGPT-Konversation zu bleiben und keinen neuen Chat zu starten. ChatGPT vergrößert seinen Kontext laufend. Wenn man in einer themenbezogenen Konversation bleibt, bezieht es die vorangegangene Anfragen und Antworten ein.

Es wurde schnell schwierig

Die nächste Aufgabe war eigentlich auch einfach – wie ich dachte:

"I want to add a function that takes two numbers and adds them together. I want to place this function in another file to keep the source files small."

In beiden Fällen konnte ich die Antwort auf diese Frage nicht 1:1 verwenden. Zwar wurde ein korrekter Code erzeugt, aber die Erklärung, wo ich die neue Datei erstellen musste und wie ich dafür sorgen sollte, dass es auch gefunden wird, war sowohl bei Rust als auch bei Go schlicht falsch.

Bei Go lieferte ChatGPT schnell eine korrigierte Fassung (ich hatte ChatGPT die Compiler-Fehlermeldung vorgeworfen), bei Rust hingegen musste ich die Originaldokumentation zur Hilfe ziehen.

Die Lösung war auch bei Rust schnell gefunden, aber hier wird schon die erste Lektion deutlich:

Was GPT produziert, muss nicht richtig sein.

Ich möchte es gerne umformulieren und als generelle Regel für den Umgang mit derartigen KI-Tools ausdrücken:

Nutze niemals das Ergebnis von ChatGPT oder anderen LLMs, wenn du nicht in der Lage bist, die Richtigkeit selbst zu prüfen!

Der weitere Verlauf

In der Folge habe ich mir erklären lassen, wie man automatisierte Tests schreibt und wie man die Tests ausführt. Auch hier waren die Antworten von ChatGPT nicht 1:1 verwendbar. Trotzdem habe ich recht schnell die richtigen Lösungen gefunden.

Dann wurde es spannend. Ich habe ChatGPT mit meinem hypothetischen fachlichen Anwendungsfall bekannt gemacht:

"I want to develop a web backend application in Go. Here are the requirements from my customer: Create a REST backend to record times. There should be a list of activities that are maintained in a database table. For each activity, a user can record any start and end times for each day through a POST endpoint. There is a GET endpoint to query the list of activities of a user for a specific day.

As I have never written a web application in Go, please give me a list of at most three possible frameworks or libraries to use, together with pros and cons and an url to read more."

Ich habe mir bewusst von ChatGPT nicht den ganzen Code in einem Rutsch erzeugen lassen, denn es ging mir ja darum, selbst eine Anwendung zu entwickeln und dabei auch die Sprache zu lernen.

(Meine bisherigen Versuche, komplette Lösungen über das normale ChatGPT Interface bauen zu lassen, waren nicht sehr erfolgreich. Vielleicht sind Tools wie MetaGPT hier ja hilfreicher, das steht noch auf meiner Liste zum Ausprobieren. ChatGPT alleine kann das jedenfalls (noch) nicht.)

Für jede Sprache habe ich dann eine Liste von Frameworks angeboten bekommen. Die aufgeführen Vor- und Nachteile waren für mich eher nichtssagend, daher habe ich jeweils die genannte Webseite aufgesucht und mir dort Codebeispiele angesehen. Dann konnte ich eine Wahl treffen.

Datenbank lesen und schreiben

Als Datenbank habe ich Redis ausgewählt, einfach darum, weil es keine SQL-Datenbank ist und ich sie ebenfalls nicht kenne. In der Rust-Konversation habe ich mir Redis erklären lassen, was allerdings ohne einen Blick in die Dokumentation nicht verständlich gewesen ist.

Für beide Sprachen habe ich dann in der oben beschriebenen Weise nach Clients für Redis gesucht und bin ebenfalls fündig geworden.

Der nächste Schritt ging in beiden Fällen erfreulich einfach. Mithilfe von ChatGPT konnte ich Datenstrukturen erstellen und diese als JSON-String gewandelt in Redis ablegen und wiederfinden. ChatGPT hat mir auch geholfen, sinnvolle Keys für die Datenbank zu wählen. Allein durch diese Wahl (TimeTracking:john_doe:237645) habe ich einen Einblick bekommen, wie Keys in Redis aufgebaut werden können.

Auch gelang es sehr gut, für das Lesen und Schreiben sinnvolle Tests zu erstellen. Ich habe jeweils beschrieben, was der Test machen soll und dann funktionierenden Code erhalten.

Ich schreibe deshalb „funktionierend“, weil ich ziemlich sicher bin, dass der Rust-Code, der hier produziert wurde, nicht besonders elegant ist. Rust kennt eigentlich funktionale Elemente, sodass man nicht mit einem veränderbaren Array und einer simplen Schleife arbeiten müsste.

Die Web-Schnittstelle

Als letzten Schritt habe ich mir dann helfen lassen, Web-Endpunkte zu erstellen. Einen GET-Endpunkt habe ich mit Rust und Go leicht bauen können, der POST-Endpunkt bei Rust hat aus irgendeinem Grund nicht funktioniert und bei Go fehlte mir am Ende die Zeit, auch das fertig zu bekommen. Ich bin aber sicher, dass das bei Go problemlos geklappt hätte, denn, so hässlich Go-Code auch aussieht, es ist im Grund ziemlich leicht, in der Sprache zu programmieren.

Nach nur 2-3 Stunden habe ich das jeweilige Experiment für beendet erklärt.

Zusätzliche Hilfe durch codeium

Über ein Problem bin ich während meines Experiments mehrfach gestolpert. Ich habe manchmal den von ChatGPT erzeugten Code verändert. Teilweise, weil es notwendig war, um Fehler zu korrigieren, manchmal aber auch, um Features einzubauen, deren Erstellung mir aufgrund des bisherigen Lernerfolgs möglich erschienen ist.

In jedem Fall hat die Konversation davon natürlich nichts mitbekommen. Und ich habe auch nicht den gesamten Code wieder zurückgespielt (was ich natürlich hätte tun können).

An der Stelle hat mir Codeium geholfen, ebenfalls ein KI-Entwickler-Tool, das zur Familie der „code completions“ gehört. Deren bekanntester Vertreter ist GitHub Copilot. Codeium ist in den Code-Editor integriert, liest den aktuellen Code und erzeugt dazu passende Ergänzungen. Das hat mir sehr geholfen, die Lücken zu ergänzen, die ChatGPT natürlicherweise gelassen hat. Diese beiden Tool-Welten passen also sehr gut zusammen und ergänzen sich.

Fazit

Drei Feststellungen kann ich nach der Zeit mit ChatGPT, Rust und Go machen:

  1. Es geht erstaunlich schnell, sich mithilfe der KI in völlig neue Technologien einzuarbeiten. ChatGPT alleine reicht zwar nicht aus, aber es gibt viele Anhaltspunkte, sodass danach die Dokumentation des Herstellers i. d. R. ausreicht, die Lücken zu füllen. Ich war jeweils nach etwa 2-3 Stunden soweit, dass die Anwendung grundsätzlich lief!
  2. Ohne grundsätzliche Programmierkenntnisse wäre ich nicht zum Ziel gekommen. Zwar wusste ich nicht, wie automatisierte Tests in Rust oder Go geschrieben werden, aber grundsätzlich ist mir das in vielen anderen Sprachen geläufig und somit war die Transferleistung möglich. Die Erklärungen alleine waren teilweise sehr dünn, obwohl ich explizit um Anleitung gebeten habe (natürlich hat ChatGPT, wie man es gewohnt ist, viel “gesagt”, aber meistens wiederholt es sich schlicht).
  3. Ein perfekter Go- oder Rust-Entwickler wird man auf diese Weise nicht. Bei Go kommt man weiter als bei Rust, weil Rust aufgrund des deutlich komplexeren Typsystems viele Fallstricke bereithält, aber auch der produzierte Go-Code hat vermutlich bestenfalls Anfängerqualitäten.

Was bleibt: Ich empfehle jedem Entwickler sehr, ChatGPT in die tägliche Arbeit zu integrieren. Wie oft braucht man Hilfe zu einer bestimmten Fragestellung? ChatGPT ist so etwas wie ein „Stack Overflow-Forum“ auf Zuruf (auch dort sind die Lösung ja nicht immer korrekt). Die Trefferquote wird bei weiter verbreiteten Sprachen wie Java oder Kotlin, C#, JavaScript, TypeScript oder auch Python noch viel bessere Ergebnisse liefern.

Man ist in jedem Fall deutlich schneller, wenn man auf die neuen Tools nicht verzichtet. Ich bin sehr gespannt, wie sich ChatGPT oder auch spezielle Lösungen von anderen Herstellern weiterentwickeln werden.

Beitrag teilen

//

Weitere Artikel in diesem Themenbereich

Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.

//

Gemeinsam bessere Projekte umsetzen.

Wir helfen deinem Unternehmen.

Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.

Hilf uns, noch besser zu werden.

Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.