Executando verificação de segurança...
3

[Criando um Aplicativo] Por que escolhi Rust para ser o Backend da minha aplicação?

Introdução

Estou criando um aplicativo relacionado ao tema de produtividade e organização, que tem no momento um foco em estudantes que desejam ter uma forma rápida e fácil de se organizar. O App irá permitir a personalização do aplicativo para a melhor forma que o usuário encontrar para se ter uma produtividade desejada.

Uma das features que imaginei para o App, seria as multiplas pessoas acessarem o aplicativo e se organizarem em conjunto, igual como funciona no Figma ou Miro. E claro, isso exigiria uma capacidade muito grande de um servidor, tendo alto desempenho e segurança para a aplicação.

Minhas Primeiras Ideias Para o Backend

Como a maioria dos desenvolvedores Mobile, eu pensei inicialmente no Firebase, que é muito mais do que o suficiente pra criar um MVP de algum aplicativo, e remove a necessidade de criar uma API própria.

Além do mais que, eu sou especializado em Mobile, então eu precisaria usar para o Backend alguma tecnologia que fosse performática, prática, DIVERTIDA de usar e se aprofundar sobre. Porque eu desejo focar na criação de uma ótima usabilidade e experiência do usuário para o Aplicativo, que é o que de fato hoje faz uma pessoa passar mais tempo usando seu aplicativo ou não.

O que eu mais gosto no Firebase, é a facilidade da autenticação e o banco de dados NoSQL dele, o Firestore, que tem um limite muito bom para contas gratuítas. Porém, ele se torna caro a partir do momento que o App escala, e de uma forma ou de outra, em algum momento eu teria que acabar criando uma API Rest própria se eu quisesse escalar o App e fazer ele um produto que quero que seja.

O Processo de Escolha da Linguagem de Programação (Trade-off)

Após perceber que de uma forma ou de outra eu teria que migrar do Firebase, decidi então procurar por linguagens de programação que pudessem resolver meu problema, que eu me interessava por aprender mais sobre e, que principalmente me fizesse sair da minha bolha.

As tecnologias que já havia estudado por mais tempo foram Python, Dart e Java. Havia chegado a estudar sobre Javascript, mas havia me enrolado todo e acabei pulando direto pra estudar Next com Typescript (Não deu certo).

Baseado em alguns vídeos e artigos da Internet e influências de algumas pessoas e empresas, acabei elencando essas 4 tecnologias:

Apesar de Node.js ser uma tecnologia muito incrível, que já evoluiu muito e tem evoluído muito, ela não seria exatamente sair da minha bolha, pois é muito parecida com outras tecnologias que já havia usado e não teria o gostinho de estar aprendendo algo novo e sim algo que eu estaria me aprofundando, pois já conhecia o ecossistema JS.

Acabou que as 3 tecnologias mais fora da bolha para eu seriam o Clojure, Rust e Elixir. Sendo o Rust a que com certeza eu teria mais dificuldade, então, possívelmente a mais divertida!

As motivações de eu ter escolhido essas 3 tecnologias:

Clojure foi por causa da Nubank, que usa ela para criar o seu Backend, o que me deixou curioso para entender mais sobre a linguagem utilizada numa empresa tão grande e inovadora.

Elixir foi principalmente por causa dos vídeos da Rockeatseat. Que quando eu vi um pouco sobre e o pipe operator, me fez ter muita vontade de estudar mais sobre a linguagem e o paradigma funcional.

Rust... Sinceramente, como não ficar curioso com a linguagens que já ganhou mais de 5 vezes seguidas como a Linguagem mais amada de todas? Além das várias notícias massas sobre ela que já saíram na Newsletter, como:

Vulnerabilidades relacionadas à memory safety do Android caem à medida que base de código utiliza mais Rust: entre 2019 e 2022, ocorrências desse tipo de falha caíram de 223 para 85 anualmente, representando 35% do total de vulnerabilidades do Android contra 76% há quatro anos. O Android 13 é a primeira versão em que a maioria do novo código adicionado usa linguagens memory safety como alternativa ao C/C++, com Rust representando 21%. As informações são do site Google Security Blog.

