"Desabstração" de Código - O Uso de Analogias no Aprendizado de Programação

Como um iniciante na programação, às vezes me sinto frustrado quando me deparo com um assunto de difícil entendimento, que tem uma teoria aparentemente muito complexa. Com o passar do tempo, percebi que um dos fatores que me impede de aprender um recurso novo de uma determinada linguagem é justamente a forma extremamente abstrata que a informação é passada, de uma forma completamente desconexa e sem contexto.

É claro que a abstração é um conceito importantíssimo dentro da programação, mas, ao meu ver, às vezes esse conceito extravasa para lugares que não deveria. Ao aprender um determinado assunto, você precisa saber onde aplicar aquilo de forma concreta, fora de um "ambiente de testes controlado". Depois de o meu ego levar muita paulada, acho que finalmente encontrei um modo de aprender teoria que seja clara pra mim, onde eu possa realmente enxergar o motivo daquela determinada funcionalidade existir. E esse modo usa uma coisa que eu adoro: Analogias.

Analogias nada mais são do que formas de explicar conceitos complexos de uma forma corriqueira, real, palpável. Entendamos analogia, de hoje em diante, como um desabstraidor (ou seria desabstrator?). Elas nos ajudam a pensar além das linhas de código, e nos ajudam a entender um algorítmo como sendo, na verdade, uma "mimetização" de coisas de acontecem no mundo real.

Mas pra mim, a melhor parte de utilizar analogias é: Elas só precisam fazer sentido pra você. Na verdade, quando se utiliza de analogias pra explicar algo a alguém, deve-se ter muita cautela, já que sua explicação fica a mercê da interpretação do próximo, o que pode gerar um desentendimento imenso. Entretanto, quando se explica algo para si mesmo, você sabe exatamente o que você mesmo quer dizer com essa explicação, e a ideia da aplicação prática parece vir de brinde.

Sei que esse assunto, ironicamente, está muito abstrato até agora. Me permitam então dar um exemplo de como aplico essa ideia no meu dia a dia: Quando comecei a estudar P.O.O em Python, havia alguns conceitos que eu não conseguia absorver, pelos fatores que citei no início do post, um deles era o conceito de getters e setters. Então, resolvi criar uma analogia pra mim mesmo, e desabstrair tudo que já tinha visto. Primeiramente pensei algo como:

"O getter vai sempre pegar um determinado atributo. Se houver setter, o getter irá levar esse atributo até o ele, onde o setter realizará alguma ação com esse dado, podendo também realizar alguma verificação, que permitirá ou não que o valor do atributo seja atualizado."

A partir dessa ideia, pensei em uma analogia que remete a um scanner de bagagem de um aeroporto: A bagagem (dado) é capturada pela esteira (getter), que a levará até o scanner (setter). O scanner então escaneia o conteúdo da bagagem e, a depender do resultado da busca, pode permitir ou não a mala de prosseguir. Caso seja detectado pelo scanner o porte de indevido de algum objeto, a mala será barrada. O mesmo acontece com um setter que impede a reatribuição de um atributo, caso essa reatribuição não contenha informações desejadas.

Talvez você me chame de louco depois de ler esse exemplo, mas a questão é que essa analogia só precisa fazer sentido pra mim. Pessoas diferentes podem enxergar conceitos iguais de formas diferentes, e não há nada errado nisso. A questão é que essa abordagem tem facilitado (e muito) os meus estudos, e agora sempre que me deparo com um setter penso em um scanner, e no que um scanner faz.

Caso ainda reste dúvidas, este não é um post científico, mas sim um relato de um iniciante que teve uma ideia de como enxergar a programação de outra forma. Resolvi então postar isso por aqui, pensando que talvez ajude pessoas perdidas e frustradas como eu era (e ainda sou).

Devido a grande possibilidade de usos dos elementos e recursos no mundo da programação, acabamos usando muita abastração. O mais fácil, e que funcionou pra mim é tentar desabstrair o conteudo com a própria xp. Algo que você fez nesse post. Há muitas iniciativas assim, como por exemplo games que tentar tirar a abstração e colocar os recursos de uma tecnologia de forma mais ludica. Um exemplo bem bacana é o https://ohmygit.org/ que ensina git, atraves de um jogo bem interativo.

Pô cara, que massa saber de sites como esses. Concordo contigo, essas ferramentas ajudam demais no aprendizado. Abraços!