a computer screen with a text description on it

ChatGPT und Software Architektur

In diesem Beitrag möchte ich gerne ChatGPT die „Macht“ übergeben und zusammen mit dir schauen, was bereits alles möglich ist.

Die User-Story

Hierzu habe ich als erstes ChatGPT folgendes gefragt: Was ist eine User Story? Wie ist Sie aufgebaut?

Eine User Story ist eine agile Technik, die in der Softwareentwicklung verwendet wird, um die Anforderungen des Kunden oder Benutzers zu beschreiben. Sie beschreibt in einfacher und verständlicher Sprache, was der Benutzer von einem Produkt oder einer Funktion erwartet und warum er es benötigt.

Eine typische User Story besteht aus drei Teilen:

  1. Der erste Teil ist der „Wer“. Hier wird beschrieben, wer die Zielgruppe der Funktion oder des Produkts ist. Dies kann ein Benutzer, ein Kunde oder eine bestimmte Benutzergruppe sein.
  2. Der zweite Teil ist der „Was“. Hier wird beschrieben, was der Benutzer oder die Zielgruppe von der Funktion oder dem Produkt erwartet. Dies kann beispielsweise eine bestimmte Funktion, eine Benutzeraktion oder ein Ergebnis sein.
  3. Der dritte Teil ist der „Warum“. Hier wird beschrieben, warum der Benutzer oder die Zielgruppe diese Funktion oder dieses Produkt benötigt. Dies kann beispielsweise ein bestimmtes Problem lösen, eine Aufgabe vereinfachen oder eine bestimmte Anforderung erfüllen.

Ein Beispiel für eine User Story könnte lauten: „Als Online-Shopper möchte ich während des Bestellvorgangs meine Lieferadresse ändern können, damit ich meine Bestellung an eine andere Adresse liefern lassen kann, wenn ich zum Beispiel im Urlaub bin.“

Hier ist der „Wer“ der Online-Shopper, das „Was“ ist die Möglichkeit, die Lieferadresse während des Bestellvorgangs zu ändern, und das „Warum“ ist die Flexibilität, die Bestellung an eine andere Adresse liefern zu lassen.

ChatGPT: Was ist eine User Story? Wie ist Sie aufgebaut?

Jetzt wollen wir mal ein wenig spezifischer werden und fragen ChatGPT folgendes:

Schreibe mir die UserStories und Akzeptanzkriterien, in welche sich ein Kunde in einem Webshop einloggt und Informationen über seine getätigten Bestellungen, seine Kundendaten, seine Zahlungsmethoden und seine Kontakte zum Kundensupport ansehen kann.

Wie du sehen kannst, ist diese User Story spezifisch für eine Branche. ChatGPT verfügt über eine riesige Wissensbasis, daher sind Experimente erforderlich, um die Tiefe des Wissens von ChatGPT zu verstehen.

Das Wichtigste bei der ersten Frage ist es, die entscheidenden Details genau zu benennen, um die besten Ergebnisse zu erzielen. Auf diese Weise kann ChatGPT mit einer Reihe von Ergebnissen wie dem folgenden antworten:

Wenn deine Ergebnisse in etwa so aussehen wie oben, dann weißt Du, dass ChatGPT die Spur aufgenommen hat und auf weitere Fragen, die du stellen wirst, aufbauen wird. Das Wichtigste ist, dass alle folgenden Ergebnisse auf diesem anfänglichen Kontext beruhen, weshalb es sich lohnt, die erste Interaktion gut zu definieren.

Jetzt können wir also etwas ziemlich Bemerkenswertes tun. Erstellen Wir eine Datenbank!

Die Datenbank

Nun stellen wir folgende simple Frage an ChatGPT:

Generiere das Datenmodell im Detail, tabellarisch in Markdown

Die Antwort sieht wie folgt aus:

Die SQL Datei

Hier möchte ich aber nicht stoppen. Deshalb frage ich ChatGPT direkt folgendes:

Erstelle mir die SQL Anweisungen

-- Erstelle die Tabelle "Kunden"
CREATE TABLE Kunden (
  ID INTEGER PRIMARY KEY,
  Vorname TEXT NOT NULL,
  Nachname TEXT NOT NULL,
  Email TEXT NOT NULL UNIQUE,
  Passwort TEXT NOT NULL,
  Telefonnummer TEXT,
  Adresse TEXT,
  Stadt TEXT,
  Bundesland TEXT,
  Postleitzahl TEXT,
  Land TEXT
);

