Embora exista uma infinidade de maneiras de aprender as bases da programação, por vezes pode ser muito mais difícil desenvolver as skills necessárias que servem de suporte. Não existe um curso online que possa ensinar a colaborar melhor em equipa e não há uma fórmula mágica de melhorar as nossas capacidades cognitivas ou de resolução de problemas. Então, como podemos nós, programadores, transitar de capazes para bons? E de bons para excelentes?
Existem algumas qualidades inatas que podem dar a certos programadores uma vantagem sobre os seus colegas, enquanto outros podem ter dificuldades em compreender o básico. Mas, a barreira para a maioria dos programadores que procuram a excelência não é a genética ou a sorte. É dedicação – é paixão.
É também importante existir uma abordagem deliberada. Ninguém se torna mestre na sua área por acidente. É preciso foco, esforço e uma visão clara do nível que se pretende atingir e é naturalmente necessário um plano para atingir esse nível de excelência.
Como qualquer outra framework, seja para desenvolvimento de software ou para desenvolver a nossa capacidade de avaliar e resolver problemas, é necessária uma forma de medir e avaliar o desenvolvimento e desempenho durante o processo. Embora alguns programadores possam estar predispostos a ter características que facilitam o processo, tal não significa que a mentalidade “engenheira” seja inteiramente predeterminada. Pode ser desenvolvida conscientemente ao longo do tempo.
Planning: Medir o desempenho
Em primeiro lugar, o que faz de alguém um bom programador? Não há uma forma única e ideal de medir o desempenho (há várias maneiras de como não o fazer, mas não ajudam para este contexto) e não há uma escala pela qual nos possamos guiar e comparar o desempenho entre dois programadores ou equipas. Por outras palavras: a melhor forma de avaliar o desempenho de um programador é medir o seu crescimento ao longo do tempo.
Se quiséssemos ser melhores atletas de corrida, o que faríamos? O primeiro passo seria estabelecer uma meta e depois desenvolver um plano. Mas, como sabemos se estamos a progredir? Através da medição! As corridas passam a ser cronometradas, medem-se as distâncias e comparam-se velocidades.
O mesmo se aplica na evolução como programador. Seja o número de pontos de uma User Story concluídos numa iteração ou a qualidade do código escrito – devem ser medidos continuamente ao longo de um período definido. Se a pontuação foi 10, a próxima meta deve ser 11.
Tal como acontece com uma corrida, o processo é o mesmo:
- Definir uma forma de medir o desempenho;
- Avaliar o desempenho;
- Determinar uma meta;
- Continuar a medir e comparar o desempenho ao longo do tempo;
- Identificar e testar novas estratégias para melhorar o desempenho;
- Depois de atingir a meta, repetir a pergunta “Estou a tornar-me objetivamente melhor, mais rápido ou mais eficiente?
Spike: Dominar as bases
Compreender os fundamentos básicos de qualquer área específica é o passo essencial para o seu domínio. Por exemplo, no xadrez para um jogador se tornar um Grande Mestre, não é suficiente saber apenas como o bispo se move no tabuleiro, mas também dominar as aberturas, posições e táticas.
Na programação, existem duas categorias fundamentais para o seu domínio:
- Fundamentos de engenharia;
- Fundamentos da linguagem/framework.
O primeiro conjunto é universal para quase todos os tipos de programação, uma vez que se trata da compreensão das estruturas, processos e frameworks subjacentes para uma programação eficaz.
No segundo conjunto, focamo-nos nos fundamentos especializados – específicos para certas linguagens ou frameworks utilizadas num determinado contexto. Os programadores podem não ser especialistas em todas as linguagens ou estruturas, mas ter uma base sólida facilita a adaptação a novas tecnologias.
User Story 1: Exercícios para melhorar
Os fundamentos básicos são isso mesmo: fundamentais, mas dominar os componentes básicos da programação torna-nos um bom programador. A programação é fundamentalmente um exercício de resolução de problemas. Trata-se de obter dados, entender o contexto e formular a melhor solução possível. Provavelmente, a parte mais importante do desenvolvimento de qualquer skill de resolução de problemas é a repetição e o reconhecimento de padrões. E isso requer prática.
Quantos mais casos de uso conhecermos, mais contexto teremos para resolver cada problema subsequente. Se conhecermos diferentes problemas e as suas soluções, temos um leque mais alargado de soluções para problemas futuros. Então, como podemos nós, programadores, aplicar esta mecânica para melhorarmos as nossas skills individuais?
Task 1.1: Praticar pensamento difuso e pensamento focado
Pode parecer estranha a ideia de que é possível treinar o nosso cérebro para ser melhor engenheiro ou programador, mas há formas cientificamente comprovadas de o fazer. Praticar os tipos de pensamento que são importantes para a resolução de problemas é uma dessas ferramentas. E, talvez mais importante, passa por praticar a capacidade de alternar entre esses tipos de pensamento para descobrir soluções melhores e mais facilmente. Em geral, temos dois tipos de pensamento que são implantados ao resolver problemas ou aprender coisas novas:
- Pensamento focado: concentramo-nos num problema ou questão particular e tentamos ativamente chegar a uma solução;
- Pensamento difuso: deixamos a ideia incubar numa espécie de modo de pensamento passivo – não estamos ativamente concentrados no assunto, mas permanece lá no fundo da nossa mente e continuamos a procurar soluções ou padrões.
Quando se trata de melhorar as skills como programador, estes dois tipos de pensamento são fundamentais. Alguns problemas podem ser resolvidos por pura força de vontade e concentração, outros podem apenas exigir mais tempo e contemplação.
Task 1.2: Ler código escrito por outras pessoas, em outros contextos
Aprendemos e crescemos, em grande parte, consumindo o trabalho de outras pessoas. Embora às vezes possa parecer um pouco abstrato considerar o nosso trabalho fora do contexto em que foi criado, analisar o trabalho de outra pessoa dá a oportunidade de conseguir essa abstração do código e tentar desconstruir e compreender o pensamento lógico de uma forma nova e diferente.
É, por isso, importante reservar tempo para, em conjunto com diferentes membros da equipa, rever e analisar o trabalho de outros. Perceber como outra pessoa analisa e resolve um problema pode inspirar novas ideias e vai, certamente, melhorar as nossas próprias capacidades.
User Story 2: solidificação de conhecimento
Aprender é ótimo. Mas reter e aplicar o conhecimento é o que realmente importa. Muitas vezes, pode ser difícil lembrarmos de algo que aprendemos e aplicá-lo no momento de ação. No entanto, existem alguns truques que ajudam a solidificar o conhecimento adquirido e a identificar oportunidades para aplicar esses conhecimentos no futuro.
Task 2.1: Intercalar para aprender novos conceitos
A ideia por trás da intercalação é muito simples. Alguns estudos descobriram que as pessoas são capazes de aprender e fixar os novos conceitos se misturarem o que estão a aprender – alternando entre alguns conceitos ou práticas diferentes. Por exemplo, formações com melhor feedback são, regra geral, aquelas que alternam entre três métodos de ensino: teoria, demonstração e prática.
Task 2.2: Ensinar os outros
Para muitos, a melhor forma de aprender é ensinar. Se um indivíduo entende um problema complexo o suficiente para explicá-lo a outra pessoa, é muito mais provável que seja capaz de aplicar esse conhecimento de uma forma prática.
O ensino é, obviamente, um exercício que encoraja e requer que o conhecimento seja ativamente relembrado, explicado e aplicado. Portanto, ensinar o que se aprende pode ser uma estratégia fundamental para reter novos conhecimentos e melhorar a capacidade de relembrar e aplicar esse conhecimento ao próprio trabalho.
Retrospective: contexto de desenvolvimento
Além de um programador proficiente, aqueles que são mais eficazes têm um amplo conhecimento do contexto em que operam. Isto significa que o software não é criado do nada, no vazio. Os programadores mais capazes entendem que existem considerações institucionais que vão além de escrever código funcional e fechar User Stories em backlog.
O software é criado para servir um propósito e opera sob um determinado conjunto de condições, dentro de um orçamento específico e para utilizadores que possuem um certo nível de conhecimento e experiência. Por outras palavras, software não é apenas software. É, em última análise, uma solução para algo. Para ser-se melhor, é preciso conseguir ver além do que está no monitor.
Para melhorarmos as nossas qualidades – e valor – como programadores, devemos esforçar-nos para diminuir a monotonia do dia a dia de escrever código e começar a perguntar o porquê. Devemos tentar sempre perceber e compreender o contexto em que as decisões são tomadas e como elas afetam o nosso trabalho. Não por narcisismo, mas ao sermos incluídos no processo de tomada de decisão, somos capazes de compreender melhor o propósito e a importância do que fazemos.