Panoramica tecnica di Envision - Software di ottimizzazione delle scorte

Envision: panoramica tecnica












Home » Risorse » Qui

Envision è un linguaggio di programmazione pensato appositamente per le analisi della catena logistica. La sintassi è simile a quella di SQL e Python. Lokad offre sia un ambiente di sviluppo, sia un ambiente di esecuzione, entrambi basati su cloud. I dati di input devono essere forniti in file tabellari (file di testo flat o fogli Excel), archiviati nella piattaforma Lokad. Lo script Envision genera un pannello di controllo ed eventualmente uno o più file tabellari di output, che risultano dai calcoli all'interno dello script.

Com'è nato Envision

Envision nasce dalla nostra pluriennale esperienza di lavoro con centinaia di rivenditori. Quando abbiamo fondato Lokad nel 2008, Envision non faceva parte dei nostri piani. Creare un linguaggio di programmazione da zero non è un compito facile: tra il 2008 e il 2013, quindi, ci siamo affidati interamente a linguaggi di programmazione già noti. Con il passare del tempo, però, man mano che acquisivamo maggiore esperienza, ci siamo resi conto che sviluppare un linguaggio di programmazione concepito specificatamente per la catena logistica avrebbe agevolato il compito di sviluppare ed eseguire soluzioni personalizzate per i nostri clienti.

Nel 2014, quando abbiamo iniziato a usare Envision su alcuni dei nostri progetti interni, è apparso evidente che le iniziative portate avanti usando Envision erano di qualità sistematicamente superiore rispetto a quelle eseguite con linguaggi di programmazione generici, anche con sviluppatori di alto livello. Non vogliamo certo insinuare che Envision sia meglio di C#/Java/Python/SQL/etc. Tuttavia, per il caso specifico di un'attività commerciale, questi linguaggi, che pure sono ottimi, non sono la soluzione ideale.

Proprietà di un linguaggio ben progettato

Ammettiamolo: la stragrande maggioranza dei linguaggi di programmazione aziendali possono al massimo essere classificati come di scarsa qualità. Mentre progettavamo Envision, ci siamo detti che avremmo voluto un linguaggio eccezionale, con un unico limite: il punto focale sarebbe stata la catena logistica.

Il linguaggio:

  • Né loop, né salti (sì, è una funzionalità)
  • Tipizzazione forte (strong typing)
  • Chiamate di funzioni senza effetti secondari
  • Compilazione nativa del codice
  • Esecuzione rapidissima con algoritmi specializzati

L'ambiente di sviluppo:

  • Colorazione e completamento automatico del codice
  • Compilatore intelligente con messaggi di errore chiari e comprensibili
  • Gestione completa delle versioni per ogni modifica ed esecuzione precedente
  • Navigazione contestuale tra i dati di input

In termini di stile, per Envision ci siamo ispirati soprattutto alla sintassi concisa di Python, ma abbiamo anche rubato qualche idea ad altri linguaggi, come C#.

SQL ed Envision a confronto

SQL ed Envision sono molto affini riguardo i dati. Tuttavia, mentre SQL è incentrato sulla richiesta di un modello transazionale, con particolare riferimento alle proprietà ACID (Atomicity o atomicità, Consistency o coerenza, Isolation o isolamento, Durability o durevolezza della transazione), Envision non richiede altro che una serie di file tabellari flat. Per molti dei problemi tipici del settore logistico, infatti, non abbiamo bisogno di dati in tempo reale: ci bastano quelli del giorno prima, che sono ormai passati e immutabili. Questi file possono, di conseguenza, essere elaborati molto più rapidamente (1) rispetto alle tabelle relazionali, perché non ci sono operatori come INSERT, UPDATE o DELETE, l'unica istruzione è READ.

In Envision, è possibile visualizzare una tabella con un'istruzione molto simile al SELECT che troviamo in SQL.
show table "Product List" with Id, Name, Supplier
Uno sviluppatore SQL esperto probabilmente noterà subito che manca il FROM, che di solito segue SELECT. Quando si tratta di catene logistiche, quasi tutti i dati sono incentrati su prodotti o SKU, e quasi tutti i dati storici rappresentano eventi legati ai prodotti. Quindi, invece che riscrivere continuamente JOIN per ripetere sempre lo stesso pattern, Envision ti offre una sorta di ‘’join naturale’’. Lo script qui sotto, ad esempio, mostra come produrre una lista di prodotti top seller basata unicamente sullo storico delle vendite, senza alcun operatore esplicito di unione.
end := max(date)
LastYearQty = sum(Orders.Quantity) when date > end - 365
show table "Top Sellers" with Id, Name, LastYearQty order by LastYearQty desc
Nella gestione della catena logistica, poi, le aggregazioni temporali sono molto frequenti: i manager di un'azienda commerciale hanno bisogno di valori giornalieri, settimanali o mensili. Anche se si tratta di un'esigenza ovvia, con SQL è piuttosto difficile realizzare persino un semplice grafico settimanale, che invece con Envision può essere creato con poche, "banali" righe.
Week.quantity := sum(Orders.Quantity)
show linechart "Weekly quantities sold" with Week.quantity
Infine, tutti gli strumenti che ruotano intorno a SQL enfatizzano un modello mentale di una query alla volta. Tuttavia, siamo giunti alla conclusione che un buon pannello di controllo richiede una combinazione di vari indicatori di business per poter essere produttivo. Al contrario, uno script Envision ha lo scopo dichiarato di generare un pannello di controllo complesso in una volta.

