Reflexões Sobre A Abstração E Suas Aplicações No Pensamento Computacional

Talvez não seja exagero dizer que a abstração é a mais poderosa das ferramentas intelectuais humanas, ou que se trata da capacidade que define o homo sapiens. Muito antes de se tornar um dos pilares do pensamento computacional, a abstração teve suas origens na própria revolução cognitiva da espécie humana que, generalizando situações cotidianas e objetos reais em forma de sinais e sons, pouco a pouco constituiu o que hoje chamamos de linguagem.

Desde então, após as abstrações mais simples (tais como identificar o arquétipo de uma árvore – raízes, tronco, galhos e copa – e criar a própria palavra “árvore” para se referir à ele), os exemplos de abstrações criadas e utilizadas por nós – mais ou menos complexas – é praticamente infindável: os mapas na cartografia; os números na matemática e na economia; os calendários; partes da filosofia (especialmente o idealismo grego, que colocou a abstração da realidade em um patamar superior à mesma); o Estado e a democracia; a física de Newton e a relatividade de Einstein… poderíamos continuar por páginas a fio tamanha é a criatividade do Homem para a criação de conceitos abstratos e o poder que isto lhe proporciona.

Estreitando o conceito para as aplicações computacionais, acabamos por nos encontrar em terreno não menos fértil. A prática de abstrair detalhes é a base, por exemplo, dos protocolos de comunicação. Assim como a linguagem é a base de comunicação entre os humanos, os protocolos definem interações entre partes, comumente máquinas, para permitir troca de informações de forma ordenada. Como exemplo contemporâneo, temos o protocolo HTTP (hyper text transfer protocol)1, que é o protocolo padrão da internet. Este protocolo define mensagens, sejam elas perguntas ou respostas, que carregam consigo as informações que se deseja enviar ou receber juntamente com significados pré-definidos, a fim de permitir a interpretação do estado da “conversa” pela outra parte. Essa abordagem protocolar permite ignorar detalhes internos das partes envolvidas na comunicação: qual a linguagem de máquina utilizada, qual o tipo equipamento físico (hardware), enfim, tudo que é irrelevante para a comunicação desejada. Em suma, desde que duas partes “falem” HTTP, a comunicação entre elas é possível. Tamanha é a utilidade da abstração em protocolos que o próprio HTTP necessita de outro protocolo, o TCP/IP (normalmente), como meio de transmissão. Muitas vezes esquecemos disso, assim como esquecemos que nossas vozes precisam do ar para se propagar. E este é o exemplo de uma abstração de sucesso: é tão eficiente em fazer-nos ignorar detalhes que, às vezes, esquecemos que esses detalhes existem.

Em um bom projeto de software, procuramos obter o mesmo efeito descrito acima: a eficiência nas abstrações. As linguagens orientadas à objetos, por exemplo, dispõem de diversas construções criadas justamente para este fim: interfaces, classes abstratas, métodos virtuais e herança, entre outras. Frases icônicas como “programe para uma interface e não para uma implementação” nos guiaram, nos últimos 30 anos, em busca de abstrações melhores que permitissem reaproveitamento de código e ganhos de produtividade.

A escolha das abstrações corretas em um domínio do conhecimento pode ser (e normalmente é) a diferença entre um produto de software de sucesso e um pesadelo de retrabalho. Neste ínterim, em seu livro Domain-Driven Design2, além de abordagens no design de software, Eric Evans propõe a criação de uma “linguagem de domínio”, um vocabulário compartilhado específico daquele domínio do conhecimento, a fim de promover o entendimento dos conceitos e abstrações escolhidas entre os envolvidos (clientes, programadores, equipe de testes etc.) e desta forma aumentar as chances de obter um bom produto ao final do projeto.

Apesar de todo o nosso avanço tecnológico, as abstrações continuam a ser a melhor ferramenta para continuar nossa acelerada evolução tecnológica, científica e social, e são fundamentais para o pensamento computacional. Não será estranho se denominarmos nosso próximo degrau evolutivo como homo abstractus.

1IETF – Internet Engineering Task Force. Hypertext Transfer Protocol — HTTP/1.1. Disponível em https://datatracker.ietf.org/doc/html/rfc2616

2 Evans, Eric. Domain-Driven Design: Tackling Complexity in the Heart of Software. Boston: Addison-Wesley, 2011.

Leave a Reply

Your email address will not be published. Required fields are marked *