Normale Ansicht

Es gibt neue verfügbare Artikel. Klicken Sie, um die Seite zu aktualisieren.
Ältere BeiträgeHaupt-Feeds

Programmieren im Zeitalter von ChatGPT

02. März 2023 um 17:55

ChatGPT ist in aller Munde. Es formuliert in flüssigem Deutsch oder Englisch Hausaufgaben, löst Philosophie-Wiederholungsfragen und fügt bei Bedarf frei erfundene Quellen hinzu, damit der Text seriöser/wissenschaftlicher wirkt. Wenn man das Programm hinweist, dass 2+3 keineswegs 5 ist, entschuldigt es sich höflich für seinen Fehler. Kurzum, Bananen-Software, reift beim Anwender? Ich bin nicht dieser Meinung.

Trotz aller Unzulänglichkeiten schätze ich das Programm mittlerweile so sehr, dass ich bereit wäre, für seine Anwendung zu zahlen. Bisher war das nicht notwendig. Mit ein paar Versuchen ist mir der Login noch jedes Mal gelungen, auch bei angeblich unerwartet hoher Auslastung.

Nun zähle ich nicht zu den Twitter- oder YouTube-Enthusiasten, die Ihnen versprechen, mit ChatGPT 10 x produktiver zu arbeiten oder 10.000 EUR pro Monat extra zu verdienen. Blödsinn! Aber ich bin mittlerweile überzeugt, dass mir ChatGPT mehr Zeit erspart, als ich brauche, um die ca. 23 EUR zu verdienen, die ChatGPT Plus aktuell pro Monat kostet. Und ich bin schon sehr gespannt, welche KI-Tools als Nächstes kommen!

ChatGPT unterstützt mich beim Programmieren

Berufsbedingt wechsle ich zwischen rund einem Dutzend Sprachen hin und her. Manche Sprachen brauche ich beinahe täglich oder zumindest wöchentlich, bei anderen vergehen schon mal etliche Monate von der einen Anwendung zu nächsten. Das bringt es mit sich, dass ich mir einfach nicht auswendig merken kann, wie ich die letzten drei Zeichen einer Zeichenkette in einem SQL-Statement, in der PowerShell oder in Java extrahiere. Wie ich einen regulären Ausdruck in PHP anwende, und welche Funktionen dagegen in Python verwendet werden.

Solange ich nicht in meinen eigenen Büchern nachschauen kann (deren Aufbau kenne ich so gut, dass die Suchzeit gegen Null geht), habe ich mir derartige Fragen bisher meist von Google beantworten lassen. Google führt dann in die Dokumentation der jeweiligen Sprache oder (bevorzugt) auf einen Beitrag von StackOverflow. Und natürlich weiß ich, welche Seiten am ehesten zum Ziel führen. Dessen ungeachtet dauert es üblicherweise ein paar Minuten, um das im Internet präsentierte Wissen auf die eigene Fragestellung anzuwenden, die Streu eines langatmigen Blog-Beitrags vom Weizen zu trennen. (Mit Videos habe ich mich dagegen nie recht anfreunden können. Es dauert einfach viel zu lange, um an die Stelle zu kommen, wo es interessant wird.)

In den letzten zwei Monaten ist die Anzahl meiner Google-Programmier-Suchen stark gesunken. ChatGPT kann auch programmieren! Warum soll ich umständlich nach Details suchen, wenn ChatGPT innerhalb von Sekunden Code liefert, der nicht nur für die ganz spezifische Fragestellung funktioniert, sondern den die KI auch noch erläutert?

Beispiele

Ein Bild sagt mehr als 1000 Worte? Nun denn:

Wie kann ich in einem PHP-Programm das Bearer Token eines GET-Requests ermitteln?
Vor kurzem habe ich einen regulären Ausdruck gebraucht, um ein Datum im US-Format (also mm/dd/yyyy) zu erkennen.
Hier geht es nur um einen Vorschlag für die Struktur (das Grundgerüst) eines Scripts. Um die Details kümmere ich mich dann selbst, d.h. ich mache das wofür ich bezahlt werde, aber verschwende keine Zeit an Trivialitäten.
Ich will in einem Python-Script eine Datei herunterladen, aber ohne Zusatzmodule zu verwenden.
In einer Folgefrage suche ich nach einem Weg, beim GET-Request einen eigenen Header anzugeben. ChatGPT antwortet im Kontext der vorigen Frage.
In einem Bash-Script will ich die Kennung einer Datei auslesen.
ChatGPT kennt auch Kotlin samt der Datenbankbibliothek Exposed. Die Antwort schießt ein wenig über das Ziel hinaus und enthält auch Code, um eine neue Tabelle einzurichten.
Extrem cool: Ich habe Code in einer Sprache (hier in der Bash) und brauche äquivalenten Code in einer anderen Sprache (hier für die PowerShell). Kein Problem für ChatGPT.
Hier hilft ChatGPT bei der Formatierung von Bildern in einem Markdown-Dokument, das mit Pandoc verarbeitet wird. ChatGPT weist auf die Pandoc-spezifische Erweiterung der Markdown-Syntax hin.
ChatGPT hilft auch bei der Linux-Administration. Hier geht es darum, mit »tar« ein inkrementelles Backup zu erstellen.

