Envision, el resumen más técnico




Envision es un lenguaje específico de dominio adaptado para la analítica cuantitativa y predictiva de cadena de suministro. La sintaxis es similar a la de SQL y Python. Lokad ofrece tanto un ambiente de desarrollo basado en la nube como un ambiente de ejecución basado en la web. Se espera que los datos de entrada se proporcionen en forma de archivos tabulados, ya sean archivos planos o planillas de Excel, hospedados en Lokad. El resultado de un script de Envision es un panel de información, y potencialmente uno o varios archivos tabulados de salida que resultan de los cálculos dentro del script.

La génesis del lenguaje específico de dominio

Envision es el resultado de los años de experiencia que Lokad ha adquirido trabajando con cientos de minoristas. No era parte del plan de nuestra tecnología cuando Lokad se fundó en 2008. La creación de un nuevo lenguaje de programación es un gran compromiso, y entre 2008 y 2013, utilizamos solo lenguajes de programación convencionales. Sin embargo, a medida que adquirimos más experiencia, nos dimos cuenta de que desarrollar un lenguaje exclusivamente diseñado para la cadena de suministro nos ayudaría a desarrollar y a llevar a cabo las tareas específicas de los clientes mucho más rápidamente.

Durante 2014, cuando Lokad comenzó el proceso de "probar su propia medicina" utilizando Envision para algunos de nuestros proyectos internos, resultó claro que, incluso con desarrolladores de software de primera, las iniciativas potenciadas por Envision estaban superando sistemáticamente a las iniciativas alternativas llevadas a cabo con lenguajes de programación genéricos. No sostenemos que Envision sea mejor que C#/Java/Python/SQL/etc. No obstante, en general resulta ser que —para los casos específicos encontrados en la cadena de suministro: estos lenguajes, si bien son excelentes, no representan lo mejor de la productividad comercial.

Las propiedades de un lenguaje bien diseñado

Aceptémoslo: la gran mayoría de los lenguajes de programación empresariales son de pésima calidad. Mientras diseñábamos Envision, decidimos que sería un lenguaje estupendo solo limitado por su enfoque no negociable en la cadena de suministro.

El lenguaje:

  • Sin bucles, sin ramas (sí, es una característica)
  • Escritura sólida
  • Llamadas de función sin efectos secundarios
  • Rellenado de código nativo
  • Ejecución veloz con algoritmos especializados

El ambiente de desarrollo:

  • Código de colores y autorrellenado de código
  • Compilador inteligente que da mensajes de error significativos
  • Control de versiones completo de ediciones y ejecuciones pasadas
  • Navegación contextual de datos de entrada

En cuanto al estilo de código, Envision se inspira en la sintaxis concisa de Python, pero también hemos tomado prestadas ideas de otros lenguajes, como C#.

SQL vs Envision

SQL y Envision comparten una gran afinidad de datos. Sin embargo, mientras SQL se concentra en consultar un modelo de datos transaccional, con mucho énfasis en las propiedades ACID (atomicidad, congruencia, aislamiento, durabilidad), Envision simplemente consulta un conjunto de archivos tabulados planos. De hecho, en lo que tiene que ver con los desafíos de optimización en la cadena de suministro, no necesitamos datos "en tiempo real", sino simplemente datos hasta ayer. Estos datos son pasados e inmutables. Como resultado, esos archivos pueden procesarse órdenes de magnitud más rápido (1) que las tablas relacionales, porque no hay cosas como INSERT, UPDATE o DELETE que soportar, sino solo READ.

En Envision, es posible visualizar una tabla con una instrucción que es bastante similar a la instrucción SELECT en SQL.
show table "Product List" with Id
Name
Supplier
Los desarrolladores con experiencia en SQL probablemente noten de inmediato que a esta instrucción le falta la parte FROM que a menudo se encuentra después de SELECT. En la cadena de suministro, observamos que casi todos los datos evolucionan alrededor de los productos (o SKU), y que casi todo el historial de datos puede describirse como eventos también adjuntos a productos. Por lo tanto, en lugar de escribir JOIN (uniones) por todas partes para repetir sin fin el mismo patrón, Envision cuenta con uniones naturales. Por ejemplo, el script a continuación muestra cómo elaborar una lista de productos más vendidos basada en el historial de ventas sin una unión explícita.
end := max(date)
// O es por Orders (pedidos)
LastYearQty = sum(O.Qty) when date > end - 365
show table "Top Sellers" with Id
Name
LastYearQty order by LastYearQty desc
Además, en la cadena de suministro hemos visto que las agregaciones calendario periódicas son muy frecuentes. Los administradores necesitan tener sus números por día, por semana o por mes; y, si bien es una necesidad básica, SQL hace que sea muy difícil visualizar algo tan simple como un gráfico de líneas semanal, que puede escribirse en solo dos líneas "tontas" en Envision.
Week.quantity := sum(O.Qty)
show linechart "Weekly quantities sold" with Week.quantity
Por último, el utilaje alrededor de SQL pone el énfasis en un modelo de razonamiento de una consulta por vez. Sin embargo, hemos llegado a la conclusión de que un buen panel de información generalmente requiere una combinación de indicadores de negocio muy específicos para ser productivo. Al contrario, un script de Envision viene con la intención de generar un panel de información complejo de una vez.

