Nos últimos 3 anos venho analisando de perto o que ser um desenvolvedor full-stack significa e, apesar da grande confusão em volta do título, inúmeras pessoas almejam em tê-lo. Pensei então em reunir algumas informações sobre o que este termo significa, o que este título diz e explorar um pouco do perfil esperado para estes profissionais.

Se você trabalha com recrutamento, desenvolve ou deseja começar uma startup e quer formar um time diversificado e produtivo, acredito que estas informações lhe ajudarão de alguma forma.

Esse artigo fala bastante sobre desenvolvimento full-stack. Se você está procurando por design full-stack tem este artigo muito legal sobre o assunto. Porém, ainda acredito que algo aqui será útil pra você.

O que full-stack significa?

A parte “stack” significa a “coleção de tecnologias” que uma empresa ou área utiliza. É o canivete suíço que tem todas as ferramentas necessárias para se alcançar um certo propósito em um dado domínio.

“Stack” traduz-se para “pilha” (de coisas, não a pilha de colocar no controle na TV). Uma pilha é um conjunto de coisas colocadas em cima umas das outras que se equilibram para formar o todo. Pelo menos é assim que devemos ver uma stack de tecnologias.

A parte “full” significa “o todo” e só existe para dar ênfase ao significado de “full-stack”.

Alguns exemplos de aplicação:

  • full-stack designer;
  • full-stack engineer;
  • full-stack framework;
  • full-stack Javascript.

Pra ficar mais claro este conceito, vamos utilizar o exemplo de uma startup fictícia que trabalha com recrutamento em TI. Esta startup reúne candidatos que podem se aplicar a vagas. Os usuários com login da empresa podem entrar e gerenciar esses candidatos e suas vagas. Vamos chamar esta startup de JobsX.

Vamos considerar que a stack de desenvolvimento da JobsX é:

  • Linguagens Java e Scala para backend;
  • MongoDB e PostgreSQL como bases de dados;
  • React para frontend;
  • Git para versionamento;
  • Jenkins para deploy, integração contínua e delivery contínuo;
  • Amazon (AWS) para infra.

Neste cenário, um desenvolvedor full-stack para a JobsX é um profissional que sabe lidar com todas as tecnologias envolvidas. Vamos entender mais este “sabe lidar” da frase anterior, em seguida. Antes, vamos pensar um pouco mais sobre o que foi falado até agora.

Por que ter um desenvolvedor full-stack ao invés de de um time mais especializado/diversificado?

Para a JobsX, ter uma ou poucas pessoas que conseguem implementar ou dar manutenção em toda a stack significa menos comunicação, mudanças mais rápidas e escolhas mais produtivas sobre o que fazer e como fazer.

Na JobsX tudo se resume a ser LEAN. Este é um ambiente propício para um desenvolvedor full-stack, onde uma pessoa ser capaz de produzir protótipos rapidamente é imprescindível para o futuro e crescimento rápido do negócio.

Estas definições dependem muito do negócio. Por isso, defini a empresa que estamos olhando, a JobsX, e o produto que esta empresa vende. Talvez esta abordagem não seja tão proveitosa para uma startup de IoT que necessita de conhecimento mais especializado sobre as tecnologias envolvidas, ou uma empresa maior, que tenha processos mais rígidos.

Mas por que estamos tratando full-stack diferente de desenvolvedores especializados? Não dá pra ter tudo em um?

Essa questão é a causa das discussões mais apocalípticas sobre este assunto. “Quem faz tudo não sabe fazer nada direito” é uma das frases que mais causam discórdia. E ela tem um fundinho de verdade.

Quem é programador frontend hoje sofre com um movimento contínuo (muito sadio, por sinal) de tecnologias voltadas para o navegador. Para você ser um bom programador frontend hoje, você tem que saber bem Javascript, pelo menos um framework moderno (Angular, React, Vue.js e etc.), uma ferramenta de build como o Webpack, conhecer CSS muito bem, bem como um pré-processador como o SASS e por aí vai.

“Ser bom” nessas tecnologias não significa só aprender como elas são hoje e usá-las para o resto da vida. Elas mudam, quase que todo dia, introduzindo uma carga de atualização que o desenvolvedor precisa consumir para continuar sendo bom naquilo.

Por este motivo, um programador frontend tem que ficar constantemente se atualizando e conhecendo possíveis tendências que possam mudar como as coisas são feitas hoje. E isto tudo é só pra frontend!

