PARADIGMAS DE PROGRAMACIÓN PARA LA SUPPLY CHAIN (RESUMEN DE LA CONFERENCIA 1.4)

learn menu

Los problemas de la supply chain son malvados y tratar de abordarlos sin las herramientas de programación adecuadas, en el contexto de una empresa a gran escala, resulta en una experiencia de aprendizaje costosa e inevitable. La optimización efectiva de la supply chain, una red dispersa de complejidades físicas y abstractas, requiere una serie de paradigmas de programación modernos, ágiles e innovadores. Estos paradigmas son fundamentales para la identificación, consideración y resolución exitosa de la amplia y variada gama de problemas inherentes a la supply chain.

programming-paradigms-as-supply-chain-theory

Ver la Conferencia

Análisis Estático

No es necesario ser un programador de computadoras para pensar como uno, y el análisis adecuado de los problemas de la supply chain se aborda mejor con una mentalidad de programación, no solo con herramientas de programación. Las soluciones de software tradicionales (como los ERPs) están diseñadas de tal manera que los problemas se abordan en tiempo de ejecución en lugar de tiempo de compilación1.

Esta es la diferencia entre una solución reactiva y una proactiva. Esta distinción es crucial porque las soluciones reactivas tienden a ser mucho más costosas que las proactivas, tanto en términos financieros como de ancho de banda. Estos costos en gran medida evitables son precisamente lo que una mentalidad de programación busca evitar, y el análisis estático es la expresión de este marco.

El análisis estático implica inspeccionar un programa (en este caso, la optimización) sin ejecutarlo, como un medio para identificar posibles problemas antes de que puedan afectar la producción. Lokad aborda el análisis estático a través de Envision, su lenguaje específico de dominio (DSL). Esto permite la identificación y corrección de errores a nivel de diseño (en el lenguaje de programación) de la manera más rápida y conveniente posible.

Considere una empresa en proceso de construcción de un almacén. No se construye el almacén y luego se contempla su diseño. Más bien, se consideraría la disposición estratégica de pasillos, estanterías y muelles de carga con anticipación, para identificar posibles cuellos de botella antes de la construcción. Esto permite un diseño óptimo, y por lo tanto, un flujo óptimo dentro del futuro almacén. Esta planificación cuidadosa es análoga al tipo de análisis estático que Lokad logra a través de Envision.

El análisis estático, como se describe aquí, modelaría la programación subyacente de la optimización e identificaría cualquier comportamiento potencialmente adverso dentro de la receta antes de instalarla. Estas tendencias adversas podrían incluir un error que resulte en el pedido accidental de más stock del necesario. Como resultado, cualquier error de este tipo se eliminaría del código antes de que tengan la oportunidad de causar estragos.

Programación de matrices

En la optimización de la cadena de suministro, el tiempo estricto es esencial. Por ejemplo, en una cadena minorista, los datos deben consolidarse, optimizarse y transmitirse al sistema de gestión de almacenes en un plazo de 60 minutos. Si los cálculos tardan demasiado, se puede poner en peligro la ejecución de toda la cadena de suministro. La programación de matrices aborda este problema eliminando ciertas clases de errores de programación y garantizando la duración del cálculo, lo que proporciona a los profesionales de la cadena de suministro un horizonte de tiempo predecible para el procesamiento de datos.

También conocido como programación de marcos de datos, este enfoque permite realizar operaciones directamente en matrices de datos, en lugar de datos aislados. Lokad lo hace aprovechando Envision, su DSL. La programación de matrices puede simplificar la manipulación y el análisis de datos, como realizar operaciones en columnas completas de datos en lugar de entradas individuales en cada tabla. Esto aumenta drásticamente la eficiencia del análisis y, a su vez, reduce las posibilidades de errores en la programación.

Considere un gerente de almacén que tiene dos listas: la Lista A son los niveles de existencias actuales y la Lista B son los envíos entrantes de los productos de la Lista A. En lugar de revisar cada producto uno por uno y agregar manualmente los envíos entrantes (Lista B) a los niveles de existencias actuales (Lista A), un método más eficiente sería procesar ambas listas simultáneamente, lo que le permitiría actualizar los niveles de inventario para todos los productos de una sola vez. Esto ahorraría tiempo y esfuerzo, y es esencialmente lo que busca hacer la programación de matrices2.

En realidad, la programación de matrices facilita la paralelización y distribución del cálculo de las grandes cantidades de datos involucrados en la optimización de la cadena de suministro. Al distribuir el cálculo en varias máquinas, se pueden reducir los costos y acortar los tiempos de ejecución.

Compatibilidad de hardware

Uno de los principales cuellos de botella en la optimización de la cadena de suministro es el número limitado de científicos de la cadena de suministro. Estos científicos son responsables de crear recetas numéricas que tengan en cuenta las estrategias de los clientes, así como las maquinaciones antagónicas de los competidores, para producir ideas prácticas.

No solo puede ser difícil encontrar a estos expertos, sino que una vez que se los encuentra, a menudo deben superar varios obstáculos de hardware que los separan de la ejecución rápida de sus tareas. La compatibilidad de hardware - la capacidad de que varios componentes dentro de un sistema se mezclen y funcionen juntos - es crucial para eliminar estos obstáculos. Aquí se consideran tres recursos informáticos fundamentales:

  • Computación: La capacidad de procesamiento de una computadora, proporcionada por la CPU o la GPU.
  • Memoria: La capacidad de almacenamiento de datos de una computadora, alojada a través de RAM o ROM.
  • Ancho de banda: La velocidad máxima a la que se puede transferir información (datos) entre diferentes partes de una computadora o a través de una red de computadoras.

El procesamiento de grandes conjuntos de datos generalmente es un proceso que consume mucho tiempo, lo que resulta en una menor productividad mientras los ingenieros esperan la ejecución del trabajo. En una optimización de la cadena de suministro, se pueden almacenar fragmentos de código (que representan pasos de cálculo intermedios rutinarios) en unidades de estado sólido (SSD). Este simple paso permite a los científicos de la cadena de suministro ejecutar scripts similares con solo cambios menores mucho más rápidamente, lo que aumenta significativamente la productividad.

En el ejemplo anterior, se ha aprovechado un truco de memoria económico para reducir la sobrecarga de cómputo: el sistema nota que el script que se está procesando es casi idéntico a los anteriores, por lo que el cómputo se puede realizar en segundos en lugar de decenas de minutos.

Este tipo de compatibilidad de hardware permite a las empresas extraer el mayor valor de sus inversiones.

Programación probabilística

Existe un número infinito de posibles resultados futuros, pero no todos son igualmente probables. Dada esta incertidumbre irreducible, la(s) herramienta(s) de programación deben adoptar un paradigma de pronóstico probabilístico. Aunque Excel ha sido históricamente la base de muchas cadenas de suministro, no se puede implementar a gran escala utilizando pronósticos probabilísticos, ya que este tipo de pronóstico requiere la capacidad de procesar el álgebra de variables aleatorias3.

En resumen, Excel está diseñado principalmente para datos deterministas (es decir, valores fijos, como números enteros estáticos). Aunque se puede modificar para realizar algunas funciones de probabilidad, carece de la funcionalidad avanzada, flexibilidad general y expresividad necesarias para manejar la manipulación compleja de variables aleatorias que se encuentra en el pronóstico de demanda probabilístico. En cambio, un lenguaje de programación probabilístico, como Envision, es más adecuado para representar y procesar las incertidumbres que se encuentran en la cadena de suministro.

Consideremos una tienda de repuestos de automóviles que vende pastillas de freno. En este escenario hipotético, los clientes deben comprar pastillas de freno en lotes de 2 o 4 a la vez, y la tienda debe tener en cuenta esta incertidumbre al pronosticar la demanda.

Si la tienda tiene acceso a un lenguaje de programación probabilístico (en lugar de una maraña de hojas de cálculo), puede estimar mucho más precisamente el consumo total utilizando el álgebra de variables aleatorias, que generalmente está ausente en los lenguajes de programación generales.

Programación diferenciable

En el contexto de la optimización de la cadena de suministro, la programación diferenciable permite que la receta numérica aprenda y se adapte en función de los datos que se le proporcionan. La programación diferenciable, combinada con un descenso de gradiente estocástico, permite a un científico de la cadena de suministro descubrir patrones y relaciones complejas dentro de la cadena de suministro. Los parámetros se aprenden con cada nueva iteración de programación, y este proceso se repite miles de veces. Esto se hace para minimizar la discrepancia entre el modelo de pronóstico actual y los datos pasados4.

La canibalización y la sustitución, dentro de un solo catálogo, son dos problemas del modelo que vale la pena analizar en este contexto. En ambos escenarios, varios productos compiten por los mismos clientes, lo que presenta una capa desconcertante de complejidad en el pronóstico. Los efectos posteriores de estas fuerzas generalmente no se capturan en los pronósticos tradicionales de series de tiempo, que principalmente consideran la tendencia, la estacionalidad y el ruido para un solo producto, sin tener en cuenta la posibilidad de interacción(es).

La programación diferenciable y el descenso de gradiente estocástico se pueden aprovechar para abordar estos problemas, como analizando los datos históricos de transacciones que vinculan clientes y productos. Envision es capaz de realizar dicha investigación, llamada análisis de afinidad, entre clientes y compras mediante la lectura de archivos planos simples que contienen suficiente profundidad histórica: es decir, transacciones, fechas, productos, clientes y cantidades de compra5.

Con solo un puñado de código único, Envision puede determinar la afinidad entre un cliente y un producto, lo que permite al científico de la cadena de suministro optimizar aún más la receta numérica que ofrece la recomendación de interés6.

Versionado de código y datos

Un elemento pasado por alto de la viabilidad de la optimización a largo plazo es asegurar que la receta numérica, incluidos cada fragmento de código y cada dato, se pueda obtener, rastrear y reproducir7. Sin esta capacidad de versionado, la capacidad de ingeniería inversa de la receta se ve muy disminuida cuando surgen excepciones desesperantes (heisenbugs en círculos informáticos).

