Abstrações perigosas

Abstração é “o processo de retirar ou remover características de algo para reduzi-lo a um conjunto de características essenciais”.
Como desenvolvedores, usamos abstrações o tempo todo.
Dizer algo:

  • usando Maven para abstrair o processo complexo de obtenção de partes que conformam nosso processo de aplicação + compilação (entre outros).

  • usando uma classe proxy que assume a responsabilidade por certos aspectos de nossa aplicação.

  • criação de scripts bash para automatizar tarefas repetitivas.

Cenário

Abstrações são a melhor maneira de lidar com a complexidade.
Mas, como mencionado na Lei das Abstrações Leaky ( http://www.joelonsoftware.com/articles/LeakyAbstractions.html )
“… (Abstrações) nos economiza tempo de trabalho, mas não nos economiza tempo de aprendizado.” . Mesmo se você souber como uma abstração funciona, reserve um tempo para aprender o que ela está fazendo nos bastidores.

Bem, para ser honesto, infelizmente, nem sempre isso é possível. GWT ( https://developers.google.com/web-toolkit/ ) é um bom exemplo. Ele converte / permuta magicamente o código Java em código Javascript. O principal objetivo da abstração do GWT é ocultar o código Javascript. Basta usar a linguagem que você já conhece, Java. Para ser honesto, a ideia faz sentido. Na verdade, GWT é apenas mais um framework que permite a compilação / permutação de uma linguagem para outra: Clojure, Groovy, Coffescript, etc. 1 A verdade é que não temos acesso (ou seria terrivelmente complexo acessar) o mecanismo que transforma a entrada em código de destino. Esse tipo de abstração é um pouco perigoso. O que acontecerá se algo falhar durante o processo? Tentar fazer uma solução alternativa para essas abstrações pesadas é, pelo menos, prejudicial.
A verdade é que às vezes temos que contar com esse tipo de abstrações poderosas. A criação de bytecode de JVM é enorme, por exemplo, e ninguém tentará encontrar uma alternativa para isso.
Portanto, temos que ter cuidado ao escolher as abstrações que iremos usar.
Para compreender os riscos de confiar em coisas que fogem ao nosso controle, ou pior ainda, ao nosso entendimento.

  1. O processo não é exatamente o mesmo, na verdade. GWT permuta código Java para Javascript. Clojure e Groovy compilam código para Java Bytecode. O Coffescript fornece “açúcar sintático”.