(1) Certo, è possibile regolare il database SQL per ottenere una performance di livello qualitativo simile a quello di una performance ottenuta con file flat. Questa operazione, però, richiede sforzi tali da annullare i benefici dati dall'introduzione di un database SQL.

Excel ed Envision a confronto

Envision è un linguaggio di programmazione, ma è comunque accessibile a tutti gli utenti avanzati di Excel. Il nostro intento non è certo quello di "snobbare" Excel, che, nonostante abbia già diversi anni di età, è comunque una soluzione difficile da superare. Anche noi del team Lokad, che siamo sviluppatori esperti nella gestione dei dati, ricorriamo spesso a Excel, per esempio per mettere insieme i risultati di esperimenti diversi.

Uno dei punti di forza di Excel è la capacità di eseguire rapidi calcoli per intere righe o colonne, ossia calcoli vettoriali con tutta la potenza del copia e incolla. Mentre i calcoli vettoriali sono sicuramente utili, il copia e incolla lo è molto meno. Supponiamo di voler calcolare il prezzo mediano dei prodotti nell'ultimo anno, basandoci sulle transazioni passate. Usando Envision, basteranno un paio di righe di script per eseguire il calcolo.
Orders.UnitPrice = Orders.NetAmount / Orders.Quantity
end := max(date)
UnitPrice = mode(Orders.UnitPrice) when date > end - 365
show table "Median Price" with median(UnitPrice)
La prima riga è un calcolo vettoriale equivalente all'introduzione di una nuova colonna, UnitPrice (prezzo unitario) all'interno della tabella Orders (ordini). Anche la terza riga è un calcolo vettoriale, con cui calcoliamo la moda (mode), cioè il valore osservato più di frequente per ogni prodotto. Come avviene con Excel, anche con Envision è molto semplice introdurre calcoli intermedi e riutilizzarli successivamente.

Envision ha un occhio di riguardo anche per la compattezza dei pannelli di controllo (in questo è simile a un foglio di sintesi Excel). In Envision, ogni assegnamento show (mostra) definisce una casella da mostrare nel pannello di controllo. Le caselle verranno poi allineate tutte seguendo il modello di una griglia di Excel.
show label "Hello World" a1d1 tomato
show table "Product Lines" a2b2 royalblue with sum(1)
show table "Order Lines" c2b2 darkorange with sum(Orders.1)
Lo script qui sopra definisce tre caselle, posizionate rispettivamente in A1:D1, A2:B2, e C2:D2 (usiamo la convenzione di Excel, per cui la lettera indica la colonna e il numero la riga).

Nessun loop, nessun salto... e tanto altro

Envision offre una sintassi chiara e funzionale. Non abbiamo loop, salti o valori NULL. E, nel caso te lo stessi chiedendo, Envision non è un linguaggio Turing-completo. Ciò non vuol dire che queste funzionalità siano omesse, ma semplicemente che Envision offre costruzioni integrate per ottenere gli stessi risultati con minor sforzo. In questo modo, non solo eliminiamo intere categorie di problemi difficili da risolvere, ma aumentiamo anche la produttività in maniera considerevole.

Supponiamo di voler calcolare il volume totale delle vendite dei 10 migliori prodotti in ogni settimana dell'anno in corso, e di confrontare i totali settimanali con quelli registrati l'anno precedente per gli stessi 10 prodotti. Ci vengono in aiuto le poche righe qui sotto.
end := max(date)
Volume = sum(Orders.Amount) when date > end - 365
Week.amt := sum(Orders.Amount) where rank(Volume) <= 10
show linechart "Top 10. This Year vs Last Year." a1f3 tomato with
  Week.amt as "Sold this year{$}"
  Week.amt[-52] as "Sold last year{$}"
Envision in questo è molto rapido, poiché siamo riusciti non solo a sfruttare molti algoritmi specifici per questo settore (2), ma anche ad acquisire (quasi) ogni singolo nodo di calcolo dei nostri script Envision. Così, quando viene rieseguito uno script dopo qualche modifica, vengono ricalcolati solo i nodi della griglia di calcolo che sono stati modificati. Una volta che avrai provato com'è comodo elaborare 20 GB di dati in 5 secondi, non vorrai più tornare alle query di SQL.

(2) Sfruttiamo un algoritmo bucket sort che spesso si rivela 500 volte più efficace rispetto al più comune algoritmo quick sort. Nonostante il limite teorico degli algoritmi di ordinamento a O(n.log(n)), accelerare un algoritmo di ordinamento fino a 500 volte è possibile se la situazione è favorevole (ad esempio, nel caso di un ordinamento per date). A tal proposito, per quanto riguarda la catena logistica, le situazioni sono spesso molto favorevoli.