PARADIGMI DI PROGRAMMAZIONE PER LA SUPPLY CHAIN (RIASSUNTO LEZIONE 1.4)

learn menu

I problemi della supply chain sono complessi e cercare di affrontarli senza gli strumenti di programmazione appropriati - nel contesto di un’azienda su larga scala - si rivela un’esperienza di apprendimento costosa. L’ottimizzazione efficace della supply chain - una rete dispersa di complessità fisiche e astratte - richiede una serie di moderni, agili e innovativi paradigmi di programmazione. Questi paradigmi sono fondamentali per l’identificazione, la considerazione e la risoluzione di una vasta e variegata gamma di problemi intrinseci alla supply chain.

programming-paradigms-as-supply-chain-theory

Guarda la lezione

Analisi statica

Non è necessario essere un programmatore per pensare come uno, e l’analisi corretta dei problemi della supply chain viene affrontata al meglio con una mentalità di programmazione, non solo con strumenti di programmazione. Le soluzioni software tradizionali (come gli ERP) sono progettate in modo tale che i problemi vengano affrontati durante l’esecuzione anziché durante la compilazione1.

Questa è la differenza tra una soluzione reattiva e una proattiva. Questa distinzione è cruciale perché le soluzioni reattive tendono ad essere molto più costose delle soluzioni proattive, sia in termini finanziari che di larghezza di banda. Questi costi in gran parte evitabili sono proprio ciò che una mentalità di programmazione mira ad evitare, e l’analisi statica è l’espressione di questo framework.

L’analisi statica consiste nell’ispezionare un programma (in questo caso, l’ottimizzazione) senza eseguirlo, come mezzo per identificare eventuali problemi potenziali prima che possano influire sulla produzione. Lokad affronta l’analisi statica attraverso Envision, il suo linguaggio specifico del dominio (DSL). Ciò consente di identificare e correggere gli errori a livello di progettazione (nel linguaggio di programmazione) nel modo più rapido e conveniente possibile.

Consideriamo un’azienda in fase di costruzione di un magazzino. Non si erige il magazzino e poi si contempla il suo layout. Piuttosto, la disposizione strategica dei corridoi, dei ripiani e dei moli di carico sarebbe considerata in anticipo, al fine di identificare potenziali ostacoli prima della costruzione. Ciò consente una progettazione ottimale - e quindi un flusso - all’interno del futuro magazzino. Questa pianificazione attenta è analoga al tipo di analisi statica che Lokad realizza attraverso Envision.

L’analisi statica, come descritta qui, modellerebbe la programmazione sottostante dell’ottimizzazione e identificherebbe eventuali comportamenti potenzialmente avversi nella ricetta prima di installarla. Queste tendenze avverse potrebbero includere un bug che comporta l’ordinazione accidentale di un quantitativo di stock molto maggiore del necessario. Di conseguenza, tali bug verrebbero eliminati dal codice prima che abbiano la possibilità di causare danni.

Programmazione ad array

Nell’ottimizzazione della supply chain, il rispetto dei tempi è essenziale. Ad esempio, in una catena di vendita al dettaglio, i dati devono essere consolidati, ottimizzati e trasmessi al sistema di gestione del magazzino entro una finestra di 60 minuti. Se i calcoli richiedono troppo tempo, l’esecuzione dell’intera supply chain può essere compromessa. La programmazione ad array affronta questo problema eliminando determinate classi di errori di programmazione e garantendo la durata dei calcoli, fornendo così agli operatori della supply chain un orizzonte temporale prevedibile per l’elaborazione dei dati.

Conosciuto anche come programmazione a frame di dati, questo approccio consente di eseguire operazioni direttamente su array di dati, anziché su dati isolati. Lokad fa ciò sfruttando Envision, il suo DSL. La programmazione ad array può semplificare la manipolazione e l’analisi dei dati, ad esempio eseguendo operazioni su intere colonne di dati anziché su singole voci all’interno di ciascuna tabella. Ciò aumenta notevolmente l’efficienza dell’analisi e riduce a sua volta le possibilità di errori di programmazione.