Se seguirmos a mesma lógica para backend, infraestrutura, banco de dados e mobile vamos adicionar uma carga desumana de aprendizado para que uma pessoa se torne especialista em todos os assuntos. O que é muito improvável de se concretizar.

Mas, então o que faz um desenvolvedor full-stack?

A maior responsabilidade de um dev full-stack é ter uma visão geral sobre a arquitetura das soluções empregadas e poder agir diretamente em cada uma delas, seja implementando coisa nova ou dando manutenção do que já foi feito.

Mais explicitamente, um dev full-stack é um desenvolvedor que consegue trabalhar com diferentes bases de dados, que sabe integrar e produzir diferentes sistemas e que tem habilidade de desenvolver o client da aplicação. O client pode ser uma página web, uma aplicação mobile, uma interface para desktop e por aí vai.

No exemplo da JobsX, “React” é o client e podemos trocá-lo por “Desenvolvimento Android” ou “Unity” caso o produto da empresa seja focado 100% em smartphones.

Não entendi. O full-stack não conhece tudo profundamente mas, mesmo assim, faz tudo? 😐

É. Parece confuso. Você pode conhecer bem os fundamentos de uma tecnologia sem ser especialista nela.

Você não precisa ser especialista em Java para conhecer padrões de projeto de linguagens orientadas a objeto. Se você conhece esses padrões, aprender a linguagem e aplicá-los fica fácil.

Tratando-se de backend, existem várias outras habilidades que, quando dominadas, podem lhe fazer um excelente programador sem ser especialista em uma única tecnologia.

Vamos ver um exemplo de linguagens de programação. Na imagem abaixo, temos 3 linguagens: A, B e C; onde as esferas representam todo o conhecimento que você precisa para dominar uma dada linguagem. A intersecção destes conhecimentos são globais e são conceitos que um desenvolvedor full-stack deve se preocupar o tempo todo.

Captura de Tela 2018-04-11 às 12.29.32

Isso funciona para todas as camadas da stack: padrões de conteinerização para aplicações em cloud, padrões de comunicação assíncrona, padrões de protocolos e comunicações entre sistemas, padrões de modelagem de bases de dados não-relacionais ou relacionais, frontend e por aí vai.

Como eu me torno um desenvolvedor full-stack?

Esta pergunta não vai ser respondida aqui. Têm inúmeros artigos dizendo como concluir este objetivo de diversas formas diferentes.

Lembre-se: tudo depende da empresa ou da área onde o full-stack vai atuar, bem como o que ele/ela deseja para sua carreira.

Uma dica para direcionamento: busque por stacks produtivas ou que o mercado têm adotado com vigor. Ruby on Rails é um bom exemplo de um framework full-stack. Busque por linguagens que sejam modernas, tenham apoio da comunidade e, mais importante, que sejam divertidas para programar. Não aprenda PHP só porque tem um curso na internet que fala que programador full-stack tem que saber PHP. Use seu bom senso, o direcionamento que você espera para a sua carreira e o que a empresa espera de você.

Também vale a pena olhar para soluções prontas, como AWS para infraestrutura ou Firebase como um backend. Estas soluções oferecem planos básicos para startups ou projetos que precisam de rápida homologação. Elas deixam você se preocupar bastante com a lógica de negócio antes de escalar sua aplicação.

Outra dica valiosíssima é olhar para as coisas que são comuns à várias tecnologias antes de se aprofundar em uma. Por exemplo: tente entender os pontos positivos e negativos de uma linguagem antes de se aprofundar em um framework como Ruby on Rails ou Phoenix. Também entra aqui aquele ponto de conhecer padrões de projeto que são comuns às tecnologias envolvidas naquela parte da stack.

O papel do full-stack na Wavy

Na Wavy não gostamos de rotular os desenvolvedores como full-stack. Em contrapartida, gostamos do perfil “T-shaped”, bem explicado por esta imagem retirada do handbook para novos membros da Valve:

Captura de Tela 2018-04-11 às 12.29.19

Nesta imagem, os braços representam a stack, toda da área. É muito importante que todos os envolvidos no produto de uma certa área entendam, mesmo que superficialmente, como as coisas funcionam. As pernas, na imagem, representam uma tecnologia (que é o forte do desenvolvedor), o que ele/ela tem mais conhecimento, experiência e confiança em desenvolver ou aplicar.

Na escala que os produtos da Wavy atendem, não há como uma pessoa assumir responsabilidade da stack toda, porque precisamos de pessoas focadas em resolver problemas grandes, como por exemplo:

  • garantir performance com milhares de usuários acessando uma certa plataforma;
  • terabytes de dados para realizar análises;
  • escala de diferentes base de dados;
  • escalar e garantir redundância de serviços;
  • melhorar tempo de entrega de mensagens;
  • e auditar e garantir segurança de todos os stakeholders atingidos por nossos serviços.

