Das Gesetz der undichten Abstraktionen



Der Text, der das "Gesetz der undichten Abstraktionen" festlegte, wurde 2002 geschrieben. Warum übersetze ich es fast 20 Jahre später? Es hat immer noch nicht an Relevanz verloren und ist lesenswert. TCP hat keine bessere Alternative erhalten, und das Gesetz der undichten Abstraktionen hat sich nur im Leben der Entwickler festgesetzt und läuft Gefahr, ein Axiom zu werden. Ich werde hinzufügen, dass ich nicht alle im Text angegebenen Zeitrahmen gezählt habe, berücksichtigen Sie also eine "Zeitverschiebung".



Es ist ein Schlüsselelement der technischen Magie des Internets, auf die wir uns jeden Tag verlassen. Diese Magie steckt im TCP-Protokoll, einem der Grundbausteine ​​des Internets.



Die Verwendung von TCP ist eine Möglichkeit, Daten zuverlässig zu übertragen. Die Verwendung von TCP beim Senden einer Nachricht über das Netzwerk stellt sicher, dass sie in ihrer ursprünglichen Form eintrifft.



Wir verwenden dieses Protokoll für eine Vielzahl von Aufgaben, z. B. zum Laden von Webseiten und zum Senden von E-Mails. Aufgrund der Zuverlässigkeit von TCP kommen E-Mails so an, wie sie gesendet wurden. Auch wenn es sich um nutzlosen Spam handelt.



Im Vergleich dazu gibt es eine andere, unzuverlässige, ein Datenübertragungsprotokoll namens IP. Niemand garantiert, dass die Daten geliefert werden. Wenn Sie eine Folge von Nachrichten über IP senden, wundern Sie sich nicht, wenn die Hälfte der Nachrichten nicht zugestellt wird und die andere Hälfte in zufälliger Reihenfolge. Darüber hinaus besteht die Möglichkeit, dass einige der Nachrichten zu Bildern kleiner Affen werden oder dass Nachrichten mit größerer Wahrscheinlichkeit zu unlesbarem Müll werden.



Hier geschieht die wahre Magie: TCP ist IP-basiert. Mit anderen Worten, TCP muss Daten nur mit einem unzuverlässigen Tool zuverlässig liefern . Um klarer zu machen, warum dies Magie ist, betrachten Sie ein realistisches, wenn auch etwas lächerliches Szenario aus dem Leben.







Stellen Sie sich vor, wir schicken Schauspieler vom Broadway nach Hollywood. Zu unseren Aufgaben gehört der Transport von Schauspielern im ganzen Land. Einige Autos stürzen ab und die Schauspieler sterben. Ein Schauspieler könnte sich unterwegs betrinken und sich die Haare schneiden lassen oder sich tätowieren lassen, weshalb er in Hollywood nicht mehr akzeptiert wird. Und das Wichtigste: Wir senden die Schauspieler in einer genau definierten Reihenfolge und sie kommen in zufälliger Reihenfolge an, da jeder von ihnen auf seiner eigenen Route fährt.



Stellen Sie sich nun einen Hollywood Express-Dienst vor, der Folgendes garantiert: (a) Lieferung; (b) in der richtigen Reihenfolge; (c) in einwandfreiem Zustand. Die Wunder sind, dass der Hollywood Express keine andere Möglichkeit hat, Schauspieler zu transferieren, als die unzuverlässigen - mit dem Auto. Hollywood Express überprüft jeden Schauspieler, der kommt, und wenn sein Zustand unbefriedigend ist, ruft der Dienst die Heimat des Schauspielers an und bittet ihn, einen identischen Zwilling zu schicken. Wenn die Schauspieler in zufälliger Reihenfolge eintreffen, stellt der Hollywood Express die ursprüngliche Reihenfolge wieder her. Selbst wenn ein großes außerirdisches Schiff auf dem Weg zu Area 51 abstürzt und die Schnellstraße in Nevada lähmt, ändern die Schauspieler einfach ihre Route und reisen durch Arizona, und der Hollywood Express wird den Produzenten in Kalifornien nichts über den Vorfall erzählen. Für die Produzenten wird alles so aussehenals ob die Schauspieler etwas länger als gewöhnlich fuhren und es keinen UFO-Absturz gab.



TCP funktioniert ähnlich. Dies nennen die Experten der Informatik Abstraktion - eine Vereinfachung von etwas viel Komplizierterem, das unter der Haube vor sich geht. Bei der meisten Programmierung geht es darum, Abstraktionen zu erstellen. Was ist eine String-Bibliothek? Auf diese Weise können Sie die Arbeit mit Zeichenfolgen so einfach und bequem gestalten wie mit Zahlen. Was ist ein Dateisystem? Dies ist eine Möglichkeit, sich eine Festplatte nicht als einen Satz rotierender Magnetplatten vorzustellen, auf denen Bits an bestimmten Orten gespeichert sind, sondern als eine hierarchische Struktur von Verzeichnissen mit Dateien, die Daten enthalten.



Aber zurück zu TCP. Ich habe ein wenig verschönert, um das Verständnis der Funktionsweise von TCP zu erleichtern. Und mir ist klar, dass eine solche Vereinfachung einige zu weißer Hitze führen kann. Ich sagte, dass TCP die Zustellung von Nachrichten garantiert. Nun, das ist es nicht. Wenn Sie Ihr Haustier nagt an Ihrem Computer-Netzwerk - Kabel, IP - Pakete stoppt es zu erreichen. Unabhängig vom TCP-Aufwand wird die Nachricht nicht zugestellt. Wenn Sie gegenüber den Systemadministratoren in Ihrem Unternehmen unhöflich waren und beschlossen haben, Sie mit einer Verbindung zu einem überlasteten Hub zu bestrafen, wird nur ein Teil Ihrer IP-Pakete erreicht. In diesem Fall funktioniert TCP, jedoch extrem langsam.



Das nenne ich undichte Abstraktionen.... TCP versucht, uns vom nicht vertrauenswürdigen Netzwerk zu abstrahieren, aber manchmal "fließt" das Netzwerk immer noch durch die Abstraktion und Sie stoßen auf Dinge, vor denen die Abstraktion Sie nicht retten kann. Dies ist nur ein Beispiel für das, was ich das Gesetz der undichten Abstraktionen nenne:

Jede nicht triviale Abstraktion ist etwas undicht.
Abstraktionen brechen zusammen. Mal ein bisschen, mal viel. Dies nennt man Löcher, Lecks. Etwas läuft nicht nach Plan. Dies geschieht überall dort, wo Abstraktion verwendet wird. Hier sind einige Beispiele:



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


Aus dem Gesetz der undichten Abstraktionen folgt, dass Abstraktionen unser Leben nicht so sehr vereinfachen, wie wir es möchten. Wenn ich C ++ unterrichte, möchte ich vermeiden, über den Datentyp char * und die Zeigerarithmetik zu sprechen. Es wäre großartig, sofort über STL zu sprechen, aber eines Tages werden die Schüler „foo“ + „bar“ schreiben und Angst bekommen, und ich muss Ihnen von char * erzählen. Oder eines Tages versuchen sie, eine Windows-API-Funktion mit einem OUT LPTSTR-Argument aufzurufen, und sie müssen noch etwas über char *, Zeiger, Unicode und wchar_t sowie TCHAR und alles, was durch die Abstraktion leckt, lernen.



Bei der Programmierung mit COM (Component Object Model - ca. Transl.) Wäre es schön, sofort die Visual Studio-Helfer und die Magie der Codegenerierung kennenzulernen. Aber wenn zumindest etwas schief geht, haben die Programmierer nicht die geringste Ahnung, was passiert ist, wo sie nach dem Fehler suchen und wie sie ihn beheben können. Und ich muss über IUnknown, CLSID und ProgIDS sprechen und ... Oh, die Menschheit!



