Em 22 de março de 2016, um incidente surpreendente deixou milhares de desenvolvedores de JavaScript perplexos e preocupados. Serviços online começaram a apresentar comportamentos estranhos e inesperados, deixando a comunidade de desenvolvimento em estado de alerta. O que estava acontecendo era um resultado inesperado de um incidente que começou com a remoção de um punhado de linhas de código, algo que poderia se repetir a qualquer momento, sem aviso prévio.
Para entender completamente o que ocorreu em 22 de março, é necessário retroceder alguns dias antes e mergulhar em uma série de emails entre o programador turco Azer Koçulu e um advogado especializado em patentes.
Para compreender melhor o cenário, é preciso viajar no tempo até 1985 e conhecer a filosofia de Azer Koçulu. Esse desenvolvedor autodidata, residente em Oakland, Califórnia, sempre foi um fervoroso defensor do código-fonte aberto. Inspirado por frases como “o ato fundamental de amizade entre programadores é o compartilhamento de programas”, proferida por Richard Stallman em 1985, Koçulu sempre sonhou em fazer parte da comunidade de código aberto. Em um gesto de gratidão pelas lições que aprendeu com outros programadores, Koçulu se tornou um colaborador ativo na plataforma npm.
“Devo minha trajetória às pessoas que nunca abandonaram a filosofia do código aberto”, declarou Koçulu em uma entrevista. Ele contribuiu com 273 pacotes diversos na plataforma, cada um deles projetado para facilitar a vida de seus colegas desenvolvedores. Devido à sua longa associação com o npm, ele conseguiu reservar palavras-chave significativas para nomear seus pacotes, como “rnd” e “strip”, por exemplo.
No entanto, foi um pacote com um nome aparentemente trivial que desencadeou uma série de eventos que afetaria a internet como a conhecemos. Esse pacote era simplesmente chamado de “kik”.
Conflito
O problema com o pacote “kik” surgiu quando a empresa canadense de mensagens Kik se preparava para lançar seu próprio pacote na plataforma npm. Em 11 de março de 2016, um advogado de patentes chamado Bob Stratton entrou em contato com Azer Koçulu, explicando que ele teria que mudar o nome de seu pacote, pois “kik” era uma marca registrada em muitos países ao redor do mundo. Koçulu recusou a colaboração, argumentando que estava trabalhando no projeto há anos.
Em resposta, Stratton elevou o tom da conversa: “Não queremos ser excessivamente rigorosos, mas essa é uma marca registrada na maioria dos países ao redor do mundo, e se você realmente lançar um projeto de código aberto chamado ‘kik’, nossos advogados de marcas registradas tomarão medidas legais.”
Koçulu também respondeu de maneira agressiva, utilizando linguagem inapropriada. Nesse ponto, Stratton ofereceu uma quantia em dinheiro como incentivo para a mudança de nome, mas os ânimos já estavam exaltados.
O caso poderia ter se desenrolado nos tribunais, mas, surpreendentemente, ele foi parar nas instalações do próprio npm. Apesar de fornecer suporte gratuito à comunidade de código aberto, o modelo de negócios do npm dependia do armazenamento pago de código de grandes empresas. Em outras palavras, eram as assinaturas de empresas como a Kik que permitiam ao npm oferecer serviços gratuitos para entusiastas como Koçulu. O npm decidiu apoiar a empresa canadense.
Isaac Schlueter, CEO do npm, entrou em contato com o desenvolvedor para explicar a situação. O npm estava prestes a transferir o nome “kik” para a empresa Kik, sem o consentimento de Koçulu. Para o programador turco, isso parecia uma traição aos princípios do software livre.
Desiludido, Koçulu tomou a decisão radical de remover todos os seus pacotes do npm, sem exceção. Dois dias depois, a cadeia de eventos que abalaria a internet estava em curso.
As 11 Linhas Fundamentais
O que causou a disrupção na internet não foi a remoção de “kik”, “rnd” ou mesmo “strip”, mas sim a exclusão de “left-pad”, um pacote aparentemente insignificante que Azer Koçulu mal se lembrava de ter criado. Contudo, esse pacote continha apenas 11 linhas de código:
module.exports = leftpad;
function leftpad (str, len, ch) {
str = String(str);
var i = -1;
if (!ch && ch !== 0)
ch = ' ';
len = len - str.length;
while (++i < len) {
str = ch + str;
}
return str;
}
Essa função não era complexa em sua essência, nem difícil de implementar. Basicamente, “left-pad” tinha a função de pegar uma string qualquer e adicionar outra string repetidamente à esquerda, como ilustrado aqui:
leftPad(17, 5, 0) // Retorna "00017"
De forma inexplicável, desenvolvedores de plataformas renomadas como Facebook, Netflix, Paypal e Reddit, que nunca tinham ouvido falar de Azer Koçulu ou de “left-pad”, de repente se depararam com mensagens de erro em suas aplicações. Reclamações surgiram de diferentes partes do mundo, incluindo Austrália, Alemanha, República Checa e Estados Unidos, todos buscando entender o significado da mensagem de erro “Npm ERR! 404 ‘left-pad’ is not in the npm registry.”
Indiretamente, a crise também afetou a Kik, já que a falha impediu o funcionamento de um de seus softwares. Nesse momento, o mundo da tecnologia estava dando voltas.
Foi um efeito cascata que ninguém havia previsto. Surpreendentemente, “left-pad” estava incorporado a mais de 2 milhões de projetos de JavaScript. Este pacote, com uma única função, tinha como um de seus dependentes o pacote “line-numbers”, responsável por adicionar números de linha ao texto. Por sua vez, “line-numbers” era uma dependência do Babel, um projeto significativo que permitia aos desenvolvedores escrever em EcmaScript 6 (ou ES6) e transformar o código resultante em ES5, compatível com a maioria dos navegadores. Curiosamente, o Babel foi criado por Sebastian McKenzie, um estudante do Ensino Médio da Austrália.
“Toda a infraestrutura digital moderna” “Um projeto mantido anonimamente por alguém no Nebraska desde 2003” O Babel, por sua vez, era essencial para o React Native, o framework móvel desenvolvido pelo Facebook, mas adotado por inúmeros projetos em todo o mundo. O React Native dependia do Babel, que por sua vez dependia de “line-numbers”, que dependia de “left-pad”. O estrago estava feito.
Resolvendo o Problema Enquanto Azer Koçulu compartilhava suas motivações em uma postagem no Medium (agora excluída), nos bastidores do npm, o problema estava sendo identificado. Uma decisão sem precedentes foi tomada: reverter a remoção do pacote “left-pad”.
Cameron Westland, associado ao npm, interveio e lançou uma versão funcionalmente idêntica da função “left-pad”, mantendo o mesmo nome do pacote, que estava disponível. No entanto, isso não resolveu o problema, já que algumas dependências ainda estavam esperando explicitamente pela versão 0.3.3, incluindo o “line-numbers”. O npm teve que recorrer a um backup e restaurar a versão original de “left-pad” de Koçulu.
Laurie Voss, diretora de tecnologia do npm, explicou a decisão: “Cancelar a ‘despublicação’ é uma ação sem precedentes que estamos tomando, dada a gravidade e a natureza generalizada da quebra, e não é feita levianamente. Esta ação coloca os interesses mais amplos da comunidade de usuários do npm em desacordo com os desejos de um autor; nós escolhemos as necessidades de muitos.”
A crise durou apenas duas horas, mas durante esse período, a internet foi lançada em um estado de perplexidade devido a 11 linhas de código e à complexa teia de dependências que se entrelaçam nos processos de desenvolvimento. Após o incidente, o Babel foi atualizado para não depender mais do “line-numbers”.
O pacote “left-pad” permanece até hoje, agora marcado como obsoleto no npm. Suas onze linhas de código têm 143 forks no GitHub, e mais de 2.170.445 repositórios ainda o listam como uma de suas dependências.