Caminhos da pedras — versão back-end

Olá!

Um material que uso bastante quando estou aconselhando alguém que está começando na carreira como pessoa desenvolvedora são os roadmaps desse link. Lá é possível encontrar o "caminho das pedras" (ao menos do ponto de vista técnico), de várias áreas diferentes da tecnologia:

acessível em: https://roadmap.sh/

Além de só indicar o material de back-end (área que me especializei e que irei focar nesse texto) e deixar por isso mesmo, na verdade gostaria de fazer breves comentários sobre alguns dos tópicos mencionados e tentar contextualizar alguns dos assuntos para tentar acelerar um pouco o aprendizado.

Se você é iniciante e quer começar na área de tecnologia, peço que leia esse e esse texto primeiro antes de continuar, por gentileza.

O roadmap de back-end é o da imagem abaixo, no qual há um mapa mental dos tópicos organizados em forma de building blocks partindo de assuntos básicos (como internet e sistemas operacionais), até mais avançados (como containers, cloud patterns e arquitetura de software):

Roadmap back-end — versão 2021

O meu intuito com esse texto é contextualizar os assuntos e não somente explicar cada detalhe de cada protocolo ou sistema, isso você encontra por outros meios.

Vamos começar do primeiro tópico do roadmap: Internet.

Simplesmente é o meio por onde tudo que você irá fazer na sua carreira como pessoa desenvolvedora irá passar. A analogia que eu usaria aqui seria a seguinte: conhecer como a internet, protocolo http, DNS, navegadores e hospedagem funcionam é o equivalente a conhecer a estrada em caso de uma viagem. Quanto mais do caminho você conhecer, como atalhos, locais de auxilio em caso de emergência, postos de gasolina e onde as coisas podem dar errado, maior a chance da viagem não dar errado, certo?

Essa é somente uma parte dos assuntos que precisam ser dominados para que você consiga desenvolver sistemas distribuídos (ou seja, que rodam em várias máquinas diferentes) de uma forma robusta.

Nós tópicos relacionados a OS and General Knowledge, temos os conhecimentos mais "puros" relacionados a computadores. Seja na forma como funcionam as instruções de um processador, gerenciamento de memória ou como dispositivos de I/O funcionam, são conhecimentos importantes para quem busca escrever o software da forma mais adequada ao computador que ele está rodando. Portanto, não negligencie estudar esses tópicos.

