Heim >Technologie-Peripheriegeräte >KI >ChatGPT beginnt, die Kernkompetenzen von Programmierern zu gefährden!

ChatGPT beginnt, die Kernkompetenzen von Programmierern zu gefährden!

王林
王林nach vorne
2023-04-04 11:50:051508Durchsuche

Die kritischere Frage ist, wie ich feststellen kann, ob die Antwort richtig ist. Ich habe jetzt die Standardantwort zur Hand und kann sie bewerten. In tatsächlichen Projekten sind wir mit Unbekannten konfrontiert. Wenn wir keine Erfahrung haben, woher wissen wir dann, dass das von GPT-4 vorgegebene Design effektiv ist? Kann es das Problem lösen?​

​ChatGPT ist ein guter Helfer für Programmierer? Oder wollen Sie die Programmierer töten?

Ich denke, es geht nicht nur um seine Fähigkeit, Code zu generieren, sondern, was noch wichtiger ist, ob es über starke Designfähigkeiten verfügt.

Designfunktionen haben zwei Ebenen, eine davon ist hochrangig, z. B. Architekturdesign und Systemdesign.

Eine davon sind relativ einfache Designfunktionen, hauptsächlich das Entwerfen spezifischer Klassen und Schnittstellen.

Heute werden wir sehen, wie es in diesen beiden Aspekten abschneidet.

Da die Antwort von ChatGPT sehr langatmig ist, werde ich einige Details löschen und nur die wichtigen Teile behalten.

Aufgrund der Vertraulichkeit des Unternehmens können wir keine realen Projekte verwenden und können zum Testen nur öffentliche Fälle in Büchern verwenden.

1. Architekturdesign

Der Fall, den ich hier verwende, ist das Kundenservice-Ticketsystem, das aus einem Buch „Vom Programmierer zum Architekten“ stammt. In diesem Buch gibt es viele praktische Fälle Ich kann sie übrigens jedem empfehlen.

Die ungefähren Anforderungen des Kundendienst-Arbeitsauftragssystems sind wie folgt:

Es gibt ein Kundendienstsystem, das die MySQL-Datenbank verwendet. Jedes Jahr werden mehr als 30 Millionen Arbeitsaufträge generiert, und jeder Arbeitsauftrag hat 5 Bis zu 6 Operationen müssen diese Operationen ebenfalls erfasst werden, so dass es jedes Jahr mehr als 150 Millionen Operationsaufzeichnungen geben wird.

Wenn der Kundendienst jetzt das System öffnet, um Arbeitsaufträge anzuzeigen, ist die Geschwindigkeit sehr langsam, das Öffnen dauert 10 Sekunden. Jetzt wurden die SQL-Anweisungen, Indizes usw. extrem optimiert und können nicht weiter verbessert werden .

Jetzt hat die Systemleistung die Verarbeitungseffizienz des Kundendienstes erheblich beeinträchtigt. Der Kunde verlangt, dass dieses Problem innerhalb einer Woche gelöst wird, was eine sehr kurze Zeit ist.

Nach der Analyse des Geschäftsprozesses haben wir festgestellt, dass bei Bearbeitung des Arbeitsauftrags der Status „Geschlossen“ hinzugefügt wird. Ein solcher Arbeitsauftrag kann nur einige Male im Jahr geöffnet werden.

Das Team hatte noch nie zuvor eine Datenbankpartitionierung verwendet und gab den Datenbankpartitionierungsplan auf, ohne die Gewissheit zu haben, dass das Problem innerhalb einer Woche gelöst werden könnte.

Für dieses Problem lautet die Lösung im Buch „Heiße und kalte Trennung“, täglicher Betrieb der „heißen Datenbank“, Verschieben „geschlossener“ Arbeitsaufträge in eine neue „kalte Datenbank“, jedoch im Prozess der heißen und kalten Daten Trennung ist es notwendig, Datenkonsistenzprobleme zu behandeln.

