
O texto que estabeleceu a "lei das abstrações que vazam" foi escrito em 2002. Por que estou traduzindo quase 20 anos depois? Ainda não perdeu a relevância e vale a pena ler. O protocolo TCP não recebeu uma alternativa melhor, e a lei das abstrações vazadas apenas se tornou enraizada na vida dos desenvolvedores e corre o risco de se tornar um axioma. Acrescentarei que não contei todos os prazos indicados no texto, então leve em consideração alguma "mudança de tempo".
É um elemento-chave da magia da engenharia da Internet com o qual contamos todos os dias. Essa mágica está no TCP, um dos blocos de construção fundamentais da Internet.
Usar TCP é uma forma confiável de transferir dados. Para ser claro, o uso do TCP ao enviar uma mensagem pela rede garante que ela chegue em sua forma original.
Usamos esse protocolo para uma variedade de tarefas, como carregar páginas da web e enviar e-mails. É por causa da confiabilidade do TCP que os e-mails chegam conforme são enviados. Mesmo que seja spam inútil.
Em comparação, há outro, não confiável, um protocolo de transferência de dados denominado IP. Ninguém dá garantias de que os dados serão entregues. Se você enviar uma sequência de mensagens usando IP, não se surpreenda se metade das mensagens não for entregue e a outra metade chegar em ordem aleatória. Além disso, há uma chance de que algumas das mensagens se transformem em imagens de macaquinhos ou, mais provavelmente, as mensagens se tornem lixo ilegível.
É aqui que a verdadeira mágica acontece: o TCP é baseado em IP. Em outras palavras, o TCP é necessário para fornecer dados de maneira confiável, usando apenas uma ferramenta não confiável .
Para deixar mais claro por que isso é mágico, considere um cenário realista, embora um tanto ridículo, da vida.
Imagine que estamos no negócio de enviar atores da Broadway a Hollywood, e nossas responsabilidades incluem transportar atores por todo o país. Alguns carros batem e os atores morrem. Um ator pode ficar bêbado no meio do caminho e cortar o cabelo ou fazer uma tatuagem no nariz, por isso não será mais aceito em Hollywood. E o mais importante, enviamos os atores em uma ordem estritamente definida, e eles chegam em uma ordem aleatória, já que cada um deles viaja em sua própria rota.
Agora imagine um serviço Hollywood Express que garanta: (a) entrega; (b) na ordem correta; (c) em perfeitas condições. Os milagres são que o Hollywood Express não tem outra maneira de transferir atores, exceto para os que não são confiáveis - de carro. O Hollywood Express verifica cada ator que chega e, se sua condição for insatisfatória, o serviço liga para a terra natal do ator e pede para enviar um gêmeo idêntico. Se os atores chegarem em ordem aleatória, o Hollywood Express restaurará a ordem original. Mesmo se uma grande nave alienígena em seu caminho para a Área 51 bater e paralisar uma via expressa em Nevada, os atores simplesmente mudarão sua rota e viajarão pelo Arizona, e o Hollywood Express não contará aos produtores na Califórnia sobre o incidente. Para os produtores, tudo ficará assimcomo se os atores dirigissem um pouco mais do que o normal e não houvesse nenhum acidente de OVNI.
O TCP funciona da mesma maneira. Isso é o que os especialistas em Ciência da Computação chamam de abstração - uma simplificação de algo muito mais complexo acontecendo nos bastidores. A maior parte da programação é sobre a construção de abstrações. O que é uma biblioteca de string? É uma maneira de tornar o trabalho com strings tão fácil e conveniente quanto trabalhar com números. O que é um sistema de arquivos? Essa é uma maneira de pensar em um disco rígido não como um conjunto de pratos magnéticos giratórios que armazenam bits em locais específicos, mas como uma estrutura hierárquica de diretórios com arquivos que contêm dados.
Mas voltando ao TCP. Enfeitei um pouco para facilitar a compreensão de como o TCP funciona. E eu percebo que tal simplificação pode trazer alguns para o calor branco. Eu disse que o TCP garante a entrega da mensagem. Bem, não é. Se o seu animal de estimação roer o cabo de rede do seu computador, os pacotes IP deixarão de alcançá-lo. Independentemente do esforço do TCP, a mensagem não será entregue. Se você foi indelicado com os administradores de sistema de sua empresa e decidiu puni-lo conectando-se a um hub sobrecarregado, apenas parte dos seus pacotes IP chegará, neste caso o TCP funcionará, mas extremamente lento.
Isso é o que chamo de abstrações vazadas.... O TCP tenta nos abstrair da rede não confiável, mas às vezes a rede ainda "flui" pela abstração e você se depara com coisas das quais a abstração não pode salvá-lo. Este é apenas um exemplo do que chamo de Lei das Abstrações Furadas:
Qualquer abstração não trivial é um pouco furada.As abstrações se quebram. Às vezes um pouco, às vezes muito. Isso é chamado de buracos, vazamentos. Algo não está indo de acordo com o planejado. Isso acontece em todos os lugares onde a abstração é usada. aqui estão alguns exemplos:
- : . « », — . , . , , , , .
- SQL , . , , , . SQL- , . , «where a=b and b=c and a=c» , «where a=b and b=c» . , , . , . , , .
- NFS SMB , . , . « , ”. . ( ), .forward ( ), .forward . , .
- , ++ . , , , . ++ +, s + “bar” . ? , , , “foo” + “bar”, ++ char*. , . (, ++ . — .)
- , , , , , . . , , . .
Resulta da lei das abstrações vazadas que abstrações não simplificam nossa vida tanto quanto gostaríamos. Quando ensino C ++, gostaria de evitar falar sobre o tipo de dados char * e aritmética de ponteiro. Seria ótimo falar sobre STL imediatamente, mas um dia os alunos escreverão “foo” + “bar” e ficarão assustados, e eu tenho que te falar sobre char *. Ou, algum dia, eles tentam chamar uma função API do Windows com um argumento OUT LPTSTR e ainda precisam aprender sobre char *, pointers, unicode e wchar_t, bem como TCHAR e tudo o que vaza através da abstração.
Ao programar com COM (Component Object Model - approx. Transl.), Seria bom aprender imediatamente os ajudantes do Visual Studio e toda a magia da geração de código. Mas se pelo menos algo der errado, os programadores não terão a menor idéia do que aconteceu, onde procurar o erro e como corrigi-lo. E terei que falar sobre IUnknown, CLSID e ProgIDS e ... Oh, humanidade!
Ao ensinar ASP.NET, seria ótimo ensinar como clicar duas vezes em objetos e escrever código que será executado no servidor quando o usuário clicar no objeto. Em essência, ASP.NET elimina a diferença entre lidar com um clique em um link (a um) e manipulando o clique do botão. Mas aqui está o problema: em HTML, você não pode enviar um formulário clicando em um hiperlink e os desenvolvedores ASP.NET tiveram que esconder esse problema. Eles resolveram o problema gerando várias linhas de código JavaScript no manipulador de hiperlink onclick. Mesmo assim, esse é um buraco na abstração. Se o JavaScript estiver desabilitado para o usuário final, o ASP.NET não funcionará corretamente e o programador do aplicativo sem perceber o que o ASP.NET está abstraindo não será capaz de entender o que aconteceu.
The Law of Leaky Abstractions diz que quando alguém surge com uma grande nova parte da geração de código que deve melhorar drasticamente nossa eficiência, você ouvirá: "primeiro aprenda como fazer você mesmo e só então use esta ferramenta para economizar tempo." As ferramentas de geração de código de alguma forma usam abstrações, que, é claro, estão cheias de buracos. E a única maneira de lidar com todos os buracos é saber como as abstrações são aplicadas e o que exatamente elas escondem. Portanto, as abstrações nos poupam tempo no trabalho, mas não no aprendizado.
É paradoxal, mas cada vez que inventamos ferramentas de nível superior com melhores abstrações, fica mais difícil se tornar um programador profissional.
Durante meu primeiro estágio na Microsoft, desenvolvi bibliotecas para trabalhar com strings no Macintosh. Aqui está um exemplo de trabalho típico: escreva uma versão de strcat que retorne um ponteiro para o final de uma nova linha. Apenas algumas linhas de código C. Tudo o que fiz saiu direto do K&R, um livro fino sobre a linguagem de programação C,
e então consegui um emprego na CityDesk (a empresa fechou em 2016 - aprox. Transl .). Agora preciso saber Visual Basic, COM, ATL, C ++, InnoSetup, componentes internos do Internet Explorer, expressões regulares, DOM, HTML, CSS e XML. Esses são todos instrumentos de alto nível comparados com o material K&R, no entanto, eu ainda preciso saber tudo sobre o material K&R.
Dez anos atrás, poderíamos imaginar que novos paradigmas de programação tornariam mais fácil para nós desenvolvermos agora. Na verdade, as abstrações que criamos ao longo das décadas tornam mais fácil para nós convivermos com novos níveis de complexidade que não sucumbimos a 10-15 anos atrás, como era o caso com o desenvolvimento de GUI ou rede. E agora temos muitas ferramentas excelentes, como linguagens orientadas a objetos e com reconhecimento de forma, que nos permitem realizar nosso trabalho com uma rapidez incrível. Até que um dia nos deparamos com um problema onde a abstração "vaza", e precisamos de duas semanas para resolver. Quando você precisa contratar um programador de Visual Basic para fazer apenas código VB, essa não é a melhor ideia. Porque tal programador ficaria preso cada vez que tropeçasse em um buraco na abstração do Visual Basic.
A lei das abstrações vazadas está nos puxando para o fundo.