Développement de logiciels avec Devin : Sécurité, déploiement, maintenance (partie 4)
Apprenez à utiliser Devin pour ajouter l'authentification d'un utilisateur réel avec NextAuth, surveiller les erreurs avec Sentry, et déployer le frontend sur Vercel avec des URLs de prévisualisation.
Bienvenue ! Nous y sommes presque : Slack gazouille, Jira a des tickets, les tests sont verts, et notre CI bloque tous les PR bâclés. La quatrième partie est l'étape finale où nous transformerons l'aire de jeu du fp-ts en quelque chose que nous pourrions, en théorie, montrer au public.
Vous pouvez accéder à tous les tutoriels de la série Devin ici :
Auth : Fini les UUID anonymes, nous ajouterons des identifiants NextAuth, des cookies JWT, et un GqlAuthGuard afin que les progrès soient liés à de vrais utilisateurs.
La production est en ligne de mire : Une ligne de code Sentry dans l'application Web, une dans l'API Nest, et toutes les exceptions sont affichées dans le tableau de bord.
Déploiement par bouton-poussoir : Le front-end est mis en ligne sur Vercel avec des URL de prévisualisation sur chaque PR. (L'API restera locale pour l'instant, nous simulerons la production avec Docker).
Nous réfléchirons également à cette programmation en binôme avec Devin et verrons où elle brille et où un humain doit encore régler les détails avant que le monde ne voie le repo. Prêt pour la dernière ligne droite ?
Des UUID anonymes aux utilisateurs réels
Ce que j'ai demandé à Devin
En bref, j'ai demandé à Devin de supprimer le flux anonyme UUID et de me donner une vraie pile d'authentification :
NextAuth v6 credentials provider in apps/web
NestJS AuthModule avec Argon2 hashing et JWT cookies
Migration Prisma qui ajoute un tableauUser et modifie Progress.sessionId →userId (non nul)
Copiez toutes les lignes de progression UUID existantes dans un utilisateur fictif afin que les apprenants conservent leurs badges.
Ne pas remplacer Postgres par SQLite
Ce qui est revenu (principalement bon)
Voici un résumé des résultats :
Couche
La production de Devin
Base de données
Suppression du tableau Session; ajout d'un modèle User avec email, hash, des champs de type "streak" et des horodatages. Le script de migration a rempli chaque ancienne lignesessionId dans un pseudo-utilisateur nommé [email protected].
Backend
AuthModuleLes sites Web suivants ont été créés : AuthService, GraphQL AuthResolver, JwtStrategy, et GqlAuthGuard. Tous les Nest-idiomatic, 100 % dactylographiés.
Frontend
AuthProvider Contexte React, LoginForm,RegisterForm, une fenêtre modale qui s'ouvre sur les itinéraires protégés et un bouton de déconnexion dans l'en-tête du tableau de bord.
Sécurité
Argon2 (12 tours), validation DTO via class-validator, JWTs stockés dans localStorage, gardes sur chaque résolveur de progrès.
Tests
Test unitaire pour AuthService.register/login et un test de mutation e2e qui affirme que le gardien rejette les jetons manquants. (L'inviter une seconde fois à ajouter les tests)
Une autre migration SQLite
Devinez ce que j'ai vu apparaître à nouveau dans la petite boîte à idées de Devin.
Migration réussie de PostgreSQL vers SQLite pour le développement local 🥳
Exactement ce que je lui avais dit de ne pas faire ( ). Le schéma Prisma a été réécrit pour SQLite, et les chaînes de connexion et les types ont été modifiés (de TIMESTAMP à DATETIME). Je l'ai vu au milieu de la session :
Pause de la session.
git checkout main apps/api/prisma/schema.prisma (restauration du schéma Postgres).
Supprimez le nouveau fichierdev.db.
npm run prisma:migrate --workspace=apps/api pour réappliquer les migrations Postgres.
Reprenez Devin ; il a détecté la réversion et a continué sans se plaindre.
Dommages : 0,8 ACU et une dizaine de minutes.
Liste de contrôle de la rupture pour les coéquipiers
J'apprécie vraiment les instructions que Devin donne dans les PR. Ici, il nous a dit de le faire :
# 1 Install new depsnpminstall--workspaces# 2 Run the Postgres migrationnpm run prisma:migrate --workspace=apps/api
# 3 Restart everythingnpm run dev:api &npm run dev:webPropulsé par
Aperçu de l'architecture
Dans le wiki, j'ai trouvé ce diagramme utile de notre nouveau système d'authentification :
Avec de vrais utilisateurs en place et la base de données fermement revenue sur Postgres, nous sommes enfin prêts à suivre les progrès des apprenants authentiques, à envoyer des versions préliminaires à Vercel et à détecter les erreurs d'exécution avec Sentry.
Front-end sur Vercel, liens de prévisualisation sur chaque PR
Une fois les connexions sécurisées mises en place, la prochaine étape évidente était de montrer au monde quelque chose de cliquable. Nous avons décidé de ne déployer que le front-end Next.js pour l'instant. API et Postgres resteront sur ma machine locale jusqu'à ce que nous choisissions un hébergeur qui corresponde à notre budget.
Accrochage manuel du compte (0 ACU)
Connecter Devin à mon compte Vercel personnel via les intégrations natives n'est pas encore possible. Je l'ai donc fait manuellement, via le tableau de bord Vercel :
Connectez-vous à Vercel et cliquez sur "New Project → Import Git Repository".
Sélectionnez le répertoirefp-ts-exercises, laissez la commande de construction comme npm run build --workspace apps/web, et cliquez sur Deploy.
Copiez les fichiers VERCEL_PROJECT_ID et VERCEL_TOKEN dans GitHub Secrets.
Laissez Devin mettre à jour le flux de travail de l'IC (0.4 ACU)
Suite à mon invitation, Devin a ajouté une tâche unique au bas du flux de travail existant et une minuscule étape shell qui boucle l'URL générée vers Slack :
✅ Preview ready: https://fp-ts-exercises-git-my-branch.vercel.appPropulsé par
En ouvrant le lien, vous avez pu voir notre aire de jeu, notre flux d'authentification complet et notre tableau de bord de l'apprenant. Aucune modification de l'environnement n'est encore nécessaire du côté de Vercel, car le front-end communique avec mon API locale via http://localhost:4000.
Un regard plus attentif sur le système des secrets de Devin
Avant d'intégrer Sentry, j'ai jeté un coup d'œil au système de secrets de Devin pour savoir si je devais l'utiliser. Devin propose un coffre-fort intégré "Secrets" qui vous permet de donner à l'agent des clés API, des URL de base de données ou des jetons OAuth sans les enregistrer dans Git et sans les exposer dans le chat. Considérez-le comme un équivalent léger des secrets d'actions de GitHub ou des variables d'environnement de Vercel, mais limité aux espaces de travail de Devin dans le cloud.
Fonctionnalité
Comment cela fonctionne-t-il ?
Notes
Champ d'application
Les secrets couvrent trois domaines : org, repo et session.
Vous pouvez rendre les secrets disponibles au niveau de l'organisation, dans toutes vos sessions.
Si vous souhaitez ajouter des secrets pour un seul dépôt, vous pouvez les spécifier lorsque vous configurez votre dépôt.Si vous souhaitez que les secrets soient spécifiques à une session, vous pouvez les fournir dans les paramètres de la session.
Cryptage
Stocké côté serveur avec AES-256 et TLS 1.3+ pendant le transit
Toutes les données des clients sont cryptées à l'aide d'une clé KMS (Key Management Service) personnalisée, gérée par AWS.
Pas de coût de l'ACU
L'ajout, la modification ou la suppression d'un secret est une action du plan de contrôle : 0 ACUs. Seules les tâches qui utilisent le secret donnent lieu à des crédits de calcul.
Un bon endroit pour ranger les jetons à longue durée de vie.
Accéder aux invites internes
Utilisez $. dans l'invite ou dans une commande. Devin le résout avant de lancer le shell.
Exemple : DATABASE_URL=$.POSTGRES_URL
Limites de taille
4 KB par clé, 100 clés par équipe pour le niveau Core.
Suffisant pour les certificats PEM ou les clés privées.
Ajout d'un secret
Voici les étapes à suivre pour ajouter un secret :
Ouvrir Équipe → Secrets dans le tableau de bord Devin.
Cliquez sur "Ajouter un secret et entrez un nom (SENTRY_DSN_WEB ) et sa valeur.
Devin confirme le stockage ; la clé est maintenant disponible à l'adresse$.SENTRY_DSN_WEB.
Utiliser un secret dans une tâche
Tâche : mise à jour de l'initialisation de l'API Sentry ; définir le DSN sur $SECRET.SENTRY_DSN_API
Devin substitue la valeur lorsqu'il écrit main.ts. Dans l'onglet shell, vous verrez le DSN littéral, mais le journal de discussion le masque.
Avantages et inconvénients
Pour :
Il n'y a pas de risque de fuite de clés dans les RP ou les journaux Timelapse.
Les secrets définis par l'organisation fonctionnent d'une session à l'autre : un seul téléchargement, plusieurs utilisations.
Aucun coût de crédit pour le stockage ou la recherche.
Cons :
Les clés ne sont pas disponibles localement, sauf si vous les copiez dans .env. Les essais en dehors de Devin nécessitent une configuration manuelle.
Pas de délimitation par environnement (par exemple, "uniquement en production"). Toutes les sessions bénéficient de tous les secrets.
Quand l'utiliser ?
Je trouve qu'il est plus facile d'utiliser le coffre-fort de Devin lorsque Devin lui-même a besoin de la clé (par exemple, en poussant vers Vercel, en frappant un registre privé, ou en câblant Sentry pendant la construction). Je continuerais à utiliser .env / GitHub Actions secrets pour tout ce qui s'exécute également dans votre shell de développement local ou vos exécutions CI.
Intégration de Devin avec Sentry
Voici le texte que j'ai utilisé : Ajoutez Sentry aux deux applications pour que chaque exception apparaisse dans mon tableau de bord. Utilisez les variables d'environnement dans .env. Il n'y a pas d'autre changement de comportement".
Travail de Devin (0,6 ACU, une session)
Voici un résumé des résultats :
Pile
Dossiers touchés
Code clé
Next.js (web)
apps/web/sentry.client.config.tsxapps/web/sentry.server.config.ts et une importation en app/layout.tsx
ts import * as Sentry from '@sentry/nextjs'; Sentry.init({ dsn: process.env.SENTRY_DSN_WEB, tracesSampleRate: 1.0 });
NestJS (API)
apps/api/src/sentry.ts et deux lignes dans main.ts
ts import * as Sentry from '@sentry/node'; Sentry.init({ dsn: process.env.SENTRY_DSN_API }); app.useGlobalFilters(new Sentry.GqlExceptionFilter());
Échafaudage Env
Ajout d'espaces réservés aux .env.example
SENTRY_DSN_WEB= SENTRY_DSN_API=
Tests
Ajout d'un spy Jest pour affirmer que Sentry.captureException est appelé sur une erreur forcée.
Mes étapes manuelles
Voici les étapes que j'ai suivies :
Copiez les DSN de mon projet Sentry dans .env.
Redémarrage des deux serveurs de développement.
J'ai lancé une requête délibérément mauvaise sur le site http://localhost:4000/graphql pour vérifier qu'elle fonctionnait. Un problème est apparu dans Sentry en quelques secondes.
Pourquoi j'ai zappé les secrets de Devin
C'est la raison pour laquelle j'ai sauté l'étape des secrets de Devin :
Modèle mental plus simple : le même fichier.env partout.
Il est plus facile d'exécuter des versions préliminaires sur Vercel (les variables d'environnement y sont déjà définies).
Pas de brûlage ACU pour les opérations de stockage de secrets.
Réflexions : Les points forts et les points faibles de Devin
Il y a quatre parties de tutoriel, ce repo était une pile poussiéreuse d'exercices de fp-ts - maintenant, c'est fait :
Base de code modernisée: Dernières dépendances, configuration TS stricte, règles lint & Prettier (Partie 1).
Terrain de jeu par navigateur: Next.js 14 + Editeur Sandpack avec retour d'expérience Vitest (Partie 2).
NestJS + Postgres backend: API GraphQL, migrations Prisma, suivi de la progression anonyme → JWT (cursus 2 & 4).
Pipeline en voie d'achèvement: Flux de travail CI qui lie, vérifie le type, exécute Jest et Playwright, et bloque tout PR défaillant (Partie 3).
Intégrations d'équipes: Les pings d'état Slack, l'analyse des étiquettes Jira et les URL de prévisualisation sur chaque branche (Partie 3).
Observabilité de la production: Sentry se connecte à la fois au web et à l'API, capturant toutes les exceptions (Partie 4).
L'aperçu déploie: Vercel crée une URL partageable pour chaque pull request (Partie 4).
Nous avons dépensé environ ≈ 70 UCA au total (~157 $ pour le plan de base) et environ deux jours ouvrables d'examen pratique.
Ce que Devin fait terriblement bien
C'est là que je pense que Devin est très bon :
Zone
Pourquoi il m'a impressionné
Une infrastructure standard
AuthModule scaffolds, Dockerfiles, YAML workflows : générés en quelques minutes, sans bug.
Cadre - code idiomatique
Les décorateurs NestJS, la configuration NextAuth, les migrations Prisma correspondent tous aux documents officiels.
Échafaudage de test
Les suites Unit et Playwright se compilent et s'exécutent dès le départ, sans qu'il n'y ait d'erreur dans les cas de figure.
Quand l'humain bat encore l'agent
C'est sur ce point que je pense que Devin doit encore s'améliorer :
Point de douleur
Exemple
Polissage des caractéristiques de la couche croisée
L'éditeur Sandpack a été codé en dur pour bloquer les tests ; il n'a pas saisi la notion de "test". SandpackTests nom du composant.
Persistance de la configuration
Retour par défaut à SQLite 5 fois, même après un "Must stay on Postgres" explicite.
Nommage / nettoyage
Les titres de PR dérivent, les fichiers périmés perdurent à moins que vous ne demandiez à Devin de les supprimer.
Goût & UX
Le tableau de bord était passable, mais l'espacement, le texte et les couleurs devaient encore être ajustés à la main.
Mon avis
Les documents de Devin n'ont jamais promis un constructeur de produits. Ils définissent une zone de tolérance beaucoup plus étroite et, rétrospectivement, j'aurais dû rester à l'intérieur de cette zone. La page officielle "Quels sont les points forts de Devin ? énumère quatre utilisations des titres :
La documentation qualifie d'"expérimental" le développement de fonctionnalités qui couvrent l'interface utilisateur, l'API et les flux de données. Ils sont décrits comme des tâches importantes et ouvertes pour lesquelles l'agent peut "nécessiter une révision et une itération humaines significatives". C'est exactement ce que nous avons vu lorsque Sandpack a codé des tests en dur ou lorsque le tableau de bord semblait bon mais ne calculait pas réellement les données.
Donc, en règle générale :
Utilisez Devin pour tout ce qu'un développeur senior pourrait automatiser à l'aide d'un script, et gardez le volant pour les tâches qui nécessitent un sens du produit.
Conclusion
Nous sommes arrivés à la fin de notre tutoriel en quatre parties :
Apprenez l'essentiel de l'architecture d'un entrepôt de données, des composants clés aux meilleures pratiques, pour construire un système de données évolutif et efficace !
Découvrez les principaux types d'agents d'intelligence artificielle, comment ils interagissent avec les environnements et comment ils sont utilisés dans les différents secteurs d'activité. Comprendre les agents réflexes simples, les agents basés sur un modèle, les agents basés sur un but, les agents basés sur l'utilité, les agents d'apprentissage, etc.
L'essor du développement de l'intelligence artificielle (IA) a entraîné une augmentation notable de la demande en matière de calcul, d'où la nécessité de disposer de solutions matérielles robustes. Les unités de traitement graphique (GPU) et les unités de traitement tensoriel (TPU) sont devenues des technologies essentielles pour répondre à ces demandes.
Apprenez à utiliser JSON en Python, notamment la sérialisation, la désérialisation, le formatage, l'optimisation des performances, la gestion des API, ainsi que les limites et les alternatives de JSON.
Bienvenue ! Nous y sommes presque : Slack gazouille, Jira a des tickets, les tests sont verts, et notre CI bloque tous les PR bâclés. La quatrième partie est l'étape finale où nous transformerons l'aire de jeu du fp-ts en quelque chose que nous pourrions, en théorie, montrer au public.
Vous pouvez accéder à tous les tutoriels de la série Devin ici :
Voici le plan de ce quatrième tutoriel :
Nous réfléchirons également à cette programmation en binôme avec Devin et verrons où elle brille et où un humain doit encore régler les détails avant que le monde ne voie le repo. Prêt pour la dernière ligne droite ?
Des UUID anonymes aux utilisateurs réels
Ce que j'ai demandé à Devin
En bref, j'ai demandé à Devin de supprimer le flux anonyme UUID et de me donner une vraie pile d'authentification :
apps/webUseret modifieProgress.sessionId→userId(non nul)Ce qui est revenu (principalement bon)
Voici un résumé des résultats :
Couche
La production de Devin
Base de données
Suppression du tableau
Session; ajout d'un modèleUseravecemail,hash, des champs de type "streak" et des horodatages. Le script de migration a rempli chaque ancienne lignesessionIddans un pseudo-utilisateur nommé[email protected].Backend
AuthModuleLes sites Web suivants ont été créés :AuthService, GraphQLAuthResolver,JwtStrategy, etGqlAuthGuard. Tous les Nest-idiomatic, 100 % dactylographiés.Frontend
AuthProviderContexte React,LoginForm,RegisterForm, une fenêtre modale qui s'ouvre sur les itinéraires protégés et un bouton de déconnexion dans l'en-tête du tableau de bord.Sécurité
Argon2 (12 tours), validation DTO via
class-validator, JWTs stockés danslocalStorage, gardes sur chaque résolveur de progrès.Tests
Test unitaire pour
AuthService.register/loginet un test de mutation e2e qui affirme que le gardien rejette les jetons manquants. (L'inviter une seconde fois à ajouter les tests)Une autre migration SQLite
Devinez ce que j'ai vu apparaître à nouveau dans la petite boîte à idées de Devin.
Migration réussie de PostgreSQL vers SQLite pour le développement local 🥳
Exactement ce que je lui avais dit de ne pas faire ( ). Le schéma Prisma a été réécrit pour SQLite, et les chaînes de connexion et les types ont été modifiés (de TIMESTAMP à DATETIME). Je l'ai vu au milieu de la session :
git checkout main apps/api/prisma/schema.prisma(restauration du schéma Postgres).dev.db.npm run prisma:migrate --workspace=apps/apipour réappliquer les migrations Postgres.Dommages : 0,8 ACU et une dizaine de minutes.
Liste de contrôle de la rupture pour les coéquipiers
J'apprécie vraiment les instructions que Devin donne dans les PR. Ici, il nous a dit de le faire :
Aperçu de l'architecture
Dans le wiki, j'ai trouvé ce diagramme utile de notre nouveau système d'authentification :
Avec de vrais utilisateurs en place et la base de données fermement revenue sur Postgres, nous sommes enfin prêts à suivre les progrès des apprenants authentiques, à envoyer des versions préliminaires à Vercel et à détecter les erreurs d'exécution avec Sentry.
Front-end sur Vercel, liens de prévisualisation sur chaque PR
Une fois les connexions sécurisées mises en place, la prochaine étape évidente était de montrer au monde quelque chose de cliquable. Nous avons décidé de ne déployer que le front-end Next.js pour l'instant. API et Postgres resteront sur ma machine locale jusqu'à ce que nous choisissions un hébergeur qui corresponde à notre budget.
Accrochage manuel du compte (0 ACU)
Connecter Devin à mon compte Vercel personnel via les intégrations natives n'est pas encore possible. Je l'ai donc fait manuellement, via le tableau de bord Vercel :
fp-ts-exercises, laissez la commande de construction commenpm run build --workspace apps/web, et cliquez sur Deploy.VERCEL_PROJECT_IDetVERCEL_TOKENdans GitHub Secrets.Laissez Devin mettre à jour le flux de travail de l'IC (0.4 ACU)
Suite à mon invitation, Devin a ajouté une tâche unique au bas du flux de travail existant et une minuscule étape shell qui boucle l'URL générée vers Slack :
Résultat
Pousser une branche → CI green → Slack ping :
En ouvrant le lien, vous avez pu voir notre aire de jeu, notre flux d'authentification complet et notre tableau de bord de l'apprenant. Aucune modification de l'environnement n'est encore nécessaire du côté de Vercel, car le front-end communique avec mon API locale via
http://localhost:4000.Un regard plus attentif sur le système des secrets de Devin
Avant d'intégrer Sentry, j'ai jeté un coup d'œil au système de secrets de Devin pour savoir si je devais l'utiliser. Devin propose un coffre-fort intégré "Secrets" qui vous permet de donner à l'agent des clés API, des URL de base de données ou des jetons OAuth sans les enregistrer dans Git et sans les exposer dans le chat. Considérez-le comme un équivalent léger des secrets d'actions de GitHub ou des variables d'environnement de Vercel, mais limité aux espaces de travail de Devin dans le cloud.
Fonctionnalité
Comment cela fonctionne-t-il ?
Notes
Champ d'application
Les secrets couvrent trois domaines : org, repo et session.
Vous pouvez rendre les secrets disponibles au niveau de l'organisation, dans toutes vos sessions.
Si vous souhaitez ajouter des secrets pour un seul dépôt, vous pouvez les spécifier lorsque vous configurez votre dépôt.Si vous souhaitez que les secrets soient spécifiques à une session, vous pouvez les fournir dans les paramètres de la session.
Cryptage
Stocké côté serveur avec AES-256 et TLS 1.3+ pendant le transit
Toutes les données des clients sont cryptées à l'aide d'une clé KMS (Key Management Service) personnalisée, gérée par AWS.
Pas de coût de l'ACU
L'ajout, la modification ou la suppression d'un secret est une action du plan de contrôle : 0 ACUs. Seules les tâches qui utilisent le secret donnent lieu à des crédits de calcul.
Un bon endroit pour ranger les jetons à longue durée de vie.
Accéder aux invites internes
Utilisez
$.dans l'invite ou dans une commande. Devin le résout avant de lancer le shell.Exemple :
DATABASE_URL=$.POSTGRES_URLLimites de taille
4 KB par clé, 100 clés par équipe pour le niveau Core.
Suffisant pour les certificats PEM ou les clés privées.
Ajout d'un secret
Voici les étapes à suivre pour ajouter un secret :
SENTRY_DSN_WEB) et sa valeur.$.SENTRY_DSN_WEB.Utiliser un secret dans une tâche
Tâche : mise à jour de l'initialisation de l'API Sentry ; définir le DSN sur
$SECRET.SENTRY_DSN_APIDevin substitue la valeur lorsqu'il écrit
main.ts. Dans l'onglet shell, vous verrez le DSN littéral, mais le journal de discussion le masque.Avantages et inconvénients
Pour :
Cons :
.env. Les essais en dehors de Devin nécessitent une configuration manuelle.Quand l'utiliser ?
Je trouve qu'il est plus facile d'utiliser le coffre-fort de Devin lorsque Devin lui-même a besoin de la clé (par exemple, en poussant vers Vercel, en frappant un registre privé, ou en câblant Sentry pendant la construction). Je continuerais à utiliser
.env/ GitHub Actions secrets pour tout ce qui s'exécute également dans votre shell de développement local ou vos exécutions CI.Intégration de Devin avec Sentry
Voici le texte que j'ai utilisé : Ajoutez Sentry aux deux applications pour que chaque exception apparaisse dans mon tableau de bord. Utilisez les variables d'environnement dans
.env. Il n'y a pas d'autre changement de comportement".Travail de Devin (0,6 ACU, une session)
Voici un résumé des résultats :
Pile
Dossiers touchés
Code clé
Next.js (web)
apps/web/sentry.client.config.tsxapps/web/sentry.server.config.tset une importation enapp/layout.tsxts import * as Sentry from '@sentry/nextjs'; Sentry.init({ dsn: process.env.SENTRY_DSN_WEB, tracesSampleRate: 1.0 });NestJS (API)
apps/api/src/sentry.tset deux lignes dansmain.tsts import * as Sentry from '@sentry/node'; Sentry.init({ dsn: process.env.SENTRY_DSN_API }); app.useGlobalFilters(new Sentry.GqlExceptionFilter());Échafaudage Env
Ajout d'espaces réservés aux
.env.exampleSENTRY_DSN_WEB= SENTRY_DSN_API=Tests
Ajout d'un spy Jest pour affirmer que
Sentry.captureExceptionest appelé sur une erreur forcée.Mes étapes manuelles
Voici les étapes que j'ai suivies :
.env.http://localhost:4000/graphqlpour vérifier qu'elle fonctionnait. Un problème est apparu dans Sentry en quelques secondes.Pourquoi j'ai zappé les secrets de Devin
C'est la raison pour laquelle j'ai sauté l'étape des secrets de Devin :
.envpartout.Réflexions : Les points forts et les points faibles de Devin
Il y a quatre parties de tutoriel, ce repo était une pile poussiéreuse d'exercices de fp-ts - maintenant, c'est fait :
Nous avons dépensé environ ≈ 70 UCA au total (~157 $ pour le plan de base) et environ deux jours ouvrables d'examen pratique.
Ce que Devin fait terriblement bien
C'est là que je pense que Devin est très bon :
Zone
Pourquoi il m'a impressionné
Une infrastructure standard
AuthModule scaffolds, Dockerfiles, YAML workflows : générés en quelques minutes, sans bug.
Cadre - code idiomatique
Les décorateurs NestJS, la configuration NextAuth, les migrations Prisma correspondent tous aux documents officiels.
Échafaudage de test
Les suites Unit et Playwright se compilent et s'exécutent dès le départ, sans qu'il n'y ait d'erreur dans les cas de figure.
Quand l'humain bat encore l'agent
C'est sur ce point que je pense que Devin doit encore s'améliorer :
Point de douleur
Exemple
Polissage des caractéristiques de la couche croisée
L'éditeur Sandpack a été codé en dur pour bloquer les tests ; il n'a pas saisi la notion de "test". SandpackTests nom du composant.
Persistance de la configuration
Retour par défaut à SQLite 5 fois, même après un "Must stay on Postgres" explicite.
Nommage / nettoyage
Les titres de PR dérivent, les fichiers périmés perdurent à moins que vous ne demandiez à Devin de les supprimer.
Goût & UX
Le tableau de bord était passable, mais l'espacement, le texte et les couleurs devaient encore être ajustés à la main.
Mon avis
Les documents de Devin n'ont jamais promis un constructeur de produits. Ils définissent une zone de tolérance beaucoup plus étroite et, rétrospectivement, j'aurais dû rester à l'intérieur de cette zone. La page officielle "Quels sont les points forts de Devin ? énumère quatre utilisations des titres :
La documentation qualifie d'"expérimental" le développement de fonctionnalités qui couvrent l'interface utilisateur, l'API et les flux de données. Ils sont décrits comme des tâches importantes et ouvertes pour lesquelles l'agent peut "nécessiter une révision et une itération humaines significatives". C'est exactement ce que nous avons vu lorsque Sandpack a codé des tests en dur ou lorsque le tableau de bord semblait bon mais ne calculait pas réellement les données.
Donc, en règle générale :
Utilisez Devin pour tout ce qu'un développeur senior pourrait automatiser à l'aide d'un script, et gardez le volant pour les tâches qui nécessitent un sens du produit.
Conclusion
Nous sommes arrivés à la fin de notre tutoriel en quatre parties :
Voici les prochaines étapes à suivre :
Si vous suivez la même voie, rappelez-vous : vous pouvez laisser l'agent poser le béton, mais c'est à vous de concevoir la maison. Bon codage !