Tenho um amigo que é diretor de uma grande startup e está querendo reescrever seu sistema web. A atual tecnologia deles é PHP, e estão estudando a migração para Java, Ruby, ou Python, sendo que estão mais propensos a Python.
Na maior parte de minha carreira eu tenho trabalhado com tecnologias Microsoft (e mesmo que você não queira acreditar, o C# é com toda certeza uma das melhores linguagens que existe hoje), mas em projetos paralelos estou sempre tentando me manter atualizado com as principais tecnologias open source. Faz alguns poucos meses que decidi aprender uma linguagem nova, e recebi de um amigo a dica pra dar uma olhada na linguagem GO (golang, criado pelo Google).
O GO é uma tentativa de combinar a facilidade de programação de uma linguagem dinâmica e interpretada com a eficiência e segurança de uma linguagem estática e compilada.
O GO é uma linguagem compilada, similar ao C (inclusive em termos de performance), e é usado pelo Baidu, servindo 100 bilhões de requisições por dia.
Eu andei estudando bastante, não só a linguagem em si, mas também as principais críticas, elogios, e comparações com outras linguagens. Pesquisei não só o GO, mas também Python, Ruby, Scala, Rust, Java 8, D, e Nimrod. Dentre as linguagens modernas, o Python e o Node.js são realmente as linguagens open-source mais populares. No entanto, há outros fatores importantes pra considerar em uma migração:
É bacana ver não só a popularidade da tecnologia, mas principalmente a curva de crescimento. Pelo que eu pesquisei, as linguagens que mais crescem são o GO e o Scala. Várias pessoas estão abandonando Ruby, Python, C# e Java para migrar para o GO, que segundo as previsões vai se tornar muito popular.
O mundo de linguagens non-enterprise (ou seja, aquelas que não tem suporte da Microsoft nem da Sun) é muito dinâmico, e as pessoas rapidamente enjoam das linguagens e pulam pra outra. Eu li uma opinião (e concordo) que o Python em breve vai ser abandonado pelos desenvolvedores assim como o Ruby já está sendo.
PS: O Node.js, por outro lado, continua firme e forte, e crescendo.
Linguagens dinâmicas (como ASP3, PHP, Python, Ruby) não tem compilador, então dá pra facilmente quebrar o funcionamento do programa sem saber. Os defensores destas linguagens dizem que você mitiga isso através de testes unitários, mas a verdade é que criar testes unitários para cobrir todo seu código (100% coverage) exige muito mais esforço do que simplesmente utilizar uma linguagem estática (como GO, C#, Java, Scala) onde o compilador indica os erros de tipos, conversões inválidas, blocos que não foram fechados, etc.
Ou seja, linguagem dinâmica aceita tudo, e linguagem estática te mostra os problemas ainda na compilação.
Há discussões muito interessantes sobre isso aqui (mais comentários aqui) e aqui.Os defensores de linguagens dinâmicas acreditam que elas são mais produtivas para criar sistemas novos (onde os requisitos mudam frequentemente), mas por outro lado existem estudos que dizem que a produtividade não depende da linguagem ser dinâmica ou estática.
O fato é que quando o sistema já está rodando e já tem um codebase grande (que é o caso desta startup do meu amigo), as linguagens dinâmicas viram um pesadelo pois para mudar qualquer coisa você não tem o compilador para te indicar quais pontos quebraram e precisam de conserto. Ou seja, fica muito mais difícil de refatorar algo do que em uma linguagem estática.
PS: O Node.js é uma linguagem dinâmica, mas comparando com Python e Ruby, o grande apelo do Node é que você usa uma única linguagem pra client e pra server. Por outro lado este argumento é um pouco falho, pois a linguagem é apenas uma parte do problema, e os skills de front-end e back-end são muito diferentes, de modo que dificilmente conhecer a linguagem vai permitir um desenvolvedor de back-end migrar pra front-end ou vice-versa.
O GO é efetivamente compilado pra código nativo, e não é interpretado por uma JVM (java) nem CLR (.net). Ele gera um binário mesmo (Linux, Windows, e acho que até pra Android). Segundo os testes, a performance é absurdamente superior a Ruby ou Python (se não me falha a memória é mais de 100x mais rápido), dado que estes são interpretados, e é até mais rápido que Java e C# por ser compilado pra código nativo.
Ainda sobre o ponto 2, o GO é a a linguagem estática que mais “roubou” características das linguagens dinâmicas pra manter o código conciso.
Ele roubou também características como ter um http server próprio “lightweight” (que existe no Python e no Node), e possui também implementações de shell interativa (REPL). Dizem que o GO juntou o melhor dos dois mundos. (Tem alguns recursos de linguagem dinâmica mas é estático e compilado). GO e Node são consideradas as “next-gen languages”, mais modernas do que os antecessores Ruby e Python.
Apesar de ter copiado algumas características que permitem o código ser mais conciso, ainda assim a sintaxe é baseada no C, então é bem familiar pra quem estudou C ou Java ou C#. Já Ruby e Python tem toda uma sintaxe própria (o Python por exemplo tem delimitador de escopo baseado em identação, e o Ruby tem toda uma sintaxe própria em relação a passagem de parâmetros e retorno de funções).
Claro que isso é um pouco questão de gosto. :-)
Baseado em tudo isso exposto acima, a minha sugestão para meu amigo foi a seguinte:
GO em primeiro lugar (porque realmente acho que um codebase grande pede uma linguagem estática), e Node.js em segundo lugar. Scala seria uma opção também.
Apesar de achar que o GO é uma ótima opção, vejo 3 possíveis razões (riscos) para NÃO usar o GO:
Mão de obra é mais rara (Python e Node são bem mais comuns). Por outro lado, o GO é uma linguagem MUITO fácil de aprender, e está atraindo muitos usuários de Ruby (principalmente) e Python.
Ou seja, contratar para GO é apenas questão de escolher o melhor candidato e ver se ele está disposto a aprender GO.
Como expliquei, eu considero que linguagem dinâmica é desvantagem (especialmente quando você já tem um codebase maior), mas alguns desenvolvedores acham que é algo positivo.
Há uma rara possibilidade de que GO NÃO se torne uma linguagem tão popular quanto Python é hoje. Mas não é o que mostram as tendências.
A única vantagem que vejo no Python (até em relação ao Node) é que tem um grande número de bibliotecas para aplicações científicas (machine learning e afins), porque ele tem uma sintaxe bem concisa pra arrays e matrizes, por isso o pessoal acadêmico gosta dele (apesar de não ter muita performance). Fora que tem um ecosistema mais desenvolvido, porque é mais antigo que Node e GO, mas isso acho que mudará com o tempo. GO e NODE por serem mais recentes não tem um ecosistema tão desenvolvido, mas o GO está se desenvolvendo muito rapidamente. É a linguagem mais popular do Github.
PS: O C# eu nem coloquei na comparação porque ele ainda não é algo maduro pra ambiente Linux, e mudar de ambiente estava fora de cogitação. Mas em termos de recursos, o C# está bem moderno (diferente do Java que ficou obsoleto [edit: o Java 8 correu atrás do prejuízo e trouxe algumas “novidades” que as outras linguagens já tinham há anos]), e é uma linguagem bem mais completa que o GO. Além da questão de ainda não rodar direito em Linux/Docker, a outra desvantagem é que ele não é compilado pra código nativo. Com o novo projeto da Microsoft, o .NET Core, o .NET passará a funcionar bem no Docker/Linux, o que poderá o colocar em pé de igualdade com as opções open source.
PPS: Não falei muito do Scala (vou futuramente incluir), mas resumidamente é uma linguagem estática, compilada, híbrida (funcional e imperativa), que roda em cima do JVM. É uma linguagem muito poderosa, e que permite código muito conciso, e esta é a principal crítica que tem sofrido - que seu código fica “difícil de entender”. Aí que está o grande apelo do GO, ele é simples, simples até demais. Não tem nem operador ternário. Por outro lado, se você tem um time que não seja muito grande, e não tenha um turnover muito grande, o Scala provavelmente é uma opção até melhor do que o GO.
A verdade é que o GO tem muitas críticas, assim como o Scala também, o Java, o C#, o Ruby, o Python, e qualquer outra linguagem mainstream. Afinal, como disse Bjarne Stroustup, “Só há dois tipos de linguagens: aquelas que as pessoas reclamam e aquelas que ninguém usa”.