ChatGPT versus Copilot

Aus Sicht von Entwicklern ist der GitHub Copilot ein kostenpflichtiges Konkurrenzprodukt zu ChatGPT. Der Copilot soll die Code-Erstellung in Editoren wie VSCode beschleunigen. Im Prinzip geben Sie einen möglichst aussagekräftigen Funktions- oder Methodennamen an, und der Copilot schlägt dafür fertigen Code vor. Die Code-Schnipsel kommen aus dem riesigen Angebot öffentlicher Git-Repositories.

Auch der Copilot nutzt KI-Technik bei der Auswahl und Adaptierung von Code-Schnipsel. Copyright-technisch ist das bedenklicher als die Vorgehensweise von ChatGPT, die in der Regel Code wirklich neu generiert. Natürlich kann es passieren, dass der Copilot Code vorschlägt, der bekannte Fehler oder gar Sicherheitslücken enthält. Das sind aber Probleme, die auch bei ChatGPT auftreten können. Letztlich bleibt es die Verantwortung des Entwicklers / der Entwicklerin, den Code zu verstehen und zu entscheiden, ob er für das Problem taugt oder nicht.

Für mich liegt der wesentliche Unterschied zwischen ChatGPT und dem Copilot weniger im produzierten Code als in der Bedienung: Mit ChatGPT kann ich gewissermaßen sprechen, ich kann mein ganz spezifisches Problem in Deutsch oder (besser!) in Englisch beschreiben und erhalte eine Antwort, die exakt auf die Aufgabenstellung eingeht. Bei Bedarf kann ich sogar um eine Nachbesserung im einen oder anderen Punkt bitten. Die Arbeitsweise ist für mich ungleich intuitiver, angenehmer und »menschlicher« als der Ansatz des Copiloten, einfach nur Code zu einer Funktionsdeklaration zu liefern.

Mich hat der Copilot schon in der Beta-Phase nicht so recht begeistert, und mit ChatGPT sieht das Angebot — nur wenige Monate nach der Markteinführung — schon ziemlich alt aus.

Letzte Anmerkungen

  • Ich habe aktuell keine Angst, dass mich ChatGPT oder eine ähnliche Technik als Programmierer, Admin, Vortragender oder Autor ablöst. Für mich ist ChatGPT einfach ein neues Hilfsmittel bei meiner Arbeit.
  • Insofern halte ich es auch für verrückt, den Einsatz in Schulen, Unis etc. zu verbieten. Das Ziel muss es vielmehr sein, KI-Tools produktiv (und durchaus verantwortungsvoll) anwenden zu lernen. Dieser Grundsatz gilt ja auch für andere Werkzeuge, die wir heute als selbstverständlich einsetzen, von der Rechtschreibkorrektur bis zur Nutzung der Wikipedia.
  • Ich bin mir ziemlich sicher, dass der Nutzen von KI-Tools umso höher ist, je größer das eigene Wissen ist. Insofern ersetzen diese Tools weder qualifizierte Mitarbeiter noch deren Ausbildung.
  • Vielleicht bin ich altmodisch, aber ich pflege einen höflichen Umgangston mit ChatGPT und vergleichbaren Werkzeugen.
  • Zu guter Letzt habe ich das Gefühl (das ich aber nicht objektiv belegen kann), dass die Kommunikation in englischer Sprache zu besseren Ergebnissen führt als Anfragen in Deutsch. Grundsätzlich ist es verblüffend, dass ChatGPT nahezu jeder Sprache mächtig ist. Aber die IT-Welt ist englisch. StackOverflow ist englisch. Die Originaldokumentation nahezu jedes IT-Tools ist englisch. Selbst Entwickler, die eine andere Muttersprache haben, verwenden in der Regel englischsprachige Variablen-, Klassen- und Methodennamen, kommentieren ihren Code idealerweise in Englisch. Insofern erscheint es mir nahe liegend, Code-Fragen in Englisch zu formulieren, was sich auch in den meisten Screenshots dieses Texts widerspiegelt.

Links

Eine andere Meinung, etwas skeptischer, aber auch mit wesentlich spezielleren Fragen:

