Este artigo será especialmente útil para engenheiros iniciantes, bem como para aqueles que desejam cultivar liderança em engenharia, buscar crescimento e alcançar novos patamares. Os candidatos também saberão o que se espera deles nas entrevistas técnicas e os critérios de seleção empregados nessas entrevistas.
Existem diferentes abordagens para definir o conjunto necessário de habilidades para um programador. Os requisitos variam dependendo da empresa, do projeto e da equipe com a qual você trabalha. O mais comum define um programador "experiente" como aquele que não apenas conhece a teoria, mas trabalha com sucesso com problemas práticos reais; sabe como encontrar soluções para problemas fora do padrão.
Aparentemente, todos os programadores experientes têm uma característica importante em comum: a capacidade de pesquisar informações relevantes. Existem algumas outras qualidades importantes, como o amor pela programação e o desejo de trabalhar. Se alguém não deseja trabalhar, mesmo uma experiência e talento impressionantes serão inúteis. No trabalho, cruzei com aqueles que eram bem versados em tecnologia, mas relutantes em trabalhar.
As habilidades básicas do programador envolvem boa memória, capacidade de se concentrar e aprender novas tecnologias e pensamento lógico. Resumindo, um programador experiente deve ter um "cérebro vivo" que funcione bem. Você não pode continuar sem ele. Essas características importantes determinam sua propensão para a programação como profissão desde a infância.
As demais características que descreverei podem ser divididas em duas categorias: conhecimento técnico e características pessoais. Se o conhecimento técnico pode ser adquirido em vários treinamentos, cursos e aprimorados na prática, as qualidades pessoais (ou soft skills) não são tão fáceis de adquirir se forem contra a natureza de uma pessoa. De qualquer forma, programadores experientes fazem seu próprio caminho e aprendem muito nessas duas áreas.
É claro que um programador experiente é bem versado em uma ou mais tecnologias e alguns frameworks. Mas, antes de dominar uma determinada tecnologia, o programador adquire conhecimentos sobre a arquitetura básica de sistemas e redes, estruturas de dados e algoritmos; administração de sistemas e Ciência da Computação em geral. Tanto os administradores de sistema quanto os DevOps seguem esse caminho. Em termos de programação como tal, é importante entender estruturas de dados e algoritmos, abstrações de tecnologia e os princípios OOP.
Depois de aprender uma determinada linguagem, um programador passa a estudar frameworks e bibliotecas. São abstrações superiores que unem as menores. Para desenvolvedores Frontend, é React, Angular e Vue.
Os pontos a seguir descrevem o funcionamento interno do 'cérebro vivo' de um programador ideal
🔴 Compreensão profunda da tecnologia e encontrar a melhor abordagem
Um programador experiente deve conhecer várias tecnologias e aplicar as melhores abordagens. Esse conhecimento não é superficial, mas dominado na prática. Uma abordagem sistemática permite que você veja o quadro geral do projeto; percebê-lo como um todo e não parcialmente, e então escolher a melhor abordagem para o seu desenvolvimento. Os conceitos de produtividade e eficiência às vezes são confundidos. Você pode terminar o projeto rapidamente, mas cometer muitos erros, e a depuração levará mais tempo do que um cuidadoso processo de desenvolvimento passo a passo.
Velocidade nem sempre é sinal de qualificação de Engenheiro Sênior. Em vez disso, a orientação para o resultado é uma característica integral. A eficiência das ações e movimentos pesa mais do que inúmeras linhas de código e velocidade. Encontrar uma abordagem para o desenvolvimento do projeto em que a qualidade e a velocidade sejam equilibradas está ao alcance de um engenheiro experiente.
🔴 Permanecer atento ao UX
Um bom hábito de um programador é estar constantemente atento à experiência do usuário — pensando em como o programa ficará do ponto de vista do usuário e se será conveniente e claro.
Você não precisa ser um designer para prever como um recurso funcionará. Também será útil dominar o teste de código para evitar erros no processo de desenvolvimento.
🔴 Compromisso com o processo técnico
Seguir o processo técnico pode ser considerado um bom hábito de qualquer programador, especialmente um experiente. Esta é uma nuance crucial. Antes de alterar uma variável ou função, você precisa verificar onde ela está sendo usada.
Você precisa se aprofundar na documentação técnica; isso ajudará a evitar erros tolos e economizar tempo e os nervos do líder técnico. Bem, pessoas experientes sabem disso e ensinam outras pessoas 🙂
🔴 Escrever código legível que seja fácil para outras pessoas trabalharem
Esta habilidade deriva da anterior. Será fácil para todos trabalhar no projeto desde que o processo técnico seja seguido minuciosamente. Lembre-se de que outras pessoas também podem trabalhar com seu código, portanto, escreva como se você tivesse feito isso sozinho. Sua “muleta” pode voltar como um bumerangue. É melhor testar e refatorar regularmente seu código, ser cuidadoso sobre o que você chama de variáveis e funções e pensar sobre os outros.
Escolher a tecnologia certa para o projeto é uma habilidade crucial. Programadores experientes às vezes insistem em usar tecnologias com as quais estão acostumados, mesmo quando o restante da equipe terá dificuldades com isso. Em vez disso, você deve tomar decisões que considerem toda a equipe; consultar, discutir e coordenar suas ações com os outros.
🔴 Análise qualitativa e desenvolvimento da arquitetura
Para analisar e entender qualitativamente a arquitetura, você precisa conhecer a teoria e ter bastante experiência prática. Um Engenheiro Sênior é capaz de realizar uma análise abrangente de requisitos e desenvolver uma arquitetura de software com implementação efetiva em vários níveis.
Ao mesmo tempo, é essencial encontrar um equilíbrio entre a legibilidade do programa e a eficiência do desenvolvimento. Para evitar problemas na fase de planejamento, um programador experiente conhece diferentes tecnologias e pode escolher a certa.
🔴 Capacidade de explicar esquematicamente
Para programadores experientes, e especialmente para Tech Leads, a capacidade de explicar informações sobre os princípios da tecnologia graficamente e usando diagramas simples é uma habilidade muito útil.
Tabelas, gráficos e diagramas fornecem uma visão holística da tecnologia e do projeto. A abordagem do sistema de visualização simplifica o trabalho de toda a equipe. Dessa forma, os Tech Leads podem transmitir a imagem completa para outras pessoas.
🔴 Criando um fluxo de trabalho eficaz
Engenheiros experientes distinguem entre o desempenho da equipe e o seu próprio. Para aumentar a eficiência da equipe, eles criam um fluxo de trabalho ou escolhem novas tecnologias, como implantação automática.
Além disso, eles tentam encorajar outros programadores da equipe a aprender mais e analisar seus erros durante a revisão do código.
Um programador experiente está bem ciente da importância de atingir os objetivos de negócios e é capaz de equilibrar a implementação e a qualidade do código. Afinal, se você se aprofundar na qualidade do código, uma tarefa pode levar um mês e você poderá refazer as coisas até os últimos dias, levando todo o projeto à perfeição. Mas para que o negócio cresça, você precisa encontrar um equilíbrio entre qualidade e requisitos do cliente.
Existem programadores que se concentram apenas em tarefas de negócios e enchem seu código de 'muletas'. Eu costumava trabalhar em um projeto, que teve que ser totalmente encerrado após 2 anos de desenvolvimento porque cada novo recurso levava um mês para ser implementado. Aquele 'cozido' de abordagens e tecnologias era simplesmente impossível de se trabalhar. É assim que o desejo de fazer mais rápido leva a resultados tristes.
Eu conhecia programadores que se aprofundaram na qualidade do código e ficaram presos em uma tarefa por 2 meses. Honestamente, fiquei surpreso por eles terem mantido seus empregos. No final das contas, a tarefa acabou sendo intransponível. Isso significa que encontrar um equilíbrio é vital.
O perfeccionismo está perto do meu coração. No entanto, tem que haver uma abordagem saudável sem exagerar. Normalmente, as pessoas não mudam. Mesmo em entrevistas, noto essas pessoas e entendo que trabalhar com elas será um desafio.
Os pontos a seguir destacam as vantagens do perfeccionismo saudável
🔴 Capacidade de trabalhar em equipa
Por padrão, fica claro que os jogadores da equipe são valorizados em qualquer projeto. Isso fala de sua natureza não conflituosa e da capacidade de assumir responsabilidades, comunicar-se e ser confiável.
Você pode ter sua própria opinião e ainda ouvir os outros.
🔴 Confiança em tarefas complexas
Programadores experientes são confiantes, mas não teimosos. Eles não têm medo de tarefas difíceis, pois já atingiram um certo nível de especialização e possuem conhecimento técnico suficiente, permitindo-lhes lidar com complexidades.
Engenheiros experientes podem planejar um projeto de diferentes perspectivas, fornecer bons conselhos e permanecer orientados para os resultados desde o desenvolvimento da estrutura até a codificação. Essas pessoas são muito valorizadas na equipe; é um prazer me juntar a eles em batalhas profissionais. Você sempre pode aprender alguma coisa.
🔴 Desejo constante de desenvolver e encontrar as informações necessárias
Mais uma vez, engenheiros experientes são bem versados em várias estruturas e são capazes de trabalhar com várias tecnologias. E para isso, você precisa evoluir constantemente, e buscar oportunidades de aprender coisas novas fora do trabalho. Pessoas experientes aprendem rapidamente e captam as novas tendências que são necessárias para o seu trabalho. Alguns engenheiros pensam que basta aprender apenas com seus próprios erros. De fato, na prática, você ganha muito conhecimento, mas precisa aprofundá-lo com base nas experiências de outras pessoas. Hoje há bastante informação online, você pode realmente aprender muito.
Provavelmente, dominar o domínio de um projeto seria uma vantagem adicional. Por exemplo, se você estiver em um projeto Fintech, espera-se que você entenda o valor do software de uma perspectiva de negócios e conheça certos processos funcionais nessa área.
🔴 Capacidade de manter o equilíbrio
Quando um projeto está em desenvolvimento, várias situações imprevistas podem ocorrer e bugs podem surgir. Eles pegam programadores inexperientes de surpresa e os encurralam. Engenheiros experientes sabem que tudo deve ser resolvido com a cabeça fria, porque entrar em pânico e gritar não vai ajudar. Embora, talvez, os bugs tenham sido causados puramente por fatores humanos.
Um programador experiente encontrará uma solução alternativa, mantendo o equilíbrio. É mais fácil encontrar uma solução fora do padrão para um problema com calma do que emocionalmente.
🔴 Capacidade de compartilhar conhecimento e dar feedback
Idealmente, programadores experientes compartilham conhecimento com outros; participe de webinars, conferências e hackathons. Compartilhar o conhecimento de um livro ou da teoria de outra pessoa é uma coisa, e contribuir com sua própria experiência - suas "dores" do passado - é outra. O networking é realmente útil, mesmo que alguns não gostem.
Um programador experiente sabe como é importante dar feedback sobre o trabalho dos outros. Isso dá aos profissionais juniores a oportunidade de entender suas áreas de crescimento potencial, o que corrigir e quais erros evitar.
Feedback oportuno é sobre gestão transparente e comunicação eficaz. É bom que os programadores na posição de Líder de Equipe entendam e pratiquem isso.
🔴 Capacidade de admitir seus erros
Outra boa característica de um programador experiente é admitir erros. Essa habilidade significa que a pessoa sabe como assumir responsabilidades. Os erros são uma oportunidade de aprender uma lição e ganhar uma experiência valiosa para o futuro. Em vez de assumir a culpa pelos bugs de outra pessoa, o Tech Lead pode fornecer insights úteis durante a revisão do código e dizer como resolver um problema específico.
Programadores experientes definitivamente não jogarão um júnior 'sob o ônibus' e apontarão o dedo para a falha do novato. Toda a equipe trabalha, e cada um tem sua área de responsabilidade. A brincadeira de alguém afeta toda a equipe. Ter isso em mente facilita a construção de relações de confiança e transparência.
As falhas podem ser técnicas e humanas. Por exemplo, se um funcionário não vai trabalhar regularmente, é um fator humano.
Quanto a falhas técnicas importantes, não as encontrei, porque não costumava trabalhar com programadores abaixo do nível Sênior. Obviamente, as possíveis falhas dos engenheiros sênior e júnior estão em diferentes dimensões.
Eu chamaria isso de falha ao enviar código para um repositório sem executar um teste. O melhor é automatizar este processo, tal como é feito na nossa empresa. Outra falha é o código 'crutching'. Às vezes, há um desejo de fazer código rapidamente, mas se esse processo acelerado degradar a qualidade, isso se tornará aparente no futuro.
Existem várias abordagens para a qualidade do código. Os princípios SOLID definitivamente devem ser considerados. Se você fizer uma função polimórfica, precisará garantir que ela não quebre as áreas onde já é usada. Ao fazer qualquer correção de código, você precisa considerar quais serão as consequências e como elas afetarão você em geral.
Não seguir o processo técnico é uma falha do programador. No contexto da minha equipe, é criar solicitações pull, executar um teste de qualidade de código, realizar testes funcionais e verificar tarefas que você mesmo executa. Se você seguir o processo técnico desenhado na empresa, as falhas serão minimizadas. No entanto, devo admitir que nem todas as empresas têm processos devidamente configurados, e isso também pode ser um pré-requisito para futuras falhas.
Em geral, acho que os fracassos dos Seniores derivam da preguiça, e os fracassos dos Juniores vêm da inexperiência e desatenção. Os erros dos juniores aparecem onde você menos espera. O trabalho do Júnior, como tal, é uma falha contínua no início, que deve ser constantemente corrigida. Mas é para isso que servem os juniores.
A preguiça do sênior parece estar acostumado com um processo, e confiar nele, pensando: “bom, depois eu resolvo”. Muitas vezes nem sempre termina bem, mas ainda termina melhor do que no caso de Junior🙂
Programadores inexperientes podem ser identificados em duas etapas: primeiro, durante uma entrevista e, em segundo lugar, e o pior de tudo, durante o trabalho, se você perder o "falsificador".
Perguntas que me ajudam a avaliar a experiência de um programador:
Esta é a primeira parte das perguntas que ajudam a determinar o grau de conhecimento de uma pessoa e as perspectivas de trabalhar em conjunto. Se um candidato ficar confuso nesta fase, as coisas só vão piorar.
Acontece que um programador tem 5 anos de experiência e é bem versado em 10 tecnologias, mas quando você faz perguntas básicas desta lista, pode não haver respostas. O mesmo provavelmente acontecerá com um conjunto de perguntas do próximo bloco.
Durante as entrevistas tecnológicas, não dou tarefas algorítmicas complexas, porque a entrevista é sempre estressante e eu odiaria agravá-la. Mesmo que um desenvolvedor esteja acostumado a trabalhar com determinadas tecnologias, esquecer como realizar determinadas tarefas é normal; ninguém é perfeito. A profundidade do conhecimento e a rápida resolução de problemas são as coisas nas quais você deve se concentrar.
No geral, avaliamos tanto as soft skills quanto as hard skills durante as entrevistas. O bloco técnico de perguntas difere dependendo da tecnologia e do projeto.
Alguns programadores têm mentores que fornecem conselhos e orientações. Eu não tinha tudo isso. Estudei por conta própria e encontrei as informações necessárias sozinho. Embora eu tenha me formado em cibernética econômica e já conhecesse o básico, enquanto lia a filosofia de Java, era difícil entender a nova abstração.
Certa vez, os cursos de Java Rush me ajudaram muito; tudo foi facilmente explicado e eu pude praticar imediatamente. Mas não é sobre o front-end.
Foi isso que me ajudou a me tornar um programador. Estudei o restante na documentação técnica oficial, bem como procurei informações em videoaulas gratuitas. Aquilo foi o suficiente para mim.
Ao mesmo tempo, é um erro pensar que a graduação em um curso abrirá as portas para uma empresa de TI. Sem conhecimento, este pedaço de papel é inútil. Assistir a cursos por causa de um diploma não faz sentido.
Até certo ponto, você pode obter informações estruturadas, mas deve se lembrar delas e deve ser a base e o início de seu crescimento futuro. Uma das características de um bom programador é a capacidade de encontrar informações de qualidade.
Se você conseguir, tudo ficará bem. Mas se você espera que alguém soletre para você, então você está muito errado. Eu recomendaria o autodesenvolvimento e a navegação nos cursos online disponíveis. E se você já trabalha como programador, pode fazer os cursos da Udemy, aqueles que você precisa para o seu trabalho.
Quanto mais experiência um desenvolvedor ganha, mais ele percebe a importância do desenvolvimento na área de Liderança em Engenharia. E não se trata apenas dos engenheiros que já gerenciam equipes; mas também de quem está sempre por dentro das tendências, aprendendo coisas novas e desenvolvendo de forma abrangente suas hard e soft skills para compartilhar seu conhecimento e competência com os outros.