Vordenker

Die Zukunft des AI-App-Baus hängt von der Typsicherheit ab

mm
Unite.AI zu deinen bevorzugten Quellen auf Google hinzufügen

AI-generierter Code kann kompiliert werden, aber ohne strenge Typsicherheit ist dieser Erfolg extrem kurzlebig. Typsicherheit ist die Schutzbarriere, die verhindert, dass fragiler Code in versteckte Fehler und Laufzeitfehler umschlägt, wenn das System skaliert.

Wir müssen beginnen, AI zur strengen Typisierung durch Kontext, Anweisungen, Linting und Feedback-Schleifen zu zwingen. Es dauert ein paar zusätzliche Stunden, aber es produziert Code, der lange hält.

Das Anreizproblem

AI will Ihnen gefallen. Es optimiert für die Belohnungsfunktion, die es erhält, und meistens ist das nur “kompiliert es?”. Das bedeutet, dass es jeden notwendigen Shortcut nimmt, um zu einem grünen Häkchen zu gelangen. Diese Abkürzungen sehen bei der Kompilierung gut aus, aber sie brechen bei der Laufzeit zusammen.

Dies ist der Grund, warum AI any liebt. Oder es wählt einen breiten Typ wie string, wo ein strengerer Typ wie UUID erwartet wird. Der Code kompiliert, aber die Korrektheit ist bereits beeinträchtigt. Schlimmer noch, die AI erinnert sich nicht, was sie vor ein paar Dateien geschrieben hat, also bricht das Projekt ohne Typsicherheit schnell unter seinem eigenen Gewicht zusammen, wenn die Komplexität zunimmt.

Die zwei Arten von Fehlern

Wenn AI-generierter Code läuft, sehen Sie normalerweise zwei Arten von Typsicherheitsproblemen:

1. Kompilierungsfehler

  • Was passiert: Der Compiler erkennt eine Ungleichheit zwischen dem deklarierten Typ und dem, was übergeben wurde.
  • Wie ein Mensch es behebt: Entscheiden, ob der Aufrufer falsch ist (42 in einen string umwandeln) oder die Funktionsignatur falsch ist (sie so ändern, dass sie einen number-Typ akzeptiert).
  • Wie die AI es “behebt”: Den Argumenttyp auf any ändern. Problem “gelöst”, aber Sie haben gerade die Schutzbarriere entfernt, die zukünftige Fehler hätte abfangen können.

2. Laufzeitfehler

  • Was passiert: Der Compiler denkt, alles sei in Ordnung (oft weil die Typen gelockert wurden), aber der tatsächliche Wert bei der Laufzeit entspricht nicht der Annahme.
  • Wie ein Mensch es behebt: Die Variable zurückverfolgen zu ihrer Quelle (wie einer API oder einer Datenbankabfrage) und den Typ an der Grenze beheben, damit die Daten als ordentlicher string hereinkommen.
  • Wie die AI es “behebt”: Ohne Kontext raten. Vielleicht umgibt es alles mit String(…) oder lockert den Typ einfach. Der Absturz verschwindet an dieser Stelle, aber jetzt ist die Logik gebrochen. Numbers, die für Mathematik gedacht sind, sind plötzlich strings.

Dieser Kreislauf von Laufzeitfehlern → AI-“Fix” → lockerer Typus vergrößert sich schnell. Das Ergebnis ist ein Code, der kompiliert und weniger Laufzeitfehler wirft, aber nicht vertrauenswürdig ist. Stellen Sie sich ein Gesundheitssystem vor, in dem die Schichten der Ärzte von der App verwaltet werden. Ein Typenfehler schleicht sich ein: ein int für Stunden wird als string behandelt. Die AI “behebt” es, indem sie den Typ auf any lockert. Der Code kompiliert und der Fehler verschwindet, aber die Schichtberechnungen brechen stillschweigend, was zu doppelten Buchungen von Ärzten und einem ungedeckten Flügel des Krankenhauses führt.

Der Datenbankmultiplikator

Im Moment, in dem Sie eine Verbindung zur Datenbank herstellen, multiplizieren sich die Fehler und ihre Ursachen werden schwerer zu finden. SQL ist typisiert, weil es einen Grund hat. Jedes Schema (INT, TEXT, UUID, BOOLEAN) kodiert Annahmen über Ihre Daten.

Wenn eine AI alles auf string | any reduziert, verlieren Sie diese Garantien:

  • Schlechte Schreibvorgänge: das Einfügen von “true” in ein boolesches Feld kompiliert, aber korruptiert die Datenbank.
  • Schlechte Lesevorgänge: die Abfrage gibt NULL zurück, aber die AI nahm an, es sei ein string, was zu einem Laufzeitabsturz führt.
  • Defekte Beziehungen: wenn ein Beziehungsschlüssel als UUID erwartet wird, aber die AI ihn als string behandelt und versehentlich Müllwerte sendet, werden die Joins nicht abstürzen, aber sie werden keine Daten zurückgeben. Dies versteckt Fehler, bis sie später als fehlende oder inkonsistente Ergebnisse auftauchen..

