Um guia na construção de tech stacks sustentáveis

Kevin Da Silva
5 min readJan 30, 2023

A muito tempo venho refletindo e pensando sobre as tecnologias que usamos comercialmente e o quao dificil e desgastante é tentar avançar um sistema para a inovação, escala e novos momentos de mercado.

Como conseguir ter um vislumbre do futuro usando tecnologias do século passado que não tiveram a capacidade de avançar na velocidade necessaria para se tornarem ferramentas das quais desenvolvedores não precisem lutar contra para conseguir escalar e manter softwares.

Com isso dito vem o ponto de que existe tecnologias boas o suficiente para nos mover ao futuro mas o mercado apenas não as usa por pura incapacidade de mudança levando assim um loop que nunca encontra um ponto de ruptura e de superação

A idéia principal desse material é fornecer um guia com tecnologias capazes de atingir essa superação, tecnologias que não carreguem uma bagagem do século passado.

Isso também significa que não devemos odiar as linguagens do mercado elas foram bastante uteis no seu tempo, manteremos o código existente nessas linguagens mas devemos dar a elas uma aposentadoria mais que merecida

PS 2 esse é um guia bastante opinionado baseado nas minhas vivencias

Esse material é dividido nos seguintes tópicos:

— Aplicações Web
— — Back end
— — Front end
— Desktop
— Mobile
— Machine learning e data science
— Sistemas/drivers e baixo nivel
— Ops

Um critério universal hoje para escolher uma ferramenta deve ser developer experience, saber lidar bem com concorrencia e arquitetura multicore de forma humanamente compreensivel e eficiente, e com preferencia para imutabilidade, caso contrario só desperdiçariamos recursos computacionais

Quanto a cada tipo de aplicação terão critérios distintos discutidos logo abaixo:

Aplicações Web — Back end

Uso uma linguagem interpretada ou tenho uma aplicação web Java

Elixir, lida de forma fenomenal com concorrencia, umbrella apps ajudam na quebra para microserviços se necessario, existe um ecossistema de ferramentas maravilhosas no quesito tolerancia a falhas e developer experience, além de que roda na maquina virtual do Erlang que ja possui caching, releases ao estilo kubernetes e interoperabilidade com Erlang

Preciso de uma linguagem que compile em binario

Para esses casos linguagens como Go, Haskell, Rust podem ser excelentes alternativas visto que Go possui suporte a CSP e Haskell possui acesso a muitos modelos de concorrencia, e Rust também mas mais a nivel de sistema.

Também são bem completas com bibliotecas que as deixam bastante preparadas para escalabilidade e diversos modos de uso, como mensageria, graphql, grpc.

Preciso usar algo em Java

Bem comum no setor bancário precisar usar alguma tralha que só funciona em Java, nesse caso temos clojure, scala e kotlin como alternativas que possuem uma abordagem mais moderna, menos verbosa e que permitem uma melhor cooperação entre programador e ferramenta

Aplicações Web — Front end

Apesar do Javascript ser uma linguagem com uma biblioteca interna extremamaente zoada e despadronizada, para front ends ela ainda serviria para a maioria dos casos visto que Javascript possui um laço bastante simbiotico com html, css e browser e podendo ser usado em casos de menor complexidade, mas existem casos em que podemos considerar outras ferramentas:

Padronizar a stack

Se seu time usa flutter você pode optar por flutter web, se usa clojure clojure script

Não posso arriscar na segurança a tempo de execução

Elm é uma boa pedida visto que o código é compilado e possui quase zero erros de runtime

Preciso de performance

Webassembly pode ser usado para garantir uma performance excelente para sua aplicação ou determinadas partes dela.

Aplicações Desktop

Desktop possui uma variedade de tecnologias, mas existem algumas que eu acredito serem boas alternativas

Preciso de time to market

Nesse caso não veria problema em utilizar javascript com tauri visto que no final usa um backend em Rust, Flutter também pode ser uma boa alternativa.

Aplicações Mobile

De todas as aplicações as que melhor evoluiram para superar suas anteriores foi o mobile que aposentou o Java e o Obejct C, então as tecnologias seriam mais chover no molhado com Kotlin, Swift e Flutter

Machine Learning e Data Science

Nesse nicho só se houve falar em python e R, mas minha recomendação não seria nenhuma delas

É bastante comum programar em python e usar um backend em C++ e afins, podendo substituir python por R e c++ por fortran ou C, mas isso não só exige profissionais que saibam duas linguagens como demora seu desenvolvimento na troca de constexto entre as varias linguagens

Um problema que não temos em Julia, uma linguagem tão performatica quanto C, mas tão simples como Python tudo isso graças ao LLVM, ou seja sem trocas de contexto, facilidade de treinamento do time

Outro ponto é que a bibliotecas como Numpy, scikit learn etc, são poderosas mas bastante confusas entre si pois não seguem uma biblioteca padrão, em Julia existe multiple dispatch que permite a extensão da biblioteca padrão para novos tipos de dados então a mesma função que opera em listas simples, opera em matrizes do DataFrames e em tipos de dados do FluxMl

Sistemas/drivers e baixo nivel

Nesse quesito eu ainda vejo bastante valor em C e C++ pela capacidade de se mesclarem a qualquer ambiente que rodem, mas Rust deve ser uma alternativa altamente consideravel visto que consegue atingir memory safety de maneira mais capaz que um humano chamando a função free().

Ferramentas como Clis, Banco de Dados também podem ser criados em Go ou Elixir

Ops/Automações

Nesse mundo os scripts são bastante usados e aqui não me oponho ao uso de batch,shell,python, js, etc scripts, afinal são linguagens de scripts e foram feitas para isso, não vejo por que aposenta-las nesse dominio.

O futuro depende de superarmos

Apesar de ainda não termos superado o século passado novas tecnologias estão nascendo agora para solucionar os problemas que surgirão das tecnologias que listamos aqui, com Gleam que tem se tornado uma linguagem tipada para a maquina virtual do erlang com bastante potencial, V que tem uma sintaxe parecida com Go mas possui uma engine de auto free e adaptação que a permite ser uma linguagem de sistemas como Rust, também aceitando assembly dentro de seus arquivos, chamar C de V, chamar V em C e converter C pra V e V pra C, Odin e Zig outras também linguagens de sistemas sendo criadas uma para simulação de fluidos e efeitos visuais e a outra como um substituto para o C e a grain que é uma linguagem que soa como Javascript mas compila para webassembly

Esta foi a tentativa de fornecer um guia de como escolher uma proxima tecnologia que consiga superar suas contradições e avançar sem a tonelada que é o peso da idade, mas que ao mesmo tempo saibam se utilizar do conhecimento dos mais velhos como Elixir faz com Erlang, Clojure com Java etc e assim dar uma merecida aposentadoria as linguagens do mercado.

Tenha um bom dia!

--

--

Kevin Da Silva

I'm a back-end developer, functional programming lover, fascinated by computer science and languages. From the south part of Brazil to the world