Consideriamo un responsabile di magazzino che ha due elenchi: l’elenco A rappresenta i livelli di stock attuali e l’elenco B rappresenta le spedizioni in arrivo per i prodotti dell’elenco A. Invece di passare attraverso ogni prodotto uno per uno e aggiungere manualmente le spedizioni in arrivo (elenco B) ai livelli di stock attuali (elenco A), un metodo più efficiente sarebbe elaborare entrambi gli elenchi contemporaneamente, consentendo così di aggiornare i livelli di inventario per tutti i prodotti in un’unica operazione. Ciò consentirebbe di risparmiare tempo ed sforzo ed è fondamentalmente ciò che la programmazione ad array cerca di fare2.

In realtà, la programmazione ad array facilita la parallelizzazione e la distribuzione dei calcoli delle enormi quantità di dati coinvolti nell’ottimizzazione della supply chain. Distribuendo i calcoli su più macchine, i costi possono essere ridotti e i tempi di esecuzione abbreviati.

Compatibilità hardware

Uno dei principali ostacoli nell’ottimizzazione della supply chain è il numero limitato di scienziati della supply chain. Questi scienziati sono responsabili della creazione di ricette numeriche che tengano conto delle strategie dei clienti, nonché delle macchinazioni antagoniste dei concorrenti, al fine di produrre informazioni utili.

Non solo questi esperti possono essere difficili da trovare, ma una volta trovati spesso devono superare diversi ostacoli hardware che li separano dall’esecuzione rapida dei loro compiti. La compatibilità hardware - la capacità dei vari componenti di un sistema di integrarsi e lavorare insieme - è fondamentale per rimuovere questi ostacoli. Qui vengono considerate tre risorse di calcolo fondamentali:

  • Calcolo: La potenza di elaborazione di un computer, fornita dalla CPU o dalla GPU.
  • Memoria: La capacità di archiviazione dei dati di un computer, ospitata tramite RAM o ROM.
  • Larghezza di banda: La velocità massima a cui le informazioni (dati) possono essere trasferite tra diverse parti di un computer o attraverso una rete di computer.

L’elaborazione di grandi set di dati è generalmente un processo che richiede molto tempo, con conseguente riduzione della produttività mentre gli ingegneri attendono l’esecuzione dei lavori. In un’ottimizzazione della supply chain, si potrebbero memorizzare frammenti di codice (che rappresentano passaggi intermedi di calcolo di routine) su unità a stato solido (SSD). Questo semplice passaggio consente agli scienziati della supply chain di eseguire script simili con solo piccole modifiche molto più rapidamente, aumentando così significativamente la produttività.

Nell’esempio sopra, si è sfruttato un trucco di memoria economico per ridurre il sovraccarico di calcolo: il sistema nota che lo script in fase di elaborazione è quasi identico a quelli precedenti, quindi il calcolo può essere eseguito in pochi secondi anziché decine di minuti.

Questo tipo di compatibilità hardware consente alle aziende di ottenere il massimo valore dai loro investimenti.

Programmazione probabilistica

Ci sono un numero infinito di possibili risultati futuri, ma non sono tutti ugualmente probabili. Data questa incertezza irriducibile, gli strumenti di programmazione devono adottare un paradigma di previsione probabilistica. Sebbene Excel sia storicamente stato il fondamento di molte supply chain, non può essere utilizzato su larga scala utilizzando previsioni probabilistiche, poiché questo tipo di previsione richiede la capacità di elaborare l’algebra delle variabili casuali3.

In sintesi, Excel è principalmente progettato per dati deterministici (cioè valori fissi, come numeri interi statici). Sebbene possa essere modificato per eseguire alcune funzioni di probabilità, manca delle funzionalità avanzate - e della flessibilità e espressività complessive - necessarie per affrontare la complessa manipolazione delle variabili casuali che si incontrano nella previsione della domanda probabilistica. Piuttosto, un linguaggio di programmazione probabilistica - come Envision - è più adatto per rappresentare e elaborare le incertezze che si incontrano nella supply chain.