Übertragen Sie diese Anforderung auf GPT-4 und sehen Sie, wie sie reagiert.

GPT-4: In diesem Fall empfehle ich die folgenden zwei Methoden, um das Leistungsproblem zu lösen:

1. Datenbankarchivierung: Da auf die meisten geschlossenen Tickets grundsätzlich nicht mehr zugegriffen werden muss, werden diese Ticketdaten nicht mehr benötigt kann von der Hauptdatenbank in eine Archivdatenbank verschoben werden. Auf diese Weise wird die Größe der Hauptdatenbank erheblich reduziert und dadurch die Abfragegeschwindigkeit verbessert. Die Archivdatenbank kann regelmäßig (z. B. monatlich oder vierteljährlich) aktualisiert werden, um geschlossene Arbeitsaufträge in die Archivdatenbank zu verschieben...

Die spezifischen Schritte sind wie folgt:

a Erstellen Sie eine neue MySQL-Datenbank, die zum Speichern verwendet wird archivierte Daten.

b. Schreiben Sie ein Skript, um geschlossene Arbeitsaufträge und die zugehörigen Vorgangsdatensätze regelmäßig aus der Stammdatenbibliothek in die Archivdatenbank zu verschieben und die Datenkonsistenz sicherzustellen.

c Ändern Sie das Kundendienstsystem so, dass es standardmäßig nur nicht archivierte Daten in der Hauptdatenbank abfragt.

d. Bereitstellung einer separaten Schnittstelle oder eines Tools für Kundendienstmitarbeiter, um bei Bedarf die Daten in der archivierten Datenbibliothek abzufragen.

  1. Cache:...Etwas...

Nicht schlecht, es erfasst sofort die wichtigsten Punkte und liefert einen Datenbankarchivierungsplan und spezifische Betriebsschritte.

Allerdings gibt es in den Anforderungen gewisse Hinweise, und diese Lösung ist leicht vorstellbar.

Liu Beim Betrieb von zwei Datenbanken können die folgenden Methoden verwendet werden, um die Datenkonsistenz sicherzustellen:

Transaktionen verwenden: Transaktionen können sicherstellen, dass eine Reihe von Vorgängen entweder alle erfolgreich sind oder alle fehlschlagen. .....etwas....

  1. Liu Xin: Wenn Sie Transaktionen verwenden, wie können Sie eine Transaktion starten, die sich über zwei Datenbanken erstreckt?

GPT-4: Entschuldigung, ich habe in meiner vorherigen Antwort einen Fehler gemacht. In MySQL können wir eine einzelne Transaktion zwischen zwei verschiedenen Datenbanken nicht direkt verwenden. Erwägen Sie in diesem Fall den Einsatz anderer Strategien, um die Datenkonsistenz sicherzustellen. Ein möglicher Ansatz ist die Verwendung des Two-Phase Commit (2PC)-Protokolls. .... etwas....

Liu

GPT-4: Leider hat die vorherige Lösung Ihre Anforderungen nicht vollständig erfüllt. Hier stelle ich eine neue Lösung bereit, die Nachrichtenwarteschlangen (wie RabbitMQ, Kafka oder Amazon SQS) verwendet, um die Konsistenz des Datenmigrationsprozesses sicherzustellen. Dieser Ansatz unterteilt den Datenmigrationsprozess in zwei separate Schritte und gewährleistet so ein einfaches Rollback, falls etwas schief geht. .....etwas...

Liu Xin: Wenn Sie MQ nicht verwenden und den Code selbst schreiben, wie stellen Sie dann die Konsistenz während des Datenmigrationsprozesses sicher?

GPT-4: Wenn Sie Message Queuing nicht verwenden möchten, können Sie mit den folgenden Methoden Ihren eigenen Code schreiben, um die Konsistenz während der Datenmigration sicherzustellen:

  1. Verwenden Sie Sperren und markieren Sie Felder:

