Você não precisa de uma linguagem de programação mais rápida...
Quando programadores debatem sobre problemas de latência em sistemas legados, não é raro ver alguém sugerir que o problema é a linguagem de programação utilizada.
"Python é lento demais! Deveria ter usado Rust."
Acontece que eu NUNCA me deparei com um cenário em que o verdadeiro gargalo é a linguagem.
Você não precisa de uma linguagem de programação mais rápida se:
- as querys estão feitas do modo errado
- o código não diferencia o que deve ser síncrono e assíncrono
- a aplicação não tem cache (quando aplicável)
- a aplicação consome memória como se não houvesse amanhã
Se o time não se preocupa com qualidade de software, a linguagem não vai fazer milagre.
Bons programadores são capazes de refatorar.
O meu ponto aqui é que frequentemente o diagnóstico do problema é feito da maneira errada. É muito confortável olhar um sistema ruim e dizer que o problema é a linguagem. Você terceiriza a culpa para os desenvolvedores da linguagem/framework e ainda ganha argumento para reescrever tudo na sua linguagem favorita.
Em mundo em que todo dia surge um framework novo, poucos se importam em compreender como as coisas são construídas. Valorizem o conhecimento de base e o resto virá por consequência. Abaixo as APIs com queries N+1.
Sua fala faz sentido para um mundo Web, onde o objetivo é criar e consumir serviços.
Eu era pesquisador na de Petróleo, mais especificamente, Sísmica. Então o objetivo era processar volumes gigantescos de dados. Então o "Acontece que eu NUNCA me deparei com um cenário em que o verdadeiro gargalo é a linguagem", nesse meu caso, já me deparei. E digo "Python é lento demais! Deveria ter usado Fortran." (é o que pessoa mais usa nessa área).
Mas o Python mesmo tem várias soluções pra deixá-lo rápido (a maioria é feito em C/C++). Mas o cara tem que saber fuçar. Se se só pegar direto em Python puro, irá sofrer rsrs.
Aqui vai uma opinião um pouco impopular: esse é um problema do mercado de tecnologia no Brasil.
As empresas não estão realmente preocupadas se você entende sobre eficiência de código. Fazem processos seletivos que verificam apenas sua capacidade de escrever instruções sequenciais e performance só vira uma prioridade quando os custos de manter um produto ineficiente no ar ficam altos demais.
Já fiz vários processos seletivos na vida e posso contar nos dedos quantos deles exigiam que eu soubesse sobre complexidade, algorítmos, estruturas de dados, etc.
A soluçao para códigos ineficientes quase sempre é escalonar as máquinas e isso tem dois custos: o financeiro (gastar mais com serviços cloud) e o tech (seguir operando e construindo novas soluções em cima de um código legado que vai dar problema no futuro).
Os profissionais são, em geral, moldados pelas demanadas do mercado. Passar a demandar seriamente conhecimentos sobre complexidade de tempo e espaço (como já acontece em outros mercados pelo mundo) parece ser o primeiro passo para construir um ecossistema de tecnologia mais consciente no Brasil.
Parabens pelo texto, li apenas fatos, que infelizmente ocorrem mais do que o esperado!
Além disso, é importante saber as peculariedades de cada linguagem, de forma que você consiga desenvolver um código da forma mais eficiente possível, e também, simplificar o código, mantendo sua complexidade baixa.
Por exemplo, em java, as strings são "imutáveis", então toda vez que você vai contatenar uma string com outra, o java pega o valor das duas strings na memória, cria uma nova string com a concatenação das duas originais em um novo espaço de memória e "apaga" as originais. Se você precisa concatenar muitas coisas, isso ficaria extremamente lento, sendo mais eficiente você criar um StringBuilder, adicionar todas strings à ele, e depois converter isso para String...
O Fabio Akita faz a citação sobre ChatGPT e como certas direções dependem de entender o problema profundamente - https://youtu.be/Yl-hlwhj2B0
Concordo: você precisa de uma linguagem de programação mais rápida!
oops, deixa eu explicar! Você pode fazer em C ou Rust e, na hora de rodar seu código, ele vai voar! Porém vc vai levar muito mais tempo pra programar qualquer coisa nessa linguagem e esse é o pulo do gato:
Vc não precisa de uma linguagem que rode mais rápido, mas precisa de uma linguagem que seja rápido de vc programar as coisas.
Eu iniciei na programação com C e C++ e queria otimizar tudo, deixar pra rodar o mais rápido. Mas conseguia fazer pouca coisa. Depois que descobri Python e, posteriormente Ruby, vi que realmente são meio lerdas pra rodar algumas coisas, porém a minha PRODUTIVIDADE aumentou drasticamente.
No mundo web, não faz muita diferença pro usuário uma página que leve 1ms pra carregar e uma que leve 100ms (note: 100x mais rápida). Porém faz muita diferença, pra uma empresa, que a produtividade seja 100x (e até muito menos que isso) melhor por se usar uma linguagem mais produtiva.
Além disso, como vc disse: o gargalo quase nunca é a linguagem, mas sim a qualidade do código, o acesso banco de dados, uso de caching etc
E os microsserviços?
Vale ressaltar que depende muito do que você de fato busca realizar. Cada linguagem de programação tem seu objetivo, por exemplo, existem cenários específicos, por exemplo iterações de grande quantidade de items, onde o prórpio PHP irá ser muito mais veloz que o NodeJS. Tudo depende do que você quer.
Outra coisa é a arquitetura e boas práticas. Uma arquitetura assíncrona é a chave da velocidade nas tecnologias Web. O uso correto da linguagem também te dá muito mais potência. Se você fizer uma tarefa de repetição árdua, como um loop enorme, concatenando em cada iteração usando ${}
será mais lento que com "" + ""
. Pequenos detalhes assim, em execuções curtas, não alteram em nada, mas es tarefas de alta repetição, fazem uma diferença enorme.
As microtimizações somente servem para tarefas repetitivas. No final, tudo depende do que seu código faz. Existem tarefas, como produção de raltório, que não dá para otimizar as querys pois você precisa de todas as linhas e dados de uma tabela para poder fazer um cálculo matemático.
E é nessa ideia que também surgiram os microsserviços: fazer tarefas específicas em ambientes especificos, com desenvolcedores específicos para conseguir a melhor velocidade de produção de código, performance e manutenção.