Unixtopia

main/ artigos/

Filosofia UNIX

É uma das abordagens mais importantes e essenciais para programação, e por extensão todo o design da tecnologia, que defende o minimalismo e é mais conhecida pelo ditado que diz que um programa deve fazer apenas uma coisa e fazê-la bem. A filosofia UNIX é uma sabedoria coletiva, um conjunto de recomendações de design evoluído durante o desenvolvimento de um dos primeiros, e mais historicamente importantes, sistemas operacionais chamado UNIX, daí o nome. Tendo sido definida por hackers, a filosofia naturalmente aconselha a fornecer um conjunto de muitas ferramentas altamente eficazes que podem ser combinadas de várias maneiras, ou seja, para executar hacking, em vez de ser restringida por uma funcionalidade fixa e pretendida de enormes programas do tipo faça tudo.

Filosofia UNIX defende simplicidade, clareza, modularidade, reutilização e composição de programas maiores a partir de programas pequenos, em vez de projetar enormes programas monolíticos como um todo. A filosofia UNIX, pelo menos parcialmente, vive em muitos projetos e sistemas operacionais semelhantes ao UNIX, como GNU/Linux, embora as distribuições estejam se distanciando cada vez mais da UNIX, foi totalmente adotada por grupos como suckless e SMR, e está sendo reiterada em projetos como Plan 9.

Veja também Everything Is a File, outro famoso princípio de design, é visto mais como uma escolha de design específica do UNIX do que parte da filosofia geral em si, mas ajuda a pintar o quadro geral. Conforme escrito na introdução do GNU coreutils, um canivete suíço, ferramenta universal que faz muitas coisas ao mesmo tempo, pode ser útil, mas não é uma boa ferramenta para especialistas no trabalho, eles observam que um carpinteiro profissional usará um conjunto de ferramentas relativamente simples e altamente especializadas, cada uma das quais é extremamente eficiente em seu trabalho.

A filosofia UNIX traz essa observação para o mundo dos programadores especialistas. A mesma analogia é feita no livro Starting Forth sobre a linguagem de programação Forth, que nesse sentido também segue a filosofia UNIX, enquanto linguagens típicas como C++ e Java oferecem algumas construções altamente complexas, codificadas, no estilo canivete suíço, como objetos, modelos, macros e assim por diante, Forth é construído sobre muitas definições simples de diferentes palavras das quais a linguagem é construída, incluindo estruturas de controle ou declaração de variáveis. E é deixada para ser estendida pelo programador.

Em 78, McIlroy escreveu uma breve visão geral do sistema UNIX na qual fornece principais pontos do estilo do sistema:

Detalhes sobre até que pontoesse minimalismo "fazer apenas uma coisa" deve ser levado são, claro, um tópico de inúmeros debates e opiniões, os hackers originais do UNIX são frequentemente muito rigorosos, um exemplo famoso disso é a apresentação "cat -v considered harmful" atacando uma função relativamente simples adicionada ao programa cat que deve concatenar arquivos. Alguns toleram adicionar algumas funções de conveniência a programas triviais, especialmente hoje.

Compare isso com a filosofia oposta do Windows, na qual combinar programas em unidades colaborativas não é intencional, é possivelmente até mesmo propositalmente evitado e difícil, lento e impraticável de fazer, tais programas são projetados para executar manualmente ações predefinidas, principalmente usando GUI, pintar imagens com um mouse, mas não são projetados para colaborar uns com os outros ou ser automatizados, eles raramente podem ser usados ​​de maneiras não intencionais e inventivas necessárias para hacking poderoso.

Uma ferramenta de compactação no Windows tal seria um programa GUI que requer que um usuário abra uma caixa de diálogo de arquivo, selecione manualmente um arquivo para compactar, o que pode até fazer coisas desagradáveis ​​como carregar o arquivo inteiro na memória, porque qualquer um que pode pagar pelo Windows também pode pagar por muita RAM, executar a compactação lá e gravar os dados de volta em algum outro arquivo. Precisa usar o programa em um computador sem exibição gráfica? Automatizá-lo para trabalhar com outros programas? Executá-lo a partir de um script? Executá-lo 10000 ao mesmo tempo com 10000 outros programas semelhantes? Que azar, a filosofia do Windows não permite isso :(.

Não entenda mal a filosofia Unix. Há muitos casos extremamente perigosos de mal-entendidos da filosofia UNIX por programadores modernos que não conseguem diferenciar o pseudominimalismo do verdadeiro minimalismo. Os desenvolvedores mostram muitos mal-entendidos aqui, primeiro, o próprio JS é extremamente bloated, pois é uma linguagem que visa coisas como conforto, desenvolvimento rápido, segurança e facilidade para iniciantes, às quais sacrifica desempenho e elegância, um hacker especialista tentando escrever um programa altamente pensado e otimizado não é seu grupo-alvo, portanto, nada baseado em JavaScript pode ser compatível com o jeito UNIX. Eles parecem implicar que basicamente qualquer sistema de módulos segue a filosofia UNIX, isso é errado, a modularidade é muito anterior à filosofia UNIX, meramente ter um sistema de pacotes de bibliotecas, cada uma das quais foca em alguma coisa, mesmo uma muito ampla como uma GUI altamente complexa, não significa que essas ferramentas sejam simples, tanto interna quanto externamente, eficientes ou comunicando-se de boas maneiras.

A filosofia UNIX implica que a universalidade é sempre ruim? Provavelmente não, ao menos em geral, ela nos diz que para um especialista criar arte que atinja o pico de seu potencial, parece melhor na maioria dos casos se ele viver em um ambiente com muitas ferramentas pequenas e altamente eficientes com as quais ele possa mexer, o que lhe permite combiná-las, mesmo, e especialmente, de maneiras imprevistas, para fazer hacking. Ferramentas universais, também são ótimas, seja como um suplemento ou para outros casos de uso, não especialistas, trabalhos sujos rápidos e assim por diante, uma linguagem de programação de propósito geral como C, outra criação dos próprios criadores do Unix, é uma ferramenta universal que prefere generalidade à eficácia em uma tarefa específica, você pode usar C para processar texto, mas provavelmente não igualará a eficiência do sed. Vamos perceber uma coisa importante: uma ferramenta universal ainda pode ser implementada de forma minimalista, portanto, nunca confunda uma ferramenta universal com um monólito inchado sobrecarregado por aumento de recursos.

Uma possível interpretação prática da filosofia UNIX que é que há um limite superior, mas também inferior para a complexidade. "Faça uma coisa" significa que o programa não deve ser complexo, podemos simplificar isso para "seu programa não deve ultrapassar 10 KLOC". "Faça bem" significa que os programas não devem ser triviais porque então dificilmente estão fazendo bem, poderíamos, diga "seu programa não deve ser menor que 10 LOC". Não deveríamos literalmente fazer um programa separado para imprimir cada símbolo ASCII, tais programas seriam muito simples e não fariam nada bem.

Preferimos fazer um programa cat, que não seja nem muito complexo nem muito trivial, que possa realmente imprimir qualquer símbolo ASCII. A filosofia UNIX é realmente sobre o equilíbrio da trivialidade e da complexidade, mas sugere que o equilíbrio certo tende a ser muito mais próximo da trivialidade do que nós, humanos, somos tentados a escolher intuitivamente. Sem orientação, tendemos a tornar os programas muito complexos e ela existe para nos lembrar de nos forçar a minimizar nossos programas para atingir o equilíbrio correto.