terça-feira, 13 de setembro de 2011

Dia do Programador 2011: Vantagens de ser um Programador Poliglota

import datetime
x = datetime.date(2011, 1, 1)
y = datetime.date.today()
if (y - x).days == 256:
    print("Feliz Dia do Programador, via #tocadoelfo!")

u_time hora_postagem = 1315915200;

Hoje é dia do programador! Todos os anos eu faço uma postagem nesta data pra lembrar o porque de eu gostar tanto de programação. Originalmente a postagem seria sobre uma implementação fodástica de circuitos lógicos usando Shellscript, C, Python e Java mas, depois de uma discussão que tive com um colega à respeito de linguagens de programação, tive a idéia de escrever este post mais filosolfativo.

Sobre o Dia do Programador

Dia 13/09 comemora-se o dia do Programador. O Dia do Programador é uma data festiva no 256º dia do ano, celebrada por programadores de computador em boa parte do mundo. Este número foi escolhido porque é o maior número que pode ser representado por um byte (oito bits). Além disso, esse número é a maior potência de dois que é menor que o número 365 (o número de dias do ano, duh). Também pode ser representado, em hexadecimal como 0x100 e em octal como 0400.

O Dia do Programador é dia 13 de setembro, exceto em anos bissextos, nos quais ele é comemorado no dia 12 de setembro, pois esse é o 256º dia do ano bissexto.

Meu Dia do Programador

Tive há algumas semanas uma discussão com um amigo sobre linguagens de programação. Ele falava das enormes vantagens do Grails em relação às outras linguagens. No entanto, a forma apaixonada com a qual ele falava sobre Grails e sobre Java me fazia pensar se ele realmente já havia programado em alguma outra linguagem que não fosse Java (Grails) antes...

Vantagens de ser um Programador Poliglota

Na maior parte do meu tempo de programação (não sou programador comercial, programo por hobby), eu me considerava um programador de Delphi, isso porque esta foi a linguagem que eu mais usei até hoje. Foram 7 anos em que eu conheci a linguagem a níveis bem mais profundos que os necessários para a programação comercial. Mas eu o fazia pela minha necessidade sempre presente de aprender como as coisas funcionam por detrás da cortina...


Eu aprendi outras linguagens nesse tempo enquanto estava na minha primeira faculdade, mas no final das contas não as usava. Se eu fosse fazer alguma coisa, eu iria fazer em Delphi, porque era a linguagem com a qual eu me sentia mais confortável para programar. Então, comecei minha segunda faculdade. Lá eu aprendi a programar em C (nas boas aulas de Arquitetura de Computadores, Sistemas Operacionais e Estruturas de Dados) e depois em Java. Há 3 anos aprendi a programar em Python. Ano passado em Javascript. Este ano, Shellscript e um pouquinho de Ruby. Ano que vem alguma linguagem funcional (provavelmente Haskell, Lisp está fora porque quero linguagens mais simples). Em algum futuro (próximo ou distante), Prolog porque essa linguagem é bastante voltada pra uma das áreas que eu mais gosto: Inteligência Artificial. Eu ainda conheço bastante de Delphi e Pascal, mas não me considero mais um programador nessas linguagens.

E foi pensando nisso, aliado à dissonância cognitiva paixão do meu amigo por Java e Grails, que eu parei para pensar, e então percebi: Eu não sou um programador Python ou Java ou C. Eu sou um programador poliglota, porque eu me sinto bastante confortável em programar em pelo menos 3 dessas linguagens e estou sempre me aprofundando nelas, ao mesmo tempo que eu estou lá, procurando aprender novas linguagens (até esotéricas, como Befunge, Whitespace e Brainfuck).

Antes eu achava que era mais interessante botar meu foco em uma única plataforma ou linguagem e me esforçar em conhecer essa linguagem completamente, mas hoje em dia eu não posso concordar mais com essa idéia. Dizem que há poucas vantagens em aprender novas linguagens de programação, a se expor a novas comunidades, abordagens e idéias. Dizem que muito do seu conhecimento precisa ser revisto já que as coisas podem acontecer de forma diferente de uma linguagem para outra. Eu acredito hoje que há sim vantagens e que eles superam de longe os benefícios de se aprofundar em somente uma linguagem. E é sobre isso que queria discutir hoje, com vocês.

Primeira Vantagem: Expande seus Horizontes

Há mais coisas necessárias para se tornar confortável na programação usando uma linguagem que meramente aprender sua sintaxe. Ao aprender uma nova linguagem você aprende novos truques, conhece novas bibliotecas e principalmente, novas formas de resolver problemas que podem ser comuns nas comunidades com as quais você interage. De certo modo você está basicamente tentando absorver o conhecimento que é comum a todos na comunidade, mas novo para você. Dependendo do que você já aprendeu, pode ser que você tenha de aprender um monte de coisas novas ou mesmo desaprender algumas em prol de novas formas de resolver problemas.