a. Erstellen Sie ein Ticket. Ein boolesches Feld mit dem Namen „is_migrated“ wird der Tabelle bzw. der Vorgangsdatensatztabelle hinzugefügt, um zu markieren, ob der Datensatz migriert wurde.

b. Schreiben Sie ein Skript oder Programm, um die Masterdatenbank nach Datensätzen abzufragen, die die Migrationskriterien erfüllen (z. B. geschlossene Tickets und „is_migrated“ ist falsch).

...etwas...

Nun, an diesem Punkt wurde endlich eine Lösung gefunden, die dem Buch etwas ähnelt und darin besteht, ein Feld zu verwenden, um zu markieren, ob es migriert wurde.

Aber ganz gleich, wie ich es angeregt habe, es bot keinen Vorschlag, wie man es idempotent machen könnte, also habe ich aufgegeben.

Liu Arbeitsauftrag basierend auf der Arbeitsauftrags-ID". Gibt es eine Möglichkeit, das Problem zu lösen?

GPT-4: Für diesen Abfragemodus können die folgenden Strategien angewendet werden, um die Abfrageleistung der Archivdatenbank zu optimieren:

  1. Indizes für Kunden-ID und Arbeitsauftrags-ID erstellen: ... weggelassen ... ..
  2. Datenbanktabellenpartition: ... leicht...
  3. Datenbankansicht: ... leicht...
  4. Ergebniscache:... Leicht...
  5. Lese- und Schreiblast aufteilen:... Etwas...
  6. Hardware und Konfiguration optimieren:...Etwas...

Keine dieser Lösungen kann das Problem effektiv lösen. Die richtige Lösung ist die Verwendung einer NoSQL-Datenbank wie HBase, was unerwartet ist.

2. Detailliertes Design

Der von mir verwendete Fall ist immer noch die Gehaltszahlung, die aus dem klassischen Buch „Agile Softwareentwicklung: Prinzipien, Muster und Praktiken“ entnommen ist.

Die Anforderungen dieses Falles sind wie folgt:

Das System besteht aus einer Unternehmensdatenbank und mitarbeiterbezogenen Daten. Das System muss die Mitarbeiter pünktlich und gemäß den Regeln bezahlen

Es gibt drei Arten von Arbeitnehmern

1. Stundenarbeiter haben einen festen Stundenlohn. Sie legen jeden Tag eine Arbeitszeitkarte vor, auf der das Datum und die Anzahl der geleisteten Arbeitsstunden aufgeführt sind 1,5-fach bezahlt. Sie werden jeden Freitag bezahlt.

2. Mitarbeiter mit monatlichem Gehalt haben ein festes Gehalt und werden am letzten Arbeitstag eines jeden Monats bezahlt.

3 Verkäufe Für Provisionen legen sie Verkaufsbelege vor, auf denen das Datum und die Menge des Verkaufs aufgeführt sind. Sie werden jeden zweiten Freitag bezahlt.

Mitarbeiter können die Zahlungsmethode wählen. Sie können den Scheck an ihre angegebene Postadresse senden, ihn in der Finanzabteilung hinterlegen und jederzeit abheben oder eine direkte Einzahlung auf ihr angegebenes Bankkonto beantragen.

Nach dem Lesen dieser Anforderung sieht das allgemeine Design wie folgt aus:

ChatGPT beginnt, die Kernkompetenzen von Programmierern zu gefährden!

Employee wird als Basisklasse verwendet und verschiedene Arten von Mitarbeiterklassen erben davon.

Aber diese Anforderung wird sich ändern. Der Kunde verlangt, dass der Mitarbeitertyp geändert werden kann, beispielsweise von Stundenmitarbeitern zu Monatsmitarbeitern, sodass das obige Design nicht funktioniert.

Zu diesem Zeitpunkt sollten Sie eine Abstraktion erstellen, eine Klasse „PaymentClassification“ verwenden, um die Zahlungsklassifizierung auszudrücken, und dann die Klasse „Employee“ diese Instanz speichern lassen. Einfach ausgedrückt: Verwenden Sie eine Kombination anstelle einer Vererbung.

