Opinião: No curso de computação eu uso cheat, no curso de computação eu uso Linux!

Há esses pequenos detalhes que eu percebo na parte da realidade a qual eu tenho acesso e talvez se repita em outros lugares. Após um tempo “martelando a ideia”, resolvi sentar para escrever o relato acompanhado de minha opinião. Nesse texto vou comentar sobre o porquê de eu achar que ter optado pelo Linux me deu vantagem sobre outros programadores do curso que faço.

A linguagem C

A primeira coisa a entender na história é a importância da linguagem C. A linguagem C é uma espécie de “Assembly portável”. Entre o código escrito pelo programador e o código gerado pelo compilador não deveria haver nenhum gargalo desnecessário. O código gerado deveria ser tão ou mais rápido que o código que o programador escreveria manualmente. Uma das formas de alcançar essa eficiência é através de Undefined Behaviour, pois assim, entre outras coisas, o código se adapta ao comportamento do hardware em muitas situações. Em C, até a ordem de avaliação dos operandos não é especificada.

Com sua proposta, a linguagem C tornou-se uma das principais linguagens no mundo da computação. Sistemas operacionais são construídos na linguagem C, sistemas para dispositivos embarcados são construídos na linguagem C, sistemas com restrições de tempo real são construídos na linguagem C, para citar alguns. Devido aos sistemas operacionais serem, principalmente, escritos em C, normalmente a linguagem C possui tratamento privilegiado em relação a comunicação com o sistema operacional e normalmente até os interpretadores de outras linguagens são escritos em C. Devido a sua importância, aprender C ajuda a ter uma visão geral dos diferentes componentes que compõem o sistema. Não só é interessante aprender C por sua importância, mas também porque a linguagem expõe conceitos interessantes que não estão presentes em linguagens que fogem do hardware e se aproximam demais com definições algorítmicas elegantes, como os conceitos de escovar bits, alocação de memória dinâmica, o custo de uma chamada recursiva, o uso de aritmética de ponteiros em estrutura de dados, entre outros.

Um fato bem importante para a história que estou tentando contar é que o processo de compilação de um programa escrito em C é complexo. Não sendo suficiente tal processo ser complexo, há muitos comportamentos que não são padronizados e podem tornar incompatíveis códigos-objeto gerados em compiladores diferentes. Ilustrando o caso, considere a opção -fpack-struct, que melhora o uso de memória, mas quebra a compatibilidade com códigos-objeto compilados sem essa opção (o que pode incluir bibliotecas do sistema). A Boost, por exemplo, lista uma página contendo uma conta simples para estimar que há 3200 variações de ABI (claro que Boost é escrita em C++, onde o problema é maior). Isso é só para exemplificar que variações de ABI existem, mas compiladores diferentes normalmente usam ABIs diferentes.

A falta de uma ABI “para a todos trazer e na escuridão aprisionar” é um problema quando você não controla as APIs que deseja utilizar e suas respectivas disponibilidades são limitadas. Citando APIs open source, tem a Qt, que no momento em que escrevo disponibiliza pacotes compilados com MingW, VS 2010, VS 2012 e VS 2013, enquanto a SDL disponibiliza somente para uma versão não claramente especificada do Visual C++ e do MingW. APIs open source são APIs que você controla, pois você sempre tem a opção de compilar sua própria versão.

Apesar de não haver uma ABI estável, no Linux, grande parte das distribuições adota a ABI padrão do GCC, que é bem estável, mesmo dentre diferentes versões do GCC. Ainda no ambiente Linux, compiladores competidores, como o Clang, também tentam aderir a ABI do GCC. Com isso, podemos usar qualquer biblioteca já instalada em nossos sistemas sem problemas causados por diferentes ABIs e também não ficamos dependentes de uma ou outra versão muito específica do Visual Studio.

Outro problema com o complexo processo de compilação de um programa escrito em C é a questão “onde encontro os arquivos de cabeçalho durante a fase de compilação e as bibliotecas na fase de linkedição?”. O Linux é um sistema que pode respeitar o padrão de sistemas de arquivos hierárquicos, que define um padrão sano para encontrar esses (e outros) arquivos-chave do sistema. O Windows próprio não fornece algo próximo ao padrão FHS, então a configuração para compilar algo fica por responsabilidade do compilador/versão-do-compilador/projeto/usuário, sempre tornando o processo mais complexo.

Todo esse complexo processo é bastante facilitado, não somente através do uso de software livre que você pode controlar, mas também, no Linux, através de gerenciadores de pacotes. Os gerenciadores de pacotes não só facilitam o gerenciamento de um sistema, como também automatizam a maior parte da preparação de um ambiente para programar em C (e muitas outras linguagens também). Há até as distribuições que não precisam de pacotes extras de desenvolvimento, tornando o processo ainda mais fácil. Se você tem o Qt ou algum programa que dependa do Qt instalado, significa que você tem o Qt instalado, em toda sua extensão, e já pode começar a programar software que faça uso do Qt. Usuários iniciantes no Linux costumam manter a mesma abordagem de instalação que usavam em seus sistemas anteriores, procurando o site do produto como o primeiro passo em um processo de instalação NNF. Alguém me salvou dessa filosofia com uma simples pergunta há bastante tempo atrás, “qual o sentido em possuir um gerenciador de pacotes se você não usa ele para gerenciar os pacotes?”.

