Por que está tudo uma merda?

Agora, você deve estar se perguntando, "por que agora tudo está uma merda?" Bom, isso requer um pouco de história.

O Big Bang da computação.

Toda a computação de hoje em dia se baseia aos trabalhos do Bell Labs, que era da AT&T, e acredite, se não fosse pela Bell Labs, você nem teria TVs, telefones, transistores, modem e muito mais coisas. Bell Labs era uma verdadeira máquina de reunir nerds e cientistas malucos, e desses cientistas, estavam o Ken Thompson e Dennis Ritche, literalmente os deuses da computação. O trabalho desses dois era trabalhar no MULTICS pra outras empresas, mas por algum motivo que não lembro, a Bell Labs acabou saindo do projeto, mas esses dois ficaram com vontade de fazer um sistema operacional (lol), então o Thompson encontrou um PDP-7 jogando num canto no trabalho e começou a produzir o que então viria a ser o UNIX, e antes que perguntem, sim, aparentemente o trabalho deles era bem "livre", por assim dizer, tem até um vídeo do Kernighan (do livro A linguagem de programação C, o K do K&R) falando que era bem livre. Voltando a história, o Ken criou o UNIX enquanto o Dennis criou a linguagem de programação C, aí o Ken REESCREVEU A PORRA DO UNIX pra usar C. Durante a criação do UNIX, veio outro cara chamado Doug McIlroy, IMPLORANDO para o Ken implementar o que viria a ser os pipes! E depois da criação dos Pipes, veio a revolução na computação!

Big Bang inception: Big bang dentro do Big Bang. Filosofia UNIX!

Os pipes foram uma grande revolução no UNIX. Agora, você poderia fazer um programa ler a saída de um outro programa de forma automática, e de acordo com o Ken, isso acabou criando uma verdadeira Orgia de Oneliners! Agora programas não eram uma coisa única e sim vários programas conectados entre si, não era mais necessário gastar horas e horas programando, é só conectar um programa com outro, e fazer alguns outros pequenos módulos, caso seja necessário. Pessoas que não eram programadores simplesmente podiam fazer coisas que seus observadores achariam que ele estaria fazendo magia. E com isso tudo, vários conjuntos de regras acabaram sendo criados para os programadores, o que veio a ser a FILOSOFIA UNIX! A filosofia UNIX são 3 regras simples:

O que significa essas regras, na prática? Bom, vamos começar pelo primeiro.

Faça programas que façam apenas uma coisa e essa coisa bem feita.

Vamos dar uma olhada no programa find(1) do UNIX. O find é um programa bem simples, ele serve pra você procurar arquivos, mas ele faz o seu trabalho bem feito. Ele tem várias opções, sobre qual tipo de arquivo você quer encontrar, qual nome (ou padrão de nome, usando o famoso REGEX), data de criação, mas tudo que ele faz não foge de uma coisa: ele foi feito pra procurar por arquivos.

Faça programas esperando que seja usado com outros programas.

Com o UNIX, isso é algo que você vai querer. Com os pipes, você consegue estender a funcionalidade dos programas e fazer muito mais coisas. Vamos fazer um pequeno exemplo, com o programa echo(1).

$ echo 'FOO BAR' 
FOO BAR 
$ _

Como você pode ver, o trabalho do echo é apenas escrever na tela o que foi mandado pelos argumentos. Mas o que acontece agora se a gente usar o programa tr(1) junto?

$ echo 'FOO BAR' | tr '[A-Z]' '[a-z]' 
foo bar 
$ _

Agora as letras da saída foi de maiúscula para minuscula. Sem nenhuma programação, apenas brincando com os programas e com os argumentos, agora eu fiz um programa que apenas solta letras minúsculas. Agora vamos usar outro tr, só que agora com outras opções.

$ echo 'FOO BAR' | tr '[A-Z]' '[a-z]' | tr 'aeoi' '4301' 
f00 b4r 
$ _

Agora eu leetzei o texto que saiu e, de novo, sem nem precisar programar, apenas conectando programas entre si. Agora, que tal fazer isso em um arquivo inteiro? Não tem problema.

$ tr '[A-Z]' '[a-z]' < lorem.txt | tr 'aeoi' '4301' 
l0r3m 1psum d0l0r s1t 4m3t, c0ns3ct3tur 4d1p1sc1ng 3l1t. 4l1qu4m m0l3st13
fr1ng1ll4 4l1qu4m... (o arquivo continua) 
$ _

Salvar?

$ tr '[A-Z]' '[a-z]' < lorem.txt | tr 'aeoi' '4301' > l0r3m.txt
$ _

Note que o quê foi salvo foi o texto que sairia na tela. O arquivo texto foi salvo no arquivo "l0r3m.txt". Então é mais ou menos assim como funciona os programas que "esperam que sejam usados por outros programas".

Use a interface de texto, pois essa é a interface universal.

Como assim, essa a interface universal? Bom, não importa qual computador você use, sempre vai ter uma interface de texto, além disso, é muito mais fácil você fazer esse tipo de junção que a gente fez no tópico anterior usando texto do que usando imagem. Pipes aceitam algo além de texto, eu lembro de editar vídeos usando ffmpeg e pipes porque eu não queria salvar os arquivos no meu HD, mas preferencialmente texto é melhor para se trabalhar.

Certo, agora por que está tudo uma merda?

Ah, sim. Então voltamos a pergunta. Por que está tudo uma merda? Se você analisar o que essas regras e outras coisas é simplesmente: simplificar o trabalho. Toda a filosofia UNIX e até a própria invenção do computador, tudo isso está buscando é a simplificação do trabalho. Ao decorrer desse blog, você vai ver que essa simplificação não está sendo mais seguida. Hoje em dia, é tudo voltado para a complexidade do software, o que rouba a liberdade do programador, do usuário e as vezes nem conveniente é. O pior disso tudo é que esse aumento da complexidade do software é ensinado COMO SE FOSSE UMA COISA POSITIVA! Complexidade nunca é e nunca vai ser algo positivo, nem pra segurança isso é, pois complexidade também esconde possíveis falhas que podem ser perigosas! Um exemplo desse ultimo caso foi o sudo(1), que descobriram uma FALHA DE BUFFER OVERFLOW ESCONDIDO HÁ 10 ANOS porque o software era complexo de mais para analisar esses tipos de bugs. Claro, não estou dizendo que todo software não vai ser complexo, tem vezes que o problema que está tendo que ser resolvido é complexo por si só, mas não é por isso que devemos deixar de buscar a simplicidade em nosso código e programa. E é isso que vou pregar nesse blog.