ChatGPT beginnt, die Kernkompetenzen von Programmierern zu gefährden!

Das ist eine Falle und ein Loch, das für ChatGPT gegraben wurde. Mal sehen, wie es damit umgeht.

Es ging offiziell los, ich teilte ihm die Anforderungen mit und ließ es entwerfen.

Unerwartet fing es sofort an, Python-Code für mich zu schreiben. Es gab zu viele Details, also habe ich die Ausgabe sofort gestoppt.

Liu Xin: Sie müssen den Code nicht zeigen, sondern nur die Klasse beschreiben.

GPT-4: OK, entsprechend Ihren Anforderungen können wir die folgenden Klassen und zugehörigen Eigenschaften und Methoden entwerfen:

  1. Basisklasse Employee: ... leicht ...
  2. HourlyEmployee-Klasse, geerbt von Employee-Klasse: ... leicht ...
  3. SalariedEmployee-Klasse, geerbt von Employee-Klasse: ... leicht ...
  4. SalesEmployee Klasse, geerbt von der Klasse „SalariedEmployee“: ... leicht...
  5. PaymentMethod-Klasse: leicht

Es „versteht“ die Anforderungen und extrahiert Substantive, um die Klassen „The Employee“, „HourlyEmployee“ und „SalariedEmployee“ zu entwerfen , und SalesEmployee, die es entworfen hat, stimmen fast mit dem ersten UML-Diagramm überein.

hat die primäre Ebene des objektorientierten Designs erreicht.

Dann fangen wir an zu graben:

Liu , was soll ich tun?

GPT-4: Um das von Ihnen erwähnte Problem zu lösen, können wir die Gehaltsberechnungsstrategie des Mitarbeiters von der Mitarbeiterklasse trennen und sie mithilfe des Strategiemusters entwerfen. Auf diese Weise können wir die Gehaltsberechnungsstrategie für die Mitarbeiterklasse dynamisch ändern, ohne sie zu ändern.

Unter diesem Entwurf müssen wir einige Anpassungen an der ursprünglichen Klassenstruktur vornehmen:

    Behalten Sie die Basisklasse Employee:
Neue Methode: set_salary_strategy, mit der die Gehaltsberechnungsstrategie des Mitarbeiters festgelegt wird

    Einzug Ergänzung zu den ursprünglichen Unterklassen HourlyEmployee, SalariedEmployee und SalesEmployee, da wir die Gehaltsberechnungsstrategie von der Employee-Klasse getrennt haben.
  • Neue abstrakte Klasse SalaryStrategy als Basisklasse für die Gehaltsberechnungsstrategie lesSalary-Klasse , geerbt von der SalaryStrategy-Klasse
  • Mit den oben genannten Anpassungen kann die Gehaltsberechnungsstrategie jetzt für die Employee-Klasse dynamisch geändert werden, ohne sie zu ändern. Wenn ein Mitarbeiter vom Stundenlohn zum Monatslohn wechselt, richten Sie einfach eine neue Gehaltsberechnungsrichtlinie für ihn ein.

Ich muss sagen, GPT-4 ist sehr mächtig!

Es verwendet das Strategiemuster, um die Gehaltsberechnungsstrategie SalaryStrategy zu abstrahieren.

Verglichen mit dem zweiten UML-Diagramm ist es bis auf den anderen Namen im Grunde dasselbe.

Man kann sagen, dass Sie viele Programmierer übertreffen können, wenn Sie dies können.

Mir ist aufgefallen, dass es sich nicht um das Problem des Zahlungszyklus handelt. Ich fing an, weiterhin Fragen zu stellen:

Liu

GPT-4: Um die Zahlungszeit verschiedener Mitarbeitertypen zu verwalten, können wir in der SalaryStrategy-Basisklasse eine abstrakte Methode Should_pay_today einführen, die bestimmt, ob das Gehalt basierend auf dem aktuellen Datum gezahlt werden soll. Als nächstes implementieren Sie diese Methode in der spezifischen Strategieklasse.