-- Erstelle die Tabelle "Bestellungen"
CREATE TABLE Bestellungen (
  ID INTEGER PRIMARY KEY,
  KundenID INTEGER NOT NULL,
  Datum DATE NOT NULL,
  Produkte TEXT NOT NULL,
  Gesamtbetrag DECIMAL(10, 2) NOT NULL,
  Lieferstatus TEXT,
  Lieferdatum DATE,
  ZahlungsmethodeID INTEGER NOT NULL,
  FOREIGN KEY(KundenID) REFERENCES Kunden(ID),
  FOREIGN KEY(ZahlungsmethodeID) REFERENCES Zahlungsmethoden(ID)
);

-- Erstelle die Tabelle "Zahlungsmethoden"
CREATE TABLE Zahlungsmethoden (
  ID INTEGER PRIMARY KEY,
  KundenID INTEGER NOT NULL,
  Typ TEXT NOT NULL,
  Kartennummer TEXT,
  Ablaufdatum DATE,
  Bank TEXT,
  Kontonummer TEXT,
  BLZ TEXT,
  FOREIGN KEY(KundenID) REFERENCES Kunden(ID)
);

-- Erstelle die Tabelle "Kundensupport_Kontakte"
CREATE TABLE Kundensupport_Kontakte (
  ID INTEGER PRIMARY KEY,
  KundenID INTEGER NOT NULL,
  Datum DATE NOT NULL,
  Thema TEXT NOT NULL,
  Beschreibung TEXT NOT NULL,
  FOREIGN KEY(KundenID) REFERENCES Kunden(ID)
);

ChatGPT erstellt sogar kopierbaren Code.

Die Diagramme

Wir benötigen zur korrekten Architekturdokumentation allerdings noch Diagramme. Auch diese lassen wir von ChatGPT erstellen:

Generiere data mode in mermaid script in html