Na Wavy, também, damos muita atenção ao time, ao conjunto, ao espírito de respeito mútuo e humildade em entender que a solução do amiguinho é a melhor e construir em cima dela. Muitas vezes o full-stack é visto como um cavaleiro solitário, um coringa para todos os problemas e uma pessoa que vai colocar pra funcionar todas as soluções da empresa. Isto pode não funcionar. Vamos ver o porquê.

Full-stack e trabalho em equipe

No dia-a-dia de trabalho na JobsX, um desenvolvedor full-stack sozinho consegue fazer todo o trabalho. Entretanto, ele/ela vai fazer as coisas do seu jeito. Do jeito que conhece ou do jeito que é mais rápido. Aqui está um dos maiores perigos do full-stack.

Lembre-se que “com grandes poderes, vêm grandes responsabilidades”.

Quando uma pessoa trabalha sozinha, ela busca ir por caminhos conhecidos, por rotas seguras, onde ela se sente confortável. Isso é verdade também para desenvolvimento. Entretanto, produzir software não é uma ciência absoluta. Quando você produz um código, você está programando um conhecimento em forma de algoritmos. Não existe uma única maneira de programar este conhecimento, mas existem boas práticas. No fundo o que vale é o consenso entre todos que estão produzindo este conhecimento e qual a melhor maneira de fazê-lo.

Se esse desenvolvedor da JobsX produzir todos os sistemas da empresa de uma certa forma que é desconhecida pela maioria dos programadores no mercado, vai ser difícil alguém chegar e continuar exatamente de onde este primeiro dev parou. Em casos mais extremos, as escolhas deste desenvolvedor podem formar uma bola de neve que destrói o projeto ou parte dele.

Por isto que um time é muito importante. Conversar antes de tomar decisões arquiteturais evitam futuras negligências técnicas como o “isso não dá pra fazer porque lá atrás fizemos tal coisa”.

Ademais, trabalhar constantemente com outras pessoas incitam a produzirmos códigos mais legíveis, com testes automatizados, com mais padrões de organização, mais modulares, sem infernos de copiar-e-colar e etc. Isto evita introduzir débitos técnicos nos sistemas. Débitos técnicos são os motivos mais comuns em atraso de projetos: basicamente eles significam que você pode fazer um código hoje, em um dia, que no futuro vai levar um mês para consertar e ninguém quer isso.

Título vs Perfil

É intrigante olhar para o mercado e ver como inúmeras vagas ou descrições adotam o termo full-stack para dar uma definição absoluta sobre o que é esperado do profissional. O mais intrigante é que poucas pessoas entendem que o que está sendo realmente requisitado é que o profissional tenha uma ideologia de full-stack, ou como vou chamar aqui, um perfil full-stack.

O perfil full-stack, somado ao perfil “T-shaped”, representa um profissional que:

  • conhece as tecnologias envolvidas em um certo processo;
  • conhece bem padrões de projeto que estas tecnologias empregam;
  • sabe produzir código sem introduzir débitos técnicos;
  • busque entender profundamente como a arquitetura se conecta;
  • sabe muito bem e tem bastante experiência com alguma(s) tecnologia(s).

Conclusão

Bastante coisa foi falada neste artigo. Nada aprofundado, mas espero que minha opinião e minha concepção sobre o assunto tenha lhe ajudado a entender os entornos do “full-stack”.

Lembre-se que full-stack não é o santo-graal dos desenvolvedores: dependendo do cenário de sua empresa ou de uma certa área, é muito sadio ter este desenvolvedor como parte do time, mas pode ser que não seja o caso.

Procure nunca manter somente um desenvolvedor fazendo tudo e, se não houver alternativa, garanta que as práticas deste desenvolvedor são congruentes com o que o mercado conhece. Aproveite da visão horizontal do full-stack para rápida prototipação ou produtividade máxima na construção do seu produto final.

Se você é desenvolvedor e quer ser full-stack, atente-se ao perfil deste profissional antes das skills que você quer. Acomode-se com a ideia de conhecer o contexto em volta das tecnologias usadas. E, mais importante, foque em sua “forma de T”.

Agradecimento especial ao @cesar.devera e @AndréBonfatti.

Posted by:Matheus Fonseca

2 replies on “Entendendo o que é um full-stack developer

Deixe seu comentário