...Etwas...

Hier hat es einen Fehler gemacht, den Zahlungszyklus in die Gehaltsberechnungsstrategie einzubauen, und es auch als „einfach zu warten und zu erweitern“ gelobt.

Liu Xin: Zahlungszeit und Gehaltsberechnungsstrategie sind zwei Konzepte, die nicht gut zusammenpassen. Wie können wir maximale Flexibilität erreichen?

GPT-4: Sie haben Recht, Zahlungszeitpunkt und Gehaltsberechnungsstrategie sind zwei verschiedene Konzepte. Um das Design flexibler zu gestalten, können wir die Zahlungszeit von der Gehaltsberechnungsstrategie trennen und eine neue abstrakte Klasse PaymentSchedule erstellen, um die Logik der Zahlungszeit zu verwalten. Auf diese Weise können wir die Gehaltsberechnungsstrategie und die Zahlungszeitstrategie für jeden Mitarbeiter separat festlegen.

Das Folgende ist die angepasste Klassenstruktur:

Behalten Sie die Basisklasse Mitarbeiter:

Attribute: Name, ID, Adresse

Methode: set_paid_method, wird zum Festlegen der Zahlungsmethode des Mitarbeiters verwendet

Methode: set_salary_strategy, Verwendung Zum Festlegen der Gehaltsberechnungsstrategie des Mitarbeiters

Neue Methode: set_paid_schedule, wird zum Festlegen der Zahlungszeitstrategie des Mitarbeiters verwendet

Behalten Sie die abstrakte Klasse SalaryStrategy und ihre spezifische Strategieklasse ohne Änderungen bei.

Abstrakte Klasse „PaymentSchedule“ als Basisklasse der Zahlungszeitstrategie hinzugefügt: ... leicht ...
  • Neue spezifische Zahlungszeitstrategieklasse hinzugefügt, die PaymentSchedule erbt:

WeeklyPayment-Klasse ... leicht ...

MonthlyPayment-Klasse...leicht...

BiweeklyPayment-Klasse...leicht...

  • Behalten Sie die PaymentMethod-Klasse und ihre Unterklassen ohne Änderungen bei.

Es ist erstaunlich! Es scheint zu wissen, was ich denke, PaymentSchedule und SalaryStrategy sind getrennt!

Bisher hat es das endgültige und wahrscheinlich beste Design im Buch erreicht:

ChatGPT beginnt, die Kernkompetenzen von Programmierern zu gefährden!

III. Zusammenfassung

In An der detaillierten Gestaltung Ebene ist die Leistung von GPT-4 weitaus stärker als das architektonische Design.

Alte Leser, die Programmierer geworden sind, wissen, dass ich GPT-3.5 letztes Jahr anhand des Gehaltszahlungsfalls getestet habe. Damals rezitierte es Antworten und gab sogar Designs, die über das erforderliche Maß hinausgingen.

Aber die Designfähigkeiten von GPT-4 sind noch einen Schritt weiter gegangen. Mit den Anweisungen des Programmierers hat er gelernt, Bedenken zu trennen.

In Bezug auf das Architekturdesign habe ich das Gefühl, dass GPT-4 viel Wissen beherrscht, aber es kann nicht effektiv auf komplexe Probleme angewendet werden. Die Lösungen, die es liefert, sind sehr verwirrend und weit von dem entfernt, was wir wollen.

Die kritischere Frage ist, wie ich feststellen kann, ob die Antwort richtig ist. Ich habe jetzt die Standardantwort zur Hand und kann sie bewerten. In tatsächlichen Projekten sind wir mit Unbekannten konfrontiert. Wenn wir keine Erfahrung haben, woher wissen wir dann, dass das von GPT-4 vorgegebene Design effektiv ist? Kann es das Problem lösen?

Das obige ist der detaillierte Inhalt vonChatGPT beginnt, die Kernkompetenzen von Programmierern zu gefährden!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen