Warum Ihr echtes Produkt nicht auf der Infrastruktur eines Builders laufen sollte
Ein guter Ort zum Denken, ein schlechter Ort, um Verantwortung zu tragen.
Vor einem Jahr waren Builder überall. Ich war auch begeistert. Das habe ich im vergangenen Jahr gelernt: Ein KI-Builder ist ein guter Ort zum Denken und ein sehr schlechter Ort, um Verantwortung zu tragen.
Die Seite sah fertig aus
Ich möchte vorsichtig sein, wie ich das sage, denn die einfache Version dieses Textes wäre falsch. Die einfache Version lautet, die Werkzeuge seien schlecht, und das sind sie nicht. Ich habe die Website meines Unternehmens darin gebaut, allein und schnell, und das Ergebnis war gut genug, dass ich stolz darauf war. Das gehört zum Argument dazu, deshalb sage ich es zuerst. Was folgt, ist nur das, was ich gefunden habe, als ich meine eigene Seite endlich so angesehen habe, wie ich eine Seite ansehe, die mir jemand anvertraut hat.
Die Wörter auf meinen Seiten existierten erst, nachdem JavaScript gelaufen war. Alles, was kein JavaScript ausführt, bekam also eine leere Hülle dort, wo eine Wiener Beratung stehen sollte. LinkedIn sah nichts. WhatsApp sah nichts. Die meisten KI-Crawler, die gerade still darüber entscheiden, was das Internet über Ihr Unternehmen sagt, sahen ebenfalls nichts. Google rendert JavaScript, also war bei Google alles in Ordnung, und weil bei Google alles in Ordnung war, kam ich monatelang nicht auf die Idee, die anderen zu prüfen.
So weit ist das eine Eigenschaft clientseitig gerenderter Anwendungen im Allgemeinen und keine Erfindung einer einzelnen Plattform. Deshalb halte ich die Aussage eng: Der Builder hat diese Ausgabe ausgeliefert und mir keinen Weg angeboten, das zu ändern.
Auch der Kopfbereich der Seite gehörte mir nicht wirklich. Meta-Tags, die ich in `index.html` geschrieben habe, kamen bei niemandem an, der die Seite aufrief, weil die Plattform beim Veröffentlichen ihre eigenen aus einer Vorlage zusammensetzte. Eine Zeit lang zeigte jeder Link, den ich geteilt habe, den Standardtitel und das Logo der Plattform in der Vorschau. Entdeckt habe ich das so, wie man einen Tippfehler auf einer Visitenkarte entdeckt, nämlich nachdem man fünfzig davon verteilt hat. All das war ärgerlich und nicht ernst, und nichts davon ist der Grund, warum ich gegangen bin.
Was ein einziger Seitenaufruf tatsächlich getan hat
Am 18. September habe ich meine eigene Startseite in Chrome geöffnet und die Resource Timings und den Local Storage gelesen, etwas, das ich in Aufträgen schon getan hatte und für mich selbst kein einziges Mal.
In einem einzigen Seitenaufruf, ohne jede Interaktion außer dem offenen Tab, gab es 187 Aufrufe an einen Ingest-Endpunkt für Session Recording, verteilt über 208 Sekunden. Das ist ungefähr einer pro Sekunde, durchgehend, so lange jemand auf der Seite bleibt. Vier weitere Aufrufe gingen an einen Analytics-Endpunkt. Drei Kennungen wurden ohne Ablaufdatum in den Local Storage des jeweiligen Geräts geschrieben, und zwei Drittanbieter-Hosts wurden kontaktiert, der Objektspeicher der Plattform und ein öffentliches CDN, die damit beide die IP-Adresse jeder Person erhalten, die die Seite besucht. Es gab kein Cookie-Banner, keine Einwilligungsabfrage und nirgends auf der Seite einen Hinweis darauf.
Ich sollte genau sein in dem, was ich sage und was nicht, denn genau sein ist mehr oder weniger die ganze Arbeit. Der Endpunkt heißt Session Recording und feuert etwa einmal pro Sekunde. Ich habe nicht untersucht, was er überträgt, also werde ich Ihnen nicht erzählen, dass er Tastatureingaben oder Formularinhalte mitschneidet. Dafür habe ich keine Belege, und wer nur von außen geschaut hat, hat sie auch nicht. Was ich sagen kann, ist der Name des Endpunkts, die Frequenz, das Datenvolumen und die Kennung, die auf dem Gerät jeder Person zurückbleibt, die über mein Unternehmen lesen wollte.
Warum ich es nicht einfach abschalten konnte
Mein erster Impuls war, die Einstellung zu suchen, und es gab keine Einstellung. Mein zweiter war, den Code zu suchen, und an dieser Stelle hat der Abend die Richtung gewechselt.
Ich habe die gesamte Codebasis nach dem Endpunkt durchsucht, dann nach den Analytics-Aufrufen, dann nach dem Storage-Host, und nichts gefunden. Keine einzige Zeile. Es stand nicht in meinem Quellcode, weil es zur Build-Zeit vom Build-Plugin der Plattform eingefügt wurde. Es existierte also nicht, bis die Plattform meine Seite kompiliert hat, und in dem Moment, in dem es existierte, lag es bereits in der Datei, die beim Aufruf der Seite heruntergeladen wird.
Man kann nicht entfernen, was nicht im eigenen Code steht. Das ist keine Geschichte über jemanden, der den richtigen Schalter nicht gefunden oder die Dokumentation nicht gründlich genug gelesen hat. Es gab nichts zu löschen, weil die Sache an keiner Stelle existierte, an der ich arbeiten durfte. Sie entstand genau in dem Moment, in dem ich die Möglichkeit verlor, sie zu prüfen, und ich glaube, das ist der Teil, bei dem alle, die Software bauen, eine Minute verweilen sollten, denn es ist kein Fehler und es wird nicht behoben werden.
Wo wurde das alles verarbeitet
Ich konnte es nicht feststellen. Nicht das Land, nicht einmal ungefähr, und das klingt genau so lange nach einem Verwaltungsdetail, bis man sich hinsetzt, um eine Datenschutzerklärung zu schreiben, und feststellt, dass darin ein Satz steht, den man unmöglich zu Ende bringen kann.
Es war nicht so, dass mir jemand etwas verheimlicht hätte. Es war Struktur, und diese Struktur können Sie in Ihren eigenen DNS-Einträgen sehen, wenn Sie die Schichten zählen. Meine Domain zeigte auf den Builder, der Builder lief bei einem Hosting-Anbieter, dieser Anbieter lief in der Cloud eines weiteren Unternehmens, und die Bilder kamen aus dem Objektspeicher eines vierten. Vier Parteien standen zwischen mir und der Hardware, und mit genau einer davon hatte ich einen Vertrag. Die Kette war die Antwort.
Deshalb sage ich heute in Beratungen öfter, als es gern gehört wird, dass "es läuft auf AWS" keine Compliance-Antwort ist. Vorher führte der Weg von mir zu einem Builder, vom Builder zu einem Host, vom Host in die Cloud eines Dritten und schließlich in eine Region, die niemand benennen konnte. Heute führt er von mir zu AWS, in eine Region, die ich gewählt habe, weil ich sie gewählt habe, unter einem Auftragsverarbeitungsvertrag, den ich vorlegen kann, wenn jemand danach fragt. Es mag dieselbe Hardware sein. Es ist eine vollkommen andere Rechtsposition, und der Unterschied ist kein technischer.
Wer dafür geradesteht
Jetzt kommt der Teil, den Builder nicht auf die Preisseite schreiben, und es ist nicht ihre Schuld, dass er zutrifft. Nach der DSGVO ist verantwortlich, wer die Seite betreibt, in diesem Fall also nicht die Plattform, sondern ich, und was auch immer standardmäßig eingeschaltet war, ich war es, die dafür geradesteht.
Artikel 13 verlangt, dass Menschen informiert werden, bevor ihre Daten verarbeitet werden, und informiert wurde niemand. Paragraf 165 Absatz 3 des österreichischen Telekommunikationsgesetzes, über den die ePrivacy-Regeln hier bei mir ankommen, verlangt für das Speichern einer dauerhaften Kennung auf dem Gerät einer Person, wenn sie für den Dienst nicht unbedingt erforderlich ist, vorher deren Einwilligung, und gefragt wurde niemand. Artikel 28 verlangt einen Auftragsverarbeitungsvertrag mit jedem Auftragsverarbeiter, Artikel 30 verlangt Aufzeichnungen darüber, wo verarbeitet wird, und Session Replay ist Verhaltensbeobachtung, die Aufsichtsbehörden als höheres Risiko behandeln und nicht als Nebensache.
Unter dem Strich hatte ich eine Pflicht, die ich auf keine Weise erfüllen konnte. Ich konnte nicht offenlegen, was ich nicht prüfen konnte, konnte keine Einwilligung für etwas einholen, das ich nicht abschalten konnte, und konnte keine Region benennen, die niemand benennen konnte. Die Datenschutzerklärung auf meiner eigenen Website, die mit meiner Unterschrift dahinter, ließ sich durch keine mir zur Verfügung stehende Handlung wahr machen. Ich berate beruflich andere Menschen zu KI-Governance, und ich tat es von einer Seite aus, die aufzeichnete, wer sie besuchte, ohne zu fragen.
Die faire Version, und ich meine sie so
Diese Seite wurde darin entworfen und geschrieben, schnell, von einer einzigen Person, und sie ist gut. Das Argument ist nicht, dass Builder schlecht sind. Es ist, dass ein Builder ein guter Ort zum Denken und ein schlechter Ort ist, um Verantwortung zu tragen, denn Produktion ist ein Versprechen an andere Menschen, und ein Versprechen kann nicht auf einer Infrastruktur ruhen, die sich ohne Ihre Zustimmung unter Ihnen verändert.
Was der Umzug tatsächlich gekostet hat
Einen Abend, und das ist das Detail, das mich am wenigsten loslässt. Das Projekt exportieren, die Laufzeitumgebung der Plattform entfernen, jede Route vorab in echtes HTML rendern, sodass sechzehn Seiten in zwei Sprachen mit ihren Wörtern darin ankommen, und die Dateien in einen privaten Speicher in Frankfurt hinter einem CDN legen. Das Design hat sich nicht verändert, die Wörter haben sich nicht verändert, die Icons haben sich nicht verändert, und niemand, der die Seite aufruft, könnte Ihnen sagen, was passiert ist. Verändert hat sich, dass es jetzt überhaupt keine Anfragen an Dritte mehr gibt, keine Cookies, kein Analytics, kein Session Recording, und dass aus einer Rechnung von etwa 50 Euro im Monat eine von unter einem Euro geworden ist.
Governance, an der man scheitern kann
Worauf ich am meisten stolz bin, ist nicht der Umzug, sondern das, was jetzt dahintersteht. Die Deployment-Pipeline weigert sich zu veröffentlichen, wenn die Laufzeitumgebung der Plattform, ihr Storage-Host, der Session-Recording-Endpunkt oder der Analytics-Endpunkt irgendwo in dem auftaucht, was beim Aufruf der Seite heruntergeladen wird, und sie weigert sich, wenn mein Firmenname im Impressum fehlt, sobald die Seite ohne JavaScript abgerufen wird. Der Satz in meiner Datenschutzerklärung über keine Cookies, kein Analytics und kein Tracking ist damit kein Versprechen mehr, sondern ein Build-Fehler, und so stelle ich mir Governance vor, sobald sie jemand tatsächlich umsetzt. Kein Richtliniendokument. Ein Test, der fehlschlägt.
In meinem Repository steht jetzt eine Liste von Deployment-Läufen, manche rot und manche grün, und ich lese die roten nicht mehr als Fehlschläge. Ein rotes Zeichen bedeutet, dass etwas, das nicht vollständig meines war, niemanden erreicht hat. Ein grünes bedeutet, dass es sie erreicht hat, nachdem ich es geprüft hatte. Eine bessere Definition von Governance habe ich nicht, und beigebracht hat sie mir eine Spalte auf einem Bildschirm und kein Framework.
Zwei Dinge, die mich einen Nachmittag gekostet haben und die Sie umsonst haben können. Das erste ist, das zu prüfen, was prüft: Meine ursprüngliche Fassung dieser Kontrolle durchsuchte nur das HTML und nicht das JavaScript-Bundle, also genau die Datei, die im Browser ausgeführt wird. Sie lief fröhlich durch, während die Zeichenfolge, nach der sie suchte, im Bundle lag, vom Minifier wieder zusammengefügt. Eine Kontrolle, die man nie zu überlisten versucht hat, ist keine Kontrolle, sondern Dekoration. Das zweite ist, dass eine Kontrolle, die falschen Alarm schlägt, schlimmer ist als gar keine. Meine meldete später einen Fehler, den es nicht gab, weil eine Verbindung abbrach, die Antwort leer zurückkam und die Prüfung daraus schloss, meine strukturierten Daten seien verschwunden. Das zu beheben hat zwanzig Minuten gedauert, und ich habe alles dafür stehen gelassen, denn der Alarm, den ich zu ignorieren gelernt hätte, ist der, auf den es ankommt.
Was ich jemandem sagen würde, der heute anfängt
Behalten Sie den Builder und nutzen Sie ihn für das, worin er wirklich gut ist: schnell vorankommen, die Meinung ändern, eine Idee ausprobieren, bevor sie ein Repository verdient hat, laut denken in etwas, das antwortet. Ich habe selbst noch einen, auf einer eigenen Subdomain, genau dafür. Und nehmen Sie dann das, was Ihren Namen trägt, das, dem andere Menschen vertrauen, das mit einer von Ihnen unterschriebenen Datenschutzerklärung, und stellen Sie es dorthin, wo Sie dafür geradestehen können.
Zwischen einer Idee, die funktioniert, und derselben Idee, die anderen Menschen ausgeliefert wird, liegt eine Lücke, und in dieser Lücke beginnt die Verantwortung. Sie an einem einzigen Nachmittag zu überqueren, ist genau das, wofür diese Werkzeuge da sind, und darauf würde ich nicht verzichten. Zu vergessen, dass die Überquerung überhaupt stattgefunden hat, ist das, was mich dorthin gebracht hat, wo ich war.
Die Grenze verlief nie zwischen guten und schlechten Werkzeugen. Sie verläuft zwischen einem Ort zum Denken und einem Ort, um Verantwortung zu tragen, und ein Builder ist ein sehr guter Ort zum Denken.
Happy coding.
MK!
Maria Catalina Kovacs