erDiagram CUSTOMER ||–o{ ORDER : places CUSTOMER ||–o{ PAYMENT : uses CUSTOMER ||–o{ SUPPORT_CONTACT : contacts ORDER ||–|{ PAYMENT : includes CUSTOMER { string id string name string email string password } ORDER { string id string customer_id date date decimal total_price } PAYMENT { string id string customer_id string type string number date expiration_date } SUPPORT_CONTACT { string id string customer_id date date string message }

Und die nächste Frage:

Generiere ein Sequenz Diagramm mit der Beziehung Kunde, Zahlungsmethode und Bestellung in mermaid script in html

sequenceDiagram participant Customer participant Webshop participant PaymentProvider Customer->>+Webshop: Selects items to purchase Customer->>+Webshop: Sends order request Webshop->>+PaymentProvider: Sends payment request PaymentProvider–>>-Webshop: Sends payment form Webshop->>+Customer: Displays payment form Customer->>+Webshop: Submits payment form Webshop->>+PaymentProvider: Sends payment confirmation PaymentProvider–>>-Webshop: Sends payment status Webshop->>+Customer: Sends order confirmation

ChatGPT zeigt keine Diagramme an, sondern generiert den Code in Mermaid-Skript, das die Diagramme erstellt. ChatGPT ist vollständig mit Mermaid-Skript vertraut, so dass es Diagramme erzeugen kann, die diese Skriptsprache erlaubt.

Der Code

Wie wir bereits festgestellt haben, wurde ChatGPT das Programmieren beigebracht, so dass Sie ChatGPT weiterhin bitten können, JavaScript, CSS und HTML zu schreiben, um einen funktionierenden Prototyp zu erstellen, indem Sie es einfach darum bitten. ChatGPT ist darauf trainiert, Code in vielen gängigen Programmiersprachen zu erzeugen.

Wenn Sie genug Zeit haben, kann dies auch eine erfahrene Person tun. Zugegeben, aber etwas langsamer. Aber das ist etwas anderes als produktionsreifer Code; es ist viel mehr Arbeit nötig, um den Code auf dieses Niveau von Qualität und Nützlichkeit zu bringen. Aber es gibt keinen Grund, warum ChatGPT nicht untätig daneben sitzen sollte, während es das tut.

Lassen Sie uns also versuchen, die Qualität des Codes mit ChatGPT zu verbessern:

Generiere ein Klassendesign, das sich an die SOLID Prinzipien von C# hält, mit Fehlerbehandlung und einer Datenbankzugriffsschicht

using System;
using System.Collections.Generic;
using System.Data.SqlClient;

namespace Webshop
{
    public interface ICustomerRepository
    {
        Customer GetCustomerById(int customerId);
        IEnumerable<Order> GetOrdersByCustomerId(int customerId);
        void AddOrder(Order order);
    }

    public class CustomerRepository : ICustomerRepository
    {
        private readonly string _connectionString;

        public CustomerRepository(string connectionString)
        {
            _connectionString = connectionString;
        }

        public Customer GetCustomerById(int customerId)
        {
            try
            {
                using (var connection = new SqlConnection(_connectionString))
                {
                    var query = "SELECT * FROM Customers WHERE CustomerId = @customerId";
                    var command = new SqlCommand(query, connection);
                    command.Parameters.AddWithValue("@customerId", customerId);
                    connection.Open();
                    var reader = command.ExecuteReader();
                    if (!reader.Read())
                    {
                        throw new ArgumentException("Customer not found");
                    }
                    return new Customer
                    {
                        CustomerId = reader.GetInt32(0),
                        Name = reader.GetString(1),
                        Email = reader.GetString(2),
                        Address = reader.GetString(3)
                    };
                }
            }
            catch (Exception ex)
            {
                throw new RepositoryException("Error getting customer by ID", ex);
            }
        }

        public IEnumerable<Order> GetOrdersByCustomerId(int customerId)
        {
            try
            {
                using (var connection = new SqlConnection(_connectionString))
                {
                    var query = "SELECT * FROM Orders WHERE CustomerId = @customerId";
                    var command = new SqlCommand(query, connection);
                    command.Parameters.AddWithValue("@customerId", customerId);
                    connection.Open();
                    var reader = command.ExecuteReader();
                    var orders = new List<Order>();
                    while (reader.Read())
                    {
                        orders.Add(new Order
                        {
                            OrderId = reader.GetInt32(0),
                            CustomerId = reader.GetInt32(1),
                            OrderDate = reader.GetDateTime(2),
                            TotalAmount = reader.GetDecimal(3)
                        });
                    }
                    return orders;
                }
            }
            catch (Exception ex)
            {
                throw new RepositoryException("Error getting orders by customer ID", ex);
            }
        }

        public void AddOrder(Order order)
        {
            try
            {
                using (var connection = new SqlConnection(_connectionString))
                {
                    var query = "INSERT INTO Orders (CustomerId, OrderDate, TotalAmount) VALUES (@customerId, @orderDate, @totalAmount)";
                    var command = new SqlCommand(query, connection);
                    command.Parameters.AddWithValue("@customerId", order.CustomerId);
                    command.Parameters.AddWithValue("@orderDate", order.OrderDate);
                    command.Parameters.AddWithValue("@totalAmount", order.TotalAmount);
                    connection.Open();
                    command.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                throw new RepositoryException("Error adding order", ex);
            }
        }
    }

    public class Customer
    {
        public int CustomerId { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
        public string Address { get; set; }
    }

    public class Order
    {
        public int OrderId { get; set; }
        public int CustomerId { get; set; }
        public DateTime OrderDate { get; set; }
        public decimal TotalAmount { get; set; }
    }

    public class RepositoryException : Exception
    {
        public RepositoryException(string message, Exception innerException) : base(message,

// Da ich nur die Free-Version von ChatGPT nutze, war hier das Ende der Ausgabe!

Die Swagger Dokumentation

Die nächste Aufgabe, mit der ich ChatGPT beauftragte, war die Erstellung des Swagger für eine REST-basierte API. Auch hier liefert ChatGPT eine respektable Leistung, die ausreicht, um mit der Entwicklung zu beginnen:

Erstelle mir eine Swagger Datei für eine REST-basierte API für die Bestellungen und die Zahlungen des Kunden

Fazit

ChatGPT kann mit der Entwicklung beginnen, da es über die nötige Breite verfügt, aber noch nicht die nötige Tiefe aufweist. Jedes Mal musste ich ChatGPT dazu bewegen, die Aufgabe zu erledigen; es gibt keine Initiative, und ich habe die nächsten Schritte eingeleitet und vorangetrieben. Zum teil musste ich meine Fragen genauer definieren.

Die Entwicklung eines Standardsatzes von Fragen, von denen Sie wissen, dass sie ChatGPT dazu bringen, ein gutes Ergebnis zu liefern, könnte jedoch sehr einfach sein. Dies kann in der Sprintplanung ausreichen, um die Entwicklung in vielerlei Hinsicht zu beginnen.

Diese Technologie ist jetzt da, und wir sollten sie in vollem Umfang nutzen und weiter experimentieren, um besser zu verstehen, welchen Wert diese fortschrittliche Automatisierung weiterhin haben kann.