Der Turm wächst immer weiter
(lucumr.pocoo.org)- Die Art, wie „vibe-coded“ Software sich zufällig und unerwartet verändert, erinnert an den Turm von Babel, dessen Bau zum Stillstand kam, weil die gemeinsame Sprache verloren ging; im KI-Zeitalter besteht der Unterschied jedoch darin, dass der Bau auch nach dem Zusammenbruch des Verständnisses weitergeht
- Die Grenzen großer Software liegen nicht nur in der Geschwindigkeit, mit der Einzelne Code produzieren, sondern auch darin, wie gut sie ein gemeinsames Verständnis von Konzepten, Grenzen, Invarianten, Ownership und den Gründen für Designentscheidungen koordinieren
- Die Reibung, die beim Erkunden von Code, bei Fragen, Reviews und Abstimmungen zwischen Teams entstand, war zwar Verschwendung, aber zugleich ein Prozess, der das gegenseitige Verständnis synchronisierte und den Konsens über das System überprüfte
- Agenten erledigen Aufgaben wie OAuth hinzufügen, Caching einbauen oder eine Datenbank neu aufbauen parallel und ohne Gespräche; selbst wenn jede Änderung sinnvoll ist und Tests besteht, kann das gemeinsame Modell der Menschen schwächer werden
- Beim KI-gestützten Engineering interpretieren und ändern Agenten einzelne Bereiche und setzen den Bau ohne unmittelbares Scheitern fort. Dadurch ist schwer zu bemerken, dass die Architektursprache verloren geht, mit der Menschen das System gemeinsam durchdacht haben
Die Stärke des Turms von Babel lag eher in Koordination als in Technik
- Manche vibe-coded Software, die sich auf eher zufällige und unerwartete Weise verändert, lässt an Bruegels The Tower of Babel denken
- Die Geschichte vom Turm von Babel wird häufig als Erzählung über Hochmut und Ehrgeiz sowie als Erklärung dafür gelesen, warum Menschen unterschiedliche Sprachen sprechen; zugleich zeigt sie aber die Einigkeit, die technischen Fortschritt ermöglicht
- In Genesis 11, 3–6 (KJV) erzielen die Menschen technische Verbesserungen, indem sie gebrannte Ziegel statt Steine und Bitumen statt Mörtel verwenden, und wollen eine Stadt und einen Turm bauen, der bis in den Himmel reicht
- Was Gott als Problem sah, waren nicht die Ziegel oder das Herstellungswissen, sondern dass die Menschen ein Volk waren und eine Sprache teilten, sodass ihnen nichts verwehrt bleiben würde
- Wenn Menschen ihre Arbeit durch eine gemeinsame Sprache verbinden, können sie etwas bauen, das niemand allein schaffen könnte
- Nicht die Ziegel oder das Herstellungsverfahren gingen verloren, sondern die Fähigkeit, einander zu verstehen; dadurch wurde Koordination unmöglich, und der Bau kam zum Stillstand
Der Turm wächst weiter, auch nachdem KI-Agenten die Reibung beseitigt haben
- KI-gestützte Programmierung gibt Einzelnen mächtigere Werkzeuge, und Entwickler, die Agenten nutzen, können eine Codebase in deutlich größerem Umfang verändern
- Die Grenzen großer Projekte hängen jedoch nicht nur davon ab, wie schnell Einzelne Code produzieren, sondern auch davon, wie gut Menschen ihr Verständnis des zu ändernden Systems koordinieren
- Die gemeinsame Sprache eines Softwareprojekts ist nicht Englisch oder Python selbst, sondern ein gemeinsames Verständnis der folgenden Punkte:
- was die einzelnen Konzepte bedeuten
- wo die Systemgrenzen liegen
- welche Invarianten wichtig sind
- wer wofür verantwortlich ist
- warum das System seine aktuelle Struktur hat
- Dieses Verständnis ist nirgends vollständig dokumentiert; es sammelt sich nicht nur in Dokumentation und Code, sondern auch in Code Reviews, Gesprächen, Debatten und der Erfahrung, anderen eine Änderung zu erklären
- Vor Agenten musste man, wenn man die Storage-Schicht einer anderen Person ändern wollte, oft Code lesen, Fragen stellen und sich mit anderen Teams abstimmen, die abhängige Services betreiben
- In diesem Prozess steckte auch Verschwendung, aber er sorgte zugleich dafür, dass das Verständnis einer Person auf andere übertragen wurde und beide Seiten prüften, ob sie sich noch darüber einig waren, wie das System funktioniert
- Diese Reibung synchronisierte das Verständnis der Menschen
- Agenten reduzieren diese Reibung stark und ermöglichen es mehreren Personen, unterschiedliche Änderungen anzustoßen, ohne miteinander zu sprechen
- Eine Person fügt OAuth hinzu, eine andere baut Caching ein, eine weitere baut die Datenbank von Grund auf neu und macht die UI rosa
- Jede einzelne Änderung kann für sich genommen sinnvoll sein; der Code kompiliert, die Tests bestehen, und bei Bedarf kann sogar eine Erklärung erzeugt werden
- Niemand muss mit anderen sprechen oder einen Teil des gemeinsamen Modells erwerben, den man früher im Verlauf der Änderung gelernt hätte
- Agenten empfinden keinen Schmerz, nur Menschen tun das; und sie ermöglichen Änderungen an Systembereichen und Codebases, für die früher die Hilfe anderer nötig gewesen wäre
- Größer gewordene Vibe-Coding-Projekte werden nicht deshalb zu Codebases wie der Turm von Babel, weil Kommunikation unmöglich ist, sondern weil Kommunikation nicht mehr nötig ist
- Jeder Entwickler hat einen unermüdlichen Übersetzer, der einen bestimmten Bereich des Turms erklärt und die gewünschten lokalen Änderungen ausführt
- Änderungen werden weiter integriert, doch die Architektursprache, mit der Menschen das System gemeinsam durchdenken konnten, kann verschwinden
- Beim biblischen Turm von Babel brachte der Verlust der gemeinsamen Sprache den Bau zum Stillstand; beim KI-gestützten Engineering kann der Bau auch nach dem Zusammenbruch des gemeinsamen Verständnisses weitergehen
- Weil der Turm nicht einstürzt und kein unmittelbares Scheitern eintritt, ist schwer zu erkennen, was verloren ging, und der Turm wächst immer weiter
1 Kommentare
Hacker-News-Kommentare
Ich denke schon lange, dass sich die Kombinierbarkeit von Software wie bei Tetris verhalten sollte: Reihen müssen verschwinden. Wer Agenten unausgereift einsetzt oder wenig Erfahrung als Engineer hat, übersieht solche Aufräumarbeiten und neigt dazu, den Turm einfach immer höher zu bauen.
Man kann Agenten zwar dazu bringen, bestehende Elemente wiederholt in bessere Abstraktionen zu integrieren, aber selbst Fable oder 5.6 Sol liegen beim hochdimensionalen Architekturgespür, das die subtilen Entwicklungen von Software vorhersieht, noch weit hinter Menschen zurück. Die heutigen Systeme scheinen die hochwertigen, spärlichen und zoombaren Weltmodelle, mit denen Menschen arbeiten, noch nicht ausreichend aufrechtzuerhalten; hoffnungsvoll stimmt aber schon die Tatsache, dass sich der Abstand inzwischen bis auf diese feine Ebene verringert hat.
Das ist die KI-Version des Skalierungsproblems, das Brooks in 《The Mythical Man-Month》 behandelt: Mit wachsender Größe verschlimmert sich die kombinatorische Explosion, und überall im Projekt entsteht doppelter Code, der faktisch dieselbe Funktionalität implementiert. Wir brauchen einen Weg, KI-gestütztes Coding auf Prägnanz auszurichten.
Auch GPT3.5 und gpt4, die einmal für Begeisterung sorgten, werden heute von qwen27b oder gemma31b klar übertroffen. Mit genug Zeit und geeignetem Reinforcement Learning (RL) werden auch Modelle im Kopf ein gutes Modell von Softwaresystemen aufbauen.
Die Kernthese dieses Textes erinnert an den Lisp Curse und den Bipolar Lisp Programmer. Die Argumentation war, dass Lisp es Einzelnen zu leicht macht, genau das zu bauen, was sie wollen; dadurch sinkt für Programmierer der Anreiz, gemeinsam generische, komplexe Ergebnisse zu schaffen, und das öffentliche Software-Ökosystem bleibt schwächer als bei Sprachen, die erheblichen Aufwand erfordern.
Armin scheint beim Thema KI-Coding eine sehr ähnliche These zu vertreten: Lisp Curse, Bipolar Lisp Programmer
Zwischen den beiden Gruppen könnten unterschiedliche kognitive Verarbeitungsweisen liegen. Damit Lisp so produktiv ist wie andere Sprachen, muss man Homoikonizität aktiv nutzen; dadurch werden ernsthafte Lisp-Programme aber leicht zu Sammlungen von domänenspezifischen Sprachen (DSLs), die nur ein oder zwei Personen verstehen.
Die Grenze großer Softwareprojekte liegt nicht darin, wie schnell einzelne Personen Code produzieren, sondern darin, wie gut die Menschen, die das System verändern, ihr gemeinsames Verständnis dieses Systems koordinieren. Die Aussage, dass seit dem 30. November 2022 alles komplizierter geworden ist, trifft zu.
AI darauf anzuwenden, ist ziemlich nahe daran, auf bestehende Komplexität noch eine weitere Komplexitätsschicht zu setzen. Im besten Fall ist es enorme Hardware-Verschwendung, im schlimmsten Fall erzeugen Agenten so viele neue Bugs, wie sie beheben, es entsteht mehr anfällige Schrottsoftware, und zugleich lernen Menschen die Technik nicht mehr, sodass die Fähigkeiten der Menschheit insgesamt schwächer werden könnten. Software muss ihrem Wesen nach nicht so komplex sein; um das zu lösen, sollte man Handwerkskunst in den Mittelpunkt stellen.
Auch HTML und Pre-Rendering sind zusammen mit HTMx und LiveView zurückgekehrt, und CSS hat sich von den grotesken Workarounds der Vergangenheit gelöst. Wenn man jüngeren Kollegen erklärt, wie man Webseiten in IE6 debuggt hat, spürt man den Abstand der Zeiten. Einiges ist komplexer geworden, anderes ist ausreichend gereift und dadurch einfacher geworden.
Ein Mensch im Jahr 20.000 v. Chr. suchte Nahrung und mied Kälte und Raubtiere, während ein Mensch im Jahr 5.000 v. Chr. Landwirtschaft betrieb, sich um Regen und Krankheiten sorgte und Systeme zur Verwaltung von Gemeinschaften und Land schuf. Heute bauen die meisten ihre Nahrung nicht selbst an, sondern verwalten die Komplexität riesiger Gesellschaften. Für Entwickler der 1970er- und 1980er-Jahre wäre schon Software vor LLMs enorm komplex, und inzwischen programmiert fast niemand mehr ohne Abstraktionsschichten direkt auf Hardware. Auch bei Kryptografie verbergen Libraries die Komplexität und lehren uns: „Implementiere es nicht selbst.“ Die zentrale Frage ist jetzt, wie schnell LLMs ein Verständnis des zu ändernden Systems koordinieren können.
Die gemeinsame Sprache eines Softwareprojekts ist weder Englisch noch Python, sondern ein gemeinsames Verständnis von Bedeutungen der Konzepte, Grenzen, Invarianten, Ownership und den Gründen, warum das System seine aktuelle Form angenommen hat. Christopher Alexanders Pattern Language behandelt genau dieses Problem, und seine Empfehlung, für jede Domäne eine passende Pattern Language zu schaffen, führte bekanntlich zu den GoF Design Patterns.
Ich experimentiere mit einer Funktion, bei der AI für jedes Projekt drei Pattern Languages für Business-, Produkt- und Technikdomäne pflegt, und das funktioniert sehr gut. Wenn man sie bei der Planung heranzieht und während Implementierung und Review bereinigen lässt, werden selbst zu 100 % von AI gecodete Projekte strukturiert, gut zwischen den Domänen ausgerichtet und leichter handhabbar.
Beim Turmbau zu Babel kam der Bau zum Stillstand, als die gemeinsame Sprache verloren ging; bei AI-gestützter Entwicklung hingegen geht der Bau weiter, auch nachdem das gemeinsame Verständnis zusammengebrochen ist. Der Autor sagt nicht ausdrücklich, ob das gut oder schlecht ist, aber ich sehe es eindeutig als etwas Schlechtes.
Wenn zu wissen, dass eine Tomate eine Frucht ist, Intelligenz bedeutet, und sie nicht in einen Obstsalat zu tun, Weisheit, dann ist AI die ultimative Form von Intelligenz ganz ohne Weisheit und im Grunde eher eine Illusion von Intelligenz. Wenn niemand mehr versteht, was AI tut, sollten wir anhalten und anerkennen, dass uns die Weisheit fehlt, das zu kontrollieren, was wir erschaffen.
Auch ich denke an Babel und Bruegels Gemälde, sehe es aber deutlich weniger optimistisch. Kurzsichtige kleine Agenten entwickeln jeweils ihren eigenen Bereich eines unüberschaubar großen Ganzen: Auf der einen Seite gibt es 50 Zinnen, auf der anderen einen merkwürdig herausragenden Turm, und ohne zu wissen warum setzt man über den Innenhof ein Adobe-Dach und daneben auf den Treppenabsatz einen Turm mit Strohdach.
Auf der Ebene einzelner Entwürfe ist das plausibel, aber ohne die vielen Schichten von Richtlinien und Urteilsvermögen, die das Gesamtvorhaben integrieren, wird daraus ein riesiges Designmonster. Dass es Disziplin braucht, um in einer hinreichend großen Organisation eine gemeinsame Sprache zu schaffen und zu erhalten, zeigt sich auch an der eigentümlichen Terminologie erfolgreicher Unternehmen und Armeen. Die „Gastown Mayors“ und die darunter stehenden „polecats“ und noch darunter die Golems glauben, dieselbe Sprache zu sprechen, doch erst wenn alles fertig ist, werden sie vom Thron aus erkennen, dass das Verständnis, von dem man glaubte, es perfekt vermittelt zu haben, in Wirklichkeit nicht geteilt wurde.
Anakin: „Entwickler, die Agenten nutzen, werden ihre Fähigkeit, Codebases zu verändern, drastisch steigern.“
Padmé: „In eine bessere Richtung, oder?“
Anakin: Schweigen
Padmé: „In eine bessere Richtung, oder?“
Der Grund, warum Vibe Coding davon abrät, den generierten Code zu lesen, scheint zu sein, dass man den Horror, der in Python-Dateien lauert, nicht mehr vergessen kann, sobald man ihn einmal gesehen hat. Im weiten Sinne funktioniert es wie angefordert, aber bei jeder Entscheidung darüber, wie das Ziel erreicht werden soll, trifft es inkonsistente Entscheidungen.
Es wendet nur auf manche Nutzereingaben seltsame Validierung an, sortiert oder lowercaset Daten ohne Grund in drei Schritten wiederholt und hardcodet sogar sämtliche Spaltennamen aus der ersten Zeile der Eingabe-CSV als Strings. Die eine Hälfte besteht aus globalen Funktionen, die Data Classes entgegennehmen, die andere ist als Klassen implementiert. Wenn man daran denkt, dass man das irgendwann selbst aktualisieren und warten muss, fällt es schwer, es nicht zu korrigieren; doch während man es so überarbeitet, verschwindet ein großer Teil der eingesparten Zeit.
Agentenbasierte Programmierung ähnelt weit mehr Managementarbeit als eigentlichem Programmieren. Manager überblicken die Arbeit einzelner Contributors nur auf hoher Ebene; oft fehlt ihnen die Zeit, die kognitive Kapazität oder die Kompetenz, jedes Detail zu verstehen.
Je mehr Software von Agenten geschrieben wird, desto stärker wird die Rolle von Software Engineers eher einer Management- als einer technischen Rolle ähneln.
Da sie weder Zeit noch Kapazität haben, alles zu verstehen, erledigen sie lediglich die nötigen Aufgaben auf ihrer abstrahierten eigenen Ebene.
Früher brauchte man für große Refactorings gute Gründe, weil sie viel Aufwand bedeuteten. Heute kann ein Agent schon bei einem leicht unklaren Prompt und ohne gründliche Prüfung des Ergebnisses die Hälfte des Codes neu schreiben, sodass sich die Seele eines Programms jeden Tag stark verändern kann. Das ist großartig und zugleich überhaupt nicht.