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:
- Faça programas que façam apenas uma coisa e essa coisa bem feita.
- Faça programas esperando que seja usado com outros programas.
- Use interface de texto, pois esta é a interface universal.
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.
- Código simples.
- Uso simples.
- Nada complexo.