Hallo ChatGPT, bin ich jetzt arbeitslos?
- von Autor
Thomas Kloppe, Softwareentwickler bei sidion
Oder ist das Ganze nur ein großer Hype?
Diese reißerische Überschrift habe ich mir selbst ausgedacht. Obwohl ... nein, genau zu dieser Frage hatte ich eine hitzige Diskussion mit Freunden und Familie. Schließlich hilft die KI Masterarbeiten zu schreiben, Schulreferate sind dann ja gar kein Problem mehr, sie erzeugt Texte in vielen Sprachen zu allen möglichen Themen und nicht zuletzt: sie programmiert.
In zahlreichen Youtube Videos kann man sich ansehen, was ChatGPT so alles erzeugt. So erstaunlich das alles ist, ein generiertes HTML Formular oder ein Programm, das Zufallszahlen erzeugt, sind noch lange keine fertige Business Anwendung.
Meine Neugierde war aber geweckt und die Frage aufgeworfen, ob die KI meinen Arbeitsalltag verändern kann.
Was leistet ChatGPT im Bereich Java Anwendungsentwicklung?
Ich habe versucht, typische Teile aus Java Businessanwendungen von ChatGPT erzeugen zu lassen. Mein Ziel war es, brauchbaren Code zu erhalten, der mir meine Arbeit erleichtert. Die Ergebnisse und Erfahrungen möchte ich hier vorstellen.
Einfach mal Code erzeugen
Ich: "Kannst du mir ein HTML Eingabeformular für eine Lieferadresse erstellen?"
ChatGPT:
<form>
<label for="name">Name:</label><br>
<input type="text" name="name" id="name"><br><br>
<label for="street">Straße:</label><br>
<input type="text" name="street" id="street"><br><br>
<label for="city">Stadt:</label><br>
<input type="text" name="city" id="city"><br><br>
<label for="zip">Postleitzahl:</label><br>
<input type="text" name="zip" id="zip"><br><br>
<label for="country">Land:</label><br>
<input type="text" name="country" id="country"><br><br>
<input type="submit" value="Senden">
</form>
Ich: "Kannst du das Formular um eine Javascript Funktion erweitern, die die Daten per REST an einen Server schickt?"
ChatGPT:
<form onsubmit="sendData(event)">
...
</form>
<script>
function sendData(e) {
e.preventDefault();
const data = {
name: document.getElementById('name').value,
street: document.getElementById('street').value,
city: document.getElementById('city').value,
zip: document.getElementById('zip').value,
country: document.getElementById('country').value,
};
fetch('/server-url', {
method: 'POST',
body: JSON.stringify(data),
});
}
</script>
Ich: "Kannst du mir zu dem Formular einen Quarkus Endpoint generieren, der die Daten im Backend empfängt?"
ChatGPT:
@Path("/address")
public class AddressResource {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public void addAddress(Address address) {
// Store address in database
}
}
public class Address {
private String name;
private String street;
private String city;
private String zip;
private String country;
// Getter and setter methods
}
Die Felder muss man höchst wahrscheinlich anpassen, aber es hat funktioniert.
Lasst uns genauer Fragen
Geht das auch noch alltagstauglicher unter Verwendung gängiger Tools?
- Ich habe ChatGPT Lombok Annotationen erzeugen lassen
- Hibernate und Jackson Annotation hat es auch generiert
- Beim Mapstruct Mapper auf ein DTO kam auch etwas Brauchbares raus. Es hat sogar "street" auf "road" gemapped.
- Ein einfaches CRUD Repository für Panache konnte ich generieren und nachher in ein Spring Data Repository umwandeln.
Mein erstes Fazit - wenn mein Projekt nicht gerade mit JHipster generiert wird, kann ich mir beim Erstellen neuer Entites durchaus Zeit sparen, denn den übrigen Stack, wie Repository und Controller, bekomme ich ziemlich konsistent dazu generiert.
Domainwissen erfragen und dann Code generieren
Auf der Suche nach Inspiration habe ich ChatGPT nach Requirements für einen Online Shop gefragt. ChatGPT listet einige Anforderungen auf und beschreibt diese. Ich picke mir diese raus:
Zahlungsgateway
"Ein Zahlungsgateway, das es dem Kunden ermöglicht, seine Bestellung zu bezahlen. Dies kann beispielsweise über eine Kreditkarte oder ein elektronisches Zahlungssystem erfolgen."
Mal sehen, ob ChatGPT zu den eigenen Anforderungen auch sinnvollen Code generiert.
Ich: "Kannst du eine Quarkus RestEasy Resource für diese Funktionen schreiben?"
ChatGPT:
import javax.ws.rs.*;
import javax.ws.rs.core.*;
@Path("/payment")
public class PaymentResource {
@POST
@Path("/process")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response processPayment(PaymentRequest paymentRequest) {
// Implementierung der Logik zur Verarbeitung einer Zahlungstransaktion
return Response.status(Response.Status.OK).entity(paymentResponse).build();
}
@GET
@Path("/status/{transactionId}")
@Produces(MediaType.APPLICATION_JSON)
public Response getPaymentStatus(@PathParam("transactionId") String transactionId) {
// Implementierung der Logik zur Abfrage des Status einer Zahlungstransaktion
return Response.status(Response.Status.OK).entity(paymentStatus).build();
}
@POST
@Path("/refund/{transactionId}")
@Produces(MediaType.APPLICATION_JSON)
public Response refundPayment(@PathParam("transactionId") String transactionId) {
// Implementierung der Logik zur Rückerstattung einer Zahlungstransaktion
return Response.status(Response.Status.OK).entity(refundResponse).build();
}
}
Im Anschluss folgte noch eine Erklärung zu den Annotationen. Ich habe mir dann die Bean PaymentRequest generieren lassen. In der ersten Version enthält die Klasse werte für Kreditkarten Zahlungen.
Ich hake nach und werde positiv überrascht: "Kannst du den PaymentRequest so erweitern, dass es auch Zahlungen via Paypal, Klarna und Lastschrift abbilden kann?"
ChatGPT:
import lombok.Data;
@Data
public class PaymentRequest {
private String transactionId;
private double amount;
private String currency;
private PaymentMethod paymentMethod;
private CreditCardDetails creditCardDetails;
private PaypalDetails paypalDetails;
private KlarnaDetails klarnaDetails;
private BankAccountDetails bankAccountDetails;
}
@Data
class CreditCardDetails {
...
}
@Data
class PaypalDetails {
...
}
@Data
class KlarnaDetails {
...
}
@Data
class BankAccountDetails {
...
}
enum PaymentMethod {
CREDIT_CARD,
PAYPAL,
KLARNA,
BANK_TRANSFER
}
ChatGPT hat den Code sinnvoll in mehrere Klassen strukturiert. Die enthaltenen Felder passen auch zur Fachdomäne.
Ganz so würde man diesen Code vermutlich nicht übernehmen. Der wichtigste Punkt ist, dass Kreditkarten Daten nur von PCI zertifizierten Anwendungen verarbeitet werden dürfen, diese sollten also tunlichst direkt an den PCI zertifizierten Zahlungsdienstleister übermittelt werden und nicht an den eigenen Backend Server.
Anderer Code
Auch YAML Dateien für Liquibase, Kubernetes Deployments und reguläre Ausdrücke habe ich mir generieren lassen.
Ein Stolperstein: Das Kubernetes-Deployment für die MongoDB bekam einfach mehrere Replicas. Die MongoDB braucht für ein redundantes Setup aber eine Primärinstanz (https://www.mongodb.com/docs/manual/replication/) und müsste über ein StatefulSet repliziert werden. Hier erkennt man aus meiner Sicht die Grenzen der KI, da für die korrekte Erstellung der Kubernetes Ressourcen, "Wissen" aus verschiedenen Bereichen zusammen geführt werden muss.
Das Erzeugen von regulären Ausdrücken empfand ich als hilfreich, da man über diese doch manchmal etwas länger nachdenken muss.
Hier die ChatGPT Version eines regulären Ausdrucks, der ein eMail Format prüft:
/^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,}$/
Nicht schlecht, oder? Genau genommen ist \w aber zu restriktiv, was den Zeichensatz angeht (https://de.wikibooks.org/wiki/Internet:_E-Mail:_Adresse). Außerdem würde der reguläre Ausdruck einen Punkt am Anfang zulassen. Trotzdem würde die Prüfung für einige Anwendungsfälle in der Praxis funktionieren. Je nachdem, wie streng man sein will, könnte man das '[\w.-]+' auch durch '.+' ersetzen und ist nicht mehr zu restriktiv.
Logik
Hier habe ich nicht so viel ausprobiert, da es mir eher um den Umgang mit meinen täglichen Tools ging. Es gibt aber viele Beispiele im Netz, wo ChatGPT bekannte Funktionen implementiert. Also zu Fragen, wie "Implementiere eine Methode die den Durchschnitt von ... berechnet" wird ChatGPT ein brauchbares Ergebnis liefern.
Fazit
Die Sache mit der KI die Masterarbeiten schreibt... Meine Vermutung: bestimmt ist der Autor ähnlich vorgegangen wie ich beim Programmieren. Er hatte Fachwissen und konnte ChatGPT mit genauen Formulierungen dazu bringen passende Ausgaben zu erzeugen.
So ist es auch mit der Software Entwicklung. Habe ich das Fachwissen, kann ich sehr genau beschreiben, welchen Code ich haben will, so wie ich Quarkus und RestEasy direkt in die Anfrage eingegeben habe.
Danach muss ich den Code bearbeiten und in meine Anwendung integrieren. Ich muss auch damit rechnen, das ChatGPT Fehler macht.
Mit ein bisschen Geschick kann mir die KI aber einiges an Schreibarbeit ersparen. Wie viel, hängt natürlich auch vom Anwendungsfall ab.
Nicht zuletzt ist es hilfreich, wenn man in einer neuen Programmiersprache entwickelt und die Syntax noch nicht verinnerlicht hat.
Quellen und Links
[1] https://chat.openai.com/chat - Chat GPT nutzen
[2] https://chat-gpt.org/ - Die offizielle Webseite
[3] https://www.youtube.com/watch?v=yf783C-mnk4 - Eines der Youtube Tutorials