Este documento tem como objetivo descrever as atribuições técnicas e não técnicas para engenheiros de software júnior, pleno e sênior que atuam em frontend, backend ou ambos. Para cada nível, presume-se que se tenha todas as habilidades do nível anterior.
Este documento permite:
- ter clareza sobre o que é esperado para cada nível;
- ter clareza sobre o que é esperado para o próximo nível e planejar uma promoção;
- ter clareza sobre se está fazendo o que é esperado para o seu nível e, caso contrário, ter um guia claro para ajudar a atingir o objetivo;
- Atua no contexto da equipe;
- Trabalha no contexto da tarefa e entende como ela impacta na solução completa;
- Busca resolver problemas simples;
- Ao ficar bloqueado, busca resolver o bloqueio e, caso não resolva, pede ajuda aos pares;
- Busca mentoria e evolução constante;
- Participa das discussões técnicas, faz perguntas e propõe soluções simples;
- Tem conhecimento básico, se interessa e faz perguntas sobre o negócio;
- Participa de code review e aprende sobre boas práticas e regras de negócio;
- Tem domínio básico das ferramentas do dia a dia como editor e terminal;
- Comunica-se de forma clara e direta com a equipe;
- Procura aplicar melhorias no código sempre que encontrar uma oportunidade;
- Segue as convenções e boas práticas definidas pela equipe;
- Recebe feedbacks e usa-os como oportunidade de evolução e melhoria;
- Contribui para criar ou manter um ambiente respeitoso e acolhedor;
- Conhecimentos básicos sobre Linux e terminal;
- Conhecimento básico de versionamento de código, principais comandos do Git e principais funcionalidades do GitHub;
- Conhecimento básico dos principais conceitos e comandos do Docker;
- Conhecimento sólido sobre a base de sua linguagem de programação, framework e ecossistema;
- Conhecimento sobre protocolo HTTP e APIs REST;
- Conhecimento básico de orientação a objetos;
- Conhecimento básico de bancos de dados relacionais e SQL;
- Conhecimento básico sobre princípios de design, código limpo e refatoração;
- Conhecimento básico sobre arquitetura limpa e domain-driven design;
- Conhecimento básico sobre testes automatizados e pirâmide de testes;
- Compreensão da importância e uso de ferramentas de análise estática como estilo de código e linters;
- Conhecimento básico sobre segurança;
- Noções básicas sobre infraestrutura e computação em nuvem;
- Atua no contexto da equipe e auxilia outras equipes;
- Trabalha além do contexto da sua própria tarefa, possui clareza sobre as outras tarefas do projeto e está apto para ajudar os pares;
- Busca resolver problemas de complexidade média;
- Ao ficar bloqueado, é assertivo e possui repertório para resolver o bloqueio. Ajuda a desbloquear os pares;
- Recebe mentoria e busca evolução, dá orientações e promove o compartilhamento e nivelamento de conhecimento;
- Participa das discussões técnicas e, com embasamento, propõe soluções ao problema com assertividade;
- Tem conhecimento médio sobre o negócio e busca ampliar este conhecimento em conversas com seus pares e pessoas de outras áreas;
- Toma decisões com maior impacto técnico e de negócio;
- Faz code review mais detalhado com atenção às boas práticas e regras de negócio;
- Participa e contribui com a comunidade em eventos;
- Tem pleno domínio das ferramentas do dia a dia como editor e terminal;
- Sabe se comunicar com públicos diferentes e estabelece conexões entre produtos, negócios e tecnologia;
- Dá e recebe feedbacks para evolução própria e de outras pessoas da equipe;
- Ajuda na integração de novos membros na equipe;
- Tem conhecimento sobre a base de código da empresa e propõe melhorias para manter o código consistente;
- Propõe o uso de convenções e boas práticas já estabelecidas pelo mercado;
- Busca influenciar positivamente as pessoas da equipe;
- Conhecimento sólido de Linux e terminal (gerenciar recursos, processos, redes e configuração);
- Conhecimento sólido de versionamento de código, incluindo branching models, estratégias de merge, resolução de conflitos e boas práticas;
- Conhecimento sólido de contêineres, orquestração de contêineres e troubleshooting de ambientes;
- Conhecimento sólido da sua linguagem de programação e biblioteca padrão;
- Conhecimento sólido de frameworks e seu funcionamento interno;
- Conhecimento sólido do ecossistema em que sua tecnologia está inserida;
- Conhece e utiliza bibliotecas que aumentam produtividade e padronizam o desenvolvimento;
- Conhecimento sólido do protocolo HTTP e modelagem de APIs REST;
- Conhecimento sólido de orientação a objetos;
- Conhecimento sólido de bancos de dados relacionais, modelagem, ACID, indexação e otimização de consultas;
- Conhecimento básico sobre bancos de dados não relacionais (Redis e Elasticsearch);
- Conhecimento sólido de princípios de design como coesão, acoplamento, SOLID e object calisthenics;
- Conhecimento sólido de código limpo e refatoração;
- Conhecimento sólido de arquitetura limpa e domain-driven design;
- Conhecimento básico sobre outros padrões arquiteturais (ports and adapters e microsserviços);
- Conhecimento sólido sobre testes automatizados, dublês de testes, configuração e boas práticas;
- Promotor do uso e mantenedor de ferramentas de análise estática como estilo de código e linters;
- Conhecimento sólido em segurança de aplicações, com domínio dos principais riscos OWASP e práticas para preveni-los;
- Conhecimento sólido sobre infraestrutura e computação em nuvem (VPC, WAF, load balancer, máquina virtual e banco de dados);
- Experiência prática com deploy e gestão de aplicações em PaaS, incluindo execução de builds, gerenciamento de ambientes, integrações e observabilidade;
- Conhecimento básico sobre cache;
- Conhecimento básico sobre ferramentas de fila e processamento assíncrono;
- Conhecimento básico sobre WebSockets e comunicação real-time;
- Conhecimento básico sobre integração e entrega contínua, monitoramento, profiling e gerenciamento de logs;
- Documenta código, APIs e processos seguindo padrões internos, garantindo clareza, rastreabilidade e alinhamento com boas práticas;
- Colabora de forma proativa com o time, promovendo cooperação e troca de conhecimento;
- Procura ativamente ajudar os colegas de equipe na resolução de problemas;
- Atua como promotor da evolução técnica da equipe;
- Incentiva boas práticas, padrões de qualidade, aprendizado contínuo e autonomia;
- Media conflitos de forma ativa e construtiva, buscando consenso e alinhamento entre as pessoas da equipe;
- Dá e recebe feedbacks claros e frequentes com foco em impacto e evolução contínua dos colegas de equipe;
- Participa de reuniões técnicas com escuta ativa, propondo e discutindo soluções;
- Se compromete com rituais, participa ativamente das dinâmicas e possui foco nos objetivos coletivos;
- Contribui ativamente para a arquitetura do projeto, identifica problemas e propõe melhorias;
- Lida com tarefas de alta complexidade, avalia impactos e toma decisões técnicas bem fundamentadas;
- Atua como promotor das tecnologias utilizadas, está por dentro das novidades e direciona o time;
- Lidera iniciativas de forma proativa com o objetivo de guiar a equipe na resolução de problemas;
- Possui conhecimento amplo do negócio e compartilha ativamente este conhecimento entre as pessoas da equipe;
- Participa e contribui ativamente com a comunidade de software;
- Possui conhecimento amplo para além da área técnica de atuação para tomar as melhores decisões;
- Se responsabiliza pelas soluções que lidera, acompanha problemas até a resolução e responde pelos impactos técnicos e de negócio;
- Conhecimento sólido sobre sistemas operacionais (processos, threads, system calls e gerenciamento de memória);
- Conhecimento sólido sobre protocolos de rede como DNS, HTTPS, SSL/TLS e modelo OSI;
- Conhecimento avançado sobre segurança incluindo criptografia e algoritmos de hash;
- Conhecimento avançado sobre banco de dados como window functions, concorrência, replicação, modelos de lock e teorema CAP;
- Conhecimento sólido dos conceitos chave de observabilidade para instrumentação, monitoramento e telemetria;
- Conhecimento sólido sobre cache e estratégias de cache;
- Conhecimento sólido sobre filas, processamento assíncrono e ferramentas relacionadas como RabbitMQ;
- Conhecimento sobre paralelismo, concorrência e programação assíncrona;
- Conhecimento sólido sobre microsserviços, monolitos modulares e arquitetura orientada a eventos;
- Arquitetura e organização de domínios complexos;
- Projeta softwares com foco em desempenho, escalabilidade e custo operacional;
- Conhecimento sólido sobre estratégias de deploy como blue green, deploy canário e feature flags;
- Conhecimento sólido sobre testes de carga, estresse e ferramentas relacionadas como k6 e JMeter;
- Conhecimento avançado sobre infraestrutura e computação em nuvem (elasticidade, serviços gerenciados e FaaS);
- Conhecimento sólido sobre infraestrutura como código e ferramentas relacionadas como Terraform;
- Conhecimento sobre servidores como Nginx, Apache ou Caddy;
- Conhecimento sobre outras linguagens e paradigmas de programação;
- Conhecimento básico sobre o funcionamento de runtimes como V8 e Zend Engine;
- Possui visão ampla do processo de construção de software e sugere melhorias no processo;
- Conhecimento sólido e promotor de práticas ágeis como XP, Scrum e Kanban;
- Capacidade de tomada de decisão técnica de forma pragmática;
- Conduz e registra decisões técnicas de impacto utilizando ADRs, RFCs e diagramas arquiteturais;