E é isso! O nível de dificuldade imposto pelo ambiente mais usado no meu curso desencoraja o desenvolvimento, aprendizado e qualquer modificação em projetos escritos na linguagem C, apesar de ela ser uma das mais importantes e expor muitos conceitos importantes.

Existem outras tarefas mais dignas para perder tempo do que ficar aprendendo C, pois algoritmos são mais “puros” e aplicáveis a outras linguagens além de C. Otimizações em algoritmos são universais, mas um fato que os advogados dessa filosofia gostam de ignorar é que você não projeta algoritmos para rodar em máquinas abstratas e se não for possível executá-los em máquinas de verdade, eles perdem sua principal utilidade. Conhecimento de arquitetura de computadores é importante e se otimizações a nível de algoritmo fossem a única coisa a importar, talvez não houvessem tantas bibliotecas de álgebra linear tentando ser a mais rápida, assim como não haveria artigos como o “Why Computer Architecture Matters” ou palestras como “Native Code Performance and Memory: The Elephant in the CPU” ou ainda conceitos como “Cache-oblivious algorithm“.

Abertura do sistema

Outra característica que acho que me favoreceu durante meu aprendizado é a disponibilidade fácil de documentação e discussões de desenvolvimento abertas.

Quando há um padrão disponível, ele precisa estar bem documentado e sem nenhuma ambiguidade, mesmo que ao custo de tornar a leitura mais difícil. Pelo bem da interoperabilidade, padrões já existentes são adotados e a criação de novos padrões é evitada. No outro “lado da batalha”, incentivos são feitos para estratégias de lock-in e DRM. Isso é uma discussão bem maior, que não é do interesse desse texto. A característica interessante para os argumentos que estou construindo nesse texto é que você sempre pode descobrir “o que há por trás de alguma tecnologia” e, quando tiver sorte, vai até poder ler um documento bem detalhado, que é a prática encorajada no “nosso lado”.

Considerando os cenários onde uma boa documentação não está disponível, você ainda terá a possibilidade descobrir o que está acontecendo, pois o código-fonte é livre e você não vai acabar esbarrando em um LPVOID lpReserved. Pode ser até que você receba ajuda de pessoas mais experientes.

Um hábito da comunidade que apoio que me ajudou é o hábito de manter as discussões abertas. O ato de declarar derrota quando sua solução não é a melhor. As discussões que ajudam a entender como decisões de projeto afetam um produto, discussões de levantamento e análise de problemas e suas soluções, discussões sobre abordagens alternativas. São essas discussões que ajudaram a moldar a forma como encaro os meus próprios problemas. Alguns exemplos de tecnologias que geram discussões, para efeito de ilustração:

Ainda para efeito de ilustração, um assunto sobre o qual eu estava lendo recentemente é programação assíncrona e, graças ao fato de eu estar participando de várias listas de discussões, acabei encontrando esse texto sobre programação assíncrona e, especialmente, o gargalo que as interfaces podem criar no sistema operacional. Esse nível de detalhamento dos problemas não é algo que eu encontro em sistemas fechados, até porque manter seus detalhes disponíveis publicamente é um acontecimento que eles evitam.

Resultado

O resultado que observo é um monte de programadores incapazes de programar em C, reclamando de projetos que tenham muitas dependências (ou somente considerando bibliotecas header-only), incapazes de compilar outros projetos, optando por linguagens e ambientes inchados para ter certeza que todas suas necessidades são supridas, para citar alguns.

Outro resultado que observo é que você ganha o título de “usuário ninja do Linux” só por ler a documentação e conseguir fazer um programa mal feito funcionar e, para um curso de computação, essa é uma tarefa broxante.

E por essas e outras é que considero que estou “cheatando” por estar usando Linux. Não é que é impossível você conseguir tanto e até mais conhecimento sem fugir da sua zona de conforto e sem usar um sistema operacional alternativo, mas é que eu acho que a jornada é muito facilitada a partir do momento que você adota o Linux.

Tags:

6 responses to “Opinião: No curso de computação eu uso cheat, no curso de computação eu uso Linux!”

  1. Fire Lord says :

    Uma coisa que venho observando a um tempo, é quem justamente tem foco em algo parece que ta usando cheat, mas justamente é so foco e não ter medo do que está por vir.

  2. Milton César Disegna de Souza Leite says :

    Sua opinião pode também ser aplicado ‘a família BSD(FreeBSD, OpenBSD e NetBSD)?

  3. Magnun says :

    Ótimo texto cara.

    • Vinipsmaker says :

      O sonho de consumo dos bloggers como eu são os textos razoavelmente pequenos que fluem “naturalmente”. Há uns três textos que vivem na minha pasta de rascunho e não tenho esperança de acabar sequer dois esse ano.

      • Magnun says :

        Sei muito bem como é😀

        Mas não fique esperando (ou guardando texto), minha experiência com isso diz que o que sempre tende a acontecer e o texto ser engavetado e esquecido.

Comentários (with MarkDown support)

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: