Casi todo es más complejo de lo que crees que será. Los humanos tienen una capacidad tremenda para pensar en diferentes niveles de abstracción simultáneamente. Como resultado, no se dan cuenta de las complejidades cuando entras en el meollo. ¡Incluso los programadores piensan en abstracciones sin darse cuenta! Por ejemplo, habitualmente decimos que “el Módulo A habla con el Módulo B”. O “El programa A interactúa con el programa B”. ¡Pero los módulos y programas son abstracciones! Todo se ejecuta en la CPU. No hay módulos Pensar en los módulos / programas como entidades independientes hace que sea más fácil analizar el comportamiento de un sistema informático, y entrar en una abstracción de nivel inferior de analizar cómo reacciona la CPU a veces puede ofuscar la verdad. Del mismo modo, cuando los no programadores hablan de cosas, hablan en abstracciones sin darse cuenta.
En los problemas de Big Data, por ejemplo, los no ingenieros (e incluso algunos ingenieros) piensan en una aplicación distribuida como una sola aplicación. Esto puede ocultar mucha complejidad. Par de ejemplos
Hace unos años, estaba construyendo un motor de predicción en Gigaspaces. Obtendríamos un conjunto de datos que distribuimos en la cuadrícula, y teníamos un código que aplicaba un modelo de predicción en cada segmento de datos. De vez en cuando, obtendríamos datos realmente malos, y la ejecución arrojaría muchos errores. El problema era que en ese momento, Gigaspaces no tenía un contador distribuido confiable. Entonces, a pesar de que cada trabajador sabía que estaba recibiendo muchos errores, no podía detener el trabajo porque no podía asumir que todos los demás trabajadores estaban obteniendo errores. Entonces, uno de los analistas de negocios dijo: “Bueno, ¿por qué no te detienes cuando ves que el 10% de los registros tienen el mismo error?”. Verá, tiene sentido para él porque pasa por toda la aplicación como un programa que se ejecuta en un solo nodo, y contar errores es trivial en una aplicación de un solo nodo. Tuve que hacer una analogía usando una fábrica hipotética que tiene cientos de trabajadores, y la usé para demostrar cómo la fábrica se paralizaría si hiciéramos lo que él quería que hiciéramos usando una solución ingenua. También le mostré cómo sería una solución real y cómo no es tan simple como él cree que es.
- ¿Cuál es el mejor software de subtitulado automático (voz a texto) gratuito y de pago para video?
- ¿Qué software se está ejecutando en las superficies de Microsoft utilizadas en los juegos de la NFL?
- ¿Cuáles son algunos softwares gratuitos de daw?
- ¿Cuáles son las aplicaciones de los compiladores?
- ¿Qué aplicaciones se hacen de AngularJS?
El segundo ejemplo es: con frecuencia me dicen “¿Por qué no lo pones en una transacción de la base de datos?” Gente … las transacciones de la base de datos tienen un solo proceso. No hay transacción de base de datos en una aplicación distribuida. La última vez que me dijeron esto fue cuando estaba explicando cómo hemos implementado un sumidero JDBC en Apache Spark que admite exactamente una vez la semántica. Estaba explicando esto a un grupo de desarrolladores que planeaban usar Spark por primera vez, y el propietario del producto dijo: “¿Por qué no actualizas la tabla de la base de datos en una transacción?”. Dije: “Las aplicaciones distribuidas no trabaja de la manera que piensas “. Digamos que tiene un lote de datos que se divide en 20 particiones y se distribuye a 10 nodos. Cada nodo funciona en una partición antes de elegir la siguiente. Ahora, no puede tener particiones cruzadas de transacciones de bases de datos. Definitivamente no puede tener transacciones de base de datos en máquinas cruzadas. Para poder “revertir” y todo el lote de datos, debe usar algún mecanismo fuera de las transacciones de la base de datos
En términos generales, incluso los programadores que no han creado aplicaciones distribuidas subestiman la complejidad de las operaciones distribuidas. Por ejemplo: las operaciones de “Unir” parecen triviales. Es mucho más complicado cuando unes 1 millón de filas con 100 millones de filas en un clúster.