"De tudo escrito, amo apenas o que se escreve com o próprio sangue."

Complexidade

Programar é gerenciar complexidade. É isso o que afirma o consagrado Structure and Interpretation of Computer Programs, com a ideia de que o trabalho do programador é criar abstrações que serão usadas para formar outras abstrações que juntas realizarão uma tarefa. Eu vejo esse padrão se repetindo em todo lugar, capsulas de complexidade contidas em abstrações para tornar realizáveis tarefas complexas.

Abstração é definido por John Locke como uma atividade da consciência que consiste em uma generalização e separação de conceitos simples dos outros conceitos que estão integrados a ele na realidade. Na linguagem natural as palavras exemplificam bem essa definição como um representante atômico de um conceito maior. O conceito "televisão" pode ser representado como "dispositivo eletrônico doméstico com uma tela grande usado para assistir conteúdos audiovisuais", só que se torna inviável usar essa frase sempre que eu precisar falar sobre o objeto que ela representa. Para isso criou-se uma abstração que encapsula a complexidade da frase e apresenta-a de uma forma simplificada onde poderá ser usada para construir outras frases, assim como a palavra "doméstico" foi usada na definição de televisão.

Essa recursividade não é válida só para a linguagem natural, a linguagem de programação segue a mesma lógica. É desejável que os fragmentos do nosso código sejam abstrações independentes entre si, para que possam ser conectados para dar um sentido maior, como palavras que formam uma frase. Com abstrações de níveis cada vez maiores, temos ferramentas capazes de criar ferramentas ainda mais complexas, e é assim que tem se desenvolvido a nossa tecnologia desde o início da humanidade pois a consciência humana trabalha dessa forma.

Paremos para refletir um pouco. Se criar abstrações é o modo como a nossa consciência melhor se relaciona com a realidade, como podemos usar isso em nosso favor para aprender coisas cada vez mais complexas? É algo banal, talvez tão banal que seja negligenciado, que precisamos ter uma boa base para aprender algo novo. A multiplicação se torna muito mais fácil se entendermos a operação de soma, a potenciação se torna muito mais fácil se entendermos a multiplicação. Será que todas as vezes que algo nos parece difícil e complexo é apenas porque não temos as abstrações necessárias para representar esse conceito de maneira simplificada?

#aprendizagem #filosofia #programacao