Posso citar, por exemplo, o uso de variáveis. Em Delphi, as variáveis têm tipo e são imutáveis. Em Python, as variáveis não possuem tipo. Quem possuem tipos são os valores, e as variáveis simplesmente são ponteiros. Em Java, as variáveis possuem tipo, mas são ponteiros para objetos. Se você está acostumado a usar variáveis dinâmicas, como no PHP, talvez aprender a usar variáveis em Python possa não lhe acrescentar nenhum conhecimento novo. No entanto se você programava em Delphi com certeza teria uma experiência bastante interessante com variáveis dinâmicas. Inclusive posso citar que por conhecer bem um modelo, e saber suas deficiências, pude conceber formas bem interessantes de usar o novo modelo de variáveis. A mistura dos conhecimentos vai começar a influenciar a maneira com que você pensa sobre os problemas e como você pode resolvê-los.

Segunda Vantagem: Torna mais fácil aprender novas coisas

"A prática leva à perfeição". Quem nunca ouviu esse ditado? Se você está sempre tentando aprender coisas novas, o próprio ato de aprender coisas novas se torna mais fácil. Muitas pessoas têm problemas com aprender coisas que entrem em conflito com o conhecimento já adquirido. A primeira vez que você aprender uma linguagem baseada em um paradigma que você não entende bem, pode levar um tempo até que você compreenda, isso porque provavelmente você estará estruturando as coisas de forma diferente da forma com a qual você está acostumado a fazer.

Falemos sobre classes. Por muito tempo escrevi classes em Delphi levando sempre em consideração que a classe precisa ter uma declaração na seção Interfaces do módulo e sua real implementação feita na seção Implementation. Todos os métodos de uma classe eram declarados na classe e depois implementados em outra parte. Então, veio o Java. Tive bastante dificuldade para aceitar o fato de que classe e código estava tudo junto num mesmo lugar. Você declarava a função e logo em seguida já começava a sua implementação. Em seguida veio o Python, e seu conceito de classes dinâmicas, onde nem mesmo precisava definir uma classe estaticamente, poderia simplesmente usar um modelo e ir construindo a classe em tempo de execução. Do Delphi pro Java a dificuldade em aceitar as diferenças foi bem maior que do Java para o Python, onde eu já estava mais preparado para aceitar os conceitos diferentes, e assim vem sendo a cada nova linguagem.

Meu primeiro contato com Ruby foi bem menos traumático que com o Python. Meu contato com Perl foi menos traumático que meu contato com C. E cada vez vai melhorando porque cada vez mais você se torna confortável com a idéia de deixar para trás aquilo que você já conhece e não se restringe à maneira de pensar sobre as coisas, e nem mesmo cria uma barreira à sua compreensão.

Óbvio que isso se aplica a mais coisas além da programação. Religião, por exemplo ;)

Terceira Vantagem: Renova continuamente seu amor pela programação

Sim, é verdade! Esta provavelmente dependerá muito da pessoa, mas quando eu programava em Delphi, havia momentos em que eu realmente não escrevia nenhum código divertido. Sim, eu acho que programação têm de ser algo divertido, senão se torna uma das tarefas mais chatas de toda a humanidade. Então, nesse momento que eu não escrevia nada divertido quase sempre eu estava escrevendo código pra trabalho de faculdade ou mesmo para pequenos projetos que nunca foram para frente. Mesmo não programando comercialmente, as vezes eu programava sem alegria e as vezes nem lembrava que eu considerava aquilo como hobby. Depois que eu passei a aprender novas linguagens, coisas como as citadas não aconteceram mais, principalmente porque agora eu tinha um leque maior de modos de pensar que serviam para diversos problemas. Para qualquer coisa para shell eu posso escolher C, Shellscript ou Python. Para comunicação de redes posso escolher Java, Python, Perl ou mesmo Javascript. Para interfaces gráficas eu me dou muito bem com Java e razoavelmente bem com PyGtk. Aplicações Web é com Struts 2 e Serviços Web com Django.

Aprender novas linguagens renova seu amor porque você aprende que não precisa fazer as coisas em uma só linguagem. Programar assim é mais divertido e também mais desafiador. Já pensou em integrar duas linguagens diferentes?

Quarta Vantagem: Diminui sua necessidade de determinadas ferramentas, e te apresenta outras novas

Na época que eu programava em Delphi, eu não conseguia me imaginar escrevendo código sem que tivesse uma IDE que me auxiliasse. Eu era tão dependente de recursos do Delphi como verificador de semântica de código, completamento de código, navegação de métodos, dezenas de recursos de depuração, que eu não conseguia me ver sendo produtivo sem estas coisas. Hoje em dia eu prefiro programar em um bom editor de texto (o gedit com plugins é meu preferido, seguido do SciTE e por último o Notepad++) com uma janela de terminal aberta para rodar os meus testes.