Consideriamo un negozio di ricambi automobilistici che vende pastiglie dei freni. In questo scenario ipotetico, i clienti devono acquistare pastiglie dei freni in lotti da 2 o 4 alla volta, e il negozio deve tener conto di questa incertezza nella previsione della domanda.

Se il negozio ha accesso a un linguaggio di programmazione probabilistica (invece di una serie di fogli di calcolo), può stimare in modo molto più accurato il consumo totale utilizzando l’algebra delle variabili casuali - tipicamente assente nei linguaggi di programmazione generici.

Programmazione differenziabile

Nel contesto dell’ottimizzazione della supply chain, la programmazione differenziabile consente alla ricetta numerica di imparare e adattarsi in base ai dati forniti. La programmazione differenziabile, una volta combinata con una discesa del gradiente stocastica, consente a uno scienziato della supply chain di scoprire modelli e relazioni complesse all’interno della supply chain. I parametri vengono appresi ad ogni nuova iterazione di programmazione, e questo processo viene ripetuto migliaia di volte. Ciò viene fatto per ridurre al minimo la discrepanza tra il modello di previsione attuale e i dati passati4.

Cannibalizzazione e sostituzione - all’interno di un singolo catalogo - sono due problemi di modellazione degni di approfondimento in questo contesto. In entrambi gli scenari, più prodotti competono per gli stessi clienti, il che presenta un livello di complessità nella previsione. Gli effetti a valle di queste forze generalmente non vengono catturati dalla previsione tradizionale delle serie temporali, che considera principalmente la tendenza, la stagionalità e il rumore per un singolo prodotto, senza tener conto della possibilità di interazioni.

La programmazione differenziabile e la discesa del gradiente stocastica possono essere utilizzate per affrontare questi problemi, ad esempio analizzando i dati storici delle transazioni che collegano clienti e prodotti. Envision è in grado di effettuare tale analisi - chiamata analisi di affinità - tra clienti e acquisti leggendo semplici file piatti contenenti una profondità storica sufficiente: transazioni, date, prodotti, clienti e quantità di acquisto5.

Utilizzando solo poche righe di codice uniche, Envision può determinare l’affinità tra un cliente e un prodotto, il che consente allo scienziato della supply chain di ottimizzare ulteriormente la ricetta numerica che fornisce la raccomandazione di interesse6.

Versionamento del codice e dei dati

Un elemento trascurato della sostenibilità a lungo termine dell’ottimizzazione è garantire che la ricetta numerica - inclusi ogni frammento di codice costituente e ogni briciola di dati - possa essere ottenuta, tracciata e riprodotta7. Senza questa capacità di versionamento, la capacità di invertire l’ingegnerizzazione della ricetta è notevolmente ridotta quando inevitabilmente si presentano eccezioni frustranti (heisenbugs nei circoli informatici).

Gli heisenbugs sono fastidiose eccezioni che causano problemi nei calcoli di ottimizzazione, ma scompaiono quando il processo viene eseguito nuovamente. Ciò può renderli straordinariamente difficili da risolvere, con conseguente fallimento di alcune iniziative e il ritorno alla gestione della supply chain tramite fogli di calcolo Excel. Per evitare heisenbugs, è necessaria la completa replicabilità della logica e dei dati dell’ottimizzazione. Ciò richiede il versionamento di tutto il codice e i dati utilizzati nel processo, garantendo che l’ambiente possa essere replicato alle condizioni esatte di qualsiasi punto precedente nel tempo.

Programmazione sicura

Oltre agli heisenbugs rogue, la crescente digitalizzazione della supply chain comporta una conseguente vulnerabilità alle minacce digitali, come gli attacchi informatici e il ransomware. Ci sono due vettori primari - e di solito inconsapevoli - di caos in questo senso: il sistema programmabile (o i sistemi) che si utilizza e le persone che si permette di utilizzarli. Per quanto riguarda quest’ultimo, è molto difficile tener conto dell’incompetenza accidentale (per non parlare degli episodi di malvagità intenzionale); per quanto riguarda il primo, le scelte intenzionali a livello di progettazione che si fanno sono fondamentali per evitare queste mine antiuomo.

