Tendo a web como a minha área principal de trabalho, tenho um interesse natural pelas ferramentas que me possam facilitar a vida. Nesse sentido, algo que hoje em dia é quase essencial é uma boa framework.
No entanto, com o advento da “web 2.0” (detesto o termo), e em particular após o grande sucesso da Ruby on Rails, frameworks para desenvolvimento web têm aparecido como cogumelos. Toda a gente e mais a minha avó tem a sua framework. Claro que algumas são levadas mais a sério que outras e isso, entre outras coisas, acaba por ditar se a framework sobrevive ou acaba os seus dias como uma vaga memória de algo que em tempos ia ser a próxima melhor coisa do mundo a seguir ao velcro.
Ainda por cima há frameworks com propósitos e objectivos diferentes mas claro que os broncos de marketing não diferenciam nada disso e quando querem impingir alguma coisa metem tudo no mesmo saco - uma framework como a Midgard não serve para a mesma coisa que uma framework como a Solar.
Para o que faço e o que me interessa, o termo “framework” significa um conjunto de ferramentas que me permitem criar facilmente um website que tenha algumas funcionalidades base de qualquer website (acesso a uma base de dados, sessões, “clean URLs” ou um “front controller”, etc.) e, se possível, também permita criar outras funcionalidades mais complexas (web services, APIs, AHAH/AJAX…).
Como tem havido um desenvolvimento bruto nesta área, decidi actualizar-me sobre o assunto e nos últimos tempos tenho andado a mexer em tudo quanto é framework.
O panorama
Vejamos o que é que há de mais notável em cada campo. Não vou escrever nenhuma análise técnica das frameworks, vou apenas enumerar as frameworks que penso serem dignas de nota, comentar uma ou outra coisa que considere relevante e ditar a minha sentença. Quem não concordar pode deixar um comentário a dizer porquê ou então pode ir passear. ;)
Ruby
Ruby on Rails
A Ruby on Rails é um brinquedo bonito, polido, elegante, ronrona quando lhe fazemos festas e até nos traz o jornal da manhã - mas é feita em Ruby e tem um factor de “blind coolness” (toda a gente diz que é fixe mas ninguém sabe bem porquê) que me irrita brutalmente, porque parece que hoje em dia todo o puto mimado “aprende” a fazer websites em HTML, depois “aprende” Rails (aprendendo Ruby ao mesmo tempo, que é relativamente fácil) e diz que sabe fazer aplicações web - mas tudo isto somente porque se ouve falar muito de Ruby, quando deveria ser pelos méritos da Framework. Na verdade este é um problema generalizado do mundo do desenvolvimento web mas isso é tema para outro dia.
Resumindo, contra a Ruby on Rails pouco mais tenho do que o desempenho do interpretador da linguagem (que está a ser muito melhorado na versão 1.9) e alguns pormenores quase-insignificantes da framework em si.
Merb
Podia ainda falar da Merb mas para além de também ser feita em Ruby, parece que se vai fundir com a Rails para a Ruby on Rails 3.0, o que pode vir a ser muito bom - mas continuará a ser Ruby. Portanto fica só a menção honrosa, por tentar colmatar os pontos problemáticos da Rails.
PHP
CakePHP
A CakePHP é um brinquedo que foi levado demasiado a sério e que por causa disso conseguiu crescer um pouco - mas não deixa de ser um brinquedo. Permite fazer sites simples muito rapidamente e é bastante fácil de se utilizar - até os problemas começarem a morder-nos nos calcanhares.
Para pequenos projectos até é uma framework aceitável mas para coisas mais a sério é preferível ir por outro caminho.
Zend Framework
A Zend Framework, uma das duas frameworks que considero os “pesos pesados” do lado do PHP, pode vir a ter um bom futuro, pois tem um grupo de desenvolvimento bastante activo e algumas funcionalidades extremamente interessantes. Os seus componentes são todos completamente independentes uns dos outros, o que é um dos seus pontos mais fortes. Por outro lado, sofre de um mal que eu não ainda não consegui conceptualizar na totalidade mas desconfio ter que ver com alguma mentalidade empresarial da Zend. Talvez seja da documentação, que é má, apesar de extensa. Para além das minhas duas primeiras tentativas (ainda nos tempos das versões anteriores à 1.0, é certo), já li e ouvi inúmeros relatos de pessoas que tentaram aprender a trabalhar com a framework mas desistiram devido à documentação ser demasiado confusa.
Kohana
Há também a Kohana, que é basicamente a Zend Framework feita “como deve ser”. A grande falha desta framework está também na documentação extremamente caótica (bem pior que a da Zend Framework), que dificulta imenso a sua aprendizagem.
Symfony
Por fim temos a Symfony, que é o outro “peso pesado” no campo de batalha das frameworks feitas em PHP. A Symfony é um projecto maduro, que tem practicamente tudo o que se pode pedir de uma framework para a web, tem uma excelente documentação e conta com uma comunidade enorme, bem como com algumas implementações dignas de consideração (por exemplo, TED.com, para mencionar dois dos sites mais conhecidos da lista, que contém também alguns sites nacionais).
A versão 1.2 da framework foi um avanço considerável, especialmente pelo upgrade para o Propel 1.3 (o qual já não depende do Creole, que era um dos maiores “bottlenecks” desta framework) e pela passagem do sistema de abstração de bases de dados para plugins, o que permitiu também a inclusão do excelente (e melhor que o Propel) Doctrine.
A Symfony padece no entanto de um problema que, infelizmente, me faz lembrar as frameworks para web feitas em Java: configurações e mais ficheiros de configurações e ainda mais algumas configurações, bem como uma organização de directorias bastante complexa. Alguns dos próprios conceitos da framework são bastante complexos só por si mas após ultrapassar estas dificuldades iniciais (que podem ser bem mais do que muitas pessoas estão dispostas a aguentar, devo dizer) é uma excelente framework.
Python
Pylons
A Pylons, na qual ainda não mexi tanto quanto gostaria (porque me deixei convencer mais por todo o marketing da Django, confesso), é a framework MVC mais recente que conheço para Python e aposta fortemente numa reutilização de código. O resultado é uma framework com uma base de código bastante leve, dando ao utilizador liberdade total na escolha dos vários componentes para acesso à base de dados, templates, etc.
TurboGears
A TurboGears é interessante, sendo também baseada em vários componentes soltos mas com uma diferença fundamental da Pylons: ao passo que a Pylons dá prioridade à liberdade de escolha, a Turbogears prefere dar uma maior consistência ao utilizador em deterimento de alguma flexibilidade - de notar que é também possível trocar alguns dos componentes da Turbogears; o preço a pagar é que é mais trabalhoso e perdem-se algumas vantagens. A Turbogears está um pouco desactualizada, pois houve uma grande evolução na utilização de Python para a web nos últimos tempos e esta framework ainda não se actualizou. A versão 2, que será baseada na Pylons, pretende colmatar esta falha ~mas até agora ainda não existe nenhuma “release” estável~ (parece que decidiram dar-me uma prenda de anos, pois a primeira versão beta do TurboGears2 foi lançada ontem, dia 29 de Dezembro; é para adicionar ao PDT 2.0, que também foi lançado ontem :) ).
Django
A Django é uma framework que cai numa área que considero um pouco cinzenta, pois a sua filosofia parece ser um pouco um misto entre as filosofias da TurboGears e da Pylons - por um lado podemos trocar alguns dos seus componentes por outros que sejam da nossa preferência (por exemplo, o sistema de templates) mas por outro há alguns componentes que são mais dependentes uns dos outros e por isso não se podem desacoplar facilmente.
No entanto é uma framework com funcionalidades absolutamente fantásticas, sendo as minhas preferidas o sistema de abstração de base de dados, o excelente sistema de URLs (que bate aos pontos o Routes do Ruby on Rails, que já é muito bom) e o fantástico sistema de administração, que é provavelmente a peça individual mais valiosa de toda a framework, pelo tempo que poupa.
Como se lê vezes sem conta (e agora vai ler-se vezes-sem-conta+1), é uma framework mais orientada para conteúdos - mas isso não invalida que seja utilizada para contruir outro tipo de aplicações. Segundo a esmagadora maioria dos testes que consegui encontrar, é também a framework mais rápida de entre as “grandes” (Django, TurboGears, Symfony, Zend Framework e Ruby on Rails).
Java
Apesar de ser uma linguagem de programação de que até gosto bastante, não vou mencionar nenhuma framework de Java para a web, pois são geralmente bestas gigantescas com um nível de complexidade absolutamente ridículo. Talvez se enquadrem nos ambientes “enterprise”, em empresas com centenas, milhares e dezenas de milhares de funcionários, em que ninguém se conhece e têm que andar todos os dias de fato e gravata. Apesar disso, as frameworks de Java terão certamente o seu espaço, caso contrário não existiriam tantas. Algo de positivo devem ter mas para o que eu faço prefiro coisas mais leves, obrigado.
A minha escolha
A linguagem
As minhas linguagens de escolha para desenvolvimento web são PHP e Python. São ambas simples e muito utilizadas para desenvolvimento na web, o que é uma parte muito importante da minha avaliação, pois significa que facilmente encontro ajuda para problemas que tenha.
A simplicidade do PHP até levou a um mito sobre a linguagem, pois por ser tão simples, há imensa gente que “aprende” PHP e depois faz websites cheios de problemas. Isto levou a que quem não gosta da linguagem utilizasse isso para a atacar, como se a culpa fosse do PHP e não das pessoas que a utilizam mal. Claro que pode ser argumentado que se uma linguagem permite que se cometam tantos erros tão facilmente, então não é uma linguagem assim tão boa. A alocação de memória em C e C++ é das maiores causas de problemas em software e no entanto ninguém diz que o problema é da linguagem. Ou se calhar até dizem, tanto que se pretende incluir “garbage collection” numa próxima versão da especificação do C++ (não vai aparecer já na C++0x). Mas penso que para quem tem meio palmo de testa e não fale só por falar, entende que há coisas que caem na responsabilidade do programador e quanto às quais as linguagens podem fazer algo para ajudar mas não são responsáveis por elas. Dito isto, PHP é uma excelente linguagem de programação, com os seus defeitos, como todas elas, mas muito orientada para a web, o que neste caso é claramente um ponto a seu favor.
Python é uma linguagem estranha, a princípio, para quem vem de linguagens como C, C++ ou PHP. Não utilizar ponto-e-vírgula no final das instruções lembra-nos visual-basic (blargh!) e utilizar a identação como forma de delimitar os blocos lógicos é bastante estranho, fazendo-me alguma confusão ainda hoje em dia. Mas ultrapassadas essas “dificuldades” iniciais, a linguagem é uma pequena maravilha, com um interpretador bastante rápido e que pode ser ainda mais rápido se adicionarmos o Psyco ou o PyPy.
Ruby como uma linguagem de programação é interessante e útil mas o interpretador precisa de muito amor e carinho para poder fazer frente às duas anteriores. A versão 1.9 está bastante melhor nesse aspecto mas mesmo assim ainda precisa de de ser mais espremida para superar as outras.
Java é uma excelente linguagem de programação, da qual, infelizmente, se anda a abusar para ensinar alunos do ensino superior a programar. No entanto, tudo o que conheço para a web com base em Java é pura e simplesmente ridículo de tão complexo que é. Se calhar são frameworks que são úteis para desenvolver aplicações gigantescas que correm nas intranets de bancos e coisas do género mas usar Java para as aplicações típicas que se vêem pela web e até para algumas coisas maiores, acho que é usar um canhão para tentar matar uma mosca.
As frameworks
Restringindo-me então a PHP e Python e após uma análise profunda, detalhada e extremamente científica das várias frameworks disponíveis para estas linguagens, cheguei à conclusão de que as frameworks que me interessam são a Symfony e a Django.
Isto não significa que não utilize outras frameworks, até porque como disse mais atrás, coisas como a Kohana e a TurboGears são projectos extremamente interessantes. Eventualmente irei mexer mais na Pylons quando estiver mais estável ou quando necessitar de algo para que a Django não seja tão boa mas por agora, as minhas escolhas recaem sobre as duas que referi.
Do lado da Symfony estão a comunidade e documentação, bem como as funcionalidades, como o admin generator, as ferramentas da linha de comandos. Contra ela está toda a configuração e estrutura de directorias que complica um bocado a coisa e quase me faz lembrar Java mas ao fim de algum tempo de habituação é uma óptima framework.
Do lado da Django está o seu excelente sistema de abstracção de base de dados, o seu fantástico sistema de URLs, o seu desempenho brutal, o seu sistema de administração automático e a sua simplicidade. Contra ela está o facto de não ser tão versátil mas é um problema tão pequeno e que (penso eu) surgirá em tão poucas situações, que quase me sinto tentado a dizer que não é problema nenhum.
Serão estas as ferramentas que me irão facilitar a vida nos próximos tempos.
Há outras coisas que mantenho debaixo de olho (GWT e Pyjamas, por exemplo) mas que de momento não se enquadram nas minhas necessidades ou estão ainda pouco maduras para serem utilizadas em ambientes de produção.
E vocês, o que é que usam?
EDIT: Obrigado ao Tony Chee por me apontar alguns erros no texto; já estão corrigidos. :)
Raúl Santos