¿Cuáles son buenos ejemplos de abstracciones con fugas en la arquitectura de software?

Todas las abstracciones suficientemente útiles tienen fugas:

1. Resumir un objeto de red para que parezca un objeto del sistema de archivos: Esto facilita las cosas, ya que todos saben cómo leer y escribir archivos. Desafortunadamente, todos los problemas de redes “se escapan”: la latencia es grande e impredecible; a veces el objeto desaparece y tienes que volver a abrirlo; etc. [Tenga en cuenta que lo contrario es mucho mejor: un objeto de archivo abstraído como un recurso de red remoto. En ese caso, la persona que llama ya tiene que lidiar con la latencia y los tiempos de espera].

2. SQL: SQL extrae el acceso rápido a datos; en particular, crea automáticamente índices de datos para que no tenga que hacerlo. Desafortunadamente, puede emitir dos consultas aparentemente idénticas y obtener resultados de rendimiento muy diferentes. ¿Por qué? Porque debajo de las cubiertas (debajo de la abstracción) una consulta usaba un índice mientras que otra no.

3. Recolección de basura: la recolección de basura abstrae un asignador de memoria finita para que parezca un sistema de memoria infinita. Con la recolección de basura no tiene que preocuparse por la memoria. O tu Desafortunadamente, bajo ciertas condiciones, como cuando tiene una asignación del 50% o más, la recolección de basura impone sanciones de rendimiento (recolección de basura). La abstracción se filtra: si tiene una aplicación de alta memoria y alto rendimiento, debe preocuparse por la asignación de memoria nuevamente.

El artículo original de Joel Spolsky tiene muchos más ejemplos: La ley de las abstracciones permeables

Por cierto: no estoy insinuando que no debas usar abstracciones. Pero es útil echar un vistazo detrás de la abstracción para que pueda evitar o manejar las fugas cuando sucedan.

Mi ejemplo favorito es la memoria recolectada de basura. La promesa de la recolección de basura es que no tiene que preocuparse por la administración de la memoria. La realidad es que sí, la preocupación es menos transparente y más compleja.

  1. Todavía puede tener fugas causadas por referencias colgantes.
  2. Usted tiene muy poco control sobre cuándo se recolecta la memoria causando problemas de rendimiento impredecibles.
  3. Usted paga una gran sobrecarga por la colección en la memoria que no puede controlar
  4. Aún necesita escribir código en un idioma no administrado si le importa el rendimiento y ahora tiene que crear código de pegamento para entornos de horcajadas.

En resumen, la recolección de basura promete ocultar la administración de memoria y simplemente la expone de manera diferente.

Ciertamente no es el caso de que todas las abstracciones útiles tengan fugas.

Ahora soy programador, pero tengo un título en ingeniería electrónica.

El lenguaje que usamos para programar una computadora y formar capas de abstracciones útiles se basa en una torre de abstracciones útiles, ninguna de las cuales se filtra en lo más mínimo.

En la parte inferior (que yo sepa) tenemos transistores, diodos, líneas de transmisión (buses) para los cuales * modelamos adecuadamente * la física cuántica o los efectos de campo de alguna manera abstracta.

En alguna capa superior, tenemos una capa de puertas lógicas, relojes, etc., que modelamos como “perfectos” aunque estén lejos de ello. La abstracción funciona perfectamente bien debido a los pulsos de reloj (aunque el pulso mismo llegue a diferentes partes del sistema en diferentes momentos).

En algún nivel superior, podemos tener registros y otros dispositivos similares. Una vez más, estos dispositivos son muy imperfectos en su propio nivel de descripción, pero se abstraen perfectamente en el siguiente nivel.

A continuación tenemos unidades aritméticas y lógicas, CPU y otras parafernalias similares.

Podría seguir.

Mi punto es que la idea de abstracción permeable parece ser comúnmente aceptada a nivel de programación, cuando cada nivel por debajo de eso es extremadamente cuidadoso de no perder las abstracciones en las que se basa.

Sospecho que parte de la razón de esto en la programación es el surgimiento de ciertas técnicas que hacen que las fugas sean más probables (estilos imperativos de programación, OO, sistemas de tipos empobrecidos, sistemas de tipos potentes utilizados mal, etc.)

Un buen ejemplo es mi intento fallido de instalar ImageMagick en OS / X.

La abstracción es multinivel. El nivel superior está utilizando un comando “brew” para instalar una pieza compleja de software de varios paquetes.

El siguiente nivel es que el suministro de cada paquete se abstrae, basándose en una serie de fuentes de red. La lista de fuentes es una abstracción mantenida en archivos de datos extraídos de un servidor cuando actualiza su sistema de gestión (homebrew).

La falla se produjo cuando la primera de las fuentes de red no estaba disponible y la entrega del paquete informó un error, en lugar de pasar sin problemas a otra fuente de red.

Esto entró en cascada, por lo que todo el proceso de actualización murió debido a que un servidor del otro lado del mundo no estaba disponible.

Las abstracciones con fugas incluyen fugas de condiciones internas o errores que el cliente de un sistema no necesita conocer.

Cuando un sistema se construye como una fachada, una abstracción con fugas es cuando los errores son específicos de los sistemas internos a los que se enfrenta.

Esa es una forma de decirlo.

O la abstracción está incompleta o es la abstracción incorrecta.

Astracción incompleta : lo que significa que no está completamente implementado y necesita manejar casos especiales cuando se trata de la abstracción que muestra cómo se implementa, lo que significa que su código que usa la abstracción se enreda con la implementación.

Entonces, ¿por qué usar la abstracción en ese caso?

Cada vez que cena abstracciones incompletas, debe completar la abstracción o encontrar una nueva que tenga más sentido.

La abstracción equivocada : no funciona, no importa cuánto esfuerzo le pongas.

More Interesting

Arquitectura de software: ¿Qué datos deben y no deben almacenarse en caché?

¿Cuál es el proyecto más liviano en el que podría trabajar que me daría experiencia con los problemas que generalmente se preguntan en las entrevistas de ingeniería de software?

¿Por qué no hay más programadores que realicen proyectos paralelos?

¿Cuál es tu opinión sobre tener un vehículo autónomo? ¡Ford ha anunciado un ambicioso plan para entregar un vehículo de gran volumen y totalmente autónomo para 2021!

Si tuviera que abandonar una de estas tres asignaturas optativas de Informática, ¿cuál abandonaría y por qué?

¿Qué tiene de emocionante WebSockets?

¿Qué lenguaje de programación con software debería aprender en 2017 para desarrollar aplicaciones para teléfonos inteligentes que casi no tienen experiencia en programación?

¿Deberían los equipos ágiles en los lenguajes de desarrollo tratar de determinar un conjunto de herramientas estándar o es mejor que cada equipo use lo que mejor funcione para ellos?

¿Cuáles son las características del programa de capacitación en línea de garantía de calidad en H2kinfosys?

¿Por qué Microsoft no traerá de vuelta el menú de inicio?

¿Qué posibilidades hay de que todos los entrevistadores de desarrolladores de software reciban la misma pregunta de programación técnica?

Cómo aprender a leer el código

¿Cómo se sienten los ingenieros de software acerca de ser llamados "hackers"?

¿Cuál es el mejor instituto de capacitación en software para Hadoop en India?

¿Por qué apesta SharePoint?