A diferença entre desenvolvedor júnior, pleno e sênior na minha opinião [PT-BR]
Tags: webdev, discuss, career, braziliandevs
Published: 2024-03-07 20:28:29

## Introdução

Decidi tentar escrever sobre cada nível, cada fase que um desenvolvedor atravessa em sua carreira, de forma simples e resumida, dividindo as habilidades interpessoais e técnicas.

O que cada cargo deve saber é algo muito pessoal e relativo, dependendo da empresa, da região do mundo, da época e das opiniões das pessoas. É importante ressaltar que este artigo reflete apenas minha opinião, que pode ser totalmente diferente da sua. Até mesmo minha opinião pode mudar no futuro. Minha intenção é fornecer um ponto de partida para reflexão e debate, tentando gerar alguma coisa concreta.

Outro ponto é que este artigo se concentra principalmente em desenvolvedores de aplicações, especificamente desenvolvedores web, o que exclui muitos outros cargos e areas que não foram consideradas.

Procurei ser o mais genérico possível, sem focar em ferramentas e processos específicos. Isso pode tornar as coisas um tanto vagas, mas foi a abordagem que escolhi.

## Desenvolvedor nível Junior
**Habilidades interpessoais**
- Escuta ativa
- Facilidade para trabalhar em equipe
- Conseguir se expressar bem
- Assumir responsabilidades adicionais, buscar oportunidades de aprendizado
- Sempre pedir ajuda quando necessario
- Mente aberta para aprender com seus colegas

**Habilidades técnicas**
- Lógica de programação 
- Estrutura de dados e algoritmos
- Orientação a objetos (Abstração, Encapsulamento, Herança e Polimorfismo)
- Saber o basico de pelo menos uma linguagem de programação
- Internet (Protocolo HTTP, Devtools, DNS, Hospedagem, Cliente e Servidor Web)
- Web API (REST, JSON, Autenticação)
- Operações básicas de CRUD (Create, Read, Update, Delete) em Banco de Dados Relacionais utilizando SQL.
- Básico de Object-relational mapping (ORM)
- Habilidade para usar ferramentas como IDEs e editores de código
- Capacidade básica de depurar e corrigir erros em aplicações usando uma IDE
- Escrever testes automatizados básicos
- Controle de versão (GIT)
- Habilidade para contribuir em projetos usando plataformas colaborativas de controle de versão
- Adesão às boas práticas de código, garantindo legibilidade para outros desenvolvedores
- Básico de Logging
- Conhecimento basico e geral de um Web Framework
- Entedimento básico e geral sobre Cloud, compreensão teórica dos conceitos fundamentais

## Desenvolvedor nível Pleno
**Habilidades interpessoais**
- Busca por protagonismo, ter pró atividade
- Comunicação assertiva
- Treinar/integrar e passar conhecimentos para novatos
- Expressar ideias de forma clara e concisa, tanto verbalmente quanto por escrito
- Se ajustar a novas situações, mudanças de prioridades
- Além da parte tecnica pensar nos aspectos do negócio como marketing, administrativo, financeiro etc
- Experiência em projetos dos mais variados tipos
- Habilidade de comunicação eficaz por escrito, levando em conta tanto o aspecto técnico quanto o comunicacional

**Habilidades técnicas**
- Domínio de uma linguagem de programação
- Análise de requisitos e casos de uso
- SOLID, DRY (Don't Repeat Yourself), KISS (Keep It Simple, Stupid), YAGNI (You Ain't Gonna Need It)
- Experiência e conhecimento de algum Web Framework
- Saber a diferença de diferentes arquiteturas como Monolitico e Microserviços, saber as vantagens de desvantagens
- Domain Driven Design (DDD) projetar o seu software em torno do domínio do problema
- Testes automatizados (Unitário, Integração e Funcional)
- Conhecimento prático da computação em nuvem em um nível básico
- Avançado de Object-relational mapping (ORM)
- Design Patterns (Singleton, Factory, Repository, Dependency Inversion)
- Conteinerização e Virtualização
- Ser capaz de configurar um servidor web
- Documentar API Web
- Noções do uso de uma Content Delivery Network (CDN)
- Saber escrever documentação sobre os projetos e processos
- Ler documentação de uma API, Lib e conseguir aplicar em um projeto
- Saber como usar um terminal
- Técnicas de refatoração (Reorganização, simplificação e otimização do código existente sem alterar seu comportamento funcional)
- Aplicar code review de maneira constante
- Saber configurar por conta propria o ambiente de desenvolvimento
- Saber usar banco de dados NoSQL quando necessario
- Experiência com o paradigma funcional
- Capacidade avançada de depurar e corrigir erros em aplicações usando uma IDE
- Processamento Paralelo