Wenn Sie ASP.NET unterrichten, sollten Sie trainieren, um auf Objekte zu doppelklicken und Code zu schreiben, der auf dem Server ausgeführt wird, wenn der Benutzer auf das Objekt klickt. Im Wesentlichen beseitigt ASP.NET den Unterschied zwischen der Behandlung eines Klicks auf einen Hyperlink ( a) und Umgang mit der Schaltfläche klicken. Aber hier ist das Problem: In HTML können Sie kein Formular senden, indem Sie auf einen Hyperlink klicken, und ASP.NET-Entwickler mussten dieses Problem ausblenden. Sie lösten das Problem, indem sie im Onclick-Hyperlink-Handler mehrere Zeilen JavaScript-Code generierten. Trotzdem ist dies ein Loch in der Abstraktion. Wenn JavaScript für den Endbenutzer deaktiviert ist, funktioniert ASP.NET nicht ordnungsgemäß, und der Anwendungsprogrammierer kann nicht verstehen, was passiert ist, ohne zu wissen, was ASP.NET abstrahiert.



Das Gesetz der undichten Abstraktionen besagt, dass wenn jemand eine großartige neue Codegenerierung entwickelt, die unsere Effizienz dramatisch verbessern soll, Sie hören: "Lernen Sie zuerst, wie man es selbst macht, und verwenden Sie dieses Tool erst dann, um Zeit zu sparen." Tools zur Codegenerierung verwenden irgendwie Abstraktionen, die natürlich voller Lücken sind. Und die einzige Möglichkeit, mit all den Löchern umzugehen, besteht darin, zu wissen, wie Abstraktionen angewendet werden und was genau sie verbergen. Abstraktionen sparen uns also Zeit bei der Arbeit, aber keine Zeit beim Lernen.



Es ist paradox, aber jedes Mal, wenn wir übergeordnete Tools mit besseren Abstraktionen erfinden, wird es schwieriger, ein professioneller Programmierer zu werden.



Während meines ersten Praktikums bei Microsoft entwickelte ich Bibliotheken für die Arbeit mit Strings auf dem Macintosh. Hier ist ein Beispiel für einen typischen Job: Schreiben Sie eine Version von strcat, die einen Zeiger auf das Ende einer neuen Zeile zurückgibt. Nur ein paar Zeilen C-Code. Alles, was ich getan habe, war direkt aus K & R, einem dünnen Buch über die Programmiersprache C,



und dann bekomme ich einen Job bei CityDesk (das Unternehmen wurde 2016 geschlossen - ca. übersetzt ). Jetzt muss ich Visual Basic, COM, ATL, C ++, InnoSetup, Internet Explorer-Interna, reguläre Ausdrücke, DOM, HTML, CSS und XML kennen. Dies sind alles High-Level-Instrumente im Vergleich zu K & R-Sachen, aber ich muss immer noch alle K & R-Sachen kennen.



Vor zehn Jahren konnten wir uns vorstellen, dass neue Programmierparadigmen uns die Entwicklung jetzt erleichtern würden. Die Abstraktionen, die wir im Laufe der Jahrzehnte erstellt haben, ermöglichen es uns, problemlos mit neuen Komplexitätsstufen auszukommen, denen wir vor 10 bis 15 Jahren nicht erlegen waren, wie im Fall der Entwicklung oder Vernetzung von GUI. Und jetzt haben wir viele großartige Tools, wie zum Beispiel objektorientierte, formularbewusste Sprachen, mit denen wir unsere Arbeit unglaublich schnell erledigen können. Bis wir eines Tages mit einem Problem konfrontiert sind, bei dem die Abstraktion "leckt" und wir zwei Wochen brauchen, um es zu lösen. Wenn Sie einen Visual Basic-Programmierer einstellen müssen, der nur VB-Code ausführt, ist dies nicht die beste Idee. Weil ein solcher Programmierer jedes Mal stecken bleibt, wenn er auf ein Loch in der Visual Basic-Abstraktion stößt.



Das Gesetz der undichten Abstraktionen zieht uns auf den Grund.



All Articles