A linguagem de programação "bala de prata"

Fev 17 (pt)

Neste artigo irei mostrar a conclusão de uma pesquisa feita por mim onde comparei algumas linguagens de programação e seus possíveis casos de uso, elencando as que conseguem ser efetivas em mais nichos possíveis em relação a aquelas que atingem apenas nichos específicos. Ah, não existe "bala de prata" de fato. Mas aqui pode haver "insights" para empresas sobre qual tecnologia pode se adaptar melhor dado cada contexto.

Para a pesquisa selecionei as linguagens "mais populares" atualmente segundo estatísticas do StackOverflow e GitHub junto com algumas em crescimento no mercado:

Populares:

Python, Javascript (e derivadas), Go, Ruby, C++, C# e Java

Tendências:

Kotlin, Elixir, Rust

Para elencar as linguagens selecionei alguns nichos:

  • Mobile (iOS / Android)
  • Aplicações Web / Micro Serviços
  • OS / Programação de aplicativos desktop (GUI)
  • Baixo nível
  • Alta performance CPU-bound
  • Concorrência / Paralelismo
  • CLI (command line interface)
  • Ciência de dados
  • Machine Learn
  • Jogos
  • IOT

Para cada um deles pontuei de 0 a 3, sendo:

0, não atende de nenhuma maneira: Não encontrei nenhum suporte para tal nicho, isso inclui ausência de frameworks, bibliotecas, recursos próprios e arquitetura da linguagem ou até limitações impostas por algum outro motivo.

1, atende de forma bem escassa: Encontrei algum suporte mas bem escasso, como: frameworks ou bibliotecas imaturas ou obsoletas e sua comunidade também não dá muita atenção para o determinado nicho.

2, atende: Encontrei bibliotecas e frameworks maduros e estáveis para determinado nicho, possui uma arquitetura favorável, mas claramente não é o foco da comunidade ou o principal uso da linguagem.

3, atende muito bem: Encontrei foco da comunidade, arquitetura, bibliotecas e frameworks maduros, estáveis e populares. Além de várias pessoas recomendando a linguagem como sendo a mais adequada para o nicho.

obs:. Não estou considerando pontos como "qualidade de código" ou "sintaxe", esses que de fato podem ser muito importantes na hora de considerar uma tecnologia ou outra. Também levando em conta que eles são bem mais complexos de medir e podem variar de time para time.

Como fiz a pesquisa

Parte 1 - Entendendo o consenso geral da comunidade.

Sendo X a linguagem, primeiro pesquisei "X main usage", depois, para cada nicho pesquisei "X for Y", "Y X library" e "X Y framework" sendo Y o nicho.

A partir daí colhi informações e opiniões gerais de sites como Quora, Reddit, fóruns espalhados pela internet e cheguei a bibliotecas e frameworks no GitHub.

Parte 2 - Analisando projetos no GitHub.

Após chegar a páginas de projetos open source / bibliotecas e frameworks no GitHub, elenquei entre imaturo, maduro e estável da seguinte maneira:

imaturo: Projetos com pouca ou nenhuma atualização, muitas issues e poucos contribuidores.

maduro e estável: Projetos com atualização constante, populares, que existem a um tempo considerável e tem uma relação entre issues e contribuidores (issues / contributors) saudável.

Resultados

Abaixo estão os resultados de cada linguagem de acordo com a minha percepção após fazer a pesquisa:

Python



Sem nenhuma dúvida Python é a "bola da vez" quando o assunto é ciência de dados e IOT, no GitHub é a linguagem com mais issues e repositórios relacionados aos temas (lado a lado com Javascript para IOT). Com a "simplicidade" no "core" de sua ideologia Python é adotado de forma abrangente no meio acadêmico e por quem deseja se mais tornar produtivo com códigos extremamente legíveis.

