Conjuntos de habilidades amplos vs. estreitos: habilidades de engenharia de software desmistificadas

Publicados: 2022-03-11

Todo engenheiro de software tem um conjunto de habilidades composto pelas diferentes habilidades que eles adquiriram. Um conjunto de habilidades é “profundo e estreito” se você domina uma ou duas habilidades e pouco mais; é “amplo e superficial” se você pode fazer um pouco de tudo sem ser um especialista em nenhum campo.

A maioria de nós está em algum lugar no meio com algumas habilidades fortes, algumas médias e muitas lacunas. Neste artigo, gostaria de discutir o espectro amplo e profundo e argumentar que aproximar-se da extremidade ampla beneficiaria a maioria dos programadores.

Habilidades do engenheiro de software: representação gráfica de um conjunto de habilidades

A amplitude e a profundidade são, obviamente, relativas. Por exemplo, você pode ser um especialista em desenvolvimento web, ou apenas em desenvolvimento web do lado do cliente, ou apenas em JavaScript. Todas essas são habilidades “profundas e estreitas” em algum sentido, mas a última é muito mais restrita que a primeira.

Além disso, conjuntos de habilidades “profundos e amplos” e “superficiais e estreitos” são possíveis: o primeiro significa que todos querem contratá-lo, e o segundo significa que você ainda não aprendeu nada significativo. Como não são muito comuns, também não vale a pena discuti-los em detalhes.

Tipos de habilidades e conjuntos de habilidades do engenheiro de software

Profundo e estreito

Ter um conjunto de habilidades profundo significa que você é um especialista em pelo menos um campo.

Veja SQL: digamos que você saiba tudo sobre teoria de banco de dados relacional; os prós e contras do MySQL, PostgreSQL, Oracle e SQLite; como otimizar consultas; quando e como desnormalizar um banco de dados, etc. Os clientes que procuram essa habilidade específica vão querer contratá-lo o mais rápido possível, e com razão. Você vai começar a trabalhar e entregar valor como poucos poderiam.

No entanto, se o projeto se expandir ou mudar significativamente, você será substituído ou complementado por programadores com as habilidades que lhe faltam. Mesmo sem grandes mudanças, você seria capaz de sugerir mudanças arquitetônicas? O cliente pode se sair melhor com um banco de dados NoSQL ou nenhum banco de dados, mas sua experiência limitada pode prejudicá-lo contra essas opções desconhecidas.

Amplo e Raso

Por outro lado, se você é um generalista que não é especialista em domínio, precisará de algum tempo para acelerar novos projetos antes de atingir o pico de produtividade.

Para dar um exemplo, talvez você precise fazer um projeto Python e nunca tenha usado essa linguagem antes. Ainda assim, você provavelmente já ouviu algumas coisas sobre isso (dinâmico, interpretado, multiparadigma) e sua experiência com outras linguagens facilitará muito a transição.

O código que você escreve inicialmente pode não ser Pythonico (com tuplas, compreensão ou geradores), mas você saberá por onde começar. Você fará um progresso constante e seus módulos bem elaborados serão fáceis de melhorar mais tarde. Sua ampla perspectiva sobre tecnologia lhe dará ideias que outros podem perder.

Quando o projeto mudar, você será um ativo para sua equipe e não um passivo.

Habilidades no mundo real

Em termos geográficos, conjuntos de habilidades estreitos parecem montanhas altas e conjuntos de habilidades amplos são como platôs. Usando essa analogia, os conjuntos de habilidades típicos provavelmente apresentam algumas montanhas, uma colina aqui e ali e muitas planícies.

Representação gráfica de montanhas, colinas e planícies

Um programador aleatório pode ser ótimo em SQL e Python, bom em programação e algoritmos da Web e realmente apreensivo com a maioria das outras coisas, como dumps de núcleo, servidores OAuth ou aplicativos nativos. Esse programador deve continuar a explorar suas áreas de especialização, ao mesmo tempo em que encontra e preenche lacunas de conhecimento.

Essa estratégia provavelmente os servirá melhor ao longo dos anos.

Por que os programadores precisam diversificar suas habilidades

Muitos projetos exigem habilidades não relacionadas combinadas de maneiras imprevisíveis. Embora engenheiros amplamente qualificados possam contribuir de maneira útil para a maioria deles, o conjunto de habilidades de um especialista atenderá aos requisitos precisos de poucos empregadores. Isso não é necessariamente um problema no curto prazo, pois você só precisa de um emprego para pagar as contas.

No entanto…

