O que torna um desenvolvedor excepcional
(steady-study.super.site)Este texto corresponde, em certa medida, à primeira parte da apresentação Guia prático para melhorar resultados e competências de engenheiros frontend júnior, apresentada no Infcon 2023. Também dá para considerá-lo uma espécie de sucessor espiritual de Roadmap de carreira para engenheiros frontend: 3 trilhas de especialização para juniores, que eu já tinha publicado no GeekNews antes.
Como é um engenheiro excepcional?
No artigo de 2015 <What Makes a Great Software Engineer?>, Li Paul Luo propôs 5 requisitos essenciais que formam um engenheiro excepcional. O método de pesquisa foi o seguinte.
- Análise de inúmeros estudos anteriores sobre educação, competências e comportamentos necessários para desenvolvedores
- Entrevistas em profundidade com 59 desenvolvedores da Microsoft de nível 2 ou superior, ou seja, profissionais com alguma competência já reconhecida. A partir disso, foram extraídos 54 candidatos a características pessoais desejáveis em desenvolvedores (personalidade, conhecimento, comportamento etc.)
- Pesquisa com cerca de 2.000 desenvolvedores da Microsoft. (Após descrever detalhadamente cada característica) foi feita a pergunta: “Se um desenvolvedor experiente não tiver essa característica, você ainda o avaliaria como um desenvolvedor excepcional?”
- Análise dos resultados da pesquisa e entrevistas de acompanhamento com os respondentes
- Com base na análise da pesquisa e nas entrevistas de acompanhamento, mais 40 entrevistas com os principais colaboradores dos desenvolvedores (artistas, planejadores de conteúdo, cientistas de dados, designers, engenheiros eletricistas etc.)
Reorganizei essas 5 condições essenciais propostas pelo autor, mudando um pouco a ordem e a interpretação, e acrescentei minhas próprias reflexões.
1. Escreve um ótimo código (Be a competent coder)
Em vez de “ser um programador competente”, é mais útil ter como objetivo “escrever um ótimo código”.
Habilidade de programação é a competência mais importante para juniores. Mas, depois de certo nível, passa a ser mais eficiente investir esforço no desenvolvimento de outras competências. Esse “certo nível” varia de pessoa para pessoa e de organização para organização.
Eu costumo avaliar a habilidade de programação de um júnior com os seguintes critérios: “1) ter uma visão própria e consistente sobre qualidade de código, 2) escrever código que atenda aos requisitos do cliente, 3) com velocidade, 4) com poucos bugs e 5) com boa legibilidade”.
2. Pratica a tomada de decisão baseada em evidências (Practice informed decision-making)
Para desenvolver capacidade de tomar decisões, é mais vantajoso focar em melhorar o processo do que o resultado da decisão. Afinal, o resultado pode ser determinado independentemente da minha vontade.
E “baseada em evidências” significa apoiar-se em dados, sem interpretá-los com viés nem tirar conclusões precipitadas. Em especial, quando você obtém novas informações, o ideal é reconsiderar julgamentos anteriores mesmo que isso não agrade, em vez de racionalizar.
Principalmente ao fazer debugging, quase sempre estamos errados quando achamos que o problema está na biblioteca ou no navegador, e não em nós. Mesmo que realmente seja um problema do navegador, se você passar a culpar o navegador por todos os problemas parecidos, pode acabar ignorando um problema crítico que na verdade foi causado por você.
Uma forma de evitar vieses e precipitação é aceitar com mente aberta diferentes perspectivas externas. Parar por um instante e observar como amigos, colegas, clientes, concorrentes e gestores interpretam uma questão torna mais difícil manter os próprios vieses.
Claro, quando uma pessoa está sob estresse, agir racionalmente fica mais difícil. Com organizações acontece o mesmo. Por isso, organizações sábias deixam propositalmente alguma folga em cronogramas e recursos, e pessoas sábias aprendem maneiras de gerenciar o estresse, como por meio da meditação.
Para praticar no dia a dia a tomada de decisão baseada em evidências, é preciso ter muitas boas evidências à disposição. Vale a pena montar um sistema que faça informações diversas e de qualidade passarem constantemente ao seu redor: assinar newsletters, participar de comunidades, entrar em grupos de estudo e assim por diante.
3. Ajuda colegas a tomar decisões eficazes (Enable others to make decisions efficiently)
Desenvolvedores excepcionais compartilham informação e experiência para ajudar colegas a crescer, aumentar a produtividade da equipe e, como resultado, permitir que a organização tome decisões melhores.
E o que um júnior pode fazer? Em vez de tentar gerar resultado imediato, crescer por meio de perguntas já é uma forma de ajudar colegas e a organização. Supere o medo de ser subestimado, rejeitado ou de atrapalhar e faça perguntas com bastante contexto. Em geral, pensamos que é preciso construir confiança para expor esse tipo de vulnerabilidade, mas as pesquisas mostram o contrário. Quando as pessoas mostram suas fraquezas e assumem riscos com coragem, a base da confiança se forma mais rapidamente.
Também existe uma forma melhor de mostrar vulnerabilidade: incluir bem o contexto. Juniores costumam ter um problema A, tentam a solução B e, quando C não funciona dentro disso, perguntam só sobre C. Nesse caso, normalmente recebem apenas respostas muito pontuais e, mesmo obtendo a resposta, muitas vezes não conseguem resolver o problema. Já vi várias vezes o oposto acontecer: quando A é bem formulado, B surge quase automaticamente e C deixa de ser necessário.
Para incentivar perguntas, é preciso construir uma cultura organizacional que valorize muito a vulnerabilidade e a transparência. Nesse ponto, qual é o valor padrão dentro da organização faz bastante diferença, porque o padrão influencia fortemente a cognição e o comportamento das pessoas.
Sob esse aspecto, ferramentas com lógica Public by Default, em que é preciso agir para esconder algo (Slack, Notion), são melhores do que ferramentas Private by Default, em que é preciso agir para compartilhar algo (Email, Google Docs). “Você pode falar comigo a qualquer momento, exceto nestas situações (Do Not Disturb)” é melhor do que “neste horário você pode vir falar comigo livremente (Open Hours)”.
4. Maximiza o valor atual do seu trabalho (Maximize current value of your work)
Um desenvolvedor excepcional precisa tanto de pensamento sistêmico (implementar com visão de longo prazo, prevendo partes que podem se tornar problemáticas depois ou como os requisitos podem mudar) quanto de capacidade de agir imediatamente (não ficar paralisado na análise; entrar em ação mesmo com medo da incerteza e obter feedback).
Especialmente em startups, o segundo costuma ser mais vantajoso, mas pender ao extremo também é ruim. É bom focar em execução rápida, mas transformar em hábito ações que exigem pouco esforço e trazem muito benefício. Um exemplo micro seria não deixar valores hardcoded, mesmo que seja apenas um, e extraí-los para variáveis; ou, mesmo que hoje existam só dois valores, se esse tipo de opção ultrapassa um único componente, usar um Mode em vez de um valor Boolean. Um exemplo macro é o hábito de pensar qual hipótese você está tentando validar com determinada ação, quais dados serão usados para validar isso e então executar.
No fim, o valor do trabalho é maximizado quando você consegue transitar com flexibilidade, por vontade própria, entre pensamento sistêmico e ação imediata.
5. Aprende continuamente de forma eficaz (Continuously learn)
Aprender a aprender de forma eficaz é o ponto de partida de todo crescimento. Quanto mais cedo isso acontece, melhor, porque gera ganhos compostos.
No fim das contas, aprender serve para ampliar nosso conhecimento e transformar nossa vida. Mas não há garantia de que conhecimentos antigos continuem válidos hoje, então é sempre necessário o esforço de atualizar-se com novas informações.
No entanto, ter muita informação não significa necessariamente algo bom. Como big data não refinado, certas informações só atrapalham. Por isso, é preciso aumentar a proporção de “sinal” em vez de “ruído”, ou seja, evitar informações imprecisas ou sem relação com os seus problemas. Eu considero bons exemplos de sinal os insights que criam pontos de conexão entre meu conhecimento atual e áreas fora do meu domínio de especialidade, ou evidências de que eu posso estar errado sob determinadas condições.
O aprendizado eficaz pode ser resumido na pergunta: “Como posso crescer de forma um pouco mais eficaz todos os dias?” A resposta é repetir: 1) encontrar o que você precisa na prática agora, 2) estudar apenas a quantidade necessária de base teórica relacionada e 3) aplicar imediatamente o que aprendeu para obter auto-feedback.
Então como saber o que você precisa agora, na prática? Você pode escrever um diário para descobrir problemas que enfrenta no dia a dia, ou tentar fazer melhor atividades nas quais gastou muito tempo na última semana. Por exemplo, se você está se preparando para conseguir emprego, provavelmente participa de estudos em grupo com frequência; então pesquisar como estudar em grupo de forma eficaz pode ajudar. Quanto mais recorrente for uma atividade, mais oportunidades de aprendizado ela oferece e maior tende a ser o impacto de melhorá-la na sua qualidade de vida.
Como aplicar isso — perspectiva de juniores e sêniors
Juniores podem verificar, item por item, o quanto se encaixam nesses objetivos, especialmente nos conhecimentos e comportamentos descritos em “escrever um ótimo código” e “aprender continuamente de forma eficaz”. Depois, podem desenvolver de forma focada as competências que estiverem faltando.
E, se você é sênior, pode usar isso em avaliações de contratação e de desempenho. Vale pensar em que sinais permitiriam identificar se um candidato possui essas competências em nível suficiente. Também dá para usar ideias semelhantes ao liderar o desenvolvimento das competências de juniores.
Além disso, essas competências servem como um bom critério para avaliar qualquer função se você simplesmente substituir “escrever um ótimo código” pela especialidade daquele domínio específico. Por isso, na XL8, seja para PM, designer ou desenvolvedor, usamos isso ao máximo como critério de avaliação de competências ao contratar, fazer onboarding e dar feedback, e temos visto um efeito bastante significativo.
Pontos de atenção ao usar isso
Essas 5 competências são todas complementares entre si. Como estão interligadas, talvez não seja tão eficaz estabelecer como meta desenvolver apenas uma delas isoladamente. Em outras palavras, também é verdade que, se você se tornar muito bom em apenas uma, pode ficar mais fácil melhorar as outras.
E esta pesquisa, como tantas outras, não é uma verdade absoluta. Naturalmente, ela tem limitações, e também é preciso considerar que passou pela interpretação do autor do artigo e pela minha interpretação.
Além disso, como o título do artigo é “What Makes a Great Software Engineer?”, pode parecer que, ao adquirir essas cinco competências, alguém se tornaria um desenvolvedor excepcional — isto é, que seriam condições suficientes. Mas o que a pesquisa realmente investigou foi: “sem isso, não se pode chamar alguém de desenvolvedor excepcional”, ou seja, são condições necessárias. Portanto, tudo bem adotá-las como bons objetivos, direção ou pontos de passagem, mas não é preciso tratá-las como destino final.
Como aplicar isso — perspectiva do desenvolvedor frontend
Para usar essas 5 competências no contexto do desenvolvimento frontend, você pode se fazer perguntas como estas.
- O que é um ótimo código no domínio de frontend? Como posso escrever um código melhor?
- Que evidências devo coletar, e como, para tomar decisões melhores no domínio de frontend?
- O que significa ajudar colegas a tomar decisões eficazes no domínio de frontend?
- Como medir o valor atual do meu trabalho no domínio de frontend? E como maximizá-lo?
- Como aprender continuamente, de forma eficaz, os conhecimentos do domínio de frontend?
Foi refletindo sobre como responder a essas perguntas que surgiu o Roadmap de carreira para engenheiros frontend. Ele separa os papéis que a organização espera de desenvolvedores frontend em trilhas especializadas em web/produto/operação e explica as principais características, vantagens e desvantagens de cada trilha. (Esse conteúdo ficou totalmente de fora da apresentação no Infcon, mas pretendo reforçá-lo e explicá-lo melhor em um texto separado.)
Esse roadmap também pode ser usado nos contextos de juniores e sêniors.
Por exemplo, juniores de frontend podem investigar a situação da empresa por meio de pesquisa prévia ou perguntas na entrevista e usar isso em sua busca de emprego, pensando algo como: “Então é esse tipo de especialização que essa organização onde eu quero entrar valoriza. Se eu desenvolver bem essa especialização e souber demonstrá-la, minhas chances de ser contratado aumentam.”
Já um sênior poderia usar assim: “Na nossa organização faltam pessoas com esse tipo de especialização. Então vamos ajudar essa pessoa a desenvolver essa competência. E vamos aprender a identificar bem quem tem essa especialização para contratar melhor.” Assim, isso pode ser aplicado tanto no crescimento dos membros do time quanto na contratação.
Claro, assim como no artigo citado acima, também é preciso ter em mente que essas 3 trilhas são complementares entre si, não são verdades absolutas e tampouco constituem um destino final.
Tornando-se um desenvolvedor sênior excepcional
No Roadmap de carreira para engenheiros frontend, também mencionei brevemente minhas ideias sobre como se tornar um desenvolvedor sênior excepcional.
- Uma boa pessoa sênior é aquela que se mantém fiel ao básico e continua desenvolvendo as 5 competências essenciais.
- Às vezes, uma única ação exemplar de um colega exerce mais influência do que muitas palavras de um líder formal. Quem demonstra liderança mesmo sem ocupar um papel formal de líder acaba recebendo esse papel no fim.
- Em qualquer situação e em qualquer tarefa pequena, quem cria grande impacto acaba sendo encarregado de trabalhos maiores depois.
1 comentários
Como foi copiado direto do Notion, o link "Roadmap de carreira para engenheiro de frontend" lá no fim acabou vindo como um link do Notion. T_T https://steady-study.super.site/frontend-engineer-career-roadmap É este aqui.