- Der left-pad-Vorfall ist ein repräsentativer Fall, der den Konflikt von Regeln und Werten zwischen der Open-Source-Community, NPM und Unternehmen zeigt.
- Die Entscheidung, Pakete zu löschen, beruhte nicht auf Logik, Wut oder Gier, sondern auf Aufrichtigkeit und inneren Prinzipien.
- In einer Situation, in der NPM seine eigenen Regeln brach, indem es den Forderungen von Kik Messenger nachgab, entschied sich der Autor, alle seine Pakete zu löschen.
- Nach dem Vorfall veränderte sich die Leidenschaft für Open Source, und das Interesse verlagerte sich auf neue Bereiche wie Business, Marketing und Teamführung.
- Der left-pad-Vorfall wurde zum Anlass für Entwickler und die Startup-Branche, über das Wesen von Open Source und die Komplexität von Entscheidungen neu nachzudenken.
Hintergrund des Vorfalls und die Entscheidung
- Acht Jahre nach dem left-pad-Vorfall teilt der Autor persönliche Erfahrungen und Gedanken.
- Zum Zeitpunkt des Vorfalls verbrachte er die meiste Zeit in der Natur ohne Netzempfang, um sich selbst zu reflektieren, und auch die Entscheidung zur Paketlöschung entstand in diesem Prozess.
- Diese Entscheidung beruhte nicht auf rationalem Urteil, Wut oder Gier, sondern auf einem inneren Prinzip: „Wenn NPM seine eigenen Regeln bricht, dann sollten auch all meine Pakete gelöscht werden.“
- Es ging dabei weniger um einen strengen „Regel-Fetischismus“ als um eine Haltung, die den Geist der Regeln selbst höher gewichtet.
- In einer Situation, in der Unternehmen wie Kik Messenger die Open-Source-Community bedrohten und ihre Macht ausübten, ignorierte NPM die selbst gesetzten Regeln und stellte Unternehmensinteressen über alles.
Die Konfliktstruktur zwischen NPM und Community
- Der Autor hatte keine Angst vor den Drohungen von Kik, aber NPM hatte Angst davor, Kik als Kunden zu verlieren.
- Den Vorfall einfach als „ein wütender Mann widersetzte sich einem Großkonzern“ zu deuten, ist eine vereinfachende Sichtweise, die Kontext, zeitlichen Verlauf und das Gewicht der Entscheidung außer Acht lässt.
- Obwohl die NPM-Seite nicht von etwas Plötzlichem oder Unerwartetem überrascht wurde, zeigte sie insgesamt eine herablassende Haltung gegenüber Entwicklern und schob durch eine Reihe widersprüchlicher Entscheidungen die gesamte Verantwortung auf den Autor.
Paketstruktur und Auswirkungen
- Die Open-Source-Arbeit des Autors war größtenteils nach der Unix-Philosophie in kleine Aufgaben aufgeteilt und bestand aus mehr als 350 Paketen.
- Oberflächlich betrachtet gab es kaum sichtbare Nutzungsspuren, doch weil NPM keine Nutzungsstatistiken veröffentlichte, war das tatsächliche Ausmaß der Auswirkungen nicht erkennbar.
- Nutzer hatten keine Möglichkeit, die realen Folgen der Paketlöschung zu kennen, und auch NPM unternahm keine Anstrengungen, die Auswirkungen zu untersuchen oder Probleme durch wahllose Löschungen zu verhindern.
Veränderungen und Wachstum nach 8 Jahren
- Einige Monate nach dem left-pad-Vorfall kündigte der Autor seinen Hauptberuf, verließ die USA und suchte in neuen Umgebungen wie Marokko, Jordanien, der Türkei und Indonesien seinen eigenen Weg.
- Er erlebte einen todesähnlichen Moment, in dem die Leidenschaft für Open Source abriss, und einen Moment der Wiedergeburt mit neuen Interessen.
- Heute widmet er sich Business, Marketing sowie der Führung von Unternehmen und Teams in verschiedenen Bereichen mit derselben Leidenschaft wie dem Programmieren.
- Mit der Botschaft, dass das Leben weitergeht, bleibt der left-pad-Vorfall ein Anlass, freie Entscheidungen, die Werte der Community und die Komplexität von Entscheidungsprozessen erneut zu reflektieren.
2 Kommentare
Es war ein Vorfall mit großer Wirkung, aber ich denke, dass – selbst ohne den Text des Paketautors zu lesen – die verflochtenen Unternehmen und Systeme stärker schuld waren als er.
Hacker-News-Kommentare
Ehrlich gesagt habe ich bei der Hälfte dieses Blogposts das Gefühl, nicht wirklich zu verstehen, worum es geht, als würde mir irgendein Kontext fehlen, aber ich finde es gut, dass der „left pad guy“ die Ereignisse aufarbeitet.
Allerdings wirkt die folgende Behauptung etwas seltsam.
Nach left-pad habe ich sehr gut verstanden, warum.
Eine eher kleine Anmerkung:
Die libc, die ich heute auf meinem Handy nutze, ist 1 MiB groß, also sechzehnmal größer als die eines klassischen Unix.
Daraus folgt, dass mindestens 90 % von libc gegen die Unix-Philosophie verstoßen.
Wenn man das Lions Book oder APUE gelesen hat und sich dann das
pthreads-Handbuch oder die ANSI-C-Spezifikation vonsetlocale()anschaut, sieht man sofort, dass dort eine völlig andere Philosophie dahintersteht.Wenn man glaubt, das sei dieselbe Philosophie, dann zeigt das nur, dass man mit keiner von beiden wirklich ernsthaft etwas anfangen kann.
Denn die Bedeutung von „one thing“ ist unklar, hilft praktisch überhaupt nicht und erzeugt in der Realität nur Streit.
Man könnte auch sagen, Eclipse mache nur „eine Sache“, nämlich eine IDE zu sein, aber das ist offensichtlich nicht das, was Unix-Entwickler damit meinten.
Es bedeutet ebenso wenig, dass man Bibliotheken mit 11-zeiligen Funktionen schreiben soll.
Der eigentliche Rat sollte eher lauten: „Programme oder Bibliotheken sollten weder zu viel noch zu wenig tun.“
Wo genau zu viel beginnt und zu wenig aufhört, ist letztlich eine Frage von Erfahrung und Fingerspitzengefühl.
Danke an akoculu, dass er diesen Text geschrieben hat.
Für mich ist dieser Vorfall ein klares Beispiel für die JavaScript-Community, also für ein Ökosystem, das sich zu stark auf Abhängigkeiten stützt.
Ich verstehe nicht, warum so viele Leute ihm die Schuld geben.
Er hat lediglich ein Paket mit 11 Zeilen Code unpublisht und konnte die Nebenwirkungen davon wahrscheinlich nicht vollständig vorhersehen.
Der Autor schreibt selbst:
Die Versionshistorie des
kik-Pakets sieht merkwürdig aus.Es wurde vor 9 Jahren durch ein Security-Holding-Paket ersetzt.
Versionshistorie des
kik-PaketsDie größte Ironie in dieser ganzen Sache ist am Ende das
kik-Paket.Das Paket
kik, das Kik unbedingt haben wollte, ist am Ende völlig nutzlos.Und die Firma Kik hat sich später selbst als nachlässig und problematisch erwiesen.
Es gab Kontroversen rund um Krypto, und das Unternehmen wurde zudem stillschweigend als Plattform für die Verbreitung von Kinderpornografie und Ähnlichem genannt.
Siehe Darknet Diaries, Episode 93
Deshalb fühlt es sich im Nachhinein fast befriedigend an, dass Azer Koçulu gegenüber Kik so entschieden Nein gesagt hat.
Am Ende bedeutet das also ... dass das alles letztlich völlig sinnlos war?
Schon die Tatsache, dass
left-padüberhaupt als Paket existiert, ist ziemlich absurd.Wegen einer einzigen String-Padding-Funktion wurden über CDN, Proxys, Build-Pipelines und Ähnliches gewaltige Datenmengen bewegt.
Ich stimme zu, dass es sinnvoll ist, bestehende Lösungen gut zu nutzen, aber dass man bei einer simplen Funktion zum Auffüllen einer Zeichenkette denkt: „Dafür gibt es bestimmt ein Paket“, ist schwer nachzuvollziehen.
Ein Teil der damaligen Debatte bestand darin, Webentwickler aus ihrer blinden Fixierung auf Mikropakete aufzurütteln.
Es gab auch eine Kultur, in der Pakete veröffentlicht wurden, um Popularität oder GitHub-Stars zu sammeln.
Gleichzeitig war die Haltung verbreitet, keine Funktion selbst zu implementieren, wenn sie sich per npm installieren ließ.
Viele Entwickler, mit denen ich heute arbeite, bevorzugen immer noch selbst sehr einfache Pakete.
Für sie lautet die Begründung: „Das reduziert den Wartungsaufwand.“
Eine ziemlich ironische Realität.
Auch die ursprüngliche Implementierung des Pakets scheint ineffiziente Operationen in
O(n^2)stattO(n)auszulösen.Siehe Wikipedia
Gibt es qualitativ wirklich einen großen Unterschied zwischen dem Rückgriff auf Utility-Funktionen aus fremden Projekten und der Nutzung eines Pakets, das bereits im gesamten Ökosystem verbreitet ist?
Es ist nicht exakt dasselbe, aber in einer Umgebung mit ausgereiften Tools liegen die beiden Ansätze meiner Meinung nach praktisch gar nicht so weit auseinander.
Dieses extreme Streben nach maximaler Wiederverwendung von Code, als wäre Copy-Paste eine veraltete Methode.
Ist das vielleicht ein ähnlicher Fall wie bei KI?
Probleme, die sich schon mit einer simplen Suche lösen ließen, werden in der Praxis stattdessen mit unzähligen Prompts erneut an eine KI gestellt.
Eine Struktur, die C&P nur um einen unnötigen zusätzlichen Schritt erweitert.
Die Unix-Philosophie lautet „do one thing well“.
Bei left-pad wurde die zweite Bedingung — „well“ — verfehlt.
Es hat mich überrascht, dass so viele Projekte die naive Implementierung einfach übernommen haben.
Eine stärker optimierte Implementierung könnte schneller und gleichzeitig kleiner sein.
Ich kenne mich mit der JavaScript-Kultur nicht besonders gut aus, aber ich meine mich zu erinnern, dass es eine Art Wettbewerb gab, die npm-Downloadzahlen hochzutreiben.
left-pad hatte 1,4 Millionen Downloads pro Woche, is-even 160.000 Downloads.
Manche haben aus Spaß Mikropakete als Abhängigkeiten hinzugefügt, andere, um die Popularitätskennzahlen ihrer Bibliothek zu steigern.
Es gab auch Widerstand dagegen, Pakete wie
is-evenin intern genutzte Teile bekannter React-basierter Bibliotheken einzubauen.Dahinter stand eine strikte Regel nach dem Motto: „Wenn man den Code selbst schreiben kann, soll man ihn trotzdem importieren.“
Verwandte Geschichte: Warum das Paket
is-oddin einer Woche fast 3 Millionen Mal installiert wurdeMich würde ein Beispiel für eine „nicht naive Implementierung“ interessieren.
Ich bin Maintainer eines beliebten npm-Pakets.
Ich kann das sehr gut nachvollziehen.
npm begann irgendwann, sich von der Zusammenarbeit mit der Community zu entfernen.
Die Übernahme durch Microsoft hat das nur weiter verfestigt, aber die Anzeichen waren schon lange vorher deutlich.
Viele Aspekte der Arbeitsweise von npm, das unkooperative Verhalten gegenüber der Community bzw. dem Node-Team, die starke Fokussierung auf Kommerzialisierung und der Ruf mancher Beteiligten waren in vieler Hinsicht unerquicklich.
Ich erinnere mich daran, das Büro in Oakland besucht zu haben; die Interaktion an diesem Tag war nicht besonders positiv, deshalb gehe ich nicht weiter ins Detail.
Die Lücke rund um
unpublishwar damals ein Problem, das allen bewusst war.Alle gaben nur dem Autor die Schuld, nach dem Motto „left-pad hat das Internet kaputtgemacht“, aber tatsächlich war das Missmanagement bei npm der größere Faktor.
Wenn ich mich richtig erinnere, wurde das Paket sogar gegen den Willen des Maintainers zwangsweise wiederhergestellt; das war eine Maßnahme, die völlig von der Community abgekoppelt war, die npm angeblich vertreten wollte, und zumindest rechtlich ebenfalls fragwürdig.
Danach kümmerte sich npm kaum noch um Missbrauch, Spam und Ähnliches, etwa core.js-Werbespam, und beteiligte sich auch kaum an Diskussionen mit der Community über Standards und Kompatibilität.
Auch das Release von
npm@5war ein großes Desaster, und die Einführung von Paket-Lockfiles ebenfalls ein Chaos.(Dass das Node-Team Releases nicht zurückhielt, um auf npm zu warten, halte ich im Rückblick eher für eine gute Entscheidung.)
Die Kommunikation mit der Community war zu der Zeit geprägt von großen Bugs, Schuldzuweisungen an die Community und einem herablassenden Tonfall.
Das war ein klares Zeichen dafür, dass npm nicht mehr für den Geist von Open Source stand.
Ich weiß nicht mehr genau, ob left-pad davor oder danach war, aber das gesamte Ökosystem befand sich damals in einer längeren Phase von Stagnation und Verwirrung.
npm-Pakete gelten heute leicht als eine Art Meme, bei dem selbst triviale Funktionen als eigenes Paket erscheinen, aber im Kontext betrachtet war npm der erste leicht zugängliche Paketmanager für eine neu aufkommende populäre Technologie, wurde gemeinschaftsgetrieben betrieben und war organisch in GitHub integriert.
Das war noch in den frühen Node-Zeiten, vor ES5, in der Ära von
varundprototype, noch bevor Joyent Node.js an die Community übergeben hatte und vor dem io.js-Fork sowie der langen Stagnationsphase von Node 0.10/0.12.Es war eine Zeit, in der niemand so recht wusste, was Best Practices überhaupt sein sollten.
Ich kann die Perspektive des Autors daher sehr gut nachvollziehen.
Aus Sicherheitssicht war der left-pad-Vorfall, wenn auch unbeabsichtigt, ein wichtiger Weckruf hinsichtlich der Trennung zwischen Unternehmen und Communities im Ökosystem sowie in Bezug auf Supply-Chain-Security.
Er hat wichtige Diskussionen über mehr Redundanz und mehr Sicherheit ausgelöst.
Ich denke, der Branche hat das am Ende gutgetan.
Nach so langer Zeit ist es interessant, das noch einmal zu lesen.
npm war nicht der erste Paketmanager irgendeiner Sprache, und viele Leute hatten schon damals davor gewarnt, dass es so viele winzige Pakete gab.
Ich denke, npm und das gesamte JS-Ökosystem wurden ein Opfer des Trends.
Diskussionen aus der Zeit des left-pad-Vorfalls:
Hacker-News-Diskussion
Warum hat Java mit Apache Commons und Google Guava vertrauenswürdige Utility-Bibliotheken, JS aber nichts Vergleichbares?
Auch in JavaScript gibt es mit Lodash eine etablierte und vertrauenswürdige Utility-Bibliothek. Die meisten ihrer Funktionen sind heute allerdings im Vergleich zu früher bereits in der Standardbibliothek enthalten.
Tatsächlich bot Lodash
pad/padStart/padEndschon drei Monate vor dem left-pad-Vorfall an.Lodash-pad-Dokumentation
Ich denke, die wichtigste Ursache ist die Kultur, danach eine gut gestaltete Standardbibliothek und danach das Vorhandensein von Tools, die verhindern, dass man mehr als 300 nutzlose Pakete in die Abhängigkeiten stopft.
Maven ist wirklich ein sehr gut designtes Tool — ironischerweise obwohl es ständig beschimpft wird — und ein Geheimnis des Java-Erfolgs.
Dass es dort keine kommerziellen Kompromisse wie bei npm gibt, liegt daran, dass Java mit der Apache Foundation eine gut unterstützte, gemeinnützige, communitybasierte Organisation hat. (Solche Strukturen sind sehr selten und in Javas Fall ein glücklicher Zufall, der aus seiner komplizierten rechtlichen Geschichte entstanden ist.)
(Auch im JS-Ökosystem gibt es viele gute Bibliotheken. Das Problem war eher, dass das Paketmanagement zu zentralisiert und zu schlecht verwaltet war.)
Google Guava ist eher mit lodash vergleichbar und nicht mit left-pad.
Früher übernahmen Bibliotheken wie Jquery und Underscore diese Rolle.
Ich finde es immer wieder erstaunlich, wie viele Unternehmen nicht alle für Builds nötigen Abhängigkeiten intern spiegeln.
Man sollte den gesamten Build-Prozess offline als Clean Build durchführen können; sich nur auf den Download-Cache zu verlassen, ist letztlich Glückssache.
In meinen Projekten werden Abhängigkeiten immer intern vendored.
Das ist vorhersehbar, erlaubt auch Offline-Builds, und Speicherplatz ist billig.