Quais as competencias necessárias e desejaveis para um desenvolvedor backend
A idéia é se houver uma demanda escrever um guia atualizado para a carreira em DevOps, Analise de Dados e suas variações e também para Desenvolvimento FullStack. Mantendo essa promessa, este artigo é sobre a carreira de desenvolvedor de back-end moderno, e serve apenas como uma recomendação direta de tecnologias, com algumas direções e a ordem em que a curva de aprendizado se torna mais prática, porém, não pode ser tido como um guia definitivo, já que seus objetivos pessoais e até mesmo sua carreira em particular pode ter necessidades muito diferentes das apresentadas aqui.
Sem mais delongas, vamos começar, e nossa linha de raciocínio foi baseada no guia do developer-roadmap escrito e atualizado pelo autor kamranahmedse. Você pode encontrar o roteiro dele detalhado na imagem abaixo, no entanto, irei explicar cada etapa logo abaixo.
Antes de começar, embora no roteiro dele não exista necessidade de conhecimento em HTML / CSS, é recomendável que você obtenha pelo menos algum conhecimento e saiba como escrever algum HTML / CSS básico, pois sua rotina de trabalho em grande parte vai servir para alimentar o trabalho de um desenvolvedor de front-end e que vai utilizar essa tecnologia, e o seu conhecimento de como ela funciona, pode gerar muito melhores resultados.
Etapa 1 – Aprenda as Linguagens de Programação Necessárias
Na imagem, você deve ter notado que foram separadas linguagens em 4 grupos, linguagens de script, linguagens funcionais, linguagem multi-propósito e linguagens enterprise ou que podem ser usadas para diversos cenários, para todos os segmentos, existem algumas opções, e você deve ter conhecimento em pelo menos 2 tipos dela, sendo que a primeira linguagem que você dete ter contato é uma linguagem de script e posteriormente uma linguagem enterprise, depois uma escolha funcional e por fim um ambiente multi-propósito.
Para quem esta iniciando no desenvolvimento de back-end, eu recomendaria uso de PHP ou PYTHON, para quem já teve contato com alguma outra linguagem de qualquer tipo ou já tem conhecimento de linguagens como C/C++ ou que tenha estudado lógica de programação, opções como RUBY ou NODE.JS podem ter uma curva de aprendizado menor que as anteriores. Aqui no Brasil a linguagem de script que vem crescendo muito e abrindo muitas opções de vagas é o NODE.JS já o PHP possui grande número de vagas, mais o mercado absorve melhor profissionais com experiência na linguagem. A escolha de uma linguagem de script como primeira opção vem pois elas têm muita demanda e permitem que você se familiarizasse rapidamente, assim como possa ingressar em uma vaga. Se você estiver migrando do front-end, ou ainda não decidiu qual opção definitiva de carreira tem, talvez ache o Node.js mais fácil, ou de poder reutilizar seu conhecimento, além de haver um grande mercado de trabalho para isso.
Se você já conhece alguma linguagem de script, recomendo que não escolha um linguagem “Funcional” ou “Multiparadigma”. Por exemplo, se você já conhece PHP, não vá para Python ou Ruby, em vez disso, experimente Erlang ou Golang. Isso certamente ajudará a expandir seu pensamento e a abrir sua mente para novos horizontes. Já, linguagens enterprise são ótimas para se aprender, porém, o mercado de trabalho para elas não absorve bem profissionais sem experiência na carreira de desenvolvimento até mesmo pelo perfil de trabalho do profissional delas.
A principal dica nesta primeira fase, é que indiferente de qual a linguagem escolhida, o mais importante são os conhecimentos de funcionamento de uma linguagem de programação, a implementação dos algoritmos e das estruturas e a forma como os dados entram e saem nos sistemas informatizados e como esse processamento ocorre. Em resumo a dica de ouro aqui é conhecer profundamente a lógica de desenvolvimento, não a linguagem em si, pois se você sabe como as coisas devem ser feitas, tecnicamente falando, implementa-las em uma ou outra linguagem é mais simples. Fazendo uma analogia, um livro que atingiu o status de BEST SELLER não chegou lá porque está escrito em portugês ou em inglês, e sim porque seu conteúdo é rico, consistente e bem elaborado, o idioma pode ser traduzido livremente e ainda assim a mensagem central será a mesma e com a mesma qualidade.
Etapa 2 – Pratique o que você aprendeu
Há melhor maneira de aprender é praticando, depois de escolher a linguagem que vai iniciar seu aprendizado, é hora de adquirir o conhecimento básico dos conceitos dela, o melhor lugar para isso é a própria documentação da linguagem, ou algum curso detalhado mostrando exemplos concretos de aplicação e de práticas com essa linguagem. Atualmente a maioria das linguagens possui instalação e suporte para os principais sistemas operacionais como Windows, MacOS, Linux e Posix em geral, então, instalar o suporte a linguagem no seu computador de estudo ou de trabalho é o primeiro ponto, e posteriormente ir produzindo pequenos scripts ou serviços que você possa implementar para testar. Abaixo alguns exemplos de coisas que você pode desenvolver para ir treinando suas habilidades em back-end.
Experimente criar um serviço que faça a consulta de CEP, podendo usar uma base pública, ou mesmo integrar a um banco de dados, vá incrementando esse serviços para gerar uma consulta completa de países, estados, cidades, bairros, ruas, entre outros, que devolva os dados em formato JSON, depois implemente uma forma de devolver esses mesmos dados em formatos diferentes como XML ou CSV.
Crie uma microsserviço, que implemente um catalogo de contatos, com nomes, endereços, telefones, emails e que permita todo o CRUD (CREATE – READ – UPDATE – DELETE) dos dados, implemente esse serviço, usando uma especificação amplamente usada como RESTFull ou SOAP de modo que possa entender como funcionam esses padrões e como outras pessoas vão consumir os seus dados produzidos no back-end.
Implemente funcionalidades que te façam manipular o sistema de arquivos e outros recursos da linguagem, por exemplo permitindo o envio de uma imagem, isso vai te auxiliar a entender profundamente como funcionam os diversos protocolos e recursos.
Etapa 3 – Aprenda o Gerenciador de Pacotes
Neste ponto, eu indicaria que você já publique seus testes em serviços como o GitHub para se familiarizar com versionamento do software, além de aprender como funcionam os gerenciadores de pacotes, que podem ser considerados como uma premissa básica para todos os tipos de sistemas, afinal, você não vai querer re-inventar a roda, até porque talvez na sua concepção de roda ela não vai funcionar tão bem como as já amplamente usadas e testadas. Os gerenciadores de pacotes ajudam a usar bibliotecas externas em seus aplicativos e a distribuir suas bibliotecas para uso de outros.
Se você escolheu PHP, terá que aprender Composer, Node.js tem NPM ou Yarn, Python tem Pip e Ruby tem RubyGems. Seja qual for sua escolha, vá em frente e aprenda como usar seu gerenciador de pacotes e como produzir pacotes pare ele. Para funcionar de aneira correta, você já deve ter conhecimento de versionamento e como os padrões de comunicação e de linguagem devem funcionar, deste modo, qualquer pessoa que queira usar seus pacotes ou mesmo consumir os recursos do seu microsserviço não precisa aprender especificamente como você os implementou. Basta ter o conhecimento geral da aplicação de comunicação e padrões como o JSON ou XML.
Etapa 4 – Padrões e práticas recomendadas
Cada um dos idiomas tem seus próprios padrões e melhores práticas de fazer as coisas. Estude-os para o seu idioma escolhido. Por exemplo, o PHP tem PHP-FIG e PSRs. Com o Node.js, existem muitas diretrizes orientadas pela comunidade diferentes e o mesmo para outras linguagens. É importante seguir os padrões mais aceitos entre a comunidade de desenvolvedores que utilizam a linguagem que você escolheu.
Esses padrões o ajudarão até mesmo a receber ajuda em fóruns ou mesmo em plataformas como o StackOverflow pois facilita para os que querem ajudar, que eles possam entender rapidamente o que você está fazendo e como você já tentou, bem como ajudam a identificar o erro e as prováveis soluções. Hoje, praticamente todas as linguagens possuem comunidades de programadores e que estão dispostas a ajudar indiferente do seu nível de conhecimento na linguagem.
Nesta etapa, você já deve ter pleno domínio da linguagem escolhida, e também dos padrões de codificação e de comunicação entre softwares (APIs ou mesmo bibliotecas e pacotes) bem como saber identificar e utilizar serviços fornecidos por terceiros, que atendam estes padrões de comunicação, deste modo seu software vai poder consumir recursos fornecidos por outros softwares e também gerar recursos que possam ser consumidos pelos outros softwares de maneira independente.
Etapa 5 – Segurança
Nesta etapa, provavelmente você já deve estar trabalhando ou pelo menos desenvolvendo aplicações de maneira comercial e já deve se preocupar com a segurança, certifique-se de ler sobre as melhores práticas de segurança, diretrizes do OWASP e entender os diferentes problemas de segurança e como evitá-los veja, que algumas linguagens possuem mais pontos de atenção do que outras e o OWASP pode servir como uma guia geral, porém, além dele, procure estar antenado a comunidade da linguagem de sua escolha para estar sempre a frente.
Etapa 6 – Prática
Neste ponto, você já pode se considerar um profissional completo, então está na hora de testar e praticar o que você conheceu, e também de ajudar outras pessoas a atingirem o mesmo nível que você. Lembre-se que o ciclo de aprendizagem, se inicia com a CAPTAÇÃO DOS CONCEITOS, depois segue para a FIXAÇÃO DAS IDÉIAS, depois a MANUTENÇÃO DO QUE FOI APRENDIDO, depois você aprende a RECUPERAR O QUE JÁ APRENDEU E RECICLAR O APRENDIZADO e por fim, para a conclusão você TRANSMISSÃO DO QUE VOCÊ APRENDEU.
Portanto, neste ciclo, é tão importante estudar quanto transmitir seu conhecimento, pois para poder ensinar de maneira correta, você tem que ter pleno domínio daquilo que está tentando transmitir, e transmitir de forma clara é também sinal de que você tem fixados os conceitos. Neste momento, pesquise alguns projetos no Github, abra algumas solicitações de pull em alguns projetos, ajude outros usuários da comunidade com suas dúvidas em fóruns e em sites de perguntas e resposta como o stackoverflow, tente resolver problemas abertos em issues existentes, ou mesmo a correção de falhas em projetos ou implementações de funcionalidades que te auxiliem a desenvolver seu trabalho.
Etapa 7 – Aprenda sobre testes
Existem vários tipos de teste diferentes, compreenda para que servem quais são e como escrever testes de unidade e testes de integração em seus aplicativos. Além disso, compreenda as diferentes terminologias de teste, como simulações, stubs e outros. Além disso, aprenda e calcule a cobertura dos testes que você escreveu, e como pode melhorar a cobertura de testes existentes.
Neste momento, quando você já souber como escrever testes e desenvolver todo o processo de cobertura, você tem dois caminhos a seguir, o primeiro é partir para outras atividades como indicado nesta listagem, ou retroceder e aprender uma nova linguagem de programação com um propósito diferente da que você está dominando. Por exemplo, se domina uma linguagem de script passar para uma linguagem funcional ou mesmo uma linguagem enterprise.
Etapa 8 – Siga a carreira e Aprenda Bancos de Dados Relacionais
Aprenda como funcionam os bancos de dados relacionais, escolha a ferramenta para aprender, entenda as diferentes terminologias de banco de dados, como, chaves, índices, normalização, tuplas, performance de escrita e de recuperação, qualidade e quantidade de informações entre outros. Existem várias opções, porém, quando se aprende um, os outros serão bastante fáceis pois o maior problema são os conceitos.
Entenda, o impacto que o processo de banco de dados pode causar em questões de performance, disponibilidade, e em quais pontos podem haver otimizações para melhorar a qualidade dos dados e a velocidade de recuperação dos mesmos.
Etapa 9 – Juntando Tudo
É hora de juntar o que você aprendeu em linguagem e ferramentas de desenvolvimento, e o que aprendeu na persistência de dados em bases de dados, e desenvolver uma aplicação completa, que use todos esses recursos. Crie um aplicativo simples usando tudo o que você aprendeu, pode ser qualquer ideia, talvez criar um aplicativo de blog ou um serviço que possa ser implementado e fornecido como acessório ou mesmo uma aplicação comercial, que pode render alguma coisa financeiramente.
Lembre-se de implementar Contas de usuário – registro e login, áreas de dados exclusivas a pessoas registradas e autenticadas, área de visualização ou teste público, implemente algo que use todas as ferramentas de persistência como um CRUD completo. Avalie os quesitos básicos de segurança do serviço, se possível use comunicação entre diferentes plataformas. Certifique-se de que o usuário só possa ver suas postagens pessoais e não de outras pessoas, mesmo manipulando os dados. Escreva os testes de unidade / integração para o aplicativo. Você deve conseguir implementar índices para as consultas ao banco de dados, fazer analises para saber se eles estão sendo realmente usados.
Etapa 10 – Aprenda Sobre Frameworks
Dependendo do projeto e da linguagem que você escolheu, você pode ou não precisar de uma estrutura externa ou de um framework. Cada linguagem tem várias opções diferentes, vá em frente e veja quais opções estão disponíveis e escolha o mais adequado ao seu cenário de trabalho.
Para usar um framework, é necessário que você tenha sólido conhecimento na linguagem para a qual ele foi projetado, ou sobre a qual ele é baseado, tenha em mente, que o uso desse tipo de ferramenta torna a edição de código de maneira manual, muito dificil, então, escolha aprender utilizar ferramentas com um leque grande de ferramentas, ou seja, propósito geral, desse modo, ele deve cobrir grande parte de suas necessidades. Lembre-se que nem todos os frameworks usam a linguagem em que são escritos para estruturar o trabalho, porém, todos usam as mesmas técnicas. Antes de escolher o qual deseja, entenda as funcionalidades dele, e qual o propósito prático, ou seja, qual a finalidade dele e quais as suas limitações.
Hoje, existem no mercado para praticamente qualquer linguagem de trabalho, um modelo de framework, ou um micro-framework, que tem por objetivo facilitar um tipo específico do trabalho, como servir por exemplo para fazer uma API, para gerir informações de Bancos de Dados, enfim, uma centena de micro-frameworks especialistas em um determinado trabalho. E existem também, grandes fremeworks que englobam um enorme número de funcionalidades, e recursos. Cabe ao programador ou equipe saber quais melhores se adequam ao trabalho, e quais produzem melhores resultados em consumo de memória ou mesmo em performance.
Para a prática desta etapa, converta o aplicativo que você fez, para usar este framework ou estrutura que você escolheu. Além disso, certifique-se de transportar tudo, incluindo os testes.
Etapa 11 – Aprenda um banco de dados NoSQL
Primeiro, entenda o que são, como são e os recursos dos diferentes bancos de dados não relacionais e por que são necessários, e quais os seus pontos fortes e pontos fracos. Escolha para estudar uma ferramenta que tenha como característica principal, o tipo de uso mais adequado ao seu propósito. Alguns baseados em documentos, são feitos para permitirem escrita de multiplas versões de um documento, visando navegar em suas versões no decorrer do tempo.
Outros, servem para armazenar informações sem uma estrutura claramente definida, outros, possuem enorme performance em analises de documentos textuais porém não produzem performance em leitura/escrita entre outros. Existem várias opções diferentes, pesquise um pouco, dê uma olhada e compare-as quanto às características e diferenças. Algumas das opções comuns que você pode escolher são MongoDB, Cassandra, RethinkDB e Couchbase. Se você tiver que escolher um, com um propósito mais geral, recomendo que vá com MongoDB.
Etapa 12 – Entenda como o Cache Funciona, e Como ele pode te auxiliar
Aprenda como implementar o cache em seus aplicativos. Entenda como usar quais os pontos onde ele pode te ajudar ou não, os impactos em termos de disponibilidade, de segurança, de confiabilidade, e até mesmo como você pode se beneficiar dos diversos tipos de cache existentes, visando escalabilidade de sua aplicação, ou mesmo, visando os impactos fincanceiros e técnicos de sua implementação.
Como uma atividade prática, implemente cache em seu aplicativo, e faça testes de performance em versões com o cache, e sem o cache.
Etapa 13 – Aprenda sobre os diferentes métodos de autenticação
Aprenda sobre as diferentes metodologias de autenticação e autorização. Você deve saber o que são, como são diferentes e quando preferir um ao outro, e também, qual a aplicação correta de cada um deles. OAuth ou autenticação aberta – Autenticação Básica – Autenticação por Token – JWT ou JSON Web Tokens – OpenID.
Entenda claramente a diferença entre AUTORIZAÇÃO e AUTENTICAÇÃO e como funciona a autenticação em dois fatores. Se você usa WEB, entenda como funcionam os protocolos e cadeias de certificação, implementação de autenticação baseada em cadeia de confiança entre outras.
Etapa 14 – Message Brokers
Um message broker é um software que possibilita que aplicativos, sistemas e serviços se comuniquem e troquem informações. O message broker faz isso convertendo mensagens entre protocolos de mensagens formais. Isso permite que serviços interdependentes “conversem” uns com os outros diretamente, mesmo que tenham sido criados em linguagens diferentes ou tenham sido implementados em plataformas diferentes.
Os message brokers são módulos de software no middleware de sistema de mensagens ou em soluções MOM (middleware orientado por mensagens). Esse tipo de middleware fornece aos desenvolvedores um meio padronizado de lidar com o fluxo de dados entre os componentes de um aplicativo para que eles possam se concentrar na lógica central. Ele pode atuar como uma camada de comunicações distribuída que permite que aplicativos de diversas plataformas se comuniquem internamente.
Os message brokers podem validar, armazenar, rotear e entregar mensagens aos destinos apropriados. Eles atuam como intermediários entre outros aplicativos, permitindo que os remetentes emitam mensagens sem saber onde estão os destinatários, se eles estão ativos ou não ou quantos deles existem. Isso facilita o desacoplamento de processos e serviços dentro de sistemas.
Etapa 15 – Mecanismos de pesquisa
Conforme o aplicativo cresce, consultas simples em seu banco de dados relacional ou NoSQL não vão resolver e você terá que recorrer a um mecanismo de busca. Existem várias opções, cada uma com suas próprias diferenças. Muitos mecanismos fazem uso de um conjunto de técnicas, mais entenda como funciona o ElasticSearch e outros mecanismos de full-text-search para poder tirar proveito de diversas ferramentas e melhorar não só em performance, como em aderência as respostas esperadas pelos seus clientes.
Etapa 16 – Aprenda a usar o Docker ou Kubernetes
Docker é um conjunto de produtos de plataforma como serviço que usam virtualização de nível de sistema operacional para entregar software em pacotes chamados contêineres. Os contêineres são isolados uns dos outros e agrupam seus próprios softwares, bibliotecas e arquivos de configuração. O Docker pode facilitar muito seu desenvolvimento, seja replicando o mesmo ambiente da produção, mantendo seu sistema operacional limpo ou acelerando sua codificação, teste ou implantação.
Kubernetes é um sistema de orquestração de contêineres open-source que automatiza a implantação, o dimensionamento e a gestão de aplicações em contêineres. Ele foi originalmente projetado pelo Google e agora é mantido pela Cloud Native Computing Foundation. J914
Etapa 17 – Conhecimento de servidores web
Se você chegou até aqui, provavelmente teve que lidar com servidores em algum momento. Neste ponto, você já tem total conhecimento do seu ambiente de trabalho, e esta etapa é principalmente para descobrir as diferenças entre os diferentes servidores da web, conhecer as limitações e as opções de configuração disponíveis e como escrever aplicativos da melhor forma utilizando essas limitações.
O objetivo não é conhecer a fundo, até porque essa é a tarefa de um outro perfil profissional, conhecido como DevOps ou SysAdmin que são profissionais especializados na gestão de servidores para os mais diversos fins, desde serviços de aplicações, microserviços, api, soap, servidores de bancos de dados, clusterização entre uma enorme gama de conhecimento. Porém, quando você tem um contato com essa plataforma, isso pode lhe fazer entender muito melhor pontos onde pode melhorar performance ou mesmo usar o seu conhecimento em servidr para otimizar algo ou fazer alguma tarefa que está sendo feita pelo software.
Muitos scripts como backup, rotinas de atualização de dados e até mesmo queryes mais demoradas podem ser programadas para serem feitas em horários de menor movimento, ou mesmo o escalonamento de servidores podem ser programadas desse modo.
Etapa 18 – Aprenda a usar Web Sockets
Embora não seja obrigatório, é benéfico ter esse conhecimento aprender como escrever aplicativos web em tempo real com soquetes da web e fazer alguns aplicativos de amostra com eles. Você pode usá-lo no seu aplicativo para implementar atualizações em tempo real. WebSockets é uma tecnologia avançada que torna possível abrir uma sessão de comunicação interativa entre o navegador do usuário e um servidor. Com esta API, você pode enviar mensagens para um servidor e receber respostas orientadas a eventos sem ter que consultar o servidor para obter uma resposta.
Esta é uma tecnologia que permite a comunicação bidirecional por canais full-duplex sobre um único soquete TCP, que foi projetado para ser executado em browsers e servidores web que suportem o HTML5, mas pode ser usado por qualquer cliente ou servidor de aplicativos que usem uma comunicação TCP. Frente a comunicações tradicionais, este modelo de transmissão é muito mais rápido, e permite que sejam usados padrões de comunicação muito mais eficientes que os tradicionais JSON e XML que são baseados em texto puro, e são um próximo nível em comunicação.
Neste momento, dependendo do perfil de comunicação e aplicações que você trabalha e desenvolve, protocolos como RTP, IGMP, RTSP, também podem ser estudados, para melhor aderência a suas espectativas.
Etapa 19 – Aprenda GraphQL
Aprenda a fazer APIs com GraphQL. Entenda como ele é diferente do REST e por que está sendo chamado de REST 2.0 devido a seus benefícios e sua linguagem de consulta, que permite extrair dados de multiplas fontes através de uma única chamada ou consulta. Ele proporciona aos profissionais responsáveis pela manutenção das APIs flexibilidade para adicionar ou preterir campos, sem afetar as consultas existentes. Os desenvolvedores podem criar APIs com o método que quiserem, pois a especificação do GraphQL assegura que elas funcionem de maneira previsível para os clientes.
Etapa 20 – Aprenda Grafos e Bancos de Dados Baseados em Grafos
Os modelos gráficos ou grafos representam de uma maneira muito flexível como lidar com relacionamentos e seus dados, e os bancos de dados gráficos fornecem armazenamento, recuperação e consulta rápida e eficiente. OrientDB, Neo4j, entre outros usam este tipo de esquema e podem ser de grande ajuda para aplicações grandes, e que precisem de velocidade em resposta para grandes volumes de requisições.
Etapa 21 – Entenda a Sua Realidade e Continue explorando – Estude Sempre que Puder
Depois de começar a aprender e praticar, você definitivamente encontrará coisas que não abordamos neste roteiro, e manter a mente aberta é uma forma saudável para aprender coisas novas. Lembre-se de que a chave é praticar o máximo que puder, buscar novidades no mercado e entender o que conceitualmente pode servir para você, e o que vai te ajudar a melhorar não só os seus conhecimentos, como também, trazer benefícios reais para suas aplicações.
Um dos grandes problemas de uma enorme massa de profissionais, principalmente de back-end, fullstack e DevOps é que acabam partindo para uso, de novas ferramentas ou tecnologias simplesmente porque é novidade ou porque outros estão usando. Um profissional realmente qualificado, deve, antes de mais nada, entender perfeitamente a tecnologia que vai utilizar ou implementar e qual o cenário de uso real dela. Muitas ferramentas apresentadas aqui, ou existentes no mercado, são desenhadas especificamente para determinados portes de aplicações, ou determinados cenários, e sua utilização em cenários ou ambientes diferentes, acaba sendo mais um problema do que uma solução.
Já vi muitos projetos mal direcionados, fracassarem, simplesmente porque as escolhas tecnológicas ou a pilha de conhecimento para se desenvolver ou trabalhar gerava altos custos e não condiziam com o porte atual do sistema que estava sendo aplicado. Até o proximo post, e bons estudos!