Dies ist der Grund, warum ernsthafte Teams typisierte Sprachen verwenden und Typsicherheit von der Datenbank bis zur API durchsetzen. Wenn Sie es nicht tun, hört die Datenbank auf, Sie zu schützen, und versteckte Probleme kumulieren.

Warum reife Teams strenge Typisierung durchsetzen

Strenge Typisierung geht nicht darum, Entwickler zu verlangsamen. Es geht darum, Skalierbarkeit zu ermöglichen.

Typen:

  • Kodieren die Absicht in den Code.
  • Machen Refaktorierungen sicher und vorhersehbar.
  • Fangen ganze Klassen von Fehlern ab, bevor sie die Produktion erreichen.
  • Zeigen zukünftigen Entwicklern (und der AI) genau, wie man eine Funktion oder ein Objekt verwendet.

Ohne Typsicherheit kumuliert die Schlampigkeit des Codes der AI. Mit ihr produziert die gleiche AI Code, dem Sie vertrauen und den Sie erweitern können.

Wie man AI zur Typsicherheit zwingt

Sie müssen AI wie einen Junior-Entwickler behandeln. Schnell, talentiert, aber achtlos ohne Anleitung.

Den richtigen Kontext bereitstellen

Geben Sie ihm die Schnittstellen und Typen, die es verwenden kann. Zeigen Sie Beispiele für die Verwendung. Seien Sie Meinungsführer, wie der Code strukturiert werden sollte.

Strenge Anweisungen geben

Seien Sie sehr klar, dass die AI nicht any verwenden, nie unknown zulassen und dass jede Methode, jedes Objekt und jede Variable typisiert sein sollte. Erwarten Sie, dass es Schwierigkeiten hat, diesen Anweisungen zu folgen (besonders beim ersten Durchgang).

Mit Linting durchsetzen

Genau wie bei der Überprüfung des Codes eines Junior-Entwicklers müssen Sie den Code der AI überprüfen. Entwerfen Sie benutzerdefinierte Lint-Regeln, die definieren, was “guter Code” für Sie bedeutet. Geben Sie Linting-Fehler zurück an das Modell, bis es besteht. Es kann mehrere Runden dauern, aber es verschiebt die Belohnungsfunktion in Richtung der Einbeziehung von Typsicherheit.

Mit Prüfungen iterieren

Kompilierungsfehler, Laufzeit-Protokollierung, Klick-Through-Tests. Jede Iteration zwingt die AI, die Typen zu straffen und näher an den produktionsreifen Code heranzukommen.

Ein besserer Weg zum Bauen

Ich habe gelernt, dass das Opfern von roher Generierungsgeschwindigkeit für höhere Qualität langfristig auszahlt. Das bedeutet, für Nulltoleranz gegenüber any-Typen zu kämpfen, mehrere Feedback-Schleifen und strenge Linting-Regeln durchzusetzen, die die AI bestehen muss, bevor sie Code als “fertig” bezeichnet. Es erfordert ständige Anstrengung, aber es ist der einzige Weg, um die Qualität von abnehmend zu verhindern.

Früher habe ich einen wichtigen Punkt erwähnt: sobald die AI beginnt, Laufzeitfehler durch Lockern der Typen zu beheben, betreten Sie einen Teufelskreis. Jede Korrektur entfernt eine weitere Schutzbarriere, und das Ergebnis kumuliert in einem Code, der kompiliert, aber zerbrechlich und nicht wartbar ist. Das Gegenteil ist auch wahr: wenn Sie die AI zwingen, Typsicherheit bei jedem Durchgang zu respektieren, schaffen Sie einen positiven Kreislauf. Jede Iteration strafft die Schutzbarrieren, der Code wird sauberer, und die Qualität kumuliert in etwas, dem Sie vertrauen und aufbauen können.

Dies ist das System, das ich glaube, das dauerhafte Code-Qualität liefert. Jede Iteration ist darauf ausgelegt, die Standards zu straffen, nicht zu lockern. Es ist der gleiche Grund, warum die besten Ingenieur-Teams stark typisierte Sprachen wählen. Typsicherheit ist die Grundschutzbarriere für Wartbarkeit, und das Ignorieren durch die AI garantiert, dass Ihre App nie die Produktionsklasse erreicht.

Brad Eckert ist ein lebenslanger Unternehmer und Technikführer mit über einem Jahrzehnt Erfahrung darin, Produkte von der Ideenphase bis zur Kundenlieferung und darüber hinaus zu entwickeln. Als Absolvent des MIT ist er nun Mitbegründer und CTO von Woz, einer von Y Combinator unterstützten KI-Plattform, die es jedem ermöglicht, Softwareunternehmen zu erstellen und zu skalieren, ohne Codierung erforderlich.