A web é a prova de que falhamos miseravelmente
Talvez o maior desperdício da minha vida, assim como da vida de um exército de desenvolvedores, foi dedicar tanta energia em desenvolver e publicar e manter e jogar fora e refazer e republicar essas porcarias dessas “web applications”. A web tornou-se a maior prova da estupidez humana e a cada dia que passa esse buraco negro está sugando mais jovens cheio de energia e faltos de entendimento das coisas nessa dança de marionetes em direção ao Grande Ciclo do Vazio, em que tudo o que é feito hoje será desfeito amanhã e no qual a busca pelo jeito certo de fazer os “sistemas web” é eterna, sendo que nunca poderemos alcançá-lo, simplesmente porque começamos de um jeito completamente errado.
Just like the Pied Piper
Led rats throught the streets
We dance like marionettes
Swaying to the Symphony of Destruction!
-- Symphony of Destruction do Megadeth
[Nota: esse artigo é um “rant”. Ele é negativo e reclamão, mesmo, e embora possa ser, sim, construtivo, não é seu propósito terminar com uma lição para a vida ou uma sugestão de como as coisas podem melhorar. Escrever “rants” é uma espécie de arte, assim como escrever crônicas. Aprecie o texto pelo que ele é e não ache que estou ralhando com você ou algo assim.]
Tudo vira lixo: um estudo de caso
No princípio havia o Unix e um cara, talvez o Rob Pike, talvez o Ken Thompson, talvez os dois, disse que “tudo é um arquivo” e que “faça uma só coisa e faça com perfeição”. Mas isso não foi o bastante para combater a gana desenvolvedora dos jovens programadores que acham que quanto mais código escreverem e quanto mais “funcionalidades” puderem socar dentro de um programa, mais legais eles serão.
Que diabos, leia o manual do raio do comando cat
em qualquer distro Linux e
você entenderá o que eu quero dizer.
O RAIO
DO
COMANDO
CAT
O que essa desgraça deveria fazer? Ler um ou mais arquivos e “imprimir” na tela. Só isso. Só precisa abrir os arquivos na ordem que o usuário passou e ir jogando tudo na tela do raio do terminal. Ok? Podemos fazer isso?
Não.
Não podemos fazer isso.
Um belo dia um miserável, provavelmente na faixa dos vinte e poucos anos, resolve
que não, “só” abrir um raio de um arquivo não é suficiente. Essa peste decide que
o cat
ficará muito mais “irado” e muito mais “sinistro”, quiçá mais “supimpa”
se, além da tarefa mais trivial do universo, que é abrir uns arquivos e
imprimir o conteúdo deles na tela ou na impresso ou no que quer que seja a saída
padrão, ele também numere linhas.
Mas só se você quiser, claro.
Ou suprima linhas em branco repetidas.
Mas só se você quiser.
Ou imprima um '$' no fim de cada linha.
Mas, veja só, só se você quiser.
É um verdadeiro favor que essa criatura fez para a humanidade. Se antes o cat
tinha 50 linhas, agora ele tem 250. Olha que maravilha!
Obrigado, jovem. #todosaplaude
Unix é lixo
Não fosse essa leitura, talvez você nunca ficasse sabendo da triste verdade sobre o tão amado Unix: foi uma ideia bacana que gerou um “produto” legal, mas o Unix é o equivalente da “V1” que serviu para alavancar a empresa e que hoje serve uma porção de clientes mas que acaba tão miseravelmente arraigada que obriga a equipe de desenvolvimento a conviver com ela por um tempo muito mais longo do que todos gostariam, mesmo que todo mundo saiba o quão problemática ela é e quantas decisões erradas foram tomadas no passado e quão melhor será a “V2” que nunca consegue deixar o papel e, mesmo que seja o caso, dificilmente vai ao ar oficialmente porque sempre há algum empecilho no caminho.
Empresas já faliram por tentar botar a “V2” no ar.
O Unix não foi sempre um lixo, assim como o cat
nem sempre numerou linhas (mas
só se você quiser!). O Unix era elegante e simples por algum tempo, até que algum
jovem (pensem, humanos: o BSD é coisa de universidade! Certamente algum garoto
meteu a mão nele) resolveu criar os “maravilhosos” sockets.
Ora, qual é o problema dos sockets? Simples: um socket não é um arquivo. Você não “lê” de um socket, você “recebe”, assim como não “escreve”, mas “envia”.
Você consegue listar sockets com o comando ls
? Não. Você consegue
estatísticas sobre os sockets abertos com cat /proc/net/tcp
ou cat
/proc/net/udp
. Mas sockets não são arquivos.
E depois (ou antes) implementaram sinais. E você pode não conseguir perceber, porque essa situação caótica tornou-se o “normal” para você, mas como uma bola de neve descendo um ladeirão branco, uma coisa levou à outra e hoje o kernel Linux tem mais de 400 syscalls.
E os *BSD não estão assim muito melhor, não.
E quando aparece alguma “maravilhosa inovação” como o controle de “capabilities”, #todosaplaude, certo? Porque é bom, certo? É ótimo, mas nunca será nada mais que um chuncho, uma baita enjambração, porque se tudo fosse o raio de um arquivo ninguém teria que ficar criando uma syscall atrás da outra porque o bom e velho sistema de permissões de arquivos resolveria tudo de maneira simples e eficiente.
Lembra dele, o chmod
? Pois é. Já pensou que ao invés de ficar configurando
CAPS
você poderia liberar ou bloquear tudo o que um programa e seus filhos podem
fazer só usando chmod?
Mas, não, assim não é bacana, certo? Simples demais. Pra que facilitar se podemos dificultar?
A web é lixo
Aqui perto de casa tem uma panificadora movimentada que dá de frente para uma rua com largura para somente três carros. E não há faixa amarela proibindo estacionar em nenhum lado. O resultado é que estacionam de ambos os lados e resta somente a lacuna central para se passar com o carro.
Tudo bem: não há sinalização, então ninguém está errado.
Mas frequentemente um ou outro espertinho, andando pela lacuna central, percebe que do lado certo para ele estacionar, ou seja, à sua direita, não há vagas, enquanto à sua esquerda, ou seja, na contra-mão, há uma ou outra vaga. E o que o triste faz? Estaciona na contra-mão.
E eu sempre fico tentado a parar do lado do veículo de uma dessas figuras e dizer: “ei, tá estacionado errado”. A pessoa vai achar que o carro ficou torno na vaga e vai ou tentar “consertar” ou dizer que “não está errado”.
“Meu filho, se você para NO RAIO DA CONTRA-MÃO, você NUNCA estará estacionado certo.”
A web está na contra-mão. E é por isso que nós, “desenvolvedores web” estamos literalmente patinando nesse ofício lascado como um exército de Sísifos empurrando suas pedras até o topo da montanha, apenas para que elas rolem novamente até o chão no dia seguinte.
“Ah, mas eu uso Javascript moderno, não essa tralha do passado [literalmente: do ano passado] que você insiste em continuar usando”, um diz para o outro, sem perceber que todas as pedras são do mesmo tamanho, no mesmo formato e com o mesmo peso, e só o que muda são as luvas que cada um usa.
É triste ver a baderna que nós criamos. Diabos!, nós ficamos a toda hora reimplementando sistemas de autenticação. Nós nos reunimos para discutir o melhor formato de armazenamento dos dados. Que são meio que os mesmos dados de sempre, só que agora temos mais uns campos apontando para outros elementos “do sistema”.
Nós temos essa sensação de que as pessoas só usarão nossos sistemas se eles forem bonitos e com “uma UX maravilhosa”, sendo que só o que as pessoas querem é que tudo funcione com o mínimo de atrito possível.
Mas a cada dia que passa incontáveis Joules são gastos reimplementando as mesmas porcarias de sempre, que são erradas por natureza para começo de conversa. Você já viu quantos clones do Trello existem por aí?
Você já tentou contabilizar todas as coisas que o seu navegador, que é um programa
só, faz? Você nunca se perguntou por que a “filosofia Unix” é tão bonita em
escala pequena (como o cat
) mas parece nunca ser aplicada em maior escala?
O código fonte do Firefox é monstruoso. E vergonhoso.
O repositório dessa infâmia demora meia hora para ser clonado. E é capaz de haver mais linhas de código no Firefox do que no kernel Linux — que é outro monstro absurdo, diga-se de passagem.
(E por que alguém, em sã consciência, resolve usar mercurial? Eu só quero clonar
o tal repositório e essa parada já está tentando me convencer a usar um tal de
fsmonitor
, sem o qual ele admite ficar mesmo miseravelmente lento.)
...
(E agora o dito cujo está sugando toda a memória da minha máquina. É inacreditável: o mercurial está gastando mais memória, nesse momento... do que o Firefox!!!)
Olha só, encontrei outro software para odiar. Bem-vindo à família, mercurial!
Vocês sabe quantas malditas linhas de código esse projeto infernal tem? É,
você percebeu que eu fiquei [ainda mais] alterado nesse ponto, porque já
faz quase 10 minutos que eu botei um cloc
(“count lines of code”) para
rodar e o dito cujo ainda está tentando contabilizar quanto lixo tem nessa
pilha gigantesca.
Mas, veja bem, eu sou um usuário do Firefox. Eu realmente aprecio tanto o navegador quanto boa parte do trabalho da Mozilla. Pelo que eu vejo, entre os sujos, eles são a espécie menos fétida. E, mesmo que os meios sejam terríveis, me parece que há um anseio bacana na Mozilla para fazer da internet um lugar realmente livre. E eu aprecio isso.
Mas a questão aqui é ontológica: o problema, caro leitor, reside na quintessência do que é desenvolver software. A “filosofia Unix” existe por um motivo. Os caras que a trouxeram à tona já desenvolviam software havia muito tempo e, naquela época, o cenário era caótico como hoje. O Unix surgiu enquanto os caras estavam ocupados tentando domar uma besta gigante chamada “MULTICS”. E a experiência foi mostrando a eles que padrões coerentes e simples é muito melhor do que a arrogância de tentarmos fingir que somos capazes de lidar com programas com milhões de linhas de código.
Hoarde (foi ele, certo?) já diria que há duas maneiras de se desenvolver software: tão simples a ponto de não restarem erros óbvios ou tão complexos a ponto de não restarem erros óbvios.
Você escolhe.
O cloc
ainda não terminou e eu te pergunto: você realmente acha seguro
executar código alheio (Javascript é exatamente isso, meu filho) na mesma “caixa
de areia” em que você digita a senha do seu cartão de crédito? Você já considerou
que está depositando muita confiança em um programa absurdamente grande, com,
literalmente, milhões de linhas de código?
Quantos bugs escondem-se entre essas linhas? Eu tenho visto muita gente usando a proporção 1/25, mas digamos que seja 1/1.000: ... PAUSA.
*Eu achei estranho demorar tanto, fui no diretório onde clonei o Firefox e resolvi
excluir o diretório .hg
. O que eu vi (rm -rfv .hg
) me deixou horrorizado.*
O Firefox tem cerca de 261.408 arquivos. ARQUIVOS. Se eu considerar que há um bug a cada 1.000 ARQUIVOS, e praticando a extrema benevolência de tentar ignorar os muitos arquivos de testes automatizados e scripts de build ou outros utilitários, ou seja, considerando que, quando você usa o Firefox para ver algum “website” você toca em meros 25.000 arquivos, poderíamos considerar que ele tem cerca de 2.500 bugs a serem descobertos.
DOIS MIL.
E QUINHENTOS.
BUGS.
Nessa tralha que você usa para acessar o internet banking.
Pegamos o gosto pelo lixo
Você pega um lixo repleto de lixo e em cima disso acha que vai construir o quê? Diabos, mais lixo, oras!
Há um caso interessante que mostra o quão funestamente perdidos nós estamos.
O ano era 2014 e um mesmo trabalho de processamento e análise de dados foi feito usando a linha de comando, com comandos e pipes e tudo o mais e, do outro lado, usando o “Amazon Elastic Map Reduce”/Hadoop.
O cálculo que o Hadoop demorou cerca de 26 minutos para fazer foi concluído em 12 segundos.
DOZE.
SEGUNDOS.
Estamos nessa época estranha em que o sujeito se depara com alguns terabytes de dados e logo pensa “oh! Eu preciso usar ferramentas de Big Data para lidar com isso”.
“Ferramentas de Big Data”. Eu poderia apostar que 90% dos casos em que alguém pensa assim poderiam muito bem ser resolvidos com a boa e velha linha de comando. Mas não soa tão legal, certo? E, no fim das contas, “ninguém nunca foi demitido por usar o Hadoop”.
O “mundo do desenvolvimento de software” está enchendo-se de novos jargões a cada dia que passa e, enquanto todo mundo acha a última “shiny new thing” toda “ultra-moderna” e como-nós-vivemos-sem-isso-até-agora, em algum lugar do mundo há alguém que viu a luz e hoje chora.
Opa! Terminou o cloc
do Firefox! Até que enfim. Eu deveria ter chamado o comando
junto com o time
. Mas vamos aos números:
- Mais de 4 milhões de linhas de C++.
- Quase 4 milhões de linhas de Javascript.
- Quase 2 milhões de linhas de C.
- Quase 2 milhões de linhas de cabeçalhos C/C++ (que também é código).
- Mais de 1.3 milhão de linhas de Rust.
Sério, galera. Isso não é bom.
Resumo
Nós temos construído lixo sobre lixo e nos acostumado com isso de maneira tal que nosso “instinto de sobrevivência” ou de apego ao que nos é familiar simplesmente nos cega e nos mantém nesse rumo maluco e caótico em que nós achamos que estamos no caminho certo quando estamos apenas andando em círculos, mas cada vez mais longe do alvo.
Eu acredito que tudo o que hoje é usufruido como uma “web app” pode ser implementado e usado, por indivíduos e por equipes, como um conjunto de aplicações simples e, especialmente, sãs (em que a contagem de linhas de código se dê em centenas, não milhões).
Eu acredito que mais da metade das coisas que usamos hoje, mais da metade dos termos e mais da metade dos conceitos que hoje povoam “o mundo da T.I.” pode ser simplesmente jogado no lixo.
Não acho, claro, que o mundo vá mudar. Ninguém ouvirá a minha voz e, muito menos, fará qualquer esforço para começar a por em ordem essa baderna absurda.
Mas eu posso mudar. E quero mudar.
Este artigo foi escrito originalmente em 07/01/2019.