Abstrações que Vazam
Abstrações que Vazam
É sábado de tarde.
Você está descansando no sofá - e chove lá fora.
Está assistindo um Netflix e tal, aquela série que sua vizinha falou sobre pra você no elevador.
Mas - falta algo. Nada melhor do que fazer um café, não?
Relutante e com preguiça - se levanta e vai para a cozinha.
Abre o armário da direita e pega o moedor de café novo, que chegou hoje de manhã. Do lado dele, está o café em grãos que você comprou junto.
A Amazon entrega as coisas rápido - pensa.
Tira o moedor da caixa, e a joga pro lado.
Vê um botão na base do moedor - "isso aqui deve ligar o negócio".
Arranca o plástico que fica em volta e já liga na tomada logo em seguida.
Agora é hora de abrir o pacote de café - sem problemas. Tem lacre fácil.
...
O cheiro de café sobe.
Você é feliz.
...
Vira sem muito cuidado a embalagem no moedor.
Deve dar boa.
Aperta o botão.
Nada.
Aperta novamente.
Nada.
... Mas era pra ser 120v. Devem ter mandado errado!
Pega a caixa que jogou no lado pra achar o manual.
As letras são pequenas e você não consegue ler nada. E tá escuro.
Preciso ligar a luz.
Você aperta o interruptor que fica do lado do armário.
Nada.
Acabou a luz?
... Escuta o som da TV ligada.
Luz não foi.
Pois é - tem algo errado no fluxo.
Você começa a analisar.
Do lado do interruptor, começa a ver umas manchas cinzas na sua parede branca.
Passa a mão - parece úmido.
Eita.
Começa a ver mais goteiras ao longo da cozinha.
Deve ser vazamento!
Onde era o registro mesmo? Na lavanderia!
Você corre fechar o registro.
Paz momentânea.
No teto - mais locais começam a gotejar.
Preciso falar com o síndico!
Pega o celular- se lembra que não vê as notificações desde a manhã.
O grupo do condomínio tem mais de 100 mensagens.
Abre o grupo - um monte de fotos e áudio.
Gente escrevendo em caps lock.
Caos e gritaria.
Volta o grupo pra cima.
Vê uma grande repetição de palavras - particularmente "palhaçada" e "descaso".
Também vê vários emojis - principalmente
Áudio da vizinha do 402 - ela é gente boa.
Play.
"PELO AMOR DE DEUS, O CORREDOR AQUI TÁ CHEIO DE ÁGUA. FALA LÁ COM O... "
Pausa o áudio. Deu ruim, time.
O vizinho do 401 comprou uma máquina de lavar nova.
Colocou a roupa pra lavar - ...e saiu dar rolê.
Instalou errado.
Deu vazamento. Alagou tudo.
Você mora no 301 - ou seja - seu vizinho de cima.
Pois é - você tem um problema nas mãos.
...
Moral da história - as coisas funcionam. Até que não funcionam mais.
E é assim que funciona em desenvolvimento de software.
O moedor não funcionava porque a eletricidade da cozinha não funcionava.
E a eletricidade não funcionava porque tinha um vazamento - que deu curto circuito em algum lugar.
O vazamento aconteceu porque seu vizinho de cima instalou uma máquina nova - errado.
Você não sabia da existência da máquina - e nem que seu vizinho por si só lavava roupa lá. Como que ele conseguiu colocar uma máquina? Não tem espaço.
As coisas só aconteceram.
É um cenário comum - mas é complexo.
Bem complexo.
Mas - há dois aspectos bem importantes aqui:
Complexidade e abstração.
Entendendo isso já te dará uma noção do porque tudo é tão estranho e difícil.
Duas palavras estranhas
Na cozinha há um aspecto extremamente importante aqui.
Pouco e muito óbvio ao mesmo tempo.
Consegue identificar?
...
As paredes.
As paredes escondem o que faz o apartamento funcionar.
O encanamento, fiação, e tudo mais.
Parece até mágica.
Você aperta o interruptor e a luz acende.
Conecta o moedor na tomada e ele funciona (ou não).
Além disso - é possível colocar quadros e posters nela.
É uma interface limpa e usável.
Ela deixa a coisa mais amigável e fácil de conviver.
Imagina se você não tivesse essa abstração, todos os fios expostos, canos. Tendo que conectar tudo na mão.
Isso significa que a parede é uma abstração.
Abstração é quando escondemos coisas. Escondemos detalhes de implementação (como a fiação) e fornecemos uma interface "amigável".
E aí tem uma outra coisa.
Sabe quando viu a parede com as manchas cinzas?
A origem disso foi muito além do que você inicialmente pensou.
Primeiro - correu pra fechar o registro, e só depois pensou em pegar o celular para falar com o síndico.
Teve todo um fluxo fora do seu controle - desde o seu vizinho colocar uma máquina nova, até o vazamento chegar em seu apartamento.
Isso é complexidade.
Complexidade é quando - em um sistema - múltiplas partes interconectadas interagem em formas não óbvias - gerando comportamento inesperado.
Metaforicamente - imagine uma peça de teatro improvisada.
Cada ator tem uma fala solta - e o que acontece, acontece em tempo real e sem roteiro. Ninguém ensaiou, mas todos influenciam.
Juntando tudo - temos abstração e complexidade andando juntos - uma receita para algo caótico.
Isso cria uma barreira invisível - onde - a partir dela, tudo se torna muito difícil de entender.
Imprevisibilidade
Estamos cada vez mais longe de linguagem de máquina, com abstrações que escondem muita da complexidade que teríamos que lidar sem elas.
Veja - imagina ter que trabalhar com sinais elétricos diretamente.
Difícil, não?
Alguém já criou uma abstração.
De abstração em abstração chegamos em um Python - ou em um Javascript.
Fora isso - em projetos reais - existem abstrações do domínio do problema em si.
O problema é que - com software - resolvemos problemas reais - e a realidade é mutável e extremamente complexa.
E o software é uma abstração em cima da própria realidade.
Assim como seu vizinho instalou a máquina de lavar sem você saber - imprevisível - o software também é, já que "imita" a realidade digitalmente.
O sistema é algo vivo - e assim - imprevisível.
Falo mais sobre isso no post não há bala de prata.
Isso gera um fenômeno chamado leaky abstractions.
É quando uma abstração não consegue esconder a implementação - e você precisa lidar com ela.
Igual aconteceu com o vazamento na parede. Vazou, as coisas pararam de funcionar e você teve que lidar com isso.
Em termos técnicos - imagine que precise fazer uma requisição para algum servidor.
Você está rodando em cima do protocolo TCP.
O TCP é uma abstração em cima da camada de IP - que por natureza é imprevisível.
Existem timeouts, delays - e erros.
E quem lida com isso?
Você.
Se existe um delay na sua aplicação - é sua responsabilidade lidar com isso e manter o usuário informado.
É uma leaky abstraction.
Mas - especialmente hoje em dia - fica mais complicado.
Inception de Abstrações
O problema é que a natureza atual dos softwares favorece essa complexidade.
Qualquer framework, tecnologia ou biblioteca utiliza dezenas - quem dirá centenas - de abstrações provenientes de dependências.
Sabe quando você roda um pip install
ou npm install
? Pois é - está adicionando dependências - as quais escondem complexidade e deixam as coisas mais "simples".
Para deixar tudo mais "amigável" precisamos sacrificar um pouco de controle.
E faz sentido - mas precisamos ter consciência disso.
Ainda mais quando temos dependências de dependências.
Voltando ao cenário do vazamento - pense no vizinho do 301.
A mesma coisa acontece - e com muita frequência - com dependências.
As coisas param de funcionar, você perde um tempão tentando arrumar para identificar que foi na dependência de alguma dependência - um erro totalmente inesperado.
Isso é complexidade na prática.
Nós não queremos reinventar a roda - porém é necessário sempre ter em mente esse cenário. As coisas podem - e vão - quebrar.
Faz parte do jogo. Da natureza mutável da realidade.
Sempre vale lembrar - quanto mais entender a camada de dependências e abstrações que um software usa, mais confiante ficará.
Esse artigo é fortemente inspirado no clássico "The Law of Leaky Abstractions", do Joel Spolsky. Escrito em 2002, mas relevante até hoje.
É isso.
-Rapozo