(1) Sí, es posible ajustar su base de datos de SQL para lograr un nivel de rendimiento similar al que se obtiene solo con archivos planos, pero hemos visto que el esfuerzo que requiere casi siempre resulta neutralizar los beneficios que habían llevado a la introducción de la base de datos de SQL en un principio.

Excel vs Envision

Si bien Envision es un lenguaje de programación, está pensado para ser accesible para usuarios avanzados de Excel. Excel es una herramienta que no despreciamos en absoluto: estas planillas tabuladas de varias décadas de existencia son difíciles de superar y, siendo nosotros mismos un equipo de científicos de datos y desarrolladores, generalmente acabamos utilizando Excel, por ejemplo, para consolidar rápidamente resultados de una serie de experimentos.

Una de las áreas en las que Excel se luce es en su capacidad de llevar a cabo rápidamente operaciones en filas o columnas completas, es decir, cálculos vectoriales, impulsados por la potencia del cortar/pegar. Los cálculos vectoriales son muy útiles, pero la lógica de cortar/pegar lo es un poco menos. Digamos que queremos calcular el precio medio de un producto en el último año de acuerdo con transacciones pasadas. Esto podría escribirse en una pocas líneas utilizando Envision.
O.UnitPrice = O.NetAmount / O.Qty
end := max(date)
UnitPrice = mode(O.UnitPrice) when date > end - 365
show table "Median Price" with median(UnitPrice)
La primera línea es un cálculo vectorial equivalente a la introducción de una nueva columna llamada UnitPrice (Precio por unidad) en la tabla O (por Orders, pedidos). Luego, la tercera línea también es un cálculo vectorial en el que el mode (el valor más frecuentemente observado) se calcula para cada producto. Al igual que con Excel, con Envision es bastante directo introducir cálculos intermedios y componerlos en un segundo momento.

Envision también pone el énfasis en la compacidad de los paneles de información, de modo similar a una planilla sintética de Excel. Cada instrucción show en Envision define un mosaico que se mostrará dentro del panel de información, y estos mosaicos se alinean siguiendo una grilla parecida a la de Excel.
show label "Hello World" a1d1 tomato
show table "Líneas de productos" a2b2 royalblue with sum(1)
show table "Líneas de orden" c2b2 darkorange with sum(O.1)
El script anterior define tres mosaicos posicionados respectivamente en A1:D1, A2:B2, y C2:D2 en línea con la convención de Excel de utilizar letras para las columnas y números para las filas.

Sin bucles, sin ramas y más

Envision ofrece una sintaxis funcional prolija. No tenemos bucles, ni ramas ni nulos; y, en caso de que se lo esté preguntando, Envision no es un lenguaje completamente turinguiano. En la práctica, estas características no se omiten. En cambio, Envision proporciona construcciones integradas para obtener el mismo resultado, pero con mucho menos esfuerzo. Al no tener estas características en Envision, no solo eliminamos clases enteras de problemas difíciles de depurar, sino que también aumentamos ampliamente la productividad.

Consideremos el trazado del volumen de ventas totales de los principales 10 productos por cada semana de este año, y la comparación de esos totales semanales con sus totales el año anterior para los mismos 10 productos. Esto puedo lograrse con unas pocas líneas que se muestran a continuación.
end := max(date)
Vol = sum(O.Qty) when date > end - 365
Week.amt := sum(O.Qty) where rank() sort [Vol] <= 10
show linechart "Top 10" a1f3 omato unit: "$" with
  Week.amt as "Sold this year"
  Week.amt[-52] as "Sold last year"
Además, Envision es extremadamente rápido. No solo hemos logrado aprovechar varios algoritmos específicos de dominio (2), sino que también hemos copiado en caché (casi) todos los nodos de cálculo de nuestros scripts de Envision. Como resultado, cuando un script levemente modificado se vuelve a ejecutar, solo los nodos del gráfico de cálculo que han cambiado se vuelven a calcular. En la práctica, una vez que ha probado lo que se siente procesar 20 GB de datos en 5 segundos, no volverá a esas lentas consultas de SQL.

(2) Tenemos un algoritmo de depósito que a menudo supera los ordenamientos rápidos por un factor de 500x. Aún así, a pesar del límite "teórico" óptimo de ordenar algoritmos a O(n.log(n)), acelerar una clasificación de algoritmo 500x es posible si la situación es favorable (por ejemplo, ordenando por fechas). En la cadena de suministro, las situaciones son a menudo muy favorables en este sentido.