5 Competências do Desenvolvedor de Software (Como Reconhecer um Bom Programador)

Mar 14 2023
Você ficaria surpreso com a frequência com que confundimos opiniões e perspectivas com fatos. Um programador geek adquire tecnologias como ferramentas brilhantes em um cinto de utilidades.

Você ficaria surpreso com a frequência com que confundimos opiniões e perspectivas com fatos.

Foto de Ayo Ogunseinde no Unsplash

Um programador geek adquire tecnologias como ferramentas brilhantes em um cinto de utilidades. Mas toda tecnologia é simplesmente uma coleção de padrões expressos em uma linguagem e a maioria dos padrões não é nova; se entendermos os padrões, podemos entender prontamente qualquer tecnologia que os incorpore.

Em vários momentos da minha vida, fiquei louco por programação, mas não acho que essa seja a marca registrada de um bom desenvolvedor. O que poderia haver de errado com um desenvolvedor talentoso que dá 110% criando código claro, preciso e sustentável das 9 às 5, aproveita o almoço enquanto fala sobre qualquer coisa menos trabalho e vai para casa para uma vida desencadeada por um teclado?

Então, aqui estão o que eu acho que são as 5 principais competências de um desenvolvedor. Para ver por que eles são importantes, pense no que é software: não é uma série interminável de instruções, nem uma coleção de chamadas arbitrárias para uma API, nem é apenas recortar e colar. Em vez disso, é uma rede de hierarquias de código — altamente estruturada, com pouco código copiado — principalmente padrões replicados (não necessariamente os padrões GOF, mas alguns como “inicialização preguiçosa”, “geração de código orientada por modelo” ou “script em XML”). Também só é útil se atender aos requisitos de negócios e for de qualidade adequada. Portanto, precisamos avaliar as habilidades que permitem que um desenvolvedor atinja esses objetivos.

Chega de preâmbulo, vamos lá.

1. Analítico - pensador estruturado, claro, crítico e solucionador de problemas

O problema é que muitas pessoas confundem postura, confiança ou fala rápida e contínua com inteligência. Portanto, precisamos ser muito claros sobre as marcas de inteligência de um desenvolvedor.

O software tem tudo a ver com decomposição funcional e estrutural, então acho que o aspecto principal da inteligência é ser analítico, por natureza, criação ou força de vontade. Uma pessoa analítica considerará uma questão ou problema de vários ângulos, escolhendo a melhor abordagem geral e, em seguida, dividindo o problema em subproblemas.

Você pode detectar essa competência em uma entrevista com bastante facilidade porque o candidato naturalmente buscará esclarecer uma questão ambígua ou listar as partes e relacionamentos de uma solução ou “tocar e fechar” um problema para identificar seu escopo antes de entrar em detalhes.

Para detectar essa competência, você não precisa dar a eles um novo problema, basta pedir que descrevam quase tudo: um produto de software em que trabalharam, orientação a objetos, as funções ou processo de desenvolvimento de software, a Internet, Web ou igualmente o traçado de uma cidade real ou ideal, a natureza da democracia, a definição e funcionamento da evolução, etc.

Quando a descrição estiver completa, pergunte-se se você acabou de ouvir uma enumeração das peças ou se o candidato descreveu o cerne da questão; isso é analítico.

2. Abstrato — capaz de identificar e compreender abstrações e padrões

O software é complexo; você não pode entendê-lo simplesmente lendo cada linha de código. Você o entendeu procurando por estrutura, construindo uma teoria de como o código é modelado e, em seguida, verificando e alterando esse modelo enquanto lê.

Desenvolver um novo software é muito parecido com entender um programa existente, exceto que o modelo ainda não existe, apenas a “teoria” desse software em sua mente. Seu programa expressa a teoria no modelo de código.

Se você pensar em termos de abstrações, escrever uma especificação funcional ou técnica não é tão diferente de codificar, exceto que a linguagem é humana e o intérprete será uma ou mais mentes humanas. Uma especificação é abstrata porque nenhum programa pode executá-la, mas se for precisa, completa, clara e bem estruturada (todas as qualidades que buscamos no código), um desenvolvedor pode implementá-la.

3. Preciso - a capacidade de expressar algo de forma concisa e precisa

Alguns desenvolvedores conseguem ter algum sucesso apenas replicando exemplos; eles procuram algo próximo do que desejam implementar e depois ajustam. É como esculpir, exceto que, quando é feito com código, o resultado geralmente não é muito claro, não é muito conciso e provavelmente não é totalmente preciso.

Da mesma forma, alguns desenvolvedores só podem explicar as coisas por exemplo, não nomeando os conceitos ou padrões subjacentes. Isso é aceitável, mas será um obstáculo porque é menos provável que eles reconheçam, entendam e apliquem padrões no nível micro ou macro no código.

Um desenvolvedor que pode ser preciso (mas não necessariamente rápido ou impressionante) no discurso desenvolverá um código mais preciso e também poderá explicar mais facilmente uma técnica ou um requisito para outro desenvolvedor.

4. Priorizado e Pragmático - a habilidade de reconhecer o que deve ser feito versus o que poderia ser feito

A abordagem ágil naturalmente favorece escrever hoje o código de hoje. Mesmo em empresas que fazem desenvolvimento em cascata, ainda é uma habilidade vital saber distinguir entre o essencial e o possível.

Muitas vezes, os produtos só são totalmente bem-sucedidos quando são entregues no prazo. Um desenvolvedor pragmático faz o que é necessário, criando alguns ganchos e escrevendo os comentários que estabelecem as bases para amanhã.

O pragmatismo também é demonstrado pelo desejo de alcançar, completar e terminar; isso nos impulsiona e nos encoraja a definir o que é sucesso, nos ajuda a priorizar o caminho para chegar lá e nos concentra na conclusão de tarefas em vez de em ouro.

5. Idealista - o desejo de fazer as coisas certas

Um desenvolvedor que é apenas pragmático às vezes pode ser preguiçoso; eles não apenas desenvolvem a funcionalidade de hoje, mas também codificam apenas para hoje, não para o desenvolvedor que deve manter esse código amanhã.

Um desenvolvedor idealista realmente se preocupa com todas as qualidades do que entrega:

  • eles garantem que entendem os requisitos
  • eles consideram e possivelmente até documentam os casos de teste antes de escrever uma linha de código
  • escrevem códigos claros e com comentários adequados; eles refatoram continuamente para que o código comum se mova para métodos compartilhados e, em seguida, para classes básicas ou auxiliares
  • eles escrevem casos de teste de unidade para proteger outros desenvolvedores e testadores de bugs
  • eles consistentemente fazem testes manuais onde um teste automatizado é impraticável

Outras Competências

Naturalmente, existem outras competências!

  • concentração — escrever software é uma tarefa complexa de transcrever um modelo da mente em código
  • a capacidade de entender e usar tecnologias
  • o desejo de aprender, mas também de melhorar todas as habilidades necessárias para serem eficazes individualmente e como parte de uma organização de entrega de software
  • o reconhecimento de que suas habilidades geralmente não têm sentido, a menos que se encaixem em outras funções de sua equipe e de outras equipes

No entanto, um desenvolvedor faria bem em ter as competências acima; então eles estão bem posicionados para avançar em suas carreiras no caminho técnico para se tornar um desenvolvedor sênior, depois um líder de desenvolvimento e posteriormente um arquiteto, ou no caminho da gestão onde a integridade, a paixão pelo respeito e o desejo de inspirar e ajudar os outros alcançar são ainda mais importantes.