## Desenvolvedor nível Sênior
**Habilidades interpessoais**
- Guiar a equipe de desenvolvimento / Mentoria
- Influenciar e motivar a equipe
- Assumir responsabilidades
- Habilidade de se comunicar diretamente com clientes quando necessário
- Entender mais profundamente questões de negócio
- Avaliar informações de forma objetiva e analítica, questionar suposições e tomar decisões informadas
- Priorizar tarefas, organizar o trabalho de forma eficiente e cumprir prazos
- Lidar com pressão, estresse e adversidades de forma construtiva e manter um desempenho consistente
- Capacidade de construir e implementar um sistema a partir do zero, e participar de todas as etapas de seu processo.

**Habilidades técnicas**
- Embora haja uma forte tendência nessa direção, é crucial saber como evitar o overengineering
- Não se apegar a processos ou ferramentas
- Capacidade profunda de resolução de problemas
- Experiência intermediária em design e desenvolvimento de arquiteturas de software
- Otimização de Desempenho (Saber usar um profiler para detectar gargalos de desempenho e vazamentos de memória em diversas aplicações)
- Segurança Avançada (Autenticação e autorização, Proteção contra ataques de injeção, Gerenciamento de sessões, Criptografia, Validação de entrada de dados, Proteção de dados sensíveis, Controle de acesso a recursos, Atualizações e patches de segurança, Logging e monitoramento de segurança, Conformidade com regulamentações de segurança)
- Nível intermediário em Cloud (Arquitetura, Serviços de Computação e Armazenamento, Rede, Segurança, Monitoramento e Gerenciamento de Recursos) 
- Conhecimento geral sobre Design Patterns, qual aplicar em cada cenario
- Conhecimento geral sobre Microsserviços (arquitetura de software distribuído, comunicação entre serviços, containers (como Docker), orquestração de contêineres (por exemplo, Kubernetes) e familiaridade com práticas de DevOps.)
- Gerenciamento de filas (Conhecimento em sistemas de mensageria,  entender conceitos de filas, tópicos, consumo e produtividade, além de habilidades em programação para integração e manipulação dos dados nas filas)
- Avançado em Banco de Dados (Performance, escalabidade, bancos não-SQL)
- Monitoramento de aplicações (Conhecimento em ferramentas de monitoramento, entender métricas de desempenho, logs e alertas, além de habilidades em análise de dados e diagnóstico de problemas de performance)
- Desenvolver integrações, tais como sistemas de pagamento, envio de emails, SMS, entre outros
- Uso profundo de IDE, editores de código intergados a LLMs como Copilot
- Background Jobs (Entender conceitos de execução assíncrona, escalabilidade e tolerância a falhas)
- Configurar uma pipeline de Continuous Integration & Continuous Delivery (CI/CD)
- Visão geral sobre Large Language Model - LLM e suas aplicações é algo desejável
- Concorrência e Paralelismo, Compreender como lidar com múltiplas tarefas concorrentes e paralelas de forma eficiente e segura

## Outros cargos

É importante observar que, em empresas maiores, há uma maior divisão e distribuição das responsabilidades, de modo que o que mencionei para o desenvolvedor sênior pode corresponder ao papel de Tech Lead, Supervisor, Arquiteto de Software, DevOps, entre outros. Nesse contexto, o desenvolvedor sênior pode se concentrar principalmente no desenvolvimento de software.

## Conclusão

Agradeço por dedicar seu tempo até o final. Valorizo muito sua opinião; por favor, compartilhe-a nos comentários abaixo. Se notar algo que ficou de fora, não hesite em deixar seu comentário. Estarei mais do que feliz em adicionar informações em futuras versões do texto.

Este post foi revisado e elaborado com a colaboração dos meus colegas de trabalho e amigos, provenientes de diversas empresas, sejam elas pequenas ou grandes, ocupando diferentes cargos e níveis de carreira, cujas trajetórias conheci ao longo da vida. É um esforço conjunto e expresso minha profunda gratidão a todos pela valiosa colaboração.