E essa outra notícia:

Desenvolvedores C++ estão cada vez mais difíceis de encontrar no mercado, apesar da grande demanda em setores como finanças e automotivo: um possível motivo para isso seria o fato da linguagem estar sendo rotulada como “legada”, com alguns especialistas sugerindo que, por questões de segurança, ela seja descontinuada em favor do Rust. As informações são do site eFinancialCareers.

Como eu sou apaixonado com a área de Mobile, ao ver uma notícia que falava sobre como Rust estava auxiliando os Softwares do Android, me fez ter uma certe tendência a pesquisar mais sobre ele do que as outras tecnologias.

As primeiras perguntas que tinha sobre cada uma das tecnologias eram:

  • Como eu poderia construir de forma rápida e fácil API's Rest?
  • Seria possível eu escalar de forma fácil a aplicação? Adicionando Features novas e removendo bugs de forma fácil?
  • Existem integrações com tecnologias Cloud como AWS ou Azure?

Obviamente o Node.js arrebentou essas e outras perguntas de forma disparada!

O Clojure e Elixir me pareceram linguagens que precisam evoluir muito no sentido de integrações com outras tecnologias (principalmente Cloud), eu acabei sentindo que elas estão muito nichadas ainda e que eu poderia acabar fazendo um OverEngineering em algum momento (ou vários), o que contradiria o que eu disse no início do artigo sobre uma tecnologia prática e que me permitisse focar no que eu realmente gostaria, o UX do aplicativo.

Os Finalistas e a Decisão Final!

Apesar do Rust ser uma tecnologia recente, comparada a outras, ele possui uma comunidade muito forte e grandes patrocinadores.

Acabei achando de forma fácil frameworks que poderiam possibilitar que eu criasse API's Rest com Rust como o Rocket, mas claro que não tão práticos quanto um Nest.js.

Porém, na parte de analisar como as duas tecnologias se sairiam em Cloud, foi o que me fez ter a decisão definitiva.

Analisei algumas comparações de Rust e Node, que da para visualizar nesses artigos:

E gente do céu... Vamos aos Dados!

Uma Comparação Básica

Enquanto uma API Rest construída em Restify com Node.js suportava 8.000 requisições por segundo, o Rust usando Rocket suportou 72.000 requisições por segundo!


Will Smith chocado

Mas e em Nuvem? Como fica?

E como esse gráfico abaixo mostra, quando comparado com Go, Node.js e Rust dentro do AWS Lambda, o Rust conseguiu ser mais rápido e usar menos recursos que as outras tecnologias:



Apenas isso já seria incrível! Mas, para melhorar, a AWS está criando suportes especialmente para o Rust, onde podemos acessar alguns recursos aqui nesse link:

E o que achei mais interessante nos recursos da AWS sobre Rust, foi uma seção especialmente feita sobre Sustentabilidade, onde mostra como podemos usar Rust para reduzir o processamento de computadores e criar Softwares mais suntentáveis, indo muito na linha das ascensão das soluções e iniciativas ESG, que vão ter um crescimento maior ainda esse ano. Podemos acessar o link para essa seção por aqui:

Conclusão

Todas aquelas 3 perguntas que fiz inicialmente para decidir sobre qual tecnologia usar, foram respondidas! Onde pensei numa estratégia de criar microsserviços em Rust usando o AWS Lambdas, para uma ótima escalabilidade e praticidade na criação do meu Backend.

Caso tenham sugestões melhores, estou aberto a ideias e debates!

Algumas outras fontes de conhecimento que vi na decisão de escolher Rust:

Quem Sou?

Meu nome é Thiago, tenho 19 anos, sou desenvolvedor Mobile desde 2021! Já passei por alguns projetos e adoro sempre desafios que possam me fazer usar todo meu talento =)

