Há alguns meses perguntaram ao Rich Hickey:
“How much does a choice of language really matter? Are there good reasons to choose one language over another or does it all come down to taste?”
E sua resposta foi:
“I think it matters quite a bit. A good language is opinionated, and strives to make a particular style of programming easy and idiomatic. It only seems a matter of taste when you are comparing languages that are more similar than they are different, like Java/C# or Python/Ruby. Try something really different like Clojure, Haskell, or Erlang and the fact that it matters becomes readily apparent.”
Eu acho que concordo bastante com sua opinião. Discutir se Java é melhor do que C#, por exemplo, é inútil, porque as duas linguagens são muito semelhantes. Nesse caso, o que acaba pesando mais na hora da escolha é o ecosistema no qual cada linguagem está inserida, que pode agradar mais a um ou a outro programador. É puro gosto.
O mesmo vale para Ruby e Python, como ele mesmo cita.
Mundos diferentes
Mas e se a comparação for entre Java e Ruby, por exemplo, como é que fica? Na minha humilde opinião, fica no sense. Porque Java e Ruby não são liguagens de mesma proposta; e mesmo sendo ambas de propósito geral, ambas tem objetivos claramente diferentes.
Comparação entre mundos diferentes
Agora vou, propositalmente, contradizer um pouco o que eu disse à cima: faz sentido, sim, você comparar Ruby com Java; Erlang com Python; F# com PHP. Sim, faz sentido.
Faz sentido quando você está escolhendo a linguagem que oferece a melhor solução para um dado domínio de problema.
Super CRUD com Erlang? Não, acho que não.
Precisar de concorrência massiva, tolerância a falhas, processos distribuídos, downtime mínimo? Humm, não sei não, mas será que não é de Erlang que você precisa?
Entende? É nessa hora que a escolha de uma linguagem começa a pesar de verdade. Isso realmente importa.
Mundos diferentes se complementam
Tempos atrás, escrevendo programas Erlang/OTP, senti falta de uma ferramenta que me ajudasse a criar rapidamente a estrutura inicial do projeto e umas coisas mais. O que fiz? Criei uma ferramenta que faz isso: otp_kickoff. Em Erlang? Não, em Ruby. Fiz isso em poucas horas, usando Thor.
Pouco tempo depois, senti falta de uma ferramenta de build amigável. Novamente, o que fiz? Criei o ebuilder, usando Ruby/Thor.
Um outro exemplo de mundos diferentes que se complementam é o JSparrow, um cliente de JMS bem fluente, que fiz usando JRuby.
Essa é a ideia de tirar o melhor de cada linguagem!
Mesmo porque, dificilmente, você constroi um sistema de verdade — que não seja um super CRUD — com apenas uma única linguagem de programação. Na minha equipe mesmo, há sistemas desenvolvidos em C# .NET, que são buildados, testados e deployados com Ruby/Rake/Cucumber e usam Java/Ivy como repositório de assemblies. Isso sem falar em JavaScript, que também tem de monte.
Esse é o mundo real dos sistemas de verdade.
Moral da história
Isso me faz pensar que brigas de fanboys de linguagens — em frenéticas buscas por prosélitos — são uma verdadeira piada.