Kotlin-Updates: Kotlin 1.6

21. November 2021 um 17:20

Seit einigen Tagen ist Kotlin 1.6 verfügbar. Dieser Beitrag geht auf die wichtigsten Neuerungen im Vergleich zu Version 1.5 ein. Die Kurzfassung: Kotlin 1.6 ist ein »kleines« Release, für die meisten Entwickler gibt es keine wirklich dramatische Änderungen. Auch die Verbesserungen in der Standardbibliothek sind eher Kleinigkeiten.

Dieser Text bezieht sich auf die folgenden Versionsnummern:

IntelliJ: 2021.2.3
Kotlin: 1.6.0
JDK: 17

Weitere Kotlin-Update-Artikel auf meiner Website finden Sie hier:

https://kofler.info/tag/kotlin-updates

Exhaustive »when«

In Kotlin 1.6 beklagt sich der Compiler, wenn eine when-Konstruktion für Enumerationen, boolesche Werte oder für Datentypen nicht alle möglichen Fälle erfasst, also nicht »exhaustive« ist. Aktuell können Sie diese Warnung noch ignorieren, aber in Kotlin 1.7 wird daraus ein Fehler. Spätestens dann müssen Sie die when-Konstruktion so formulieren, dass sämtliche Fälle erfasst werden (am einfachsten durch einen else-Block).

enum class Days {
    Monday, Tuesday, Wednesday, Thursday, 
    Friday, Saturday, Sunday
}

val day = Days.Friday
when(day) {
    Days.Monday, Days.Tuesday -> println("Wochenanfang")
    Days.Wednesday, Days.Thursday -> println("Wochenmitte")
    Days.Friday -> println("Fast geschafft")
    // Warnung:  Non exhaustive 'when' statements on enum will be prohibited 
    // in 1.7, add 'Saturday', 'Sunday' branches or 'else' branch instead
}

Standardbibliothek

readln: Wenn Sie mit readLine() eine Datei zeilenweise auslesen, liefert die Funktion entweder die nächste Zeile oder null. Nunmehr gibt es zwei Varianten zu readline, die die ursprüngliche Form längerfristig ablösen sollen:

  • readlnOrNull() verhält sich wie ehemals readLine(), ist aber klarer benannt und hat mehr Ähnlichkeiten mit println.
  • readln() löst dagegen einen Fehler aus, wenn das Ende der Datei erreicht ist, und kann statt dem wenig eleganten readLine()!! verwendet werden.

readLine() bleibt uns vorerst erhalten, soll aber in kommenden Kotlin-Versionen deprecated werden.

typeOf: typeOf<Typ> liefert ein KClass-Objekt, das Typ beschreibt. Die Funktion stand zwar schon seit Kotlin 1.3.40 zur Verfügung, ursprünglich aber nur für die JVM-Variante. Nunmehr kann typeOf in allen drei Kotlin-Varianten (also auch JS und Native) verwendet werden.

Duration-API: Die Duration API (beschrieben in Abschnitt 7.3 meines Kotlin-Buchs) gilt nun als stabil. Das gilt allerdings nicht für andere kotlin.time-Klassen zur Zeitmessung. Die in Kotlin 1.5 abgeschaffte Notation

val myDur = 2.minutes + 3.seconds - 10.milliseconds * 0.66

ist erfreulicherweise wieder eingeführt worden, erfordert nun aber Importe der betreffenden Companion-Eigenschaften, hier also:

import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.seconds
import kotlin.time.Duration.Companion.milliseconds

Unsupported class file major version 61

Meine ersten Tests mit Kotlin scheiterten an Java 17. Auf meinem Rechner ist auch die JDK 17 installiert. Anscheinend ist das Build-System dazu nicht kompatibel. IntelliJ war nicht in der Lage, das minimalistische Console Template zu kompilieren und zeigte eine wenig hilfreiche Fehlermeldung an:

Could not open init generic class cache for initialization script '/tmp/wrapper_init4.gradle' (/crypt/home/kofler/.gradle/caches/7.1/scripts/954mesz5ux7usmane6uzpuni1).
> BUG! exception in phase 'semantic analysis' in source 
> unit '_BuildScript_' Unsupported class file major version 61

Eine kurze Suche in stackoverflow ergab, dass Kompatiblitätsprobleme zwischen Gradle und der JDK 17 die Ursache sein könnten. Ich habe dann die JDK-Version für das Build-System auf 11 zurückgesetzt, und alles funktionierte. Merkwürdig. (Es geht hier nicht um die JDK für das eigentliche Projekt, die darf sehr wohl 17 sein.)

Die von JVM eingesetzte JVM sollte nicht allzu aktuell sein …

Quellen/Links

Sonstiges:

❌
❌