Meu linkedin: https://www.linkedin.com/in/thiagoaugustozeferino/

Espero que não seja errado postar coisas "pessoais" como foto e linkedin, porém, as vezes sinto uma falta de contato humano no Tabnews, por só ter o nome das pessoas e, que muitas vezes está ilegível.

Carregando publicação patrocinada...
2

Nenhum problema na tua escolha. Vejamos as tuas motivações:

Clojure : Se o Nubank usa e até comprou a empresa que criou Clojure, alguma coisa de especial tem. Se fosse só por segurança com relação a memória, eles poderiam ter optado por Rust. Mas eles precisam segurança nos resultados.

Elixir: Nubank também comprou a Platfomtec (empresa onde foi criada Elixir pelo José Valim). Mas pipes é apenas um detalhe de sintaxe. A motivação deveria ser mais focada nas características da VM de Elixir. Tem um vídeo com o Valim na Rocketseat que vale ser assistido https://www.youtube.com/watch?v=roc-5euwalY (deixa rolando e vai só escutando enquanto fazes outra coisa).

Rust: O hype atraiu muita gente. É bom pois geram um ecossistema com bastante coisa (como JS). É segura em uns aspectos mas nem tanto em outros. Só para se ligar tem um texto em https://fotomix.wordpress.com/2022/06/05/nan-on-error-resume-next/

Inclusão tardia

As vezes é interessante usar a mesma linguagem no frontend e backend. Saiu uma vaga de emprego no Reddit Job Application for Staff Software Engineer, Data Access at Reddit com uma renumeração razoável (198,200 - 297,300 US$). Detalhes:

  • Use the unique programming language, Nim, for frontend and backend work.
1

As vezes é interessante usar a mesma linguagem no frontend e backend.

Em Mobile, isso é bem inadequado. Porque é um ecossistema inteiro, assim como Web, e que tem seus próprios tópicos e tals.

E no meu caso, eu não gostaria de usar tecnologias como Ionic, Xamarim ou React Native, só pra facilitar o desenvolvimento do código em todo o projeto. Porque no final, o resultado vai ser deplorável.

Entendo que tem empresas e pessoas que preferem ter um produto medíocre (mediano) em algumas partes mas que pelo menos seja fácil de trabalhar com ele. Porém, eu gosto de fazer tudo com qualidade, o que pode ser difícil ou "impossível" as vezes, mas me faz ficar muito mais feliz com o resultado e com certeza vai deixar os usuários do Aplicativo mais confortáveis e entusiasmados ao usá-lo.

Imagina se quando a Apple tivesse sido criada, eles tivessem pensado em fazer os produtos deles da forma mais fácil e que todo mundo poderia fazer? Invés da forma mais difícil e que geraria um puta impacto na experiência do usuário?

2
1

Obrigadoo pelo adição de conteúdo!

Na verdade, acabei nem olhando muito mais sobre o Elixir depois que vi que ele não tinha integrações muito boas com sistemas cloud, quando comparado com Node e Rust.

Mas imagino que logo, logo vai melhorar essa integração e o Elixir vai crescer mais ainda! Qualquer dia desses faço um projeto só com ele.

2

Pipe esta vindo pro JS |> igual do Elixir.

Embora de pra criar PIPE, COMPOSE e outras no js puro mesmo!

Com node uso Fastify https://www.fastify.io/benchmarks/

Express e restify são muito lentos.

Mas tem outros ainda mais rápidos!
Ou o próprio server do Node puro!
Se você usar webSocket
é bom usar o uWebSockets
Ele é o mais rápido dos mais rápidos servidores
de websocket que existe hoje.

https://github.com/uNetworking/uWebSockets.js/
Não sei se existe para RUST.
Seungo o autor até para HTTP simples o uWebSockets é o mais rápido de todos.

https://github.com/uNetworking/uWebSockets/tree/master/benchmarks#benchmark-driven-development

