Que princípios guiam as tecnologias?

Quem é melhor tecnologicamente? .Net ou Java? Ruby? Php? ... Quem?

Sei que estou me metendo num assunto polêmico, mesmo aqui na Microsoft. Mas, como é uma pergunta frequente, vou dar minha visão.

Para este tipo de análise, não uso o estado atual destas tecnologias, mas as forças que as fizeram surgir e as que vão fazê-las se desenvolverem nos próximos anos.

Minha percepção é que .Net nasceu com alguns princípios fortes que ainda estão em curso:

  • Generalidade: É um ambiente que visa à produção de software de missão crítica para cenários que vão do software para workstation convencional à web;
  • Engenharia de Software: Ele foca em uma engenharia de software para programas grandes, daí a opção de usar tipos fortes, maximizando o erro em tempo de compilação, componentização e outros;
  • Simplicidade, sempre que isto não fira os princípios acima: isto é, sempre que possível o .Net oferece facilitadores, como editores drag-drop, intellisense, inferência de tipos (que é uma maneira elegante de tirar o ônus da tipagem forte sem remover seus benefícios), etc.
  • Multi-linguagem, sendo base para uma gama grande de linguagens (F#, Eiffel, etc.).
  • Acesso nativo à plataforma Windows e softwares de terceiros que habitam esta plataforma!

(é claro que existem questões como ser de alguma forma open ou não, custo, empresas por detrás das tecnologias, etc., mas não creio que estes pontos são reais diferenciadores dos caminhos destas tecnologias. Tais fatores impactam muito mais em questões como ecossistema, marketing, acesso, etc. do que com mecanismos linguísticos ou outro aspecto mais técnicos)

Se tivermos isto em mente, fica óbvio perceber que Ruby on Rails (correção - ver comentário) e Php não visam o mesmo cenário do .Net. Eles foram concebidos visando cenários mais focados (Web) e aceitam erros em tempo de execução.

Já no caso de Java, tenho dúvidas se os princípios da simplicidade e multi-linguagem são tão fortes quanto no .Net, mas tenho certeza que o princípio do “Acesso Nativo”não é válido – ele é substituído por “ser multi-plataforma”. Daí a dificuldade para obter o acesso a DLLs, ActiveX, COM+, etc.

São duas estratégias distintas com impactos distintos: Java irá tentar o mínimo múltiplo comum e/ou recriará parte da infra-estrutura com bibliotecas Java, mesmo que isto impacte no desempenho quando comparado a um código nativo. .Net tentará incorporar as novidades da plataforma e dos softwares de mercado tão logo possível, chamando API’s nativas ou utilizando protocolos padrão.

Multi-plataforma é um valor charmoso e atraente, mas nem sempre real. Muitas vezes (não tenho número de mercados) não será necessário mudar de plataforma ao longo da vida do aplicativo. Além disto, a virtualização é outra maneira de mitigar esta questão, o que, para muitos, tira um pouco da sua força.

São muitos os aspectos que fazem a escolha de um produto. Mas, a meu ver, são poucos os princípios de escolha que fazem as tecnologias percorrer caminhos tão diferentes.

Não cabe aqui dizer qual é a melhor, mas sublinhar as diferenças para que vocês façam a suas escolhas de forma consciente.

Em que princípios vocês apostam?