Connect with us

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

Vordenker

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

mm

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 durch Kontext, Anweisungen, Linting und Feedback-Schleifen zu strenger Typisierung zu zwingen. Es dauert ein paar Stunden länger, 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 Weg einschlagen wird, 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 daran, was sie vor ein paar Dateien geschrieben hat, sodass das Projekt ohne Typsicherheit schnell unter seinem eigenen Gewicht zusammenbricht, wenn die Komplexität wächst.

Die zwei Arten von Fehlern

Wenn AI-generierter Code ausgeführt wird, 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 (ändern, um einen number-Typ zu akzeptieren).
  • Wie die AI es “behebt”: Ändern des Argumenttyps in any. 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 eine API oder Datenbankabfrage) und den Typ an der Grenze beheben, sodass die Daten als richtiger string eingegeben werden.
  • Wie die AI es “behebt”: Ohne Kontext rät sie. Vielleicht umgibt sie alles mit String(…) oder lockert den Typ einfach. Der Absturz verschwindet an diesem Punkt, aber jetzt ist die Logik gebrochen. Numbers, die für Mathematik gedacht sind, sind plötzlich strings.

Dieser Zyklus von Laufzeitfehlern → AI-“Fix” → lockerer Typus verstärkt 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. Eine Typenungleichheit 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 zusammen, was zu doppelten Buchungen von Ärzten und einem ungedeckten Flügel des Krankenhauses führt.

Der Datenbank-Multiplikator

Im Moment, in dem Sie eine Verbindung zur Datenbank herstellen, multiplizieren sich die Fehler und ihre Ursachen werden schwerer zu finden. SQL ist typisiert, und jeder 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: 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.
  • Unterbrochene 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 Schema zu API durchsetzen. Wenn Sie dies nicht tun, hört die Datenbank auf, Sie zu schützen, und versteckte Probleme multiplizieren sich.

Warum reife Teams strenge Typisierung durchsetzen

Strenge Typisierung ist 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, bevor sie die Produktion erreichen.
  • Zeigen zukünftigen Entwicklern (und AI) genau, wie eine Funktion oder ein Objekt zu verwenden ist.

Ohne Typsicherheit verstärkt sich die Schlampigkeit des AI-Code. Mit ihr produziert dieselbe AI Code, dem Sie vertrauen und erweitern können.

Wie man AI zur Typsicherheit zwingt

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

Den richtigen Kontext bereitstellen

Geben Sie ihm die Schnittstellen und Typen, die es verwenden kann. Zeigen Sie Beispiele für die Verwendung. Seien Sie bestimmt darüber, wie der Code strukturiert werden soll.

Strenge Anweisungen geben

Lassen Sie die AI sehr klar wissen, dass es any nicht verwenden darf, nie unknown zulassen und dass jeder Methode, Objekt und Variable typisiert sein muss. Erwarten Sie, dass es Schwierigkeiten hat, diesen Anweisungen zu folgen (insbesondere beim ersten Durchgang).

Mit Linting durchsetzen

Genau wie bei der Überprüfung des Code 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 Typsicherheit.

Mit Checks iterieren

Kompilierungsfehler, Laufzeit-Logging, Click-Through-Tests. Jede Iteration zwingt die AI, die Typen zu straffen und näher an den Produktionscode heranzukommen.

Ein besserer Weg zum Bauen

Ich habe gelernt, dass das Opfern der rohen Generierungsgeschwindigkeit für eine höhere Qualität sich 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 der Code als “fertig” bezeichnet wird. Es erfordert ständige Anstrengung, aber es ist der einzige Weg, um die Qualität von rutschend zu halten.

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 verstärkt sich in einen Code, der kompiliert, aber brüchig und unmaintainierbar ist. Das Gegenteil ist auch wahr: Wenn Sie die AI zwingen, die Typsicherheit bei jedem Durchgang zu respektieren, erstellen Sie einen virtuosen Kreis. Jede Iteration strafft die Schutzbarrieren, der Code wird sauberer, und die Qualität verstärkt sich in etwas, dem Sie vertrauen und aufbauen können.

Dies ist das System, das ich glaube, das anhaltende 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 Basisschutzbarriere für Wartbarkeit, und das Ignorieren durch die AI garantiert, dass Ihre App nie die Produktionsreife 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 bringen. Als Absolvent des MIT ist er jetzt der Mitbegründer und CTO von Woz, einer von Y Combinator unterstützten KI-Plattform, die es jedem ermöglicht, Softwareunternehmen aufzubauen und zu skalieren, ohne dass Codierung erforderlich ist.