O node sempre vai ficar atrás de linguagens compiladas como
C, C++ e Rust, e sempre deve usar mais recursos é da natureza do node
pois tem mais coisas envolvidas!

O Figma usa webassembly https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x

Agora o back, não sei é ainda assim > https://qr.ae/prUAtM
O back-end é escrito em Ruby(que não é conhecida por ser rápida nem usar poucos recursos) com Sinatra, usando Postgres(isso eles mudaram pra PostGraph) como banco de dados e hospedado na AWS

Abraços e boa jornada pelo RUST. Pretendo aprender ela tbm!

1

Pipe esta vindo pro JS |> igual do Elixir.

Muuuito massa, deu uma pesquisada e parece que vai demorar ainda para vir como uma funcionalidade nativa do JS.


Ou o próprio server do Node puro!
Se você usar webSocket
é bom usar o uWebSockets

Com certeza o JS tem muitas formas iradas a serem usadas, principalmente se tiver um conhecimento mais sênior sobre. Fico sempre impressionado com os vídeos do Erick Wendell sobre o assunto. Porém, usar o Node e JS raíz exigiria que eu gastasse muito mais tempo do que outras tecnologias para que pudesse criar algo que atingisse todos os requisitos que eu desejaria.


O Figma usa webassembly https://www.figma.com/blog/webassembly-cut-figmas-load-time-by-3x

O interessante do Rust, é que podemos usar ele para WebAssembly também, na própria documentação dele fala sobre isso:

2

Acho que esqueci de deixar claro:

O uWebSockets é um webserver/socket escrito em C++, e C principalmente.
Feito para velocidade.

Ele não foi feito para Node inicialmente!
Mas tem plugin pra ele!
E faz o padrão do Node ser de criança perto dele kkkk

Segundo seu autor é o mais rapido que existe hoje!
Não importa se você usa websocket ou http.
Ele funciona com ambos e em velocidade animal!

Aqui tem uns exemplo em RUST
https://github.com/uNetworking/uWebSockets/search?l=rust

Caso você queira dar uma olada!

Como você esta bem preocupado com isso. Seria uma boa dar uma olhada e fazer testes!

Abraços

1
1
1
2

Já ouviu falar do Bun?

Já ouvi falar sim! Porém, me parece algo muito novo para eu considerar a utilizar, e não me parece trazer muitas novidades além de só velocidade.

Além de que, comparado com o estado atual do Node, é meio descabido substituir ele, talvez se usasse em conjunto, como uma forma de melhorar aplicações Node atualmente, aí sim eu me interessaria. Porque atualmente o Node é interessante por todo o suporte que ele tem para construir aplicações seguras, escaláveis e de fácil entendimento, é uma tecnologia muito irada e estável.

Por exemplo, o Bun tem integrações com Cloud, Banco de Dados e outras ferramentas que o Node tem? Se não, nem tem como pensar como alternativa, pois vais ter que realizar um OverEngineering no processo de construção do Software que pode acabar até tirando as vantagens que foi criado para ter, como a velocidade.

[Edit]

E ainda mais que, hoje nos temos ferramentas como o Astro que já servem para facilitar o Server Side Rendering.

1

Cara, previsão do futuro é um ramo muito incerto. Tanto o Deno quanto o Bun são tecnologias que ainda não estão maduras o suficiente, o Deno foi lançado em 2018 e ainda está na versão 1.30, o Bun começou ano passado e está na versão 0.5 tornando seu futuro ainda mais incerto. O node saiu em 2009 e não faz muito tempo que se tornou tão popular. Atualmente o Deno me parece muito mais interessante por conta das suas funcionalidades mesmo sendo mais lento. Qual deles vai se sobressair só o tempo dirá.

1
1

Tudo bem Tiago?

Comecei a um tempo observar Rust até estou vendo alguns materiais no YouTube que ensinam o básico...

Eu achei bem legal seu projeto e a idéia é algo que ja pensei em fazer como projeto também!