Existem alguns tópicos que se aplicam a todas as linguagens, como Threads e Concorrência e alguns que embora sejam de uso geral, em algumas linguagens são vitais (por exemplo: em C#, código com o gerenciamento de memória correto é responsável por sistemas com performance 90% melhor do que código feito sem se preocupar com isso). Portanto, tente direcionar o aprofundamento desses tópicos de acordo com a linguagem escolhida, costuma funcionar melhor.

Quando falamos de controle de versão, serei categórico: aprenda git. Segundo a mais recente developer survey do Stack Overflow, 93,43% dos desenvolvedores usam git como ferramenta de controle de versão. Os outros 6,57% só podem estar usando tecnologia obsoleta (como Subversion ou CVS) ou não usam controle de versão. Se você gosta de entender a computação com uma perspectiva histórica, recomendo essa talk do lendário Linus Torvalds (criador do Linux e também do git), sobre porque o resto dos controles de versão são um lixo (palavras dele). Relacionado a isso, se você quiser aprender sobre alguma plataforma como github, bitbucket ou gitlab, literalmente, tanto faz. Todas são muito parecidas e acaba sendo questão de preferência mesmo.

Em se tratando de linguagens, cabe comentar cada uma individualmente:

Java: É uma das linguagens mais populares do mundo e muitos sistemas de missão crítica ainda rodam utilizando ela. Por ser uma linguagem um pouco antiga (de 1996), a curva de aprendizado pode soar um pouco intimidadora para quem está começando agora. Ultimamente anda melhorando em termos de evolução, mas já passou por fases de estagnação. Não é uma linguagem modernosa, mas tem bastante mercado. Quando falamos de frameworks, acredito que dá para ir direto para o Spring Boot se você tá começando.

C#: Por muito tempo, foi uma linguagem que somente era usada em ambientes Windows. De uns 5 anos para cá, agora é multiplataforma e vem evoluindo rapidamente. É uma linguagem de propósito geral (assim como Java) e costuma evoluir bem rápido. A curva de aprendizado hoje pode ser um pouco íngreme, dado a quantidade de features que a linguagem adquiriu ao longo do tempo. O lado bom do C# é que a experiência do desenvolvedor eu acho bastante simples (basta usar o Visual Studio que você não terá muitos problemas).

Rust: É uma linguagem considerada mais adequada para low-level/systems programming, ou seja, ela vem para competir em nichos mais específicos, modernizando sistemas que geralmente são feitos usando C++. Você não verá aplicações comuns em empresas como APIs ou sistemas LoB sendo feitas em Rust por aí (e consequentemente, há um baixo número de vagas fora desses nichos). É uma linguagem rápida, inovadora e bastante segura, pois o compilador te protege de você mesmo (ao contrário de C++, por exemplo) mas ainda não tem muita adoção. Não recomendo como primeira linguagem dado as suas idiossincrasias, mas, é uma ótima opção se você já conhece uma linguagem e está querendo aprender coisas novas para se tornar uma pessoa desenvolvedora melhor.

Go: Eu a considero a "pequena notável". É uma linguagem super simples de aprender (possui somente 25 palavras reservadas) e possui mecanismos altamente opinativos de como escrever código, o que pode ser bom se você não quer se preocupar muito com estilo de código. Apenas siga o que a comunidade recomenda e siga em frente. Além de alta performance e muito barata (já vi cenários em que o sistema escrito em Go consumia 1/10 dos recursos computacionais como CPU e memória do que o mesmo sistema escrito em Java, por exemplo). É fácil de aprender, mas não possui muitas vagas no geral, e para iniciantes, menos ainda, apesar de todos os pontos positivos. Eu acredito que daqui mais alguns anos, se tornará uma linguagem tão popular quanto Java, C# ou Javascript. A título de curiosidade, Docker e Kubernetes são tecnologias que foram escritas em Go.

Javascript: Segunda a pesquisa do Stack Overflow mencionada anteriormente, é a linguagem mais popular atualmente. Apesar de surgir na web, também roda no back-end, usando tecnologias como Nodejs (consolidada) ou Deno (relativamente experimental). Aprender Javascript é obrigatório hoje em dia. Vaga não falta, mas acredito que possa saturar o mercado daqui algum tempo, justamente porque todo mundo que tá começando de 2019 em diante começa por ela. Além disso, existem casos de uso que ela tenta atender, mas não deveria (desenvolvimento desktop com Electron, que parece uma gambiarra). Se você quer ir para o front-end, aprender javascript e algum framework como React, Angular ou VueJs é obrigatório. Mas como esse texto é voltado para back-end, Nodejs nesse contexto é mais uma opção e não a única.

Python: A linguagem que tem a fama de ser a mais fácil de aprender. É a linguagem mais usada em áreas como analytics, machine learning e afins. Para back-end puro de alta performance, acredito que os resultados são melhores em linguagens compiladas. Se você busca empregabilidade, é uma ótima opção, mais a frente eu explico o porquê.

Ruby: A linguagem que boa parte das startups de 2010 para cá criaram monolitos que foram reescritos depois. É uma linguagem bastante elegante e bastante agradável em se tratando de developer experience. Pela minha percepção não tem muita coisa nova sendo feita em Ruby hoje, porém, é uma linguagem bastante adequada para sistemas web, mas, o suporte para outros cenários deixa um pouco a desejar. Curiosamente, é a linguagem da lista com mais vagas disponíveis no Linkedin. Eu chuto que é porque na verdade é difícil de achar pessoas desenvolvedoras (portanto, as vagas se acumulam) e não porque tem muita gente usando.

Clojure: Não está listada no roadmap, mas, se você conseguir passar pelos parênteses, dizem por aí que você se diverte bastante usando. É uma linguagem que roda no ecossistema da JVM e tem o paradigma funcional como base. Se você não sabe o que é isso, já escrevi sobre isso aqui. É uma linguagem que vem se tornando popular ao longo do tempo (inclusive a quantidade de vagas no Linkedin me surpreendeu bastante). Caso você queira trabalhar no Nubank (a empresa mais famosa que utiliza essa linguagem), é obrigatório saber Clojure (e Datomic).

Kotlin: Também roda no ecossistema da JVM e eu a enxergo como a sucessora espiritual da linguagem Java. Além de desenvolvimento back-end, é uma linguagem que também pode ser usada para desenvolvimento Android. Possui poucas vagas no Linkedin, mas me parece que é o caminho natural dos desenvolvedores Java mais experientes migrarem para Kotlin. Acredito que seja questão de tempo para ela ganhar tração.

PHP: É a linguagem que boa parte da Web usa. É uma linguagem bastante simples, mas, justamente por ser muito flexível, ela não te obriga a aprender "certo" algumas coisas. Não falta pessoas desenvolvedoras em PHP, justamente por isso, em média, o salário de pessoas que usam essa tecnologia costuma ser mais baixo. Tive sérios problemas de performance ao trabalhar com sistemas que utilizam PHP e não recomendo a tecnologia para aplicativos de missão crítica. Para sistemas menores e freelancing, talvez seja a opção mais produtiva existente.

Elixir: É uma linguagem brasileira que tem um suporte muito bom para concorrência e paralelismo, ou seja, sistemas de alta performance. De sintaxe amigável e enxuta, além de usar o que tem de melhor do paradigma funcional, é uma ótima linguagem, porém, quase ninguém usa. Ainda. Acredito que vai se tornar mais popular com o tempo. Recomendo aprender Elixir pelo conhecimento sobre o modelo de atores, Erlang e do porque da BEAM (a máquina virtual que a linguagem roda em cima), ser um software extremamente tolerante a falhas. Porém, em termos de empregabilidade para quem tá começando, não recomendo.

Para embasar os comentários sobre empregabilidade que fiz, eu rodei uma pesquisa usando os termos linguagem + developer no Linkedin e veio a seguinte quantidade de vagas:

Quantidade de Vagas por linguagem no Linkedin

Resumindo: Se você quer emoção e alto risco (e possível alto retorno), vá de Go, Kotlin ou Clojure. Se você quer um emprego rápido, vá de PHP, Java, C#, Python, Ruby ou Javascript.

Quanto a Databases, talvez o ponto mais importante seja entender que não existe um único modelo de banco de dados que resolva todos os problemas. Além disso, para uma carreira como pessoa desenvolvedora Back-End não é necessário em um primeiro momento estudar sobre bancos de dados de nichos específicos (como Neo4j ou Cassandra). Portanto, comece por algum relacional (pode ser MySQL, SQL Server ou de algum provedor de nuvem) ou NoSQL (como MongoDB ou algum similar da nuvem). Mas, independente de qual banco escolher, aprenda a linguagem SQL em profundidade. É algo muito comum em muitas pessoas desenvolvedoras que eu conheço a falta de um conhecimento aprofundado em escrita de queries, o que pode causas inúmeros problemas de manutenção e de performance. Aqui cabe um outro detalhe: aprenda o suficiente sobre stored procedures e triggers para não precisar usá-las.

O entendimento do restante dos tópicos (ACID, Normalization, CAP Theorem) são importantíssimos, principalmente em arquitetura de soluções e engenharia de dados. Portanto, aprenda sobre esses conceitos o quanto antes. Lembre-se: entender os conceitos fundamentais por trás das tecnologias é mais importante do que decorar alguns comandos específicos. Saber os fundamentos é um tipo de conhecimento que não tem data de expiração e que ninguém pode tirar de você. Ao contrário de dominar todos os comandos de uma versão X do software Y. Se o desenvolvedor mudar algo no código e mudar os comandos, seu conhecimento se torna obsoleto no próximo deploy.

Aproveitando que estamos falando de arquitetura, entender conceitos como REST, APIs, Caching, Security, CQRS, Microservices, Serverless, Event Sourcing e afins te ajuda a pensar em outras formas de fazerem sistemas se comunicarem entre si. Nesse ponto, concordo com a ordem proposta no roadmap.

Na sessão Building For Scale, talvez não tenha uso para todo mundo. Em todos os lugares que já trabalhei como profissional de tecnologia, apenas em 1 tive que usar todos os conceitos relacionados a escala. Na maioria dos casos, não adianta tentar aplicar conceitos de algo em "escala Netflix" se a empresa que você trabalha não tem a escala da Netflix. Aprenda esses conceitos depois de saber fazer CRUD, dominar uma linguagem de programação e SQL, não antes. E mesmo aprendendo, acho que vale alinhar as expectativas aqui e dizer que mesmo assim você pode não usar da forma como gostaria.

Apesar de não estar tão explícito no roadmap a importância dessas ferramentas, eu gostaria de reforçar a importância de aprender Docker e Kubernetes. A primeira para facilitar a gestão das dependências e evitar problemas diversos de ambiente e configuração. E o segundo para conseguir construir soluções mais robustas e que escalam de uma forma automática e saudável. Eu já escrevi sobre como escalar sistemas baseado em experiências que tive aqui se você tiver curiosidade.

Além disso, existem alguns trabalhos da comunidade de pessoas desenvolvedoras que devem ser celebrados e incentivados. Aqui fica a recomendação dos livros gratuitos do Jefferson Fernando (do Canal LinuxTips), sobre Docker e também sobre Kubernetes.

Os assuntos que por ventura não comentei e que estão no roadmap são importantes sim, porém, podem ser estudados em um segundo momento.

Com isso dito, espero que esse texto tenha sido útil para você e para o seu desenvolvimento =)

Até!

--

--

Escritor-Desenvolvedor

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store