Piuttosto che investire preziose risorse nell’aumento del team di sicurezza informatica (in previsione di comportamenti reattivi, come il combattere gli incendi), decisioni prudenti nella fase di progettazione del sistema di programmazione possono eliminare intere classi di mal di testa a valle. Rimuovendo funzionalità ridondanti - come un database SQL nel caso di Lokad - si possono prevenire catastrofi prevedibili - come un attacco di SQL injection. Allo stesso modo, optare per livelli di persistenza di tipo append-only (come fa Lokad) significa che eliminare dati (da amici o nemici) è molto più difficile8.

Sebbene Excel e Python abbiano i loro vantaggi, mancano della sicurezza di programmazione necessaria per la protezione di tutto il codice e i dati richiesti per il tipo di ottimizzazione della supply chain scalabile discusso in queste lezioni.

Note


  1. Il tempo di compilazione si riferisce alla fase in cui il codice di un programma viene convertito in un formato leggibile dalla macchina prima di essere eseguito. Il tempo di esecuzione si riferisce alla fase in cui il programma viene effettivamente eseguito dal computer. ↩︎

  2. Questa è solo una approssimazione molto approssimativa del processo. La realtà è molto più complessa, ma questo è compito degli esperti informatici. Per ora, l’idea principale è che la programmazione ad array comporta un processo di calcolo molto più snello (ed efficiente in termini di costi), i cui benefici sono numerosi nel contesto della supply chain. ↩︎

  3. In termini semplici, ciò si riferisce alla manipolazione e combinazione di valori casuali, come il calcolo del risultato di un lancio di dadi (o di diversi centomila lanci di dadi, nel contesto di una grande rete di supply chain). Comprende tutto, dall’addizione, sottrazione e moltiplicazione di base a funzioni molto più complesse come la ricerca di varianze, covarianze e valori attesi. ↩︎

  4. Considerate di cercare di perfezionare una ricetta effettiva. Potrebbe esserci uno schema di base su cui fare affidamento, ma ottenere il giusto equilibrio degli ingredienti - e la preparazione - risulta sfuggente. In realtà, una ricetta non riguarda solo il gusto, ma anche la consistenza e l’aspetto. Per trovare l’iterazione perfetta della ricetta, si apportano piccoli aggiustamenti e si annotano i risultati. Piuttosto che sperimentare con ogni possibile condimento e utensile da cucina, si apportano modifiche basate sul feedback osservato con ogni iterazione (ad esempio, aggiungendo un pizzico di sale in più o in meno). Con ogni iterazione, si impara di più sulle proporzioni ottimali e la ricetta evolve. In sostanza, questo è ciò che la programmazione differenziabile e la discesa del gradiente stocastica fanno con la ricetta numerica in un’ottimizzazione della supply chain. Si prega di consultare la lezione per i dettagli matematici. ↩︎

  5. Quando viene identificata una forte affinità tra due prodotti già presenti nel catalogo di una persona, potrebbe indicare che sono complementari, il che significa che vengono spesso acquistati insieme. Se si scopre che i clienti passano da un prodotto all’altro con un alto grado di somiglianza, potrebbe suggerire una sostituzione. Tuttavia, se un nuovo prodotto presenta una forte affinità con un prodotto esistente e provoca una diminuzione delle vendite del prodotto esistente, potrebbe indicare cannibalizzazione. ↩︎

  6. Dovrebbe essere ovvio che queste sono descrizioni semplificate delle operazioni matematiche coinvolte. Detto questo, le operazioni matematiche non sono particolarmente confuse, come spiegato nella lezione. ↩︎

  7. I sistemi di versionamento popolari includono Git e SVN. Consentono a più persone di lavorare contemporaneamente sullo stesso codice (o su qualsiasi contenuto) e di unire (o rifiutare) le modifiche. ↩︎

  8. Il livello di persistenza solo aggiunta si riferisce a una strategia di archiviazione dei dati in cui nuove informazioni vengono aggiunte al database senza modificare o eliminare i dati esistenti. Il design di sicurezza solo aggiunta di Lokad è trattato nella sua estesa FAQ sulla sicurezza. ↩︎