Los heisenbugs son excepciones molestas que causan problemas en los cálculos de optimización, pero desaparecen cuando se vuelve a ejecutar el proceso. Esto puede hacer que sean extraordinariamente difíciles de solucionar, lo que resulta en el fracaso de algunas iniciativas y en que la cadena de suministro vuelva a las hojas de cálculo de Excel. Para evitar los heisenbugs, es necesario lograr una replicabilidad completa de la lógica y los datos de la optimización. Esto requiere versionar todo el código y los datos utilizados en el proceso, asegurando que el entorno se pueda replicar en las mismas condiciones exactas de cualquier punto anterior en el tiempo.

Programación segura

Más allá de los heisenbugs rebeldes, la creciente digitalización de la cadena de suministro conlleva una vulnerabilidad consiguiente a las amenazas digitales, como los ciberataques y el ransomware. Hay dos vectores primarios, y generalmente inadvertidos, de caos en este sentido: el sistema o sistemas programables que se utilizan y las personas a las que se les permite utilizarlos. En cuanto a lo último, es muy difícil tener en cuenta la incompetencia accidental (por no mencionar los incidentes de malicia intencional); en cuanto a lo primero, las elecciones intencionales a nivel de diseño que se hacen son fundamentales para evitar estos campos minados.

En lugar de invertir recursos preciosos en aumentar el equipo de ciberseguridad (en previsión de comportamientos reactivos, como la lucha contra incendios), decisiones prudentes en la fase de diseño del sistema de programación pueden eliminar clases enteras de dolores de cabeza posteriores. Al eliminar características redundantes, como una base de datos SQL en el caso de Lokad, se pueden prevenir catástrofes predecibles, como un ataque de inyección SQL. De manera similar, optar por capas de persistencia de solo agregación (como hace Lokad) significa que eliminar datos (por amigo o enemigo) es mucho más difícil8.

Si bien Excel y Python tienen sus ventajas, carecen de la seguridad de programación necesaria para la protección de todo el código y los datos necesarios para el tipo de optimización de la cadena de suministro escalable que se discute en estas conferencias.

Notas


  1. El tiempo de compilación se refiere a la etapa en la que el código de un programa se convierte en un formato legible por la máquina antes de que se ejecute. El tiempo de ejecución se refiere a la etapa en la que el programa se está ejecutando realmente en la computadora. ↩︎

  2. Esta es una aproximación muy aproximada del proceso. La realidad es mucho más compleja, pero eso es competencia de los expertos en informática. Por ahora, la idea principal es que la programación de matrices resulta en un proceso de cálculo mucho más eficiente (y rentable), cuyos beneficios son abundantes en el contexto de la cadena de suministro. ↩︎

  3. En términos sencillos, esto se refiere a la manipulación y combinación de valores aleatorios, como calcular el resultado de un lanzamiento de dados (o varios cientos de miles de lanzamientos de dados, en el contexto de una gran red de cadena de suministro). Esto abarca desde la suma, resta y multiplicación básicas hasta funciones mucho más complejas como encontrar varianzas, covarianzas y valores esperados. ↩︎

  4. Considera tratar de perfeccionar una receta real. Puede haber un esquema básico en el que te basas, pero obtener el equilibrio perfecto de ingredientes y preparación resulta esquivo. De hecho, no solo hay consideraciones de sabor en una receta, sino también de textura y apariencia. Para encontrar la iteración perfecta de la receta, se hacen ajustes mínimos y se observan los resultados. En lugar de experimentar con todos los condimentos y utensilios de cocina concebibles, se hacen ajustes educados basados en la retroalimentación que se observa con cada iteración (por ejemplo, agregar un poco más o menos de sal). Con cada iteración, se aprende más sobre las proporciones óptimas y la receta evoluciona. En su esencia, esto es lo que la programación diferenciable y el descenso de gradiente estocástico hacen con la receta numérica en una optimización de la cadena de suministro. Por favor, revisa la conferencia para los detalles matemáticos. ↩︎

  5. Cuando se identifica una fuerte afinidad entre dos productos que ya están en el catálogo de alguien, puede indicar que son complementarios, lo que significa que a menudo se compran juntos. Si se descubre que los clientes cambian entre dos productos con un alto grado de similitud, puede sugerir sustitución. Sin embargo, si un nuevo producto muestra una fuerte afinidad con un producto existente y provoca una disminución en las ventas del producto existente, puede indicar canibalización. ↩︎

  6. Cabe decir que estas son descripciones simplificadas de las operaciones matemáticas involucradas. Dicho esto, las operaciones matemáticas no son demasiado confusas, como se explica en la conferencia. ↩︎

  7. Los sistemas de versionado populares incluyen Git y SVN. Permiten que varias personas trabajen en el mismo código (o cualquier contenido) simultáneamente y fusionen (o rechacen) cambios. ↩︎

  8. La capa de persistencia de solo agregación se refiere a una estrategia de almacenamiento de datos donde se agrega nueva información a la base de datos sin modificar ni eliminar los datos existentes. El diseño de seguridad de solo agregación de Lokad se explica en detalle en su extensa sección de preguntas frecuentes sobre seguridad. ↩︎