A superespecialização é arriscada. Colocar seus ovos em uma cesta pode ser bom se você puder prever o futuro melhor do que todos os outros, mas essa habilidade é rara e não está relacionada a habilidades tecnológicas. Considere a demanda por habilidades de programação do Windows em nosso milênio. Ou pergunte a si mesmo: muitos de nós poderiam ter adivinhado as respectivas trajetórias do Android, Flash, Nokia ou Blackberry há uma década?

Por fim, os principais empregadores valorizam muito as habilidades diversas. O Facebook não atribui novas contratações às equipes até seis semanas após o início. O Google incentiva transferências internas e executa vários programas de rotação. Mesmo que você goste de trabalhar como freelancer, manter suas opções abertas não fará mal. Se você pensar em trabalhar para essas empresas, terá que ser pelo menos um pouco generalista.

Supondo que você esteja convencido e queira diversificar suas habilidades, como você faria isso?

Como diversificar e melhorar as habilidades técnicas

Você pode trocar dinheiro por habilidades:

  • Aceite uma taxa mais baixa ao fazer a transição para um campo desconhecido. Se você é 75% produtivo como de costume, um corte temporário de 25% no salário é justo. Você vai resgatá-lo em breve.
  • Faça um trabalho de demonstração não remunerado com as habilidades desejadas enquanto se candidata a empregos que as exigem. Se você não estiver pronto para a mudança, ainda é uma lição útil a ser aprendida.

Você também pode trocar tempo por habilidades:

  • Contribuir para um projeto de código aberto. Você receberá conselhos e validação, retribuirá à comunidade e talvez seja notado por potenciais empregadores ou colegas de trabalho.
  • Faça um projeto pessoal para alegria, inspiração e uma mudança no trabalho do dia-a-dia. Por exemplo, eu clonei o jogo Snake pré-smartphone enquanto aprendia React.

Você tem que procurar oportunidades de aprendizado, mas não pode fazer isso constantemente. Para meu projeto de entrevista no Toptal, usei Node.js e Backbone, nenhum dos quais eu tinha muita experiência. Foi divertido, mas o ritmo de aprendizado exigido não pôde ser sustentado por meses.

Idealmente, você alternaria entre longos períodos de estabilidade (com produção e renda estáveis) e breves intervalos quando se desafiasse a aprender algo novo. A frequência com que você faz o último depende de vários fatores, como seu conjunto de habilidades atual, demanda do mercado e seus objetivos pessoais.

Por que a amplitude é boa para os empregadores

No que diz respeito aos empregadores, habilidades profundas sempre serão necessárias em alguns cenários:

  • Quando há pouca confiança ou compromisso de tempo entre empregador e empregado.
  • Quando resultados catastróficos (como incidentes de privacidade ou segurança) são prováveis.
  • Quando habilidades esotéricas são necessárias.
  • Quando os prazos são urgentes e inegociáveis.

Ainda assim, muitos projetos não verificam nenhuma dessas caixas e seus gerentes de contratação devem considerar engenheiros experientes. Muitas habilidades técnicas, como teste e documentação de código, e todas as habilidades sociais (como comunicação) são transferidas. A resiliência é importante mesmo quando os produtos não mudam completamente; se a peça que você contratou para estacionar, um generalista pode trabalhar na próxima prioridade mais alta.

Representação gráfica de um empregador escolhendo um desenvolvedor com um conjunto de habilidades amplo e superficial em vez de um com um conjunto de habilidades profundo e restrito

Dada a importância de amplos conjuntos de habilidades, devemos incentivar os desenvolvedores a diversificar, e devemos comunicar a importância do amplo conhecimento aos empregadores que podem estar muito focados em “anos de experiência” com vários campos e habilidades.

O objetivo final é um histórico de clientes satisfeitos; além de hard e soft skills, isso comprova a capacidade do engenheiro de fazer a transição para áreas desconhecidas. É também um forte incentivo para os freelancers não se aventurarem em novos campos antes de estarem prontos para isso.

Alcançando o equilíbrio certo

Quando as habilidades amplas são desvalorizadas, alguns bons desenvolvedores ficam ociosos e alguns bons projetos têm falta de pessoal ou estão acima do orçamento. Exigir uma combinação perfeita de habilidades é como exigir trabalho no local, pois torna mais difícil combinar oferta (mão de obra qualificada) com demanda (trabalho recompensador).

Nada disso é um argumento contra a especialização do domínio; sempre importará e será generosamente recompensado. Devemos apenas ter em mente que habilidades amplas também importam mais do que é aparente.