A vantagem do generalista
As falhas moram nas fronteiras entre camadas, e o generalista é quem consegue ver a costura.
Sou engenheiro full stack no sentido mais amplo do termo: desenho o sistema, escrevo o frontend, escrevo o backend, monto a infraestrutura, e depois audito a coisa toda quando falha. Na maior parte da minha carreira isso foi tratado como fraqueza. Os especialistas eram os sérios. O generalista era quem sabia um pouco de tudo e não o bastante de nada.
Não acho mais que isso seja verdade, e acho que o motivo é estrutural, não pessoal.
As falhas moram nas fronteiras
Quando audito um sistema, a falha quase nunca está dentro de um componente bem definido. O código do time de frontend funciona. O código do time de backend funciona. O banco está bem. A falha está no espaço entre eles: a premissa que o frontend fez sobre um campo que o backend mudou depois, o retry que o cliente faz e que o servidor não foi desenhado para absorver, o cache que estava correto até alguém adicionar um segundo escritor.
O especialista vê o componente dele. O generalista vê a costura. Como a costura é onde as falhas moram, o generalista tem vantagem exatamente no trabalho que mais importa quando as coisas dão errado. Isso explica boa parte de por que encontro falhas que outras pessoas deixam passar. Não porque eu conheça uma camada melhor do que o especialista dela, mas porque consigo seguir uma requisição por todas elas sem passar o bastão.
Pensar em sistemas exige ver o sistema inteiro
System Design como disciplina é sobre trade-offs entre camadas. Validamos aqui ou ali. Empurramos isso para o cliente ou mantemos no servidor. Isso é uma constraint de banco ou uma regra de aplicação. Cada uma dessas perguntas é impossível de responder de dentro de uma camada só, porque o custo da decisão cai numa camada diferente daquela em que ela é tomada.
Não dá para fazer System Design bem sendo especialista puro. Dá para contribuir. Mas quem segura o quadro inteiro precisa ter trabalhado em cada parte dele, ao menos o bastante para saber quanto cada parte custa.
O que o generalista precisa fazer para continuar confiável
A crítica aos generalistas não está totalmente errada. Um generalista raso em tudo não é útil. Então a disciplina é esta: escolha uma ou duas áreas para ser genuinamente profundo, e seja competente no resto. Profundo quer dizer que você poderia ensinar. Competente quer dizer que você consegue entregar, revisar, e saber quando chamar o especialista.
Para mim, as áreas profundas são System Design e encontrar falhas. As competentes são todo o resto, com preferência por Next.js e TypeScript porque me deixam manter um único modelo mental do navegador ao banco de dados. A escolha da stack está a serviço do quadro inteiro, não o contrário.
O formato da carreira
A carreira de especialista é uma escada dentro de uma coluna. A carreira de generalista é um caminho atravessando colunas, e é mais difícil de descrever num currículo. Ninguém tem cargo para "pessoa que consegue ver a coisa toda".
O que descobri é que o caminho generalista fica mais valioso com a idade, não menos. No começo, o especialista é mais fácil de contratar porque a vaga é clara. Depois, quando a empresa tem cinco especialistas e cada um diz que o problema está na camada do outro, a pessoa que consegue caminhar a requisição inteira e apontar a costura vira o engenheiro mais valioso do prédio. É essa a posição em torno da qual construí meu estúdio, e é a posição que eu diria a qualquer engenheiro de curiosidade ampla para mirar.
A versão prática
Se você sente o chamado da amplitude e já ouviu que precisa se especializar, aqui vai uma instrução diferente. Vá fundo em uma coisa até conseguir ensinar. Depois, em vez de ir fundo numa segunda, vá para o lado. Construa um projeto de ponta a ponta sozinho, incluindo a infraestrutura, incluindo a parte em que você é ruim. Faça de novo. Depois da terceira vez você vai enxergar costuras que os especialistas não enxergam, e isso não é prêmio de consolação. É a vantagem.