quinta-feira, 28 de junho de 2012

Ensaio: Por que eu continuo a programar?

Apesar de estar fazendo faculdade de desenvolvimento de sistemas e estar sempre envolvido com alguma linguagem de programação, com novas ferramentas de desenvolvimento, com HTML5, com Node.js, com o Archlinux, e mais um monte de outras coisas, as pessoas tendem a me olhar fazendo isso e achar que estou jogando tempo fora com essas atividades, sendo que poderia estar fazendo coisas muito maiores que simplesmente brincar de programar. Me desculpe, mas isso é o que gosto de fazer. E espero que com esse texto eu possa explicar um pouco da forma como eu penso sobre as coisas.

Por que continuar a programar?

As pessoas esperam, a medida que você vai ficando mais velho, que você deixará tarefas mais práticas (como programação) para se dedicar à outras tarefas mais "nobres" como gerenciar uma equipe ou fundar uma empresa. Isso é especialmente verdadeiro quando pensamos no modo como a parte de pesquisa científica nas escolas acontece. Os professores delegam os detalhes de um projeto para os orientandos, mantendo para si a visão do todo do projeto. Em outras palavras, colaboração vertical...


Colaboração Vertical

A colaboração vertical é construída na forma de uma estrutura hierárquica onde as pessoas no topo supervisionam as pessoas abaixo. Na pesquisa isso significa que os pesquisadores sênior têm as idéias, que os pesquisadores júnior implementam. Com o passar do tempo, os pesquisadores sêniores se tornam incapazes de fazer o que os juniores fazem, mas vão se tornando especialistas em vender o peixe do seu projeto. Esse modelo pode ser ampliado para um visão onde o pesquisador sênior dirige pesquisadores mais experientes, que ao mesmo tempo supervisionam os pesquisadores mais novos, e assim por diante.

A imagem acima, tirada da tirinha The Profzi Scheme exemplifica bem essa estrutura.

Colaboração Horizontal

Por outro lado, existe uma outra forma de colaboração, que podemos chamar de colaboração horizontal. Nesse modelo, os pesquisadores seniores fazem tudo, desde ter a idéia até executá-la. Eles preferem automatizar as coisas, ou evitar trabalhos muito onerosos, sempre que possível. Aqui a colaboração é mais usada para se obter um ponto de vista diferente do problema, e até conhecimento complementar. Esse modelo funciona muito bem quando a quantidade de pessoas envolvidas é menor, já que compartilhar as idéias de seu projeto pode ser algo próximo do íntimo.

O tipo de trabalho que cada modelo melhor suporta difere na medida dos seus objetivos. Eu penso que um modelo de colaboração vertical favorece projetos de mais longo prazo e que possuam resultados facilmente previstos. Já a colaboração horizontal têm um quê de acaso e de idéias selvagens sendo lançadas.

Quem sou eu nesse contexto?

Acho que deu pra perceber que eu pessoalmente prefiro esse método horizontal. Eu pretendo ser programador até onde eu conseguir. Isso é pouco frequente de se ver, principalmente entre meus amigos. Vários deles já se enveredaram nos caminhos da gerência de equipes de desenvolvimento ou mesmo em supervisão de trabalhos de iniciação científica. Ao mesmo tempo que isso é difícil de se ver, quando eu falo isso para as pessoas, muitas delas ficam perplexas. Algumas tarefas em programação tomam tempo, as vezes muito tempo.

Eu hoje gasto por volta de 2 a 3 meses do meu ano programando. Pode parecer pouco, quando se pensa que os outros 10 meses do ano são gastos com meu trabalho de manutenção de computadores. Dizem que meu tempo é precioso demais para eu gastar com tarefas como programação ou configuração de sistemas (que é algo que adoro fazer), e que essas tarefas poderiam facilmente ser feitas por alguém recebendo uma fração do que eu recebo. Então, por que eu ainda programo?

Olha, nessa hora meu melhor advogado é o grande mestre Donald Knuth, que diz o seguinte:

People who discover the power and beauty of high-level, abstract ideas often make the mistake of believing that concrete ideas at lower levels are relatively worthless and might as well be forgotten. On the contrary, the best computer scientists are thoroughly grounded in basic concepts of how computers actually work, and indeed that the essence of computer science is an ability to understand many levels of abstraction simultaneously.

Claro que eu também tenho meus próprios argumentos:

  1. Eu quero que meu trabalho seja significativo, que tenha impacto, não que seja uma profusão de citações e comentários de outras pessoas, que no final eu só endosso com minha assinatura e do meu orientador.
  2. Não tenho medo de estar reinventando a roda. Pelo contrário, fazer isso, implementar minhas idéias desgarrado de outros projetos e frameworks que possam me "ajudar" acaba me forçando a estudar melhor sobre o assunto, me faz entender melhor sobre o que estou fazendo.
  3. Minha habilidade como programador só tende a melhorar com o tempo. Me lembro até hoje quando conversava com um professor sobre uma framework que ele havia feito em Delphi para trabalhar com bancos de dados sem usar componentes data-aware. Na época eu tinha até dificuldade de entender o trabalho que ele havia feito. Olhando do ponto que estou hoje, até parece algo simples de se fazer. Isso porque minha habilidade com programação só aumentou nesses últimos 14 anos.

Se meus argumentos são razoáveis (e mesmo tendo o mestre do meu lado), por que as pessoas ainda ficam surpresas quando eu me intitulo "programador-cientista"? Eu penso que essa rejeição da programação como uma atividade de baixo nível pode ser explicada pela "Teoria da Classe Ociosa".

Resumindo, as pessoas não querem ser úteis, elas querem prestígio. E não há prestígio em construir ferramentas, cozinhar ou plantar. Para maximizar o prestígio, é preciso chegar no nível da classe ociosa: seu trabalho não ser imediatamente útil para as pessoas. Por tabela, há mais prestígio em ser um diretor, um médico ou um político do que ser um professor ou um enfermeiro. Pessoas que supervisionam as coisas de longe têm mais prestígio. A programação é uma forma de "construção de ferramentas", por isso as pessoas da classe ociosa não a fazem. E não as fazendo, as pessoas têm mais tempo para discutir com as outras pessoas ociosas sobre assuntos que estão "nas suas mãos".

Existe uma frase que eu usava muito nos meus e-mails que resume essa minha opinião sobre a classe ociosa:

The more time you spend talking about what you have been doing, the less time you have to spend doing what you have been talking about.

Eventually, you spend more and more time talking about less and less until finally you spend all your time talking about nothing.

As pessoas irão normalmente se auto-intitular "engenheiros", "analistas" ou mesmo "desenvolvedores", mas raramente se chamarão de "programadores", pois isso é uma tarefa meramente utilitária (e na visão de alguns, desprovida de desenvolvimento intelectual).

Bom, é isso. Falows e até um próximo post. Não aguentei ficar tanto tempo sem postar! Faz parte da minha pessoa!

P.S.: Esse post é uma resposta direta à outro post chamado Write Less Code.