Kurs
Willkommen zurück! Im ersten Tutorium dieser Reihe hat Devin mein altes fp-ts-exercises Repo entstaubt und ein ordentliches dependency-upgrade PR eröffnet. In diesem zweiten Teil erhöhen wir den Schwierigkeitsgrad und bauen Full-Stack-Features.
Du kannst alle Tutorials der Devin-Serie hier aufrufen:
- Einrichtung und erster Pull Request (Teil 1)
- Eine vertikale Scheibe mit Devin verschiffen (Teil 2)
- Integration, Tests und CI/CD (Teil 3)
- Sicherheit, Einsatz, Wartung (Teil 4)
Wenn du bis zum Ende dieses zweiten Teils scrollst, hast du es geschafft:
- A Next.js 14 Spielplatz, wo die Lernenden den Code im Browser bearbeiten;
- Live-Vitest-Tests die in Echtzeit grün (oder rot) werden; und
- A NestJS mit SQL-Datenbank Backend, das den Fortschritt mit nichts weiter als einer anonymen UUID in localStorage speichert.
Auf dem Weg dorthin lassen wir Devin seine eigene Aufgabenliste erstellen, beobachten, wie er mit Front- und Back-End-Tickets jongliert, und greifen ein, wenn er über Konfigurationsfehler stolpert. Ich zeige dir, wo ich ACUs ausgegeben (und gespart) habe, was ich von Hand repariert habe und wie man Sitzungen effizient hält.
Rekapitulation und Voraussetzungen
In dieser Tutorial-Reihe arbeiten wir mit meinem (ehemals) aufgegebenen fp-ts-Übungsrepositorium.
Das Projekt ist eine Sammlung von kleinen Herausforderungen, die funktionale Programmierkonzepte (wie Option, Either usw.) in TypeScript vermitteln sollen. Im Moment ist es ein Clone-and-Run-Repo: Lernende ziehen es herunter, bearbeiten Dateien lokal und führen die Tests in ihrem eigenen Terminal aus.
Das Ziel ist es, diese Übungen in eine browserbasierte, interaktive Spielwiese zu verwandeln, auf der die Teilnehmer/innen die Erklärungen lesen, den Code in einem In-Page-Editor bearbeiten und sofort sehen können, ob die Tests bestanden wurden (oder nicht). Die Lernenden haben außerdem die Möglichkeit, sich einzuloggen und ihren Fortschritt zu speichern.
Was wir im ersten Teil erreicht haben
Erinnere dich daran, dass wir im ersten Lernprogramm:
- Das alte fp-ts Repo wurde modernisiert: neueste Abhängigkeiten, Linting, Typ-Prüfungen.
- Ich habe Devin mit GitHub verbunden und bewiesen, dass er eine saubere Pull-Anfrage öffnen kann.
Lokale Werkzeuge, die du für den zweiten Teil brauchst
Für dieses zweite Tutorial brauchen wir:
- Node 20+ und npm 10 (unterstützt Workspaces bereits ab Werk).
- Docker mit einem PostgreSQL-Container (oder einer lokalen PostgreSQL-Instanz).
Empfohlene Devin-Einstellungen
Ich empfehle die folgenden Einstellungen für Devin:
- Lege eine weiche Obergrenze von 5 ACUs pro Sitzung in Einstellungen > Nutzung & Grenzenein; wir starten für jede Phase eine neue Sitzung.
- Lass die Registerkarte "Zeitraffer" sichtbar, um Devin anzuhalten oder anzustupsen, wenn er ins Stocken gerät.
Lass Devin den Spielplan schreiben
Ich dachte, es wäre interessant, zunächst Devins Planungsfähigkeiten zu testen. Ich habe eine Eingabeaufforderung erstellt und Devin gebeten, mir mit der Funktion "Fragen" (derzeit kostenlos in der Beta-Phase) bei der Planung der Arbeit zu helfen, die wir heute machen werden.
Aufforderung:
Ich möchte mein bestehendes fp-ts-exercises Node + TypeScript Repo (derzeit Clone-and-Run CLI-Übungen) in eine browserbasierte Lernplattform verwandeln, die den Fortschritt verfolgt.
Zielerfahrung:
- Die Lernenden öffnen eine Next.js-Webanwendung, wählen eine Übung aus, bearbeiten den Code im Browser und sehen sofort, ob die Vitest-Tests bestanden haben oder nicht.
- Der Fortschritt (abgeschlossene Slugs) wird serverseitig gespeichert und bei späteren Besuchen erneut geladen, aber wir fügen noch keine Benutzerkonten hinzu (wir verwenden eine anonyme UUID, die im Browser gespeichert ist).
Die technischen Möglichkeiten, zu denen ich tendiere:
- Frontend: Next.js 14 (React 18, App Router)
- Code Editor & Runner: Sandpack + @vitest/browser
- API: NestJS 13 mit @nestjs/graphql (Apollo-Treiber)
- Datenbank: Prisma 5 mit PostgreSQL
- Arbeitsbereich: einfache npm-Arbeitsbereiche (apps/web, apps/api, packages/exercises)
Schlage einen schrittweisen Umsetzungsplan (Aufgabenliste) vor, der diesen vertikalen Abschnitt mit Leben füllt. Schätze die relativen ACU-Kosten für jede Aufgabe und kennzeichne alle langwierigen Schritte (z. B. große Migrationen oder Installationen mit vielen Abhängigkeiten).
Devin lieferte uns eine Liste mit sechs Aufgaben, für die er jeweils einen geschätzten ACU angab, und markierte die Schritte, die mit "starken Abhängigkeiten" verbunden waren.
Devins Antwort:
Phase 1: Arbeitsbereich einrichten (2-3 ACU)
- npm-Arbeitsbereichsstruktur initialisieren (1 ACU)
- erstellen. Apps/Web, apps/api, und packages/exercises Verzeichnisse
- Wurzel konfigurieren package.json mit Arbeitsbereich-Definitionen
- Verschiebe bestehende Übungsdateien nach packages/exercises/src/
- Next.js 14-Frontend einrichten (1-2 ACU - Langläufer: Abhängigkeitsinstallation)Initialisiere Next.js mit App Router in apps/webTypeScript und Tailwind CSS konfigurierenGrundlegende Routing-Struktur einrichten
Phase 2: Übungspaket Migration (3-4 ACU)
- Extrahiere Übungsinhalte in ein gemeinsames Paket (2 ACU)
- Erstelle Pakete/Übungen mit Extraktion von Übungsmetadaten
- Analysiere vorhandene Übungsdateien, um sie zu extrahieren:
- Anweisungen
- Starter Code
- Lösungen
- Definiere TypeScript-Schnittstellen für die Übungsstruktur
- Einführung eines Systems zur Entdeckung von Übungen (1-2 ACU)
- Dateisystem-Scanner erstellen (wie fs.readdirSync Logik in exercise.js:17-28)
- Exportiere die Metadaten der Übung: Titel, Beschreibung, Schwierigkeit, Tests
Phase 3: Backend API (4-5 ACU)
- NestJS API mit GraphQL einrichten (2 ACU - Langwierig: Abhängigkeiten installieren)
- Initialisiere das NestJS Projekt in apps/api
- Apollo GraphQL Server konfigurieren
- Grundlegende Endpunkte für Gesundheitschecks einrichten
- Prisma + PostgreSQL implementieren (2 ACU - Langfristig: Datenbankeinrichtung)
- Entwurfsschema für:
- Benutzer-Sitzungen
- Abgeschlossene Übungen
- Prisma-Client und Migrationen einrichten
- Lernpfad-Resolver erstellen
- Verwaltung anonymer Benutzersitzungen (1 ACU)
- UUID generieren und im Browser speichern localStorage
- Aktiviere die sitzungsbasierte Fortschrittspersistenz ohne Authentifizierung
Phase 4: Frontend-Kernfunktionen (5-6 ACU)
- Übungsbrowser-Schnittstelle (2 ACU)
- Übungen nach Kategorie auflisten (Option, entweder, Aufgabe, etc.)
- Fortschrittsindikatoren und Abschlussstatus anzeigen
- Aktiviere die Auswahl und Navigation von Übungen
- Sandpack Code-Editor-Integration (2-3 ACU - Langfristig: Sandpack-Setup)
- Sandpack mit TypeScript-Unterstützung konfigurieren
- Lade den Startcode und fp-ts Abhängigkeiten
- Dateisystem für Übungs- und Testdateien einrichten
- Vitest Browser Runner Integration (1 ACU)
- Ersetze execSync Vitest-Aufrufe (exercise.js:45-47) mit @vitest/browser
- Ermöglicht die Durchführung von Tests in Echtzeit und die Anzeige der Ergebnisse
Phase 5: Lernpfad (2-3 ACU)
- Client-seitige Fortschrittsverwaltung (1 ACU)
- Apollo Client für GraphQL einrichten
- Fortschritt mit Backend synchronisieren
- Erkennung des Übungsabschlusses (1-2 ACU)
- Bestehende Logik zur Erfolgserkennung anpassen (exercise.js:48-49)
- Backend-Fortschrittsaktualisierungen bei bestandenem Test auslösen
Phase 6: Polnisch & Einsatz (2-3 ACU)
- UI/UX Verbesserungen (1-2 ACU)
- Responsive Design sicherstellen
- Ladezustände und Fehlerbehandlung hinzufügen
- Verbessere die Anzeige der Übungsanweisungen
- Einrichtung des Produktionseinsatzes (1 ACU)
- Docker für beide Anwendungen konfigurieren
- Verwalten von Umgebungsvariablen
- Datenbankbereitstellung einrichten
Geschätzte Gesamtkosten: 18–24 ACU
Der Plan war insgesamt ziemlich gut. Ich habe einige Dinge geändert, vor allem in Phase sechs, da wir uns im vierten Tutorial mit dem Einsatz beschäftigen werden.
Phase 1: Arbeitsbereich & Front-End-Gerüst
Goal: Erstelle npm-Workspaces, verschiebe die Legacy-Dateien und bootstrappe eine leere Next.js 14-Shell.ACU burn: 3,66 (geplant 1-2).Ergebnis: Das Repo enthält nun /apps/web
, packages/exercises
und eine Tailwind-fähige Next.js-App, die auf localhost:3000
läuft.
Die Aufforderung
Ich habe Devin gebeten, den Plan zu erstellen, den er für die erste Phase gemacht hat. Agentic Devin hat keinen Kontext zu dem, was du vorher in der "Frag Devin"-Funktion gefragt hast, also musst du eine separate Anfrage erstellen und den Kontext angeben.
Ich werde nicht alle Aufforderungen in diesem Artikel einfügen, aber hier ist die erste:
Aufforderung:
Aufgabe: Initialisiere die npm-Workspace-Struktur und das Next.js-Frontend für die Browser-Plattform fp-ts-exercisesContext:
Ich bin dabei, mein bestehendes CLI-basiertes Lernsystem fp-ts-exercises in eine browserbasierte Plattform umzuwandeln. Das aktuelle System hat die Übungen in 10-from-either.exercise.ts:1-3 mit der TypeScript-Konfiguration in tsconfig.json:88 und der Vitest-Einrichtung in vitest.config.ts:7 organisiert.
Anforderungen:
- Erstelle die Struktur des npm-Arbeitsbereichs:
- Root package.json mit Workspace-Konfiguration für apps/web, apps/api, packages/exercises
- Verschiebe bestehende Übungsdateien aus dem aktuellen src/ nach packages/exercises/src/
- Behalte die aktuelle Namenskonvention für Übungsdateien bei (.exercise.ts und .solution.ts)
- Initialisiere Next.js 14 frontend in apps/web:
- App Router verwenden (nicht Pages Router)
- Konfiguriere TypeScript mit ähnlichen strengen Einstellungen wie die aktuelle tsconfig.json:88
- Hinzufügen von Tailwind-CSS für das Styling
- Erstellen einer grundlegenden Routing-Struktur für das Durchsuchen von Übungen
- Kompatibilität aufrechterhalten:
- Sicherstellen, dass bestehende Übungsstrukturen und Importe weiterhin funktionieren
- Fp-ts-Abhängigkeiten über den Arbeitsbereich hinweg zugänglich halten
- Aktuelle Vitest-Konfigurationsmuster beibehalten
Ergebnisse:
- Workspace-konfigurierte package.json im Stammverzeichnis
- Next.js-App in apps/web/ mit TypeScript und Tailwind
- Migrierte Übungen in packages/exercises/
- Grundlegende Routing-Struktur (/Übungen, /Übungen/[Kategorie], /Übungen/[Kategorie]/[Slug])
Tech Stack:
- Next.js 14 mit App Router
- TypeScript (strenger Modus)
- Tailwind CSS
- npm-Workspaces (nicht yarn/pnpm)
Einreichung:
- Sicherstellen, dass Lint und Typecheck-Skript funktionieren
- Erstelle eine PR mit deinen Änderungen
Alle Aufforderungen, die ich daraufhin geschrieben habe, folgten demselben Muster: Aufgabenhighlight, Kontext, Anforderungen, Ergebnisse, technischer Hintergrund und Details zur Einreichung.
Was Devin tatsächlich getan hat
Es hat ziemlich lange gebraucht, um sich zu entscheiden (etwa vier Minuten), aber es hat funktioniert:
- Das Skelett des Arbeitsbereichs erstellt
- Alle Übungsordner wurden nach
packages/exercises/src
migriert. - Bootstrapped Next.js 14 mit dem App Router, TypeScript und Tailwind.
- Lint- und Type-Check-Skripte zur Frontend-App hinzugefügt (nachdem ich sie angestupst hatte).
Warum die ACU-Kosten in die Höhe geschnellt sind
Die ACU-Kosten sind in die Höhe geschnellt, weil:
- Devin verbrachte eine ganze Minute damit, nach einer Zeitüberschreitung des Spiegels
npm install
zu wiederholen. - Es wurde versucht, den Devs-Server und die Prozesse mit
q
in Vim zu stoppen, dannCtrl-C
, und beides schlug fehl. Ich habe dem Programm ein wenig Zeit gegeben, um es selbst zu reparieren, musste dann aber beide Male manuell eingreifen und die Prozesse beenden. Jede zusätzliche Minute bedeutete zusätzliche ACUs, und ich hätte dieses Problem nicht so schnell bemerkt, wenn ich Devins Aktionen nicht genau verfolgt hätte.
Menschliche Interventionen und Lektionen gelernt
Hier ist eine Zusammenfassung der Korrekturen, die ich vornehmen musste:
Fix |
Zeit |
Wie ich es gemacht habe |
Hängende Node Watch Aufgabe beendet |
15 s |
Beendet den Prozess in der VM-Shell. |
Tailwind neu installiert |
90 s |
npm install tailwindcss postcss autoprefixer --workspace=apps/web und wiederholte tailwind init. |
.next/ zu .gitignore hinzugefügt |
10 s |
Manuell übertragen, um aufgeblähte PRs zu vermeiden. |
Das Verschieben großer Dateibäume geht von Hand schneller und ist viel günstiger, da Devin nach Zeit/Aufgabe abrechnet. Ich habe die Ordner verschoben, bestätigt und den Agenten die neue Struktur übernehmen lassen. Es konnte meine Änderungen problemlos übernehmen und selbständig zusammenführen!
Allerdings musste ich das Programm auffordern, die Skripte für Lint und Typprüfung auszuführen, auch wenn ich dies in der ersten Eingabeaufforderung angegeben hatte. Am Ende lief es für beide, aber sie scheiterten. Devin hielt es trotzdem für einen Erfolg und machte die PR mit.
Ich habe beide Probleme lokal behoben, die Skripte selbst ausgeführt und den neuen Webentwicklungsserver gestartet, um sicherzugehen, dass er wie vorgesehen startet, und den Commit veröffentlicht.
Phase 2: Verpacken der Übungen
Goal: Extrahiere alle Challenge-Dateien in ein wiederverwendbares packages/exercises
Paket und generiere Metadaten für jede Übung.ACU burn: 0,6 (geplant 2+).Outcome: Shared Package exportiert typisierte Metadaten, die die Web-App und die zukünftige API mit import { exercises } from '@exercises/registry'
importieren können.
Was Devin tatsächlich getan hat
Devin hat es geschafft:
- Strukturierte TypeScript-Schnittstellen für Übungen, Metadaten, Kategorien und den Gesamtkatalog.
- Parser üben das:
- Extrahiert Metadaten aus Codekommentaren und Funktionssignaturen
- Analysiert Startercode, Lösungscode und Vitest-Testfälle
- Automatische Generierung von Tags aus der
fp-ts
Nutzung - Konvertiert camelCase-Namen in lesbare Titel
- System zur Entdeckung von Übungen das:
- Durchsucht das Dateisystem nach
.exercise.ts
und.solution.ts
Paaren - Erstellt einen Slug-basierten Katalog (zum Beispiel
option-01
) - Organisiert Übungen nach Kategorien mit Zwischenspeicherung für mehr Leistung
- Bequeme Exporte zum Abfragen von Übungen und Kategorien:
getExercises()
,getExerciseBySlug()
,getExercisesByCategory()
,getCategories()
,getCategoryBySlug()
Warum Devin unter dem Budget abschloss
Devin hat es geschafft, die Kosten für die ACU niedrig zu halten - hier siehst du, wie er das geschafft hat:
- Keine umfangreichen Installationen oder Netzwerkanrufe
- Das Verschieben von Dateien war einfach; Devin benutzte
git mv
(billig) anstelle von Copy-Paste plus Diff - Die Erzeugung von Metadaten war reines TypeScript, schnell zu planen und auszuführen
Menschliche Interventionen
Dieses Mal nicht!
Aus dem letzten Mal habe ich gelernt und die Skripte in Devins Zweig lokal ausgeführt. Alles wurde kompiliert und die Registry exportiert saubere Typdefinitionen, was sie zum perfekten Eingabematerial für die UI und API macht, die wir als Nächstes bauen werden.
Phase 3: NestJS + GraphQL API
Goal: Richte einen NestJS 13-Dienst ein, der den Trainingsfortschritt über GraphQL darstellt und Daten in PostgreSQL mit Prisma persistiert.ACU burn: 4.2 (geplant 4).Outcome: apps/api
boots on localhost:4000/graphql
. Du kannst Fortschrittsdatensätze abfragen und ändern, die durch eine anonyme Sitzungs-ID gekennzeichnet sind.
Was Devin tatsächlich getan hat
Für die dritte Phase, Devin:
- Erstelle eine vollständige NestJS API in
apps/api
mit TypeScript und Apollo GraphQL - PostgreSQL mit Prisma ORM integriert und ein Schema mit
Session
undCompletedExercise
Modellen eingerichtet - Anonymes Sitzungsmanagement mit UUIDs implementiert (keine Anmeldung erforderlich)
- GraphQL-Resolver für die Erstellung/Validierung von Sitzungen, Übungsabfragen und die Verfolgung des Fortschritts gebaut
- Verbundenes Backend mit dem gemeinsamen Übungspaket (
packages/exercises
) zur Datenermittlung - CORS konfiguriert, um die Kommunikation mit dem Next.js-Frontend zu unterstützen
- Sicherstellung der Typkompatibilität zwischen dem GraphQL-Schema und bestehenden TypeScript-Schnittstellen
- Einrichten von Entwicklungsskripten, Datenbankmigrationsfluss und Prisma Studio-Integration
Wo Devin gestolpert ist
Dies sind die Probleme, auf die ich in der dritten Phase gestoßen bin, und die Korrekturen, die ich vornehmen musste:
Ausgabe |
Fix |
Zeit |
|
Souffliert Devin: "Ich stoße auf diesen Fehler, wenn ich versuche, Die Meta-Eigenschaft 'import.meta' ist nur zulässig, wenn die Option |
1 ACU, 5 Minuten |
Lint-Skript fehlt |
Souffliert Devin: "Füge das Lint-Skript zum api-Paket hinzu und stelle sicher, dass es funktioniert." |
1 ACU, 4 Minuten |
Versehentlich begangen |
|
20 s |
Gelernte Lektionen
Das sind meine Eindrücke:
- Config vs. Code: Devin ist sehr gut, wenn das Framework erst einmal steht, aber um Abhängigkeitsprobleme zu erkennen, braucht es immer noch ein menschliches Auge.
- Immer lokal ausführen: Ich hatte bereits eine lokale PostgreSQL-Datenbank auf meinem Rechner erstellt, und die PR-Anweisungen zum Ausführen der Prisma-Migration und zum Starten der Entwicklungsumgebung waren klar und einfach zu befolgen (siehe Abbildung unten). Devins Kommentar besagt, dass es gelungen ist, die API lokal auszuführen, doch
npm run dev
stürzte ab, bisreflect-metadata
hinzugefügt wurde.
- Devin ist gut im Umgang mit PR-Kommentaren. Ich kommentierte den PR und erklärte Devin, dass ich versucht hatte, die API lokal auszuführen und dabei auf einen Fehler gestoßen war. Es gab mir sofort ein kleines Augen-Emoji, und die Sitzung wurde von selbst fortgesetzt, um den Fehler zu beheben, und ein paar Minuten später wurde ein Fix gepusht.
- Prüfe immer auf geheime Dateien: Devin hatte eine
.env
Datei mit einerDATABASE_URL
Variable übergeben, die einen Dummy-Benutzernamen und ein Passwort enthielt. Nachdem ich sie lokal gezogen hatte, änderte ich den Benutzernamen und das Passwort in meine lokalen Datenbankkennungen und stellte sicher, dass die Datei aus dem Git-Tracking-System entfernt und zum.gitignore
hinzugefügt wurde. Wir werden in zukünftigen Tutorials sehen, wie man sicher mit Geheimnissen umgeht.
Phase 4: Sandpack Spielplatz & Live Tests
Goal: Gib den Lernenden einen Browser-Editor, der fp-ts-Lösungen und Vitest-Checks in Echtzeit ausführt.ACU burn: 7.2 (geplant 3-4).Outcome: Der Besuch von /exercises/option-01
öffnet eine geteilte Ansicht: Der Sandpack-Editor auf der linken Seite, der Testtunnel auf der rechten Seite und eine Erfolgsmeldung, sobald alle Specs bestanden sind.
Was Devin tatsächlich getan hat
Hier ist, was Devin für die vierte Phase gemacht hat:
- Übungslisten und Navigationsseiten mit dynamischer Kategorie- und Slug-Unterstützung
- Integrierter Sandpack-Editor mit TypeScript-, fp-ts- und Echtzeit-Dateisystem-Unterstützung
- CLI Test Runner durch Vitest im Browser und Live-Feedback ersetzt
- Verbindung zwischen Frontend und Backend über Apollo Client für sitzungsbasierte Lernpfade
- Responsive UI mit Ladezuständen und Fehlerbehandlung implementiert
Wo Devin zusätzliche ACUs verbrannt hat
Devin hat in dieser Phase mehr ACUs verbrannt als erwartet - hier ist der Grund dafür:
Ursache |
Wie ich das Problem behoben / entschärft habe |
Ich habe veralteten CLI-Runner-Code in |
Lösche |
Auf Rückmeldung gewartet, aber nicht explizit nachgefragt → Leerlaufschleife. |
Nach drei Minuten Stille habe ich im Chat "Sieht gut aus, mach weiter" getippt. |
Gelernte Lektionen
Meine Eindrücke sind dieses Mal:
- Schweigend zusehen = Geld verbrennen. Lass die Registerkarte "Zeitraffer" geöffnet und wenn Devin eine Schleife dreht, schiebe sie an oder halte sie an.
- Lösche toten Code frühzeitig. Devin löscht veralteten Code nicht wirklich von selbst, es sei denn, du sagst es ihm. Ich habe vorhin den Fehler gemacht, ihn zu bitten, Dateien zu verschieben, ohne ausdrücklich zu sagen, dass er sie löschen soll, und so hatten wir am Ende mehrere Einstiegspunkte, die den armen Devin in dieser Phase sehr verwirrten.
Devin hat sich hier etwas Zeit gelassen. Es drehte sich in einer Schleife und versuchte, die gleichen Probleme zu speichern, das Backend und das Frontend nicht richtig zu verbinden, Änderungen vorzunehmen, die Server neu zu starten, im Browser zu prüfen, ob es funktionierte, usw. Es war wie eine normale Entwicklungsarbeit, nehme ich an...
Wir haben jetzt eine funktionierende App. Ich konnte sowohl den API- als auch den Webserver starten, zu localhost navigieren, die Stub-Funktion bearbeiten, auf Speichern drücken und beobachten, wie das Testfenster von rot auf grün wechselte. Dann habe ich gemerkt, dass es die Arbeit nur zur Hälfte erledigt hat, und habe den Test und die Lösung der ersten Übung auf jeder Übungsseite fest eingefügt. Ich wies ihn darauf hin und nach mehreren Schleifen konnte er den Fehler korrigieren und seine Korrekturen veröffentlichen.
Phase 5: Fortschrittssynchronisation mit UUID
Goal: Behalte den Abschlussstatus jedes Lernenden bei und male die Seitenleiste beim Neuladen neu an, alles ohne Benutzerkonten.ACU burn: 2.7 (geplant 2-3).Ergebnis: Ein winziger React-Hook speichert jetzt eine vom Browser erzeugte UUID, ruft die GraphQL-API bei jedem Testdurchlauf auf und lädt den Fortschritt vor, wenn der Spielplatz aufgesetzt wird.
Was Devin tatsächlich getan hat
Für die fünfte Phase, Devin:
- Integrierter Apollo Client für die GraphQL-Kommunikation zwischen dem Frontend und dem Backend
- Anonymes Sitzungsmanagement mit UUIDs in localStorage implementiert
- Synchronisierte Echtzeit-Fortschrittsdaten und visuelle Indikatoren auf Ebene der Kategorie und der Übung
- Erkennung des Übungsabschlusses durch Einbindung in den Vitest Test Runner im Browser
- Offline-Unterstützung, optimistische Updates und robuste Fehlerbehandlung mit Wiederholungslogik (die ich nie gefordert habe).
Einer der Vorteile ist, dass Devin ein optimistisches UI-Update hinzugefügt hat, so dass Abzeichen sofort auf ✅ umgeschaltet werden. Das ist wichtig, denn so bleibt die Schnittstelle auch bei Verbindungen mit hoher Latenzzeit flott.
Gelernte Lektionen
Was ich mitnehme, ist:
- Kleiner Umfang bedeutet minimale Fehler: Die Aufgabe war recht klein und eng gefasst, sodass Devin sie gut und innerhalb eines guten Zeitrahmens ausgeführt hat.
- Sag, was du willst, aber auch, was du nicht willst: Ich habe bemerkt, dass Devin dazu neigt, den Spielraum zu erweitern, und wieder einmal hat er mir mehr gegeben, als ich wollte. In diesem Fall hat es mich nicht gestört, aber wenn es etwas gibt, was du wirklich nicht möchtest, dann sag es ausdrücklich. So habe ich zum Beispiel in jeder einzelnen Eingabeaufforderung "keine Anmeldefunktion" angegeben, weil ich davon ausging, dass sie versuchen würde, dorthin zu gelangen.
Wir haben jetzt den Beweis, dass unsere anonyme Sitzungspipeline durchgängig funktioniert. Es ist an der Zeit, dass es in der letzten Polierphase gut aussieht.
Phase 6: UI Polish & Progress Dashboard
Goal: Verwandle die Benutzeroberfläche in ein pastellfarbenes, "luftiges" Erlebnis und füge ein Dashboard hinzu, das die Streifen, den Schwierigkeitsgrad und die wöchentlichen Aktivitäten jedes Lernenden anzeigt.ACU burn: 11 (geplant ≈ 3).Outcome: Helle und dunkle Pastellthemen, neu gestaltete Übungskarten und ein Live-Dashboard mit Ringen, Balken und Streckenzählern. Devin hat die groben Züge gemacht, aber ich bin eingesprungen, um die Unstimmigkeiten bei der Namensgebung und den Austausch von Abhängigkeiten zu retten.
In dieser Phase habe ich den Umfang absichtlich erweitert, um zu sehen, wie Devin mit einer größeren Anzahl von Anfragen umgehen würde. Ich dachte eigentlich, dass es für Devin viel einfacher sein würde, als Phase 3 mit der ganzen Backend-Implementierung anzugehen. Spoiler-Alarm: Ich habe mich geirrt.
Was Devin nach der Aufforderung in Angriff genommen hat
Das ist die Aufschlüsselung meiner Anforderungen und Devins Leistung:
Anforderung |
Devins Leistung |
Pastell Design System |
Tailwind-CSS-Variablen für sanftblaue Primär-, mintfarbene Erfolgs- und lavendelfarbene Akzente hinzugefügt. Setze |
Typografie und Abstände |
Führt eine |
Fortschritts-Dashboard |
Neue Route
|
Verbesserte Karten |
Ersetzte |
Katalog-Erweiterung |
Erstelle 10 weitere Stub-Übungen mit sprechenden Namen und Platzhaltervorlagen. Zu den Metadaten gehören der Schwierigkeitsgrad, die geschätzte Zeit und die Kategorie. |
Was Devin falsch gemacht hat
Die Dinge sind nicht perfekt gelaufen - Devin:
- Geänderte Übungspaket-Dateinamen ohne den Wrapper oder Resolver zu aktualisieren → Laufzeit 500s; Patchen +1 ACU.
- Er hat Postgres still und heimlich durch SQLite ersetzt, "um die lokale Entwicklung zu erleichtern", ohne mich um Erlaubnis zu fragen. Ich hätte es nicht gewusst, wenn ich nicht zugeguckt hätte.
- Ich habe Dutzende von
console.log
Anweisungen in React-Komponenten hinterlassen und die Lint-Checks haben es immer wieder versucht.
Gelernte Lektionen
Was ich mitnehme:
- Die Logik des Dashboards muss noch überarbeitet werden: Devin hat Streifen- und Zeitzähler verdrahtet, aber sie funktionieren nicht mehr. Backend-Metriken sollten mindestens einen Integrationstest haben, damit die "Happy-Path"-UI nicht vorzeitig zusammengeführt wird.
- Die ACU-Nutzung beschleunigt sich bei langen Sitzungen: Nach ~8 ACUs verlangsamte sich die Sitzung merklich. Kurze, begrenzte Sitzungen (< 5 ACUs) halten den Kontext eng und den Agenten reaktionsfähig.
- Devin wird "hilfreich" die Abhängigkeiten tauschen: Es hat Postgres durch SQLite ersetzt, ohne zu fragen. Pinne kritische Dienste in deinem Prompt: "Wechsle nicht die Datenbank-Engine; bleibe bei Postgres."
- Konstruktionsaufgaben lösen Hot-Reload-Churns aus: Jede Aktualisierung von Tailwind/Vite zählt als Agentenzeit. Vielleicht ist es besser, die Sitzung vor der Massenbearbeitung von Stilen anzuhalten und Devin aufzuwecken, wenn das Projekt sauber kompiliert ist.
Diese Aufgabe war langwierig und kostspielig, verglichen mit dem Rest der Arbeit, die wir geleistet haben. Wenigstens weiß Devin, wo die Dinge falsch gelaufen sind:
Wir haben zwar etwas Hübsches, aber es hat ein bisschen gedauert und ist nicht voll funktionsfähig. Einige der Dashboard-Kennzahlen sind fest kodiert - zwei Übungen in unserer Optionskategorie? Wir haben 10. Die Streak- und Zeitmetriken sind auch nicht mit irgendetwas verbunden und die Benutzeroberfläche auf den einzelnen Übungsseiten ist ziemlich schlecht.
Kosten & Zeit Rückblick
Wie die Zahlen ausfielen
Hier ist eine Zusammenfassung, wie alles gelaufen ist:
Phase |
Geplante ACUs |
Tatsächliche ACUs |
Delta |
Anmerkungen |
1 - Arbeitsbereich & Gerüst |
1 – 2 |
3.66 |
▲ ≈ 1.7 |
Zusätzliche Schleifen auf |
2 - Übungspaket |
2 |
0.60 |
▼ 1.4 |
Einfaches Verschieben von Dateien, keine aufwendigen Installationen |
3 – API & Prisma |
4 |
4.20 |
▲ 0.2 |
Config Falten (fehlt |
4 - Spielplatz & Tests |
3 – 4 |
7.20 |
▲ ≈ 3.5 |
Hot-Reload-Zyklen, Blockierung des Merge-Editors |
5 - Fortschrittssynchronisation |
2 – 3 |
2.70 |
▼ ≈ 0.3 |
Unkomplizierter Haken + Abfragen |
6 - UI polieren & Dashboard |
2 – 3 |
11.00 |
▲ ≈ 8 |
Neuinstallationen, stiller DB-Swap, große CSS-Neuladungen |
Gesamt |
18 – 24 |
29.36 |
▲ ≈ 6 – 11 |
Rund 35 % über der ursprünglichen Schätzung |
Kosten: 29,36 ACUs × $2,25 ≈ $66 |
Zeitersparnis gegenüber manueller Arbeit
Das ist meine Schätzung der gesparten Zeit:
Aufgabe |
Menschliche Schätzung |
Devin (+ Korrekturen) |
Netz |
Bootstrapping NestJS + GraphQL + Prisma |
4 Stunden |
1 Std. (inkl. Korrekturen) |
-3 Std. |
Sandpack + Vitest Browserverkabelung |
3 Stunden |
1 Stunde 20 Minuten |
-1 h 40 min |
Vollständige Neugestaltung in Pastellfarben & Dashboard |
6 Stunden |
2 Stunden (aber immer noch nicht funktionsfähig) |
−4 h |
Gesamtzeit |
~13 Stunden |
~4 Stunden 20 Minuten |
-8 Std. 40 Min. |
Die wichtigsten Erkenntnisse
Das sind Dinge, die ich empfehle:
Thema |
Was zu tun ist |
Warum es wichtig ist |
Halte die Sitzungen kurz |
- Begrenze jeden Lauf auf ≤ 5 ACUs. - Teile große Ziele in mundgerechte Tickets auf. |
Sitzungen mit mehr als 8 ACUs sind langsam, und die Fehlerrate steigt auf ≈35 %. Kurze Bursts bleiben reaktionsschnell und billiger. |
Früh stupsen, oft innehalten |
- Sieh dir die Registerkarte "Zeitraffer" an; wenn Devin eine Schleife macht, tippe "Weiter" oder "Schlafen". - Mach eine Pause, während du CSS oder Dokumente bearbeitest, und wecke Devin, sobald der Code kompiliert ist. |
Die Leerlaufschleifen ticken noch, aber die heiße Phase der Entwurfsarbeit ist ein reines ACU-Brennen. |
Konfiguration als manuelle Arbeit behandeln |
- Große Dateibäume selbst verschieben/umbenennen (Drag-Drop schlägt 0.8 ACU-Skripte). - Behebe erstmalige Paketfehler manuell, Wiederholungen sind ACU-Senken. |
Datei-I/O und Wiederholungsinstallationen machen ~30 % der verschwendeten Credits aus. |
Lint & type-check lokal |
- Führe deine Testskripte (in unserem Fall Lint und Typecheck) immer vor dem Zusammenführen aus. - Füge diese Befehle zu deinem CI hinzu (mehr dazu im nächsten Tutorial!). |
Devin wird den Erfolg verkünden, auch wenn die Pipeline scheitert. |
Pin critical tech |
- Gib an, was sich nicht ändern darf: "Bleib auf Postgres, kein Login, behalte Tailwind." - Erforderliche Umgebungsvariablen in |
Devin tauscht Postgres gegen SQLite aus oder fügt neue Testläufer hinzu, wenn er nicht dazu aufgefordert wird. |
Geheimnisse selbst regeln |
- Entferne - Plane einen Geheimhaltungsschritt für spätere Tutorials. |
Devin unterscheidet nicht unbedingt zwischen Dummy-Credits und echten Creds. |
Merge-Editor stoppt |
- Springe ein, um bei Merge-Commits und Prozess-Exits zu helfen. |
Vim-Lock-ups verschwenden Minuten und ACUs. |
Unbrauchbaren Code frühzeitig löschen |
- Nach Umzügen, |
Redundante Dateien verwirren den Agenten und verlängern die Erstellungszeiten. |
Unit-Tests für neue Logik hinzufügen |
- Streckenzähler, Timer oder Metriken brauchen Backend-Tests, vertraue nicht allein auf die Benutzeroberfläche. Auch hier gilt: Warte ab, wir werden das im nächsten Tutorial behandeln. |
Devin verkabelte das Armaturenbrett, ließ die Zähler aber funktionsunfähig, bis Tests die Lücke aufdeckten. |
Sag, was du willst und was du nicht willst |
- Explizite Negativformulierungen ("No auth yet") verhindern, dass sich der Geltungsbereich vergrößert. - Überprüfe den Plan, den Devin vorschlägt, und schneide Extras ab. |
Der Agent liebt es, zu viel zu liefern - gut für Demos, schlecht für Budgets. |
Was kommt als Nächstes?
Wir haben jetzt:
- Ein pastellfarbener Spielplatz, der fp-ts Tests im Browser ausführt
- Eine NestJS + PostgreSQL API, die den Fortschritt mit nichts anderem als einer UUID speichert
- Ein Fortschritts-Dashboard, das wirklich Spaß macht
Unter dem nächsten Tutorialverlagern wir den Schwerpunkt von den Funktionen auf den Workflow und die Zusammenarbeit mit:
- Kontinuierliche Prüfung: Füge die Suiten Jest und Playwright hinzu und lass Devin beide mit jeder PR grün halten.
- CI/CD-Pipeline: Erstelle GitHub-Aktionen, die die Web- und API-Apps bauen und führe die Tests in Headless Chrome aus.
- Teamintegrationen: Verbinde Devin mit Jira, um Tickets zu aktualisieren, schicke Build-Zusammenfassungen an Slack und experimentiere mit der neuen produktinternen Wiki-Funktion von Devin, um die Dokumentation zu vereinfachen.
Wenn du bereit bist, weiterzumachen, klicke auf den dritten Listenpunkt unten, um zum nächsten Tutorial zu gelangen:
- Einrichtung und erster Pull Request (Teil 1)
- Eine vertikale Scheibe mit Devin verschiffen (Teil 2)
- Integration, Tests und CI/CD (Teil 3)
- Sicherheit, Einsatz, Wartung (Teil 4)