Fora de IOT e data science Python ainda é uma excelente aliada se precisarmos construir aplicações web, desktop, CLI e jogos simples com uma "enxurrada" de bibliotecas excelentes como:

  • Django (https://github.com/django/django). Com 54.8k de stars e 2082 contribuidores coloco lado a lado com Ruby on Rails como uma das mais maduras e robustas ferramentas para desenvolvimento web.

  • Kivy (https://kivy.org/). Uma biblioteca incrível para construção de aplicativos multi-plataforma, conseguimos compilar um projeto inteiramente escrito em Python para IOS, Android ou Desktop.

  • Para programas CLI: Alive progress, asciimatics e python-prompt-toolkit (https://github.com/rsalmei/alive-progress, https://github.com/peterbrittain/asciimatics, https://github.com/prompt-toolkit/python-prompt-toolkit)

  • Pygame (https://www.pygame.org/news). Uma biblioteca com mais de 20 anos de estrada, com todos os recursos necessários para criar os mais diversos jogos.

    "A Free and Open Source python programming language library for making multimedia applications like games built on top of the excellent SDL library. C, Python, Native, OpenGL. "

  • Numpy (https://numpy.org/devdocs/user/whatisnumpy.html) Biblioteca escrita em C muito utilizada em ciência de dados:

    Numpy is a Python library that provides a multidimensional array object, various derived objects (such as masked arrays and matrices), and an assortment of routines for fast operations on arrays, including mathematical, logical, shape manipulation, sorting, selecting, I/O, discrete Fourier transforms, basic linear algebra, basic statistical operations, random simulation and much more

Para concorrência e CPU-bound Python parece não ser uma das melhores alternativas mas ainda sim há algo que possa se fazer para otimiza-lo nessas tarefas, como por exemplo, podemos criar processos evitando o GIL (Global Interpreter Lock): https://docs.python.org/3/library/multiprocessing.html

Javascript (e derivadas)

 

Quando dizem que Javascript vai dominar o mundo pode haver um pouco de verdade. Junto com suas derivadas (Typescript, Node, Deno e etc…) a linguagem consegue ter ferramentas para os mais diversos nichos, muitas que dispensam apresentação e comentários como: Vue, React, Angular, Express, Nest, Next, Nuxt, Electron ou React Native. Com Javascript conseguimos atingir a maioria das plataformas (IOS, Android, Desktop, Debian, Windows), produzir aplicativos CLI e desenvolver jogos com ferramentas maduras como https://phaser.io/, https://github.com/pixijs/pixi.js e https://gdevelop-app.com/ não deixando a desejar em quase nada. A linguagem ainda é a que têm mais repositórios e issues relacionados a IOT no GitHub.

Para ciência de dados senti que podem faltar algumas ferramentas, apesar disso há bibliotecas bem legais para machine learning como https://github.com/BrainJS/brain.js#brainjs e https://js.tensorflow.org/. Dependendo do projeto, consideraria dar uma comparada lado a lado com Python, que provê um "arsenal" mais completo para o nicho. Muitas vezes podemos até acabar usando Node e Javascript em conjunto com Python. Olha só que bacana esse site: https://js4ds.org/

Ainda sim, quando o assunto se torna alta performance, concorrência e baixo nível esta não parece ser a melhor escolha. Mas aí seria exigir demais, não é?

Ruby



O nicho mais forte da linguagem Ruby é web. O framework Ruby on Rails com 47,5k de stars, 4260 contribuidores e apenas 340 issues (o que da em média , 0.07 issues por pessoas que já contribuiram) sem dúvida é uma das peças de software mais robustas e maduras do mercado, fortemente utilizado por GitHub, Shopify, Gitlab, Airbnb e por aí vai, a experiência se traduz em 15 anos de um projeto que inspirou o resto da web inteira em 2005 e até hoje continua inovando e se colocando no nível ou até a frente de suas "cópias" em outras linguagens. Além do Ruby on Rails, a linguagem ainda conta com inúmeras bibliotecas que deixam a produtividade alta para quem quer desenvolver para Web, como: Devise, Jekyll, Hotwire, Sinatra, Roda, Hanami e etc…

Ruby também apresenta ótimos recursos para construção de CLI. Além da sintaxe focada em produtividade e no bem estar do programador, temos bibliotecas maduras como https://github.com/piotrmurach/tty, https://github.com/fazibear/colorize e https://github.com/jfelchner/ruby-progressbar. Alguns programas CLI notórios são escritos com a linguagem, como: Homebrew, Vagrant e Chef.

Tirando esses dois nichos, há projetos bem legais como https://github.com/hybridgroup/artoo para IOT, https://github.com/shoes/shoes4 e https://github.com/AndyObtiva/glimmer para construção de GUI, Inclusive fiquei surpreso com a quantidade de bibliotecas para Machine Learning: https://github.com/arbox/machine-learning-with-ruby

Na sua versão 3 lançada no final de 2020 a linguagem ganhou suporte a concorrência, um início de tipagem estática e um boost de performance CPU-Bound, que podem trazer, quem sabe, mais recursos e atenção para outros nichos.

C++

 

C++ Apesar de ser uma das mais antigas da lista, ainda é largamente utilizada e cumpre muito bem o seu papel, sendo uma das principais quando lidamos com questões de baixo nível, alta performance e jogos. Sem dúvidas podemos fazer qualquer coisa com C++ e muito bem, mas entendi que uma das barreiras de sua escolha em determinados nichos é a complexidade e a preferência geral por linguagens mais simples, isso acaba acarretando em menos frameworks e bibliotecas, como no caso de web, microserviços e até ciência de dados e machine learn onde a maior parte da comunidade é acadêmica. Para jogos C++ é uma escolha notória, veja alguns dos títulos escritos com a linguagem:

Battlefield Word of Warcraft League of Legends GTA San Andreas DOOM

Também encontrei um projeto bem legal para criação de aplicações mobile multi plataforma: https://www.boden.io/

C#

 

Sem me prolongar muito, C# provavelmente é uma ótima escolha para atacar a grande maioria dos nichos, principalmente se o foco é Windows. A linguagem tem grande flexibilidade, frameworks ótimos e performance invejável. Veja algumas das ferramentas que teremos no nosso "arsenal" ao escolhermos utilizar C#:

.NET core: Framework multiplataforma extramemente robusto, focado em performance e alta escalabilidade para desenvolvimento de aplicações Web, Desktop e CLI. É utilizado por empresas como Stack Overflow e Godaddy

Xamarin: Framework extremamente maduro e robusto para desenvolvimento de aplicações mobile nativas e multiplataforma, pode ser considerado por muitos como a melhor opção para o nicho! O Xamarin é de fato uma ferramente fantástica, veja mais em: https://docs.microsoft.com/pt-br/xamarin/get-started/what-is-xamarin

Unity: C# é a linguagem principal de uma das principais e mais populares ferramentas para criação de jogos. https://unity.com/pt

Não há dúvidas que C# se daria muito bem para tarefas de Data Science, mas claramente não há vontade dos cientistas de dados em sair do Python! Utilizando C# para algum projeto de Data Science com certeza teríamos que "re-inventar a roda" em algum momento. Ainda sim há projetos maravilhosos para o Nicho, veja: https://github.com/SciSharp

Em IOT também temos uma atenção interessante por parte da Microsoft: https://dotnet.microsoft.com/apps/iot

Java / Kotlin

 

Outra grande escolha para atacar a maioria dos nichos são as linguagens da JVM. O ecossitema de ferramentas, bibliotecas e frameworks feitos é gigante. Vale ressaltar que adicionei Java e Kotlin juntos porque Kotlin é 100% compatível com Java e a maioria das ferramentas servem para as ambas igualmente.

Mobile:

Java é a linguagem principal dentro de desenvolvimento Android e Kotlin nos trás possibilidades para desenvolver também para IOS (https://kotlinlang.org/lp/mobile/)

Machine Learn / Ciência de dados:

Graças a sua performance, muitos podem indica-la como sendo a escolha perfeita para tarefas mais intensivas de ML, depois de Python, é uma das linguagens mais populares no nicho. Fink, Hadoop, Hive e Spark são algumas das principais ferramentas para Big Data, que anda lado a lado com Ciência de dados.

Jogos:

Diversos títulos foram escritos com a linguagem, como: Minecraft, Runescape e FIFA 11. Além de ser uma escolhe versátil para o nicho, Java é predominante no desenvolvimento de jogos para Android.

CLI:

https://picocli.info/

Web:

Java está na web desde os primórdios dos anos 2000. Sempre evoluindo, não deixa nada a desejar hoje em dia com frameworks mega-robustos como Spring

IOT:

Aplicativos Desktop:

Elixir

 

Elixir tem todos os requisitos para ser considerada a mais robusta ferramenta quando o assunto é concorrência e paralelismo: A linguagem tem total compatibilidade com Erlang/OTP e é escrita em cima da Erlang VM (tecnologia por trás do Whatsapp, Facebook messenger), além de adotar o paradigma funcional, imutabilidade e vários conceitos que ajudam a escrever códigos extremamente assertivos e eficientes para esse nicho, como o Actor Model. O resultado disso é que a linguagem tem se tornado a escolha definitiva para empresas como Discord, Stone, MasterCard, Sumup, Square Enix entre outras.

Sua maturidade com concorrência e paralelismo também a tornam uma das melhores tecnologias para aplicações web e microserviços. A escalabilidade que ganhamos utilizando o framework Phoenix (https://www.phoenixframework.org) é em todos os sentidos: desde qualidade de código até alta performance, escalando verticalmente ou horizontamente, executando milhões de conexões websocket simultâneas e etc… Elixir e Phoenix utilizam os recursos da máquina como CPU's e memória de forma extremamente eficiente.

Para IOT também existem projetos que atingiram uma boa maturidade como o Nerves (https://github.com/nerves-project/nerves) e o Scenic (https://github.com/boydm/scenic).

Em Ciência de dados e Machine Learning há uma crescente movimentação da comunidade para explorar o potencial da linguagem, veja:

Fora esses nichos, é bem difícil encontrar alguma atenção da comunidade, no máximo uma ou outra biblioteca em estágio bem inicial.

Rust

 

Rust é uma linguagem que pode receber o título de "C moderna". Foi criada justamente para facilitar a criação de tasks "baixo nível" com uma sintaxe bem próxima a linguagens de "alto nível", o que a torna uma das linguagens mais amadas por desenvolvedores segundo pesquisas do StackOverflow.

Rust held the top spot for most loved technology for the fifth year in a row

Seu ecossistema ainda é um tanto "enxuto", mas há um potencial para Rust se tornar uma das linguagens mais importantes dos próximos tempos. Suas características permitem que ela tenha todos os recursos necessários para atingir com extrema excelencia todos os nichos:

Performance extrema Sintaxe moderna Gerenciamento de memória eficiente

Em relação a comunidade, encontrei maior maturidade nos seguintes nichos:

Aplicações Web / Microserviços https://rocket.rs/ https://actix.rs/ https://github.com/koute/stdweb

Jogos https://amethyst.rs/ https://ggez.rs/ https://bevyengine.org/

CLI https://github.com/clap-rs/clap

Para Machine Learning e Data Science enxerguei bastante potencial, mas sinto que ainda falta engajamento da comunidade.

Go

 

Go vem em grande ascenção no mercado desde a sua criação nos escritórios da gigante Google, e por vários motivos:

Compila em qualquer plataforma e para qualquer plataforma (de forma extremamente rápida), o que é uma grande vantagem em comparação a grande maioria das linguagens e a torna uma escolha excelente para aplicações multiplataforma. Em nenhuma outra linguagem que pesquisei encontrei bibliotecas tão maduras para CLI's como https://github.com/spf13/cobra ou https://github.com/urfave/cli. Não é "a toa" que aplicações como Docker foram escritas com Go. Também temos ótimas bibliotecas para GUI's como https://github.com/fyne-io/fyne e https://github.com/andlabs/ui.

É rápida e performática, tornando-a excelente para qualquer aplicação que pode necessitar de alto desempenho: web, microserviços críticos e jogos, por exemplo. Para web e microserviços temos uma cartela cheia de ótimas opções: Gin, Beego, Revel, Martini, Buffalo e por aí vai. Para jogos temos com maior destaque as bibliotecas https://github.com/faiface/pixel e https://ebiten.org/.

É muito simples e fácil de aprender, o que facilita para novos desenvolvedores.

Tem suporte nativo, fácil e muito eficiente para lidarmos com concorrência e paralelismo, com os "go channels e routines" é sem dúvida uma das melhores escolhas para escrever aplicações que tenham esses requisitos como fundamentais (apesar de considerar Elixir como superior nesse quesito, graças suas características funcionais a excelente Erlang VM e OTP, ainda pretendo escrever um artigo sobre isso).

Na minha opinião muitas bibliotecas tendem a surgir nos próximos anos com sua popularidade crescendo e não consigo enxergar uma limitação que faça Go não se tornar uma escolha totalmente viável para quase todos os nichos em um futuro não muito distante! (deixando a parte de baixo nível e gerenciamento de memória um pouco de lado).

Conclusão

Atualmente é impossível atingir todos o nichos com excelência utilizando uma linguagem só, de fato. Apesar da maioria delas serem de propósito geral, a influência e direcionamento das comunidades é evidente. Ruby poderia ser uma excelente escolha para Data Science se no meio acadêmico fosse popular e a comunidade trabalhasse em ferramentas assim como aconteceu com Python

Aqui vai o nosso ranking de "linguagem bala de prata" pela soma de pontos:

  1. Java / Kotlin: 28
  2. C#: 26
  3. C++: 25
  4. Python, Go, Rust e Javascript: 23
  5. Ruby: 17
  6. Elixir: 16

E aqui pela quantidade de nichos com 2 pontos ou mais:

  1. Java / Kotlin, C# e C++: 10
  2. Python, Go e Javascript: 8
  3. Rust: 7
  4. Ruby: 6
  5. Elixir: 4

Devo querer que minha empresa tenha uma stack mais homogênea, com menos linguagens possíveis?

Depende, se tratando da maioria das empresas, não. É literalmente impossível e até ruim querer manter uma linguagem só dentro de uma empresa. Não há nenhuma vantagem: Um desenvolvedor que coda Web e Mobile muito provavelmente não será o mesmo que irá codar a parte de Data Science ou Devops. O "homogêneo" deve partir de um nicho e não de uma stack. E um nicho é naturalmente separado, "não homogêneo" em relação as suas comunidades e tecnologias. Resumindo:

Se você é dono de uma empresa procure escolher a linguagem ideal para cada nicho e não uma linguagem que cubra todos ou a maioria dos nichos. Porém, se você é um desenvolvedor solo "full-mega-blaster-stack" que tem novas idéias para startups ou pega "freelas" dos mais variados e precisa codar tudo sozinho pode ser interessante e produtivo escolher fazer mais com menos linguagens possíveis.



Ei, o que achou desse artigo?

Compartilhe e dê sua opinião clicando em uma das redes abaixo:


Muito obrigado!