Projetos para as Férias
Sugestões para programadores em busca de horizontes mais largos
Alguns meses atrás eu fiz essa sugestão em uma lista de discussão. Uma das pessoas da lista perguntou se deveria tentar aprender Python ou Ruby.
Aprender uma linguagem de programação dá algum trabalho, mas dá também vários insights importantes. São regras diferentes e, muitas vezes, enfoques diferentes. Conhecer apenas uma linguagem limita a capacidade de entender os problemas e limita a gama de soluções que podemos imaginar.
Quando tudo o que se conhece são martelos,
tudo se parece com pregos
Tanto Python como Ruby têm muito a favor deles. São linguagens elegantes e poderosas e estão associadas a frameworks como Zope/Plone, Django e Rails que, francamente (e fazendo vários inimigos com isso), fazem com que as alternativas tradicionais pareçam saídas da idade da pedra. Seguem a filosofia FOP, ou Flintstones Oriented Programming.
Se é para empreender uma jornada de descoberta, a idéia é aprender alguma coisa completamente diferente do que se conhece. No caso da maioria dos programadores web, isso quer dizer "alguma coisa que não se pareça com ASP, PHP, JSP, Java ou C#". Essas linguagens são práticas, mas, me perdôem os fanboys, não são nem interessantes, nem divertidas, nem particularmente produtivas ou sequer particularmente elegantes (e, não raro, são usadas como contra-exemplo de elegância). Pense Lisp, Smalltalk ou FORTH. É como fazer uma visita àquelas prateleiras da livraria que você nunca visitou. Aproveite a viagem não para aprender muito de uma só coisa, mas só um pouco de muitas coisas.
Cada uma destas linguagens apresenta um jeito diferente de pensar em relação às outras, do minimalismo extremo (FORTH) a um conceito mais sofisticado de programação do que o que normalmente usamos hoje (Smalltalk). Eu acho que vale a pena, no mínimo, molhar o pé em todas elas, só para ter uma noção de como a vida pode ser diferente.
Simples é Poderoso
Em Smalltalk, preste atenção na inexistência do conceito de programa: tudo faz parte do "ambiente".
Pode ser chocante à primeira vista, por isso eu vou repetir. Em Smalltalk, não existe sistema operacional, ambiente de desenvolvimento, compilador ou programa. É tudo a mesma coisa.
Em Smalltalk tudo faz parte de um espaço de trabalho em que existem objetos que você pode usar, inspecionar, especializar e modificar à vontade. Não existe o conceito de código-fonte no sentido de que você não precisa parar, editar, recompilar e reiniciar - você modifica o método e os objetos mudam seu comportamento. Ao contrário de quase todas as linguagens, estruturas de controle não recebem tratamento especial em Smalltalk: "ifTrue:", por exemplo, é um método. É um método que recebe como argumento um bloco de codigo que ele pode ou não executar (eu simplifiquei a explicação, mas deixo para o leitor descobrir onde).
Interessante também que não existe limite quanto ao que você pode modificar: como todas as coisas - métodos, classes, blocos de código - obedecem as mesma regras, você pode inspecionar e mudar qualquer coisa. Algumas mudanças ("true become: false" é um clássico) podem ter conseqüências desagradáveis, mas é um risco do uso de ferramentas poderosas. Afinal, se você não conseguir cortar a própria perna, é porque sua ferramenta não é poderosa o suficiente.
Em uma observação não muito relacionada, o XO, o "notebook de mais ou menos US$100", deve vir com um aplicação chamada eToys que é feita em um dialeto de Smalltalk.
Minimalismo Extremo
Das idéias adiante do seu tempo (e do nosso, dizem alguns) do Smalltalk, vamos passar para o outro extremo. Forth é uma linguagem tremendamente compacta (pode ser usada em computadores tão pequenos que não se chamam computadores). É provável que tudo que separa sua torradeira de um programa em Forth seja um minúsculo interpretador. A coisa mais "estranha" para os que chegam é exatamente o que vai fazer com que ela pareça familiar a quem teve ou tem uma calculadora HP clássica. Aqui tudo gira em torno de uma pilha.
Em Forth, você vai "ensinando" a máquina a fazer coisas, dando significado a palavras novas que se tornam comandos da linguagem. Não existem funções ou objetos propriamente ditos - você vai ensinar o computador a fazer esses truques, mas apenas se você precisar.
O que eu quero dizer com isso é que, em Forth, você vai acabar construindo uma linguagem nova especialmente para resolver seu problema e, no meio do caminho, vai fabricar várias pequenas ferramentas para isto.
A título de outra observação curiosa, PostScript, a linguagem que as boas impressoras usam, é estruturalmente parecida com Forth. Você pode, inclusive, programar com ela, bastando baixar um interpretador.
Elegância Extrema
Lisp é provavelmente a mais antiga das linguagens citadas aqui. No princípio, havia dois "feudos". Em um deles, estava FORTRAN, representando a corrente de "vamos fazer linguagens eficientes para usar ao máximo os anêmicos computadores que temos". C/C++, Java/C#, Forth, BASIC e Pascal vivem ou viveram desse lado. Do outro lado, estava o pessoal do Lisp, pensando "vamos fazer a linguagem mais legal que nossos computadores ainda não são capazes de rodar direito". Smalltalk, Python e Ruby moram desse lado.
Naqueles dias, você precisaria gastar várias dezenas de milhares de dólares para ter um computador capaz de rodar Lisp direito (chamávamos de Lisp machines na época e eu lamento nunca ter visto uma pessoalmente). As décadas passaram e hoje o computador em que você está lendo este artigo é mais do que suficiente para rodar Lisp com dignidade.
A sintaxe minimalista do Lisp nos faz pensar os programas "pelo avesso". O que um programador Lisp chama de código-fonte (as S-expressions), um fazedor de compiladores chamaria de parse-tree - o que você vê no fonte é uma representação em árvore, em que dados e funções se misturam e são usados como argumento para outras funções. Essa é, talvez, a sacada mais interessante do Lisp: a distinção entre dados e programa é artificial. É um fruto da sua imaginação (na realidade, vem da falta dela, mas isso tem cura).
Assim como no FORTH, o "jeito natural" de fazer a coisa é construir a linguagem em direção ao problema. E já que programas e dados são feitos da mesma coisa, seus programas podem ajudar você e escrever partes deles mesmos. Metaprogramação é mágica poderosa.
Acredita-se que pelo menos uma ponto-com deu muito certo por ter escolhido usar Lisp enquanto seus competidores batiam a cabeça com linguagens "tradicionais" como C++.
Pedras Preciosas e Trilhos
Muitas pessoas hoje têm aprendido Ruby para poder trabalhar com o Rails. Rails é um framework para a criação de aplicações web baseadas em bancos de dados relacionais de acordo com o padrão MVC (Model-View-Controller - outra coisa inventada pelo pessoal do Smalltalk).
Quando visitar Ruby, note as idéias interessantes sobre orientação a objetos. Observe o uso de herança simples, temperada com mixins e a sintaxe breve para designar variáveis globais, de instância e locais - em Ruby, não se fala em "self". Observe também que closures (blocos de código com contexto - uma idéia vinda do Lisp) podem ter suas próprias variáveis e são também objetos que podem ser passados como um parâmetro ou, segurem-se, atribuídos a um método de outro objeto.
De novo: desaprenda que existe uma diferença entre código e dados. Ela nunca existiu - estava na sua cabeça o tempo todo.
Cobras e Alienígenas
Python é uma linguagem pragmática. Já foi a linguagem "oficial" do falecido sistema operacional Amoeba. Abraça os conceitos da orientação a objetos, mas não dá as costas à idéia de funções, com um tempero interessante: elas próprias são objetos.
Como a maioria das linguagens que eu mencionei aqui, Python tem suporte sintático a tipos "ricos": Você declara listas, tuplas, dicionários e conjuntos com a mesma naturalidade com que cria um inteiro. Falando em listas, aprenda a usar list comprehensions e veja onde você consegue chegar com elas. Abrace de vez a idéia de mixins e descubra como você pode mudar as classes que um objeto extende depois dele ter sido criado.
Assim como Ruby, muitas pessoas chegam ao Python pegando uma carona na dupla Zope e Plone. Zope é um servidor de aplicações escrito em Python e Plone é um gerenciador de conteúdo escrito para o Zope. Entenda-os e aprenda que você só vai usar bancos de dados relacionais quando realmente precisar deles. Parafraseando um dos cabeçalhos do começo, quando tudo o que se conhece são bancos de dados relacionais, tudo se parece com tabelas.
E nem tudo são tabelas.
Apenas como uma observação, em Python você também tem a liberdade de redefinir quase tudo, embora, as conseqüências de dizer "True = False" sejam bem menos devastadoras do que no Smalltalk.
Martelos e Parafusos
Conhecer uma variedade maior de ferramentas faz parte do amadurecimento de qualquer profissional. Com elas você aprende novos jeitos melhores (ou piores) de resolver problemas que você já tem e ganha chances maiores de encontrar boas soluções boas pros que você ainda não tem. Conhecer outras ferramentas faz com que você entenda melhor as limitações daquelas que você já conhece. Evita a visão em túnel.
Isso quer dizer que, se você programa usando FOP ou se você está perfeitamente contente com VB, PHP ou Java, devia tratar de conhecer outras coisas.
E lembre-se de outra coisa muito importante: Se você fizer do mesmo jeito que todo mundo faz, usando as mesmas ferramentas que todo mundo usa, suas chances de fazer melhor do que todo mundo ficam muito menores.
E, a propósito, 55 48 48 50 32 122 105 108 101 70 10 0 do emit loop para todos.
© Ricardo Bánffy
Este artigo também está disponível aqui.