Skip to content

Tutorial 2 How the Code Works de

James Morris edited this page Jul 29, 2026 · 1 revision

Tutorial 2 · So funktioniert der Code

🌎 Sprache: Deutschalle 33 Sprachen ansehen

Ziel: die Handvoll Designentscheidungen verstehen, die dieses Projekt leicht — und sicher — mit einem KI-Agenten veränderbar machen. Du musst den Code nicht auswendig lernen; du brauchst das mentale Modell, damit du den Agenten präzise steuern kannst.

← Zurück: Tutorial 1 Orientierung · Weiter: Tutorial 3 Deine erste Aufgabe mit dem Agenten


Die Karte

lockedin-cli/
├── bin/lockedin.js      # Einstiegspunkt — der EINZIGE Teil mit Ein-/Ausgabe
├── src/lockedin.js      # der Kern — reine Funktionen, die Strings zurückgeben
├── test/
│   ├── unit.test.js     # testet die Kernfunktionen direkt
│   └── cli.test.js      # startet das echte Binary und prüft seine Ausgabe
├── tools/screenshot.js  # rendert die SVGs, die du in docs/ siehst
└── package.json         # Metadaten + das `npm test`-Script

Vier Ideen treiben das Ganze an. Lerne sie, und du kannst den Agenten fast jede Änderung mit gutem Gefühl erledigen lassen.

Idee 1 — Ein reiner Kern, der Strings zurückgibt

Öffne src/lockedin.js. Achte darauf, dass die Render-Funktionen nichts ausgeben — sie geben Strings zurück:

function renderConnect() {
  const names = shuffle(NAMES).slice(0, 6);
  // ...baut ein Array von Zeilen auf...
  return out.join('\n');   // gibt Text zurück; druckt nichts aus
}

Die eigentliche Ausgabe (und das Lesen deiner Tastenanschläge) passiert komplett in bin/lockedin.js. Diese Trennung in „Kern gibt Daten zurück, Rand macht E/A“ ist hier das Allerwichtigste, denn eine Funktion, die einfach nur einen String zurückgibt, ist trivial zu testen:

const out = app.renderConnect();
assert.ok(out.includes("“Ich würde dich gern meinem beruflichen Netzwerk hinzufügen.” — gesendet an "));

Kein Mocking eines Terminals, kein Abfangen von stdout. Wenn du den Agenten bittest, ein Feature hinzuzufügen, ist genau das der Grund, warum er dafür auch einen schnellen, zuverlässigen Test hinzufügen kann.

Idee 2 — Content-Pools

Die Witze leben in einfachen Arrays oben in src/lockedin.js:

const HOOKS = [ 'Unpopuläre Meinung:', 'Lass das kurz sacken.', /* ...~25 insgesamt... */ ];
const LESSONS = [ '→ Dein Netzwerk ist dein Net Worth.', /* ... */ ];

Generatoren ziehen aus diesen Pools. In v1.2.0 ist jeder Pool auf ~25 Varianten angewachsen, und es kam eine zweite Ebene von Template-Pools dazu (Dinge wie POST_REVEALS und REFLECT_TAGSETS), sodass nicht nur die Wörter variieren, sondern auch die Struktur jeder Ausgabe. Content hinzuzufügen ist oft so einfach wie Strings in ein Array zu stecken — eine perfekte erste Aufgabe für einen Agenten.

Idee 3 — Zufälligkeit mit Seed = deterministische Tests

Zufällige Ausgabe und automatisierte Tests klingen unvereinbar. Dieses Projekt bringt beides mit einem zufallszahlengenerator mit Seed zusammen:

setSeed(42);
const a = generatePost();
setSeed(42);
const b = generatePost();
// a === b  → gleicher Seed, gleicher Post

Jede Zufallsentscheidung geht durch die gemeinsamen Helper pick() / shuffle(), die aus diesem Generator mit Seed ziehen. Setze LOCKEDIN_SEED=42, und die CLI wird vollständig reproduzierbar. Die goldene Regel für jede Änderung: Neue Zufälligkeit muss pick / shuffle verwenden, niemals direkt Math.random — sonst gehen Determinismus (und die Tests) kaputt. Behalte das im Hinterkopf; in Kapitel 3 wirst du den Agenten daran erinnern.

Idee 4 — Zwei Ebenen von Tests

  • test/unit.test.js ruft Kernfunktionen auf und prüft die Strings, die sie zurückgeben (schnell, präzise).
  • test/cli.test.js startet tatsächlich bin/lockedin.js und prüft echtes stdout und den Exit-Code (beweist, dass das Ganze End-to-End funktioniert).

Zusammen sind sie das Gate. Sie kodieren außerdem Invarianten — Versprechen, die die App macht. Zum Beispiel beginnt ein Post immer mit einem bekannten Hook und enthält immer mindestens drei -Lektionen; auf dem „connect“-Screen steht immer incalculable. Wenn ein Agent Code ändert, fangen diese Tests alles ab, was still und leise ein Versprechen gebrochen hat.


Warum das für die Arbeit mit einem Agenten wichtig ist

Wenn du die vier Ideen zusammennimmst, bekommst du eine Codebasis, in der ein Agent:

  1. Ein Feature hinzufügen kann als reine Funktion, die einen String zurückgibt,
  2. einen Test hinzufügen kann, ganz ohne E/A-Akrobatik,
  3. die Ausgabe über den RNG mit Seed reproduzierbar hält und
  4. beweisen kann, dass nichts kaputtgegangen ist, indem er das vorhandene Gate ausführt.

Genau diesen Loop wirst du im nächsten Kapitel laufen.

✅ Probier es mit deinem Agenten aus

Bitte deinen Agenten, dein Verständnis zu überprüfen — lesend, nicht editierend:

  1. „Liste jeden Content-Pool in src/lockedin.js auf und wie viele Einträge jeder hat.“
  2. „Zeig mir eine Invariante, die test/unit.test.js für generatePost erzwingt, und erkläre, wodurch sie kaputtgehen würde.“
  3. „Wo ist der RNG mit Seed definiert, und welche Funktionen müssen ihn statt Math.random verwenden? Ändere nichts — erkläre es nur.“

Wenn die Antworten des Agenten zu diesem Kapitel passen, bist du bereit zu bauen.

Weiter: Tutorial 3 Deine erste Aufgabe mit dem Agenten

📘 LockedIn CLI wiki

Tutorial

Reference


Satire · Sátira · 風刺. Not affiliated with LinkedIn. GPL-3.0-or-later.

Clone this wiki locally