La loi des abstractions qui fuient



Le texte établissant la «loi des abstractions qui fuient» a été rédigé en 2002. Pourquoi est-ce que je le traduis près de 20 ans plus tard? Il n'a toujours pas perdu de sa pertinence et mérite d'être lu. TCP n'a pas reçu de meilleure alternative, et la loi des abstractions qui fuient ne fait que s'imposer dans la vie des développeurs et risque de devenir un axiome. J'ajouterai que je n'ai pas compté tous les délais indiqués dans le texte, alors prenez en compte un certain «décalage horaire».



C'est un élément clé de la magie de l'ingénierie d'Internet sur lequel nous nous appuyons chaque jour. Cette magie réside dans le protocole TCP, l'un des éléments fondamentaux de l'Internet.



L'utilisation de TCP est un moyen de transférer des données de manière fiable . Pour être clair, l'utilisation de TCP lors de l'envoi d'un message sur le réseau garantit qu'il arrive dans sa forme d'origine.



Nous utilisons ce protocole pour diverses tâches, telles que le chargement de pages Web et l'envoi d'e-mails. C'est à cause de la fiabilité de TCP que les e-mails arrivent tels qu'ils ont été envoyés. Même s'il s'agit de spam inutile.



Par comparaison, il existe un autre, peu fiable, un protocole de transfert de données appelé IP. Personne ne garantit que les données seront livrées. Si vous envoyez une séquence de messages via IP, ne soyez pas surpris lorsque la moitié des messages ne seront pas livrés et que l'autre moitié viendra dans un ordre aléatoire. De plus, il est possible que certains messages se transforment en images de petits singes ou, plus probablement, que les messages deviennent des déchets illisibles.



C'est là que la vraie magie opère: TCP est basé sur IP. En d'autres termes, TCP est nécessaire pour fournir des données de manière fiable en utilisant uniquement un outil non fiable .



Pour clarifier pourquoi c'est magique, considérez un scénario réaliste, quoique quelque peu ridicule, tiré de la vie.



Imaginez que nous envoyions des acteurs de Broadway à Hollywood et que nos responsabilités incluent le transport d'acteurs à travers le pays. Certaines voitures tombent en panne et les acteurs meurent. Un acteur peut se saouler en chemin et se faire couper les cheveux ou se faire tatouer le nez, c'est pourquoi il ne sera plus accepté à Hollywood. Et le plus important: nous envoyons les acteurs dans un ordre strictement défini, et ils arrivent dans un ordre aléatoire, puisque chacun d'eux voyage sur son propre itinéraire.



Imaginez maintenant un service Hollywood Express qui garantit: (a) la livraison; (b) dans le bon ordre; (c) en parfait état. Le miracle est que le Hollywood Express n'a pas d'autre moyen de transférer les acteurs, à l'exception des non fiables - en voiture. Hollywood Express vérifie chaque acteur qui vient, et si son état n'est pas satisfaisant, le service appelle le pays d'origine de l'acteur et demande à envoyer un jumeau identique. Si les acteurs arrivent dans un ordre aléatoire, le Hollywood Express rétablira l'ordre d'origine. Même si un grand navire extraterrestre en route vers la zone 51 s'écrase et paralyse l'autoroute du Nevada, les acteurs changeront simplement de route et traverseront l'Arizona, et le Hollywood Express ne dira pas aux producteurs californiens de l'incident. Pour les producteurs, tout ressemblera à cecicomme si les acteurs conduisaient un peu plus longtemps que d'habitude et qu'il n'y avait pas de crash d'OVNI.



TCP fonctionne à peu près de la même manière. C'est ce que les experts en informatique appellent l' abstraction - une simplification de quelque chose de beaucoup plus compliqué qui se passe sous le capot. La plupart de la programmation consiste à construire des abstractions. Qu'est-ce qu'une bibliothèque de chaînes? C'est un moyen de rendre le travail avec des chaînes aussi simple et pratique que de travailler avec des nombres. Qu'est-ce qu'un système de fichiers? C'est une façon de penser à un disque dur non pas comme un ensemble de plateaux magnétiques rotatifs stockant des bits dans des emplacements spécifiques, mais comme une structure hiérarchique de répertoires avec des fichiers contenant des données.



Mais revenons à TCP. J'ai un peu embelli pour faciliter la compréhension du fonctionnement de TCP. Et je me rends compte qu'une telle simplification peut en amener à chauffer blanc. J'ai dit que TCP garantit la livraison des messages. Eh bien, ça ne l'est pas. Si votre animal ronge le câble réseau de votre ordinateur, les paquets IP cesseront de l' atteindre. Indépendamment de l'effort TCP, le message ne sera pas remis. Si vous étiez impoli avec les administrateurs système de votre entreprise et décidiez de vous punir en vous connectant à un hub surchargé, alors seule une partie de vos paquets IP atteindra, dans ce cas TCP fonctionnera, mais extrêmement lentement.



C'est ce que j'appelle des abstractions qui fuient.... TCP essaie de nous soustraire au réseau non fiable, mais parfois le réseau «circule» toujours à travers l'abstraction et vous rencontrez des choses dont l'abstraction ne peut pas vous sauver. Ce n'est qu'un exemple de ce que j'appelle la loi des abstractions qui fuient:

Toute abstraction non triviale est quelque peu fuyante.
Les abstractions s'effondrent. Parfois un peu, parfois beaucoup. C'est ce qu'on appelle des trous, des fuites. Quelque chose ne se passe pas comme prévu. Cela se produit partout où l'abstraction est utilisée. Voici quelques exemples:



  • : . « », — . , . , , , , .
  • 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*. , . (, ++ . — .)
  • , , , , , . . , , . .


Il découle de la loi des abstractions qui fuient que les abstractions ne simplifient pas notre vie autant que nous le souhaiterions. Lorsque j'enseigne le C ++, je voudrais éviter de parler du type de données char * et de l'arithmétique du pointeur. Ce serait formidable de parler de STL tout de suite, mais un jour les élèves écriront «foo» + «bar» et auront peur, et je dois vous parler de char *. Ou un jour, ils essaient d'appeler une fonction API Windows avec un argument OUT LPTSTR, et ils doivent encore en savoir plus sur char *, pointeurs, unicode et wchar_t, ainsi que TCHAR et tout ce qui fuit à travers l'abstraction.



Lors de la programmation avec COM (Component Object Model - approx. Transl.), Ce serait bien d'apprendre tout de suite les helpers de Visual Studio et toute la magie de la génération de code. Mais si au moins quelque chose ne va pas, les programmeurs n'auront pas la moindre idée de ce qui s'est passé, où chercher l'erreur et comment la corriger. Et je vais devoir parler de IUnknown, CLSID et ProgIDS et ... Oh, l'humanité!



Lors de l'enseignement d'ASP.NET, il serait bon de s'entraîner à double-cliquer sur des objets et à écrire du code qui s'exécutera sur le serveur lorsque l'utilisateur cliquera sur l'objet. Essentiellement, ASP.NET élimine la différence entre la manipulation d' un clic sur un lien hypertexte (l' un) et gérer le clic du bouton. Mais voici le problème: en HTML, vous ne pouvez pas soumettre un formulaire en cliquant sur un lien hypertexte et les développeurs ASP.NET ont dû cacher ce problème. Ils ont résolu le problème en générant plusieurs lignes de code JavaScript dans le gestionnaire de lien hypertexte onclick. Mais, néanmoins, c'est un trou dans l'abstraction. Si JavaScript est désactivé pour l'utilisateur final, ASP.NET ne fonctionnera pas correctement et le programmeur d'application sans se rendre compte de ce qu'ASP.NET extrait ne pourra pas comprendre ce qui s'est passé.



La loi des abstractions qui fuient dit que lorsque quelqu'un propose une nouvelle génération de code qui devrait considérablement améliorer notre efficacité, vous entendrez: "Apprenez d'abord à le faire vous-même et n'utilisez ensuite cet outil que pour gagner du temps." Les outils de génération de code utilisent des abstractions d'une manière ou d'une autre, qui, bien sûr, sont pleines de trous. Et la seule façon de traiter tous les trous est de savoir comment les abstractions sont appliquées et ce qu'elles cachent exactement. Les abstractions nous font donc gagner du temps au travail, mais pas sur la courbe d'apprentissage.



C'est paradoxal, mais à chaque fois que l'on invente des outils de plus haut niveau avec de meilleures abstractions, il devient plus difficile de devenir programmeur professionnel.



Lors de mon premier stage chez Microsoft, j'ai développé des bibliothèques pour travailler avec des chaînes sur Macintosh. Voici un exemple de travail typique: écrivez une version de strcat qui renvoie un pointeur vers la fin d'une nouvelle ligne. Juste quelques lignes de code C. Tout ce que j'ai fait était tout droit sorti de K&R, un petit livre sur le langage de programmation C,



puis j'ai trouvé un emploi chez CityDesk (la société a fermé en 2016 - environ Transl .). Maintenant, j'ai besoin de connaître Visual Basic, COM, ATL, C ++, InnoSetup, les internes d'Internet Explorer, les expressions régulières, DOM, HTML, CSS et XML. Ce sont tous des instruments de haut niveau comparés aux trucs K&R, mais j'ai encore besoin de connaître tous les trucs K&R.



Il y a dix ans, on pouvait imaginer que de nouveaux paradigmes de programmation nous faciliteraient le développement maintenant. En fait, les abstractions que nous avons créées au fil des décennies nous permettent de nous entendre facilement avec de nouveaux niveaux de complexité auxquels nous n’avons pas succombé il y a 10 à 15 ans, comme dans le cas du développement de GUI ou de la mise en réseau. Et maintenant, nous disposons de nombreux outils géniaux, tels que les langages orientés objet prenant en charge les formulaires, qui nous permettent de faire notre travail incroyablement rapidement. Jusqu'au jour où nous sommes confrontés à un problème où l'abstraction «fuit», et nous avons besoin de deux semaines pour le résoudre. Lorsque vous devez engager un programmeur Visual Basic pour n'effectuer que du code VB, ce n'est pas la meilleure idée. Parce qu'un tel programmeur restera bloqué chaque fois qu'il tombe sur un trou dans l'abstraction de Visual Basic.



La loi des abstractions qui fuient nous tire vers le bas.



All Articles