Particularmente, não creio que os mais experimentados desenvolvedores do mundo tenham uma resposta precisa para essa questão. Eles sequer precisam responder a essa questão para continuar aprimorando suas habilidades e acumulando sucessos em novos projetos. Eles simplesmente aprendem com a prática e com a interação com outros colegas experientes, assimilando e aplicando padrões que apresentem bons resultados de produtividade e de qualidade.
A propósito, em 1999 o renomado enxadrista Garry Kasparov foi perguntado se a sua maestria no jogo de xadrez poderia ser ensinada. Para o consagrado campeão mundial, quem almeja a maestria no xadrez deve ter intuição, deve ter um gongo interior, uma iluminação, de modo que possa ter uma visão panorâmica do que está acontecendo (no torneio). Finalizou dizendo que seria necessário já nascer com essa característica, já que nenhum treinamento poderia contruí-la.
Voltando à engenharia de software, Alistair Cockburn citou 7 habilidades requeridas para o desenvolvimento de software (fonte: Software engineering in the 21st century):
- Decidir o que deverá ser construído
- Gerenciar (pessoas e projetos)
- Modelar
- Design da visão externa
- Design de larga escala (arquitetura)
- Design de pequena escala (programação)
- Validar o trabalho
Segundo Mary Poppendieck, especialista em pensamento lean, desenvolver software requer a aplicação consciente de técnicas de solução de problemas. Para ela, é comum novatos optarem pela abordagem depth-first, tomando decisões de design muito cedo. Enquanto se aprende o contexto do problema, é mais seguro adotar a abordagem breadth-first, evitando-se tomar decisões prematuras que possam fazer com que a equipe desperdice energia focando em detalhes com maior risco de impacto de mudanças ao longo do projeto.
Após duas décadas aprendendo, acumulando e combinando técnicas para desenvolver software com qualidade, o que eu posso concluir de tudo isso?
Tenho percebido que as técnicas de desenvolvimento de software evoluem com o passar dos anos, assim como os problemas de negócio e as soluções tecnológicas. Por isso, precisamos usar frequentemente nosso intelecto, intuição, talento, criatividade, conhecimento técnico e habilidade de comunicação/interação com outras pessoas para formatarmos e aplicarmos a técnica correta de acordo com o contexto de cada momento do projeto de desenvolvimento de software. Minha conclusão é a seguinte: precisamos nos manter aprendendo por meio da pesquisa frequente e da interação contínua com os colegas de trabalho, participando ativamente da solução dos problemas que emergem dos projetos reais. Felizmente, a comunidade de desenvolvedores de software dispõe de redes sociais colaborativas que permitem expandir esse aprendizado continuamente conforme o interesse e disponibilidade de cada um.