La ley de las abstracciones con fugas



El texto que estableció la "ley de las abstracciones con fugas" fue escrito en 2002. ¿Por qué lo estoy traduciendo casi 20 años después? Todavía no ha perdido su relevancia y vale la pena leerlo. El protocolo TCP no ha recibido una alternativa mejor, y la ley de las abstracciones con fugas solo se ha arraigado en la vida de los desarrolladores y está en peligro de convertirse en un axioma. Agregaré que no recalculé todos los marcos de tiempo indicados en el texto, así que tenga en cuenta algunos "cambios de tiempo".



Es un elemento clave de la magia de la ingeniería de Internet en el que confiamos todos los días. Esta magia está en el protocolo TCP, uno de los pilares fundamentales de Internet.



El uso de TCP es una forma de transferir datos de manera confiable . Para ser claros, usar TCP al enviar un mensaje a través de la red asegura que llegue en su forma original.



Usamos este protocolo para una variedad de tareas, como cargar páginas web y enviar correos electrónicos. Debido a la confiabilidad de TCP, los correos electrónicos llegan tal como se enviaron. Incluso si es spam inútil.



En comparación, hay otro, poco confiable, un protocolo de transferencia de datos llamado IP. Nadie da garantías de que se entregarán los datos. Si envía una secuencia de mensajes usando IP, no se sorprenda cuando la mitad de los mensajes no se entregarán y la otra mitad vendrá en orden aleatorio. Además, existe la posibilidad de que algunos de los mensajes se conviertan en imágenes de pequeños monos o, más probablemente, los mensajes se conviertan en basura ilegible.



Aquí es donde ocurre la verdadera magia: TCP está basado en IP. En otras palabras, se requiere TCP para entregar datos de manera confiable utilizando solo una herramienta no confiable .



Para que quede más claro por qué esto es mágico, considere un escenario realista, aunque algo ridículo, de la vida.



Imagínese que estamos en el negocio de enviar actores de Broadway a Hollywood, y nuestras responsabilidades incluyen el transporte de actores por todo el país. Algunos autos chocan y los actores mueren. Un actor puede emborracharse en el camino y cortarse el pelo o hacerse un tatuaje en la nariz, razón por la cual ya no será aceptado en Hollywood. Y lo más importante, enviamos a los actores en un orden estrictamente definido, y llegan en un orden aleatorio, ya que cada uno de ellos viaja por su propia ruta.



Ahora imagine un servicio Hollywood Express que garantice: (a) entrega; (b) en el orden correcto; (c) en perfecto estado. Los milagros son que el Hollywood Express no tiene otra forma de transferir actores, excepto a los poco confiables: en automóvil. Hollywood Express revisa a todos los actores que vienen y, si su estado no es satisfactorio, el servicio llama a la patria del actor y solicita enviar un gemelo idéntico. Si los actores llegan en orden aleatorio, Hollywood Express restaurará el orden original. Incluso si una gran nave alienígena en su camino al Área 51 se estrella y paraliza una autopista en Nevada, los actores simplemente cambiarán su ruta y viajarán a través de Arizona, y Hollywood Express no les contará a los productores en California sobre el incidente. Para los productores, todo se verá asícomo si los actores estuvieran conduciendo un poco más de lo habitual y no hubiera un accidente OVNI.



TCP funciona de la misma manera. Esto es lo que los expertos en Ciencias de la Computación llaman abstracción : una simplificación de algo mucho más complejo que está sucediendo bajo el capó. La mayor parte de la programación se trata de construir abstracciones. ¿Qué es una biblioteca de cadenas? Es una forma de hacer que trabajar con cadenas sea tan fácil y conveniente como trabajar con números. ¿Qué es un sistema de archivos? Esta es una forma de pensar en un disco duro no como un conjunto de platos magnéticos giratorios que almacenan bits en ubicaciones específicas, sino como una estructura jerárquica de directorios con archivos que contienen datos.



Pero volvamos a TCP. He embellecido un poco para que sea más fácil entender cómo funciona TCP. Y me doy cuenta de que tal simplificación puede llevar a algunos al blanco. Dije que TCP garantiza la entrega de mensajes. Bueno, no lo es. Si su mascota muerde el cable de red de su computadora, los paquetes IP dejarán de llegar. Independientemente del esfuerzo de TCP, el mensaje no se entregará. Si fue descortés con los administradores del sistema en su empresa y decidió castigarlo conectándose a un concentrador sobrecargado, entonces solo llegará una parte de sus paquetes IP, en este caso TCP funcionará, pero extremadamente lento.



Esto es lo que yo llamo abstracciones con fugas.... TCP intenta abstraernos de la red que no es de confianza, pero a veces la red todavía "fluye" a través de la abstracción y te encuentras con cosas de las que la abstracción no puede salvarte. Este es solo un ejemplo de lo que yo llamo la Ley de abstracciones con fugas:

Cualquier abstracción no trivial tiene algunas fugas.
Las abstracciones se rompen. A veces un poco, a veces mucho. Esto se llama agujeros, fugas. Algo no va según lo planeado. Esto sucede en todos los lugares donde se usa la abstracción. Aquí hay unos ejemplos:



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


De la ley de las abstracciones con fugas se sigue que las abstracciones no simplifican nuestra vida tanto como nos gustaría. Cuando enseño C ++, me gustaría evitar hablar sobre el tipo de datos char * y la aritmética del puntero. Sería genial hablar de STL de inmediato, pero un día los estudiantes escribirán “foo” + “bar” y se asustarán, y tengo que contarte sobre char *. O algún día intentan llamar a una función de la API de Windows con un argumento OUT LPTSTR, y todavía tienen que aprender sobre char *, punteros, unicode y wchar_t, así como TCHAR y todo lo que se filtra a través de la abstracción.



Al programar con COM (Component Object Model - aprox. Transl.), Sería bueno aprender de inmediato los ayudantes de Visual Studio y toda la magia de la generación de código. Pero si al menos algo sale mal, los programadores no tendrán la menor idea de lo que sucedió, dónde buscar el error y cómo solucionarlo. Y tendré que hablar de IUnknown, CLSID y ProgIDS y ... ¡Oh, humanidad!



Al enseñar ASP.NET, sería genial entrenar para hacer doble clic en objetos y escribir código que se ejecutará en el servidor cuando el usuario haga clic en el objeto. En esencia, ASP.NET elimina la diferencia entre la manipulación de un clic en un hipervínculo (la una) y manejando el clic del botón. Pero aquí está el problema: en HTML, no puede enviar un formulario haciendo clic en un hipervínculo y los desarrolladores de ASP.NET tuvieron que ocultar este problema. Resolvieron el problema generando varias líneas de código JavaScript en el controlador de hipervínculos onclick. Pero aún así, este es un agujero en la abstracción. Si JavaScript está deshabilitado para el usuario final, ASP.NET no funcionará correctamente y el programador de aplicaciones sin darse cuenta de lo que ASP.NET está abstrayendo no podrá entender lo que sucedió.



La Ley de las abstracciones con fugas dice que cuando alguien crea una gran pieza nueva de generación de código que debería mejorar drásticamente nuestra eficiencia, escuchará: "primero aprenda cómo hacerlo usted mismo y solo luego use esta herramienta para ahorrar tiempo". Las herramientas de generación de código utilizan abstracciones de una forma u otra, que, por supuesto, están llenas de agujeros. Y la única forma de lidiar con todos los agujeros es saber cómo se aplican las abstracciones y qué esconden exactamente. Así que las abstracciones nos ahorran tiempo en el trabajo, pero no en el aprendizaje.



Es paradójico, pero cada vez que inventamos herramientas de nivel superior con mejores abstracciones, se vuelve más difícil convertirse en programador profesional.



Durante mi primera pasantía en Microsoft, desarrollé bibliotecas para trabajar con cadenas en Macintosh. Aquí hay un ejemplo de un trabajo típico: escriba una versión de strcat que devuelva un puntero al final de una nueva línea. Solo unas pocas líneas de código C. Todo lo que hice fue sacado directamente de K&R, un libro delgado sobre el lenguaje de programación C,



y luego conseguí un trabajo en CityDesk (la empresa cerró en 2016 - aprox. Transl .). Ahora necesito conocer Visual Basic, COM, ATL, C ++, InnoSetup, los componentes internos de Internet Explorer, las expresiones regulares, DOM, HTML, CSS y XML. Todos estos son instrumentos de alto nivel en comparación con las cosas de K&R, sin embargo, todavía necesito saber todas las cosas de K&R.



Hace diez años, podíamos imaginar que los nuevos paradigmas de programación nos facilitarían el desarrollo ahora. De hecho, las abstracciones que hemos creado a lo largo de las décadas nos facilitan llevarnos bien con los nuevos niveles de complejidad a los que no sucumbimos hace 10-15 años, como fue el caso del desarrollo de GUI o redes. Y ahora tenemos muchas herramientas excelentes, como lenguajes orientados a objetos y con reconocimiento de formas, que nos permiten hacer nuestro trabajo increíblemente rápido. Hasta que un día nos enfrentamos a un problema donde la abstracción "gotea", y necesitamos dos semanas para solucionarlo. Cuando necesita contratar a un programador de Visual Basic para que haga solo código VB, esta no es la mejor idea. Porque tal programador se atascará cada vez que se encuentre con un agujero en la abstracción de Visual Basic.



La ley de las abstracciones con fugas nos está llevando al fondo.



All Articles