Mas gostaria de saber se neste seu projeto é possível incluir um Road Map misto, entre preenchimento automático e manual. Fiquei interessado em aprender mobile e Rust... Ainda estou Python, JS e PHP com laravel.

interessa ajuda de um junior pra esse projeto. Onde seria um escambo de mão de obra em troca de aprendizado?

Se interessar, vou deixar meu LinkedIn para contato.

https://www.linkedin.com/in/helbert-nogueira-jesus-de-souza-a96a7a41

1

Ainda estou Python, JS e PHP com laravel

Opa, vejo que tais estudando muita coisa em conjunto né?

Sugiro escolher uma tecnologia só e focar nela, porque a maior parte das empresas vai pedir que tu tenha conhecimento em apenas uma tecnologia e o ecossistema dela. Porque os ecossistemas de Python, JS e PHP são bem diferentes.

interessa ajuda de um junior pra esse projeto. Onde seria um escambo de mão de obra em troca de aprendizado?

Na verdade, esse projeto é algo pessoal meu, e um desafio que meio que impus em mim.

Caso você precise de experiência, eu recomendo você também se auto impor um desafio. Vi que falasse que já tivesse uma ideia parecida de projeto, então vai lá e coloca ele em prática =)

Meme do Just Do It


Mesmo que talvez demore um pouco, e acabe em trancos e barrancos, tenho certeza que vais aprender muito. Esse artigo talvez possa ajudar com a motivação pra não parar um projeto logo no início:
1
1
1

Opa, já sim!

Porém, não é tão diferente quanto o Firebase, e ainda usa banco de dados relacional, o que eu não gosto tanto, prefiro NoSQL, por isso gosto do Firestore.

Mas uma outra alternativa massa, pro Firebase e o Supabase, é o Hasura. Que pode funcionar muito bem e até melhor do que o Firebase. Porém, o Hasura só suporta bancos de dados relacional (mas muitos bancos), e está ainda em desenvolvimento a integração com MongoDB.

2

Acho que o banco de dado pra você pode ser o https://rethinkdb.com/
Ele é NoSQL, em tempo real e com API que lembra SQL

O RethinkDB é o primeiro banco de dados JSON escalonável e de código aberto construído desde o início para a Web em tempo real. Ele inverte a arquitetura de banco de dados tradicional, expondo um novo e empolgante modelo de acesso – em vez de pesquisar alterações, o desenvolvedor pode dizer ao RethinkDB para enviar continuamente resultados de consulta atualizados para aplicativos em tempo real. A arquitetura push em tempo real do RethinkDB reduz drasticamente o tempo e o esforço necessários para criar aplicativos escalonáveis ​​em tempo real.

Quando o RethinkDB é uma boa escolha?

O RethinkDB é uma ótima opção quando seus aplicativos podem se beneficiar de feeds em tempo real para seus dados.

O modelo de acesso ao banco de dados de consulta-resposta funciona bem na Web porque mapeia diretamente para a solicitação-resposta do HTTP. No entanto, os aplicativos modernos exigem o envio de dados diretamente ao cliente em tempo real. Os casos de uso em que as empresas se beneficiaram da arquitetura push em tempo real do RethinkDB incluem:

Web colaborativa e aplicativos móveis
Aplicativos de análise de streaming
jogos multijogador
Mercados em tempo real
Dispositivos conectados
Por exemplo, quando um usuário altera a posição de um botão em um aplicativo de design colaborativo, o servidor precisa notificar outros usuários que estão trabalhando simultaneamente no mesmo projeto. Os navegadores da Web oferecem suporte a esses casos de uso por meio de WebSockets e conexões HTTP de longa duração, mas adaptar os sistemas de banco de dados às necessidades em tempo real ainda apresenta um enorme desafio de engenharia.

O RethinkDB é o primeiro banco de dados escalonável de código aberto projetado especificamente para enviar dados para aplicativos em tempo real. Ele reduz drasticamente o tempo e o esforço necessários para criar aplicativos escalonáveis ​​em tempo real.