cat left-pad.md
N°023Dipendenze e fragilitàJavaScript
leftPad(str, len, ch)
Le undici righe che ruppero il web nel 2016
Il 22 marzo 2016 un programmatore rimosse per protesta tutti i suoi pacchetti dal registro npm. Uno di essi, left-pad, conteneva undici righe di codice elementare, ma era usato indirettamente da mezzo mondo. Questo pezzo racconta come la sua sparizione abbia rivelato quanto fragile e interdipendente sia diventato il software moderno.
- Anno
- 2016
- Era
- 2010-2019
- Linguaggio
- JavaScript
- Reperto
- 11 righe
Un gesto di protesta
Il 22 marzo 2016 un programmatore di nome Azer Koçulu fece qualcosa di drastico per protesta. Aveva sviluppato un pacchetto chiamato Kik, e l'omonima azienda di messaggistica lo accusava di violazione di marchio, chiedendogli di rinominarlo. Dopo che il registro npm — la piattaforma centrale dove i programmatori JavaScript condividono e scaricano pacchetti di codice riutilizzabile — diede ragione all'azienda trasferendo il nome, Koçulu reagì rimuovendo per protesta tutti i suoi pacchetti, oltre un centinaio, dalla piattaforma. Li cancellò dal pubblico, in blocco.
Tra quei pacchetti ce n'era uno apparentemente insignificante, chiamato left-pad. Faceva una cosa sola e banalissima: aggiungeva caratteri all'inizio di una stringa finché questa non raggiungeva una certa lunghezza. Per esempio, trasformava il numero 7 in 007 aggiungendo zeri davanti. Undici righe di codice elementare, il genere di funzione che qualunque programmatore principiante saprebbe scrivere in due minuti.
Eppure, nel giro di pochissimo tempo dalla sua rimozione, qualcosa di apparentemente assurdo cominciò ad accadere in tutto il mondo: progetti software enormi e importantissimi smisero di compilare. Sviluppatori che non avevano mai sentito nominare left-pad si trovarono di colpo con build interrotte e messaggi d'errore. Undici righe scomparse stavano paralizzando una fetta del web.
La torre di dipendenze invisibili
La spiegazione di questo paradosso sta in una parola: dipendenze. Nel modo moderno di sviluppare software, quasi nessuno riscrive da zero le funzioni di uso comune. Le si prende già pronte, dichiarando che il proprio progetto dipende da un certo pacchetto. Quel pacchetto, a sua volta, dipenderà da altri, che dipenderanno da altri ancora, in una catena profonda e ramificata. Quando installi un singolo strumento, dietro le quinte vengono scaricati automaticamente decine o centinaia di pacchetti collegati, la maggior parte dei quali non hai mai scelto né visto.
Left-pad era uno di questi anelli nascosti. Pochissimi progetti lo usavano direttamente, ma era una dipendenza di altri pacchetti molto popolari, che a loro volta erano dipendenze di strumenti usatissimi come Babel, un componente fondamentale dell'ecosistema React di Facebook. Così, lungo questa catena invisibile, le undici righe di left-pad erano finite, indirettamente, dentro un numero gigantesco di progetti in tutto il pianeta. Nessuno lo aveva deciso; era emerso dalla rete di dipendenze.
Quando left-pad sparì dal registro, tutti gli anelli che lo richiamavano si spezzarono a catena. Installare uno qualsiasi di quei pacchetti popolari falliva, perché a un certo punto del processo il sistema cercava di scaricare left-pad e non lo trovava più. Un singolo pacchetto rimosso aveva fatto crollare, come tessere del domino, una porzione enorme dell'infrastruttura di sviluppo mondiale.
Lo specchio di una fragilità
L'incidente fu risolto in fretta — il registro npm prese la decisione eccezionale di ripristinare left-pad per fermare l'emorragia — ma lo shock culturale fu profondo e duraturo. Il mondo dello sviluppo si guardò allo specchio e vide qualcosa di inquietante: la torre maestosa del software moderno poggiava, in parte, su fondamenta minuscole e fragili, mantenute da singoli individui senza alcuna garanzia. Una persona arrabbiata, in un pomeriggio, aveva potuto involontariamente rompere il lavoro di migliaia di altre.
Il dibattito che ne seguì toccò domande scomode e ancora aperte. Ha senso dipendere da un pacchetto esterno per undici righe che si scriverebbero in un minuto? Quanto conosciamo davvero la montagna di codice che importiamo con un solo comando? Cosa succede se uno di quei minuscoli mattoni, scritto da uno sconosciuto, viene rimosso, abbandonato, o peggio, modificato di nascosto con codice malevolo? Quell'ultima domanda si sarebbe rivelata profetica: negli anni successivi, attacchi che compromettono pacchetti molto diffusi per colpire chi li usa — i cosiddetti attacchi alla catena di approvvigionamento — sarebbero diventati una minaccia concreta e seria.
Perché custodirlo
Left-pad merita una teca perché è il simbolo perfetto di una verità contemporanea: il software non è più scritto, è assemblato. Costruiamo cose grandi incastrando pezzi prodotti da migliaia di sconosciuti, in una collaborazione globale di una potenza straordinaria e di una fragilità altrettanto straordinaria. Quelle undici righe rendono visibile, in un colpo solo, sia il miracolo che il rischio di questo modo di lavorare.
C'è un equilibrio sottile da cogliere, e il reperto lo incarna alla perfezione. Riutilizzare codice altrui è una delle più grandi conquiste della programmazione: evita di reinventare la ruota, accelera tutto, mette a disposizione di chiunque il lavoro dei migliori. Ma ogni dipendenza è anche un atto di fiducia e un punto di fragilità. La forza dell'ecosistema — la facilità con cui si condivide e si riusa — è esattamente anche la sua debolezza.
Custodire `leftPad` significa ricordare di guardare in basso, verso le fondamenta che diamo per scontate. Le infrastrutture più critiche sono spesso le più invisibili e le meno curate, sorrette dalla buona volontà di pochi. Il reperto insegna una sana consapevolezza: sapere da cosa dipendiamo, non importare alla cieca, e ricordare che dietro ogni comando di installazione c'è una rete di esseri umani e di fiducia che, qualche volta, può spezzarsi.
Punti chiave
- Il 22 marzo 2016 Azer Koçulu rimosse per protesta tutti i suoi pacchetti da npm, dopo una disputa sul nome «Kik».
- Tra questi c'era left-pad: appena 11 righe per aggiungere caratteri all'inizio di una stringa.
- Era una dipendenza indiretta di strumenti popolarissimi come Babel, quindi presente in moltissimi progetti.
- La sua rimozione ruppe a catena le build di una porzione enorme dell'ecosistema JavaScript mondiale.
- npm ripristinò eccezionalmente il pacchetto; l'episodio rivelò la fragilità delle dipendenze del software moderno.
- Anticipò il tema degli attacchi alla catena di approvvigionamento: il software oggi è assemblato, non scritto.