Ultimamente, ando utilizando bem menos os recursos de depuração embutidos nas linguagens. No lugar, venho guiando meu desenvolvimento com base em testes unitários. Uso o depurador para coisas relacionadas com vazamentos de memória, uma verificação mais apurada do fluxo de execução do meu código e muito raramente, para inspecionar variáveis ou a pilha da aplicação. Faço dessa forma pois me forço a separar o que é problema de lógica, problema de código, de linguagem, de execução e outros tipos. Prefiro ter de identificar o erro manualmente no código que me tornar dependente da habilidade de algumas IDEs de identificar o erro. Eu faço isso porque nem sempre vamos ter uma IDE à nossa disposição para nos auxiliar em correções de código ou navegação de métodos.

O fato é que realmente uma IDE ajuda e agiliza o desenvolvimento de software, principalmente em casos onde o nível de complexidade de uma aplicação é alto e alguns recursos embutidos em uma boa IDE abstraem muito do trabalho repetitivo e sem criação, deixando o desenvolvedor com mais tempo livre para "pensar" que está desenvolvendo.

Porém, alguns desenvolvedores simplesmente ignoram a linguagem de programação que estão utilizando e se especializam somente na IDE e o resultado é ótimo: se a IDE sair de linha e for abandonada o desenvolvedor não terá mais como trabalhar ou se precisar alterar algo sem a IDE não conseguirá.

Nem sempre você encontrará uma linguagem que possua IDE e com isso, você acabará pegando o costume de conhecer mais do seu código e da linguagem de programação que você está aprendendo. No entanto, você sempre encontrará depuradores disponíveis para essas linguagens e sempre poderá contar com seus testes unitários para verificar a consistência lógica do seu código.

Quinta Vantagem: Faz você ficar menos emocionalmente ligado à uma linguagem ou plataforma

Fato! Pessoas que só trabalham com uma linguagem ou plataforma (ou sistema operacional) tendem a ser emocionalmente ligadas a estes. Se você está emocionalmente ligado, não é fácil se manter racional durante discussões ou quando o futuro da sua linguagem está ameaçado (Delphi, VCL, Cobol hehehe). Se você sabe programar em mais de uma linguagem, você sabe que sua habilidade como programador é transferível. Você sabe que você pode ser excelente programador, não se importando com a linguagem que você está desenvolvendo. Você sabe que você pode ser racional nas discussões porque você têm perspectiva suficiente para analisar diversas linguagens e não se prender a formas estritas de pensar. Você simplesmente sabe que pode lidar com isso.



Vantagem Extra: É mais fácil arranjar um bom emprego quando você conhece várias linguagens

Eu pretendia falar somente das cinco vantagens acima, mas um colega reviu o post e comentou sobre essa vantagem e não poderia deixar de falar dela. Então, existem por aí oportunidades diversas para várias linguagens. Java, Python, Delphi, Django, Php, C/C++, Cobol, Clipper, Mumps e outras, e quanto mais você conhecer, mais oportunidades você pode encontrar pelo caminho. Conhecer várias linguagens também pode lhe ser útil na hora de migrações de sistemas, já que se você sabe programar em várias, pode muito bem opinar à respeito da migração e das dificuldades que ocasionalmente podem surgir deste processo.

Conheço um caso de um órgão público no estado que eu moro, que para o controle de pessoal até hoje usam uma linguagem de programação chamada Mumps. O seu sistema é muito bom, mas há um porém: além de a linguagem não estar em uso na atualidade (exceto casos como estes) não há profissionais que saibam trabalhar com essa linguagem. Há a necessidade de migração para um sistema mais moderno, mas até agora não há nenhuma alternativa que seja melhor que a implementada nesta linguagem.

Conclusão

Há inúmeras outras vantagens de se aprender várias linguagens mas, a maior vantagem de todas é o aprendizado contínuo. Grande parte das pessoas (os programadores inclusos) aprendem algo em suas vidas e quando alcançam um patamar de segurança, ficam estagnados, parados, sem vontade de aprender mais nada. Antes de ver as vantagens de aprender novas linguagens, devemos ver as vantagens de estar sempre em eterno aprendizado, pois sempre há coisas novas para conhecermos, e que da mesma forma que aconteceu quando tivemos aquele primeiro contato mágico com a programação, pode nos surpreender e nos levar para lugares e formas de pensar que nunca antes cogitamos!

Ah, e aproveitem o dia do programador!

Programmer's Day
Programmer's Day 2008
Dia do Programador Edição 2009
Dia do Programador 2010: Brainfuck