Categorias

Onze linhas de código que quebraram a internet

Em 22 de março de 2016, milhares de desenvolvedores de JavaScript foram para seus projetos, seus escritórios e esbarraram em um problema aparentemente inexplicado. Serviços pararam de funcionar. Sites apresentaram funcionalidades quebradas. Durante horas, ninguém sabia o que estava realmente acontecendo. Era o ponto final de uma queda maciça de dominós que havia começado lá atrás com o sumiço repentino de apenas 11 linhas de código… e o que aconteceu naquele dia pode se repetir a qualquer momento, sem aviso.

Para entender o 22 de março, é necessário recuar alguns dias para uma troca de emails entre o desenvolvedor turco Azer Koçulu e um advogado de patentes.

Para entender ainda melhor, é necessário recuar até 1985 e conhecer a mente de Azer Koçulu. O programador residente de Oakland, na Califórnia é um defensor ferrenho do código-aberto. Em 1985, Richard Stallman declarou: “o ato fundamental de amizade entre programadores é o compartilhamento de programas”. E Koçulu era um adepto fervoroso dessa doutrina. Como um auto-didata que aprendeu tudo que sabia de desenvolvimento com o trabalho voluntário de outros programadores, seu maior sonho era fazer parte dessa comunidade. Para devolver o conhecimento que recebeu, Koçulu se tornou um colaborador ostensivo do npm.

“Devo tudo o que tenho às pessoas que nunca desistiram da filosofia do código aberto”, declarou Koçulu, em entrevista. Ele chegou a ter 273 pacotes registrados na plataforma, com os mais diversos nomes. Eram pequenos utilitários, pequenas funções em JavaScript que serviriam para facilitar a vida de seus camaradas desenvolvedores. Como Koçulu foi um dos pioneiros do npm, ele conseguiu registrar palavas-chave de peso para nomear seus pacotes (como “rnd” e “strip”, por exemplo).

Entretanto, não foi um nome óbvio que causou a cascata que derrubaria a internet. Foi um pacote chamado simplesmente de “kik”.

Bate-boca

O pacote “kik” tinha a infelicidade de compartilhar o mesmo nome de um aplicativo de mensagens com sede no Canadá, o Kik. A empresa estava se preparando para publicar seu próprio pacote no npm quando esbarrou no entrave. Em 11 de março de 2016, um advogado de patente chamado Bob Stratton entrou em contato com Azer Koçulu, para explicar que ele teria que mudar o nome de seu pacote. O desenvolvedor se recusou a colaborar, argumentou que já estava trabalhando no projeto havia anos.

Então, Stratton subiu o tom: “não queremos ser babacas sobre isso, mas é 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 vão bater na sua porta e derrubar as suas contas e coisas assim”.

Por sua vez, Koçulu também escalou a conversação, empregando palavrões em sua resposta. Foi a vez de Stratton oferecer uma quantia em dinheiro pela alteração, porém os ânimos já estavam exaltados.

O caso poderia ter parado nos tribunais, mas, na verdade, foi parar nos escritórios do próprio npm. Apesar do repositório oferecer amparo gratuito para a comunidade de código aberto, seu modelo de negócios é baseado no armazenamento pago de código de grandes empresas. Em outras palavras, são as assinaturas de empresas como a Kik que permitem que o npm ofereça serviços gratuitos para entusiastas como Koçulu. O npm tomou as dores da empresa canadense.

Isaac Schlueter, presidente executivo da npm, entrou em contato com o desenvolvedor para explicar a situação. O npm iria passar o nome “kik” para a empresa Kik, à revelia de Koçulu. Para o programador turco, aquilo parecia uma punhalada nas costas. Tudo que ele acreditava sobre software livre estava sendo jogado pelos ares, no seu entendimento.

Amargurado, Koçulu tomou a decisão de remover todos os seus pacotes do npm, sem exceção. Dois dias depois, a fileira de dominós quebrou no mundo inteiro.

11 linhas básicas

Não foi o sumiço de “kik”, nem de “rnd” ou mesmo de “strip” que causaram o caos na internet. Foi o sumiço de “left-pad”, um pacote menor do qual nem o próprio Koçulu lembrava mais. Eram 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;
}

Não é uma função complexa de se compreender, nem difícil de se implementar. Tudo que “left-pad” faz é pegar uma string qualquer e adicionar outra string qualquer repetidas vezes a partir da esquerda. Desta forma:

 leftPad(17, 5, 0)
// Retorna "00017"

Misteriosamente, desenvolvedores de grandes plataformas como Facebook, Netflix, Paypal, Reddit, profissionais que nunca tinham ouvido falar de Azer Koçulu ou mesmo de “left-pad”, estavam encontrando mensagens de erro em suas aplicações. Reclamações da Austrália, Alemanha, República Checa, Estados Unidos, de todas as partes do planeta, estavam brotando. Todos queriam saber o que significava a mensagem “Npm ERR! 404 ‘left-pad’ is not in the npm registry.”

Indiretamente, a crise chegou a atingir a Kik. A falha impedia um de seus softwares de funcionar. Naquele momento, o mundo tinha dado voltas.

Era um efeito cascata que ninguém tinha previsto. Sem alarde, “left-pad” estava presente em mais de 2 milhões de projetos de JavaScript. O pacote com uma única função tinha como um de seus dependentes o pacote “line-numbers”, que adiciona números de linha ao texto. O pacote “line-numbers”, por sua vez, era utilizado em Babel, um projeto gigante com uma função poderosa: ele permite que desenvolvedores possam escrever em EcmaScript 6 (ou ES6) e transformar o resultado em código compatível com ES5, executável em qualquer lugar. Curiosamente, Babel foi criado por Sebastian McKenzie, um estudante de Ensino Médio da Austrália.

“Toda a infraestrutura digital moderna”
“Um projeto que uma pessoa randômica no Nebraska vem mantendo ingratamente desde 2003”

Por sua vez, Babel faz parte do núcleo do React Native, o framework móvel criado para o Facebook, mas implementado por projetos no mundo inteiro. O React Native depende de Babel que dependia de “line-numbers” que depende de “left-pad”. O estrago estava feito.

Desfazendo o problema

Alheio às consequências inesperadas de seus atos, Koçulu publicava naquele dia uma postagem no Medium (já apagada) relatando os motivos que o levaram àquela decisão. Enquanto isso, nos bastidores do npm, o problema foi identificado e uma decisão inédita foi tomada: desfazer a remoção do pacote “left-pad”.

Cameron Westland, ligado ao próprio npm, interveio e publicou uma versão funcionalmente idêntica da função “left-pad”, com o mesmo nome de pacote (que estava vago). Não resolveu. O novo “left-pad” foi publicado na versão 1.0.0 e algumas dependências estavam esperando explicitamente a versão 0.3.3, incluindo “line-numbers”. O npm teve que recuperar um backup e restaurar o “left-pad” original de Koçulu.

“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”, escreveu Laurie Voss, diretora de tecnologia da npm. Ela justificou a decisão: “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”.

Toda a crise durou apenas duas horas. Mesmo assim, nessas duas horas, a internet mergulhou em perplexidade por causa de 11 linhas de código e a forma como o sistema de dependências se entranhou nos processos de desenvolvimento. Depois do incidente, Babel foi atualizado sem a dependência para “line-numbers”.

O pacote “left-pad” existe até hoje. Ele agora é um pacote marcado como obsoleto no npm. Suas onze linhas possuem 143 forks no GitHub. Dois milhões, cento e setenta mil e quatrocentos e quarenta e cinco repositórios estão marcados como seus dependentes até hoje.