Maison >Périphériques technologiques >IA >ChatGPT commence à menacer les capacités fondamentales des programmeurs !

ChatGPT commence à menacer les capacités fondamentales des programmeurs !

王林
王林avant
2023-04-04 11:50:051505parcourir

La question la plus critique est de savoir comment déterminer si sa réponse est correcte. J'ai maintenant la réponse standard sous la main et je peux l'évaluer. Dans les projets réels, nous sommes confrontés à des inconnues si nous n’avons aucune expérience, comment savoir que la conception donnée par GPT-4 est efficace ? Est-ce que cela peut résoudre le problème ?​

​ChatGPT est une bonne aide pour les programmeurs ? Ou voulez-vous tuer les programmeurs ?

Je pense qu'il ne s'agit pas seulement de sa capacité à générer du code, mais plus important encore, de ses solides capacités de conception.

Les capacités de conception ont deux niveaux, l'un étant de haut niveau, tel que la conception d'architecture et la conception de systèmes.

L'une concerne les capacités de conception de niveau relativement bas, principalement la conception de classes et d'interfaces spécifiques.

Aujourd'hui, nous verrons comment il se comporte sous ces deux aspects.

La réponse de ChatGPT étant très longue, je vais supprimer certains détails et ne conserver que les parties importantes.

En raison de la confidentialité de l'entreprise, nous ne pouvons pas utiliser de projets réels et ne pouvons utiliser que des cas publics dans des livres pour le tester.

1. Conception d'architecture

Le cas que j'utilise ici est le système de ticket du service client, qui est extrait d'un livre "Du programmeur à l'architecte". Il y a de nombreux livres dans ce livre Cas pratiques. , d'ailleurs, je les recommande à tout le monde.

Les exigences approximatives du système de bons de travail du service client sont les suivantes :

Il existe un système de service client utilisant la base de données MySQL. Plus de 30 millions de bons de travail sont générés chaque année, et chaque bon de travail en compte 5. à 6 opérations. , ces opérations doivent également être enregistrées, de sorte qu'il y aura plus de 150 millions d'enregistrements d'opérations chaque année.

Maintenant, lorsque le service client ouvre le système pour visualiser les bons de travail, la vitesse est très lente, l'ouverture prend 10 secondes. Désormais, les instructions SQL, les index, etc. ont été optimisés à l'extrême et ne peuvent plus être améliorés. .

Maintenant, les performances du système ont sérieusement affecté l'efficacité du traitement du service client. Le client exige que ce problème soit résolu dans un délai d'une semaine, ce qui est un délai très court.

Après avoir analysé le processus d'affaires, nous avons constaté que si le bon de travail est traité, un statut « fermé » sera ajouté. Un tel bon de travail ne peut pas être ouvert plusieurs fois par an.

L'équipe n'avait jamais utilisé le partitionnement de base de données auparavant et a abandonné le plan de partitionnement de base de données sans aucune certitude qu'il serait résolu en une semaine.

Pour ce problème, la solution dans le livre est la "séparation chaude et froide", le fonctionnement quotidien de la "base de données chaude", le déplacement des ordres de travail "fermés" vers une nouvelle "base de données froide", mais en cours de traitement des données chaudes et froides. séparation, il est nécessaire de gérer les problèmes de cohérence des données.

Jetez cette exigence à GPT-4 et voyez comment elle répond.

GPT-4 : Dans ce cas, je recommande les deux méthodes suivantes pour résoudre le problème de performances :

1 Archivage de la base de données : étant donné qu'il n'est pratiquement plus nécessaire d'accéder à la plupart des tickets clôturés, ces données de ticket. peut être déplacé de la base de données principale vers une base de données d’archives. De cette façon, la taille de la base de données principale sera considérablement réduite, améliorant ainsi la vitesse des requêtes. La base de données d'archives peut être mise à jour régulièrement (par exemple mensuellement ou trimestriellement) pour déplacer les bons de travail clôturés vers la base de données d'archives...

Les étapes spécifiques sont les suivantes :

a Créer une nouvelle base de données MySQL, utilisée pour stocker. données archivées.

b. Écrivez un script pour déplacer régulièrement les bons de travail clôturés et leurs enregistrements d'opérations associés de la bibliothèque de données principale vers la base de données d'archives et assurer la cohérence des données.

c. Modifier le système de service client pour qu'il interroge par défaut uniquement les données non archivées dans la base de données principale.

d. Fournissez une interface ou un outil distinct permettant au personnel du service client d'interroger les données de la bibliothèque de données archivées en cas de besoin.

  1. Cache :...Un peu...

Pas mal, il saisit immédiatement les points clés, et donne un plan d'archivage de la base de données et des étapes de fonctionnement précises.

Cependant, il y a certaines indications dans les exigences, et cette solution est facile à imaginer.

Liu Xin : Dans vos étapes opérationnelles, comment assurer la cohérence des données ? Vous devez exploiter deux bases de données ici

GPT-4 : Il est très important d'assurer la cohérence des données. Lors de l'exploitation de deux bases de données, les méthodes suivantes peuvent être utilisées pour garantir la cohérence des données :

  1. Utiliser des transactions : les transactions peuvent garantir qu'un ensemble d'opérations réussissent toutes ou échouent toutes. .....légèrement....

Liu Xin : Lorsque vous utilisez des transactions, comment pouvez-vous démarrer une transaction qui s'étend sur deux bases de données ?

GPT-4 : Désolé, j'ai fait une erreur dans ma réponse précédente. Dans MySQL, nous ne pouvons pas utiliser directement une seule transaction entre deux bases de données différentes. Dans ce cas, envisagez d’utiliser d’autres stratégies pour garantir la cohérence des données. Une approche possible consiste à utiliser le protocole Two-Phase Commit (2PC). .... légèrement....

Liu Xin : Le protocole de validation en deux phases est très fragile. Existe-t-il un autre moyen sûr de déplacer des données de la base de données principale vers la base de données d'archive ?

GPT-4 : Désolé, la solution précédente ne répondait pas entièrement à vos besoins. Je propose ici une nouvelle solution qui utilise des files d'attente de messages (telles que RabbitMQ, Kafka ou Amazon SQS) pour garantir la cohérence du processus de migration des données. Cette approche divise le processus de migration des données en deux étapes distinctes, garantissant une restauration facile en cas de problème. .....En bref...

Liu Xin : Si vous n'utilisez pas MQ et écrivez le code vous-même, comment assurer la cohérence pendant le processus de migration des données ?

GPT-4 : Si vous ne souhaitez pas utiliser Message Queuing, vous pouvez écrire votre propre code pour garantir la cohérence lors de la migration des données en utilisant les méthodes suivantes :

  1. Utilisez des verrous et marquez les champs :

a. Créer un ticket Un champ booléen nommé "is_migrated" est ajouté respectivement à la table et à la table des enregistrements d'opération pour indiquer si l'enregistrement a été migré.

b. Écrivez un script ou un programme pour interroger la base de données principale pour les enregistrements qui répondent aux critères de migration (par exemple, tickets fermés et "is_migrated" est faux).

...un peu...

Eh bien, à ce stade, il a finalement trouvé une solution, qui est un peu similaire au livre, qui consiste à utiliser un champ pour marquer "s'il a été migré".

Cependant, peu importe la façon dont je l'ai incité, cela ne suggérait pas comment le rendre idempotent, alors j'ai abandonné.

Liu Xin : La base de données d'archives contient une grande quantité de données et la requête est très lente, mais la requête consiste essentiellement à « trouver le bon de travail en fonction de l'ID client, puis connaître tous les enregistrements de traitement du bon de travail basé sur l'ID du bon de travail". Existe-t-il un moyen de résoudre ce problème ?

GPT-4 : Pour ce mode de requête, les stratégies suivantes peuvent être adoptées pour optimiser les performances de requête de la base de données d'archive :

  1. Créer des index pour l'ID client et l'ID de bon de travail : ...omis.... ..
  2. Partition de la table de base de données : ... légèrement...
  3. Vue de la base de données : ... légèrement...
  4. Cache des résultats :... Légèrement...
  5. Répartir la charge de lecture et d'écriture :... Légèrement...
  6. Optimiser le matériel et la configuration :...Légèrement...

Aucune de ces solutions ne peut résoudre efficacement le problème. La bonne solution consiste à utiliser une base de données NoSQL comme HBase, ce qui est inattendu.

2. Conception détaillée

Le cas que j'utilise est toujours le paiement du salaire, qui est extrait du livre classique "Développement logiciel agile : principes, modèles et pratiques".

Les exigences de ce cas sont les suivantes :

Le système se compose d'une base de données d'entreprise et de données relatives aux employés. Le système doit payer les employés à temps et selon les règles

Il y en a trois. types d'employés

1. Les travailleurs horaires ont un salaire horaire fixe. Ils soumettent chaque jour une carte de temps de travail, qui enregistre la date et le nombre d'heures travaillées. S'ils travaillent plus de 8 heures par jour, ils le seront. payé à 1,5 fois. Ils sont payés tous les vendredis.

2. Salaire mensuel Les employés ont un salaire fixe, et ils sont payés le dernier jour ouvrable de chaque mois

3. Le personnel de vente a un salaire fixe, mais il recevra un certain montant en fonction de son salaire. ventes Pour les commissions, ils soumettent des reçus de vente indiquant la date et la quantité de la vente. Ils sont payés un vendredi sur deux.

Les employés peuvent choisir le mode de paiement. Ils peuvent poster le chèque à l'adresse postale qu'ils ont désignée, le sauvegarder au service financier et le retirer à tout moment, ou demander qu'il soit déposé directement sur le compte bancaire qu'ils ont désigné.

Après avoir lu cette exigence, la conception générale est la suivante :

ChatGPT commence à menacer les capacités fondamentales des programmeurs !

L'employé est utilisé comme classe de base et différents types de classes d'employés en héritent.

Mais cette exigence va changer. Le client exige que le type d'employé puisse être modifié, par exemple d'employés horaires à employés mensuels, de sorte que la conception ci-dessus ne fonctionnera pas.

À ce stade, vous devez faire une abstraction, utiliser une classe PaymentClassification pour exprimer la classification de paiement, puis laisser la classe Employee détenir cette instance, en termes simples, utiliser la combinaison au lieu de l'héritage.

ChatGPT commence à menacer les capacités fondamentales des programmeurs !

C'est un piège et un trou creusé pour ChatGPT, voyons comment il le gère.

Cela a officiellement commencé, je lui ai expliqué les exigences et je l'ai laissé concevoir.

De façon inattendue, il a écrit du code Python pour moi dès qu'il est apparu. Il y avait trop de détails et je l'ai immédiatement empêché de sortir.

Liu Xin : Pas besoin de montrer le code, décrivez simplement la classe.

GPT-4 : OK, selon vos besoins, nous pouvons concevoir les classes suivantes et les propriétés et méthodes associées :

  1. Classe de base Employee : ... légèrement...
  2. Classe HourlyEmployee, héritée de la classe Employee : ... légèrement...
  3. Classe SalariedEmployee, héritée de la classe Employee : ... légèrement...
  4. SalesEmployee classe, héritée de SalariedEmployee Class : ... légèrement...
  5. PaymentMethod Class : légèrement

C'est vraiment bien Il « comprend » les exigences et extrait les noms pour concevoir des classes. , et SalesEmployee qu'il a conçu sont presque les mêmes que le premier diagramme UML.

a atteint le niveau primaire de la conception orientée objet.

Alors commençons à creuser :

Liu Xin : La classe ci-dessus est bien conçue, mais si une personne commence comme employé horaire et devient plus tard un employé avec un salaire mensuel, la conception ci-dessus ne peut pas prendre en charge ce changement. , Que dois-je faire?

GPT-4 : Afin de résoudre le problème que vous avez mentionné, nous pouvons séparer la stratégie de calcul du salaire de l'employé de la classe Employé et la concevoir en utilisant le modèle de stratégie. De cette façon, nous pouvons changer dynamiquement la stratégie de calcul du salaire pour la classe Employé sans la modifier.

Dans cette conception, nous devons apporter quelques ajustements à la structure de classe d'origine :

  • Conserver la classe de base Employé :

Nouvelle méthode : set_salary_strategy, utilisée pour définir la stratégie de calcul du salaire de l'employé

  • Emménager en plus des sous-classes d'origine HourlyEmployee, SalariedEmployee et SalesEmployee, car nous avons séparé la stratégie de calcul du salaire de la classe Employee.
  • Nouvelle classe abstraite SalaryStrategy, comme classe de base pour la stratégie de calcul du salaire
  • Nouvelle classe de stratégie spécifique :

Classe HourlySalary, héritée de la classe SalaryStrategy

Classe SalariedSalary, héritée de la classe SalaryStrategy

S classe aire , hérité de la classe SalaryStrategy

Avec les ajustements ci-dessus, la stratégie de calcul du salaire peut désormais être modifiée dynamiquement pour la classe Employee sans la modifier. Lorsqu'un employé passe d'un salaire horaire à un salaire mensuel, il suffit de mettre en place une nouvelle politique de calcul de salaire pour lui.

Je dois dire que GPT-4 est très puissant !

Il utilise le modèle de stratégie pour résumer la stratégie de calcul du salaire SalaryStrategy.

Comparé au deuxième diagramme UML, à l'exception du nom différent, il est fondamentalement le même.

On peut dire que si vous pouvez faire cela, vous pouvez surpasser de nombreux programmeurs.

J'ai remarqué qu'il ne s'occupait pas du cycle de paiement. J'ai commencé à poser des questions :

Liu Xin : La demande initiale incluait également le délai de paiement. Par exemple, les travailleurs horaires sont payés tous les vendredis. Comment cela devrait-il être conçu ?

GPT-4 : Afin de gérer le délai de paiement des différents types d'employés, nous pouvons introduire une méthode abstraite Should_pay_today dans la classe de base SalaryStrategy, qui détermine si le salaire doit être payé en fonction de la date du jour. Ensuite, implémentez cette méthode dans la classe de stratégie spécifique.

...Un peu...

Ici, il a commis une erreur en intégrant le cycle de paiement dans la stratégie de calcul des salaires, et l'a également salué comme "facile à maintenir et à développer".

Liu Xin : Le délai de paiement et la stratégie de calcul du salaire sont deux concepts qui ne font pas bon ménage. Comment pouvons-nous atteindre une flexibilité maximale ?

GPT-4 : Vous avez raison, le délai de paiement et la stratégie de calcul du salaire sont deux notions différentes. Pour rendre la conception plus flexible, nous pouvons séparer le délai de paiement de la stratégie de calcul du salaire et créer une nouvelle classe abstraite PaymentSchedule pour gérer la logique du délai de paiement. De cette manière, nous pouvons définir séparément la stratégie de calcul du salaire et la stratégie de délai de paiement pour chaque employé.

Voici la structure de classe ajustée :

Conserver la classe de base Employé :

  • Attributs : nom, identifiant, adresse

Méthode : set_payment_method, utilisée pour définir le mode de paiement de l'employé

Méthode : set_salary_strategy, utiliser Pour définir la stratégie de calcul du salaire de l'employé

Nouvelle méthode : set_payment_schedule, utilisée pour définir la stratégie de délai de paiement de l'employé

  • Conserver la classe abstraite SalaryStrategy et sa classe de stratégie spécifique sans modifications.
  • Ajout de la classe abstraite PaymentSchedule, comme classe de base de la stratégie de délai de paiement :... légèrement...
  • Ajout d'une nouvelle classe de stratégie de délai de paiement spécifique, héritant de PaymentSchedule :

Classe WeeklyPayment... légèrement...

Classe MonthlyPayment... légèrement...

Classe BiweeklyPayment... légèrement...

  • Conservez la classe PaymentMethod et ses sous-classes sans modifications.

C'est incroyable ! Il semble savoir ce que je pense, PaymentSchedule et SalaryStrategy sont séparés !

Jusqu'à présent, il a réalisé le design final et probablement le meilleur du livre :

ChatGPT commence à menacer les capacités fondamentales des programmeurs !

Résumé

In. À la conception détaillée niveau, les performances de GPT-4 sont bien supérieures à celles de la conception architecturale.

Les anciens lecteurs devenus programmeurs savent que j'ai testé GPT-3.5 avec le cas de paiement du salaire l'année dernière, à cette époque, il récitait les réponses et donnait même des conceptions au-delà des exigences.

Mais GPT-4 est différent. Ses capacités de conception sont allées encore plus loin. Grâce aux instructions du programmeur, il a appris à séparer les préoccupations.

En termes de conception architecturale, j'estime que GPT-4 maîtrise beaucoup de connaissances, mais il ne peut pas être appliqué efficacement à des problèmes complexes. Les solutions qu'il produit sont très déroutantes et loin de ce que nous souhaitons.

La question la plus critique est de savoir comment déterminer si la réponse est correcte. J'ai maintenant la réponse standard sous la main et je peux l'évaluer. Dans les projets réels, nous sommes confrontés à des inconnues si nous n’avons aucune expérience, comment savoir que la conception donnée par GPT-4 est efficace ? Est-ce que cela peut résoudre le problème ?

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer