Présentation technique d'Envision

Présentation technique d'Envision









Accueil » Ressources » Ici

Envision est un langage particulièrement adapté aux analyses logistiques. Sa syntaxe a des points communs avec le SQL et le Python. Lokad offre un environnement de développement en ligne ainsi qu'un environnement d’exécution sur le cloud. Les données d’entrée doivent être fournies dans des fichiers tabulaires, soit des fichiers texte, soit des feuilles Excel, qui sont stockés sur la plateforme Lokad. Le résultat d’un script Envision est un tableau de bord et, éventuellement, plusieurs fichiers tabulaires de sortie qui contiennent les résultats de calculs effectués par le script.

L’origine d’un langage spécifique au domaine du commerce

Envision est le résultat d’années d’expérience au contact de centaines de distributeurs. Lors de la création de Lokad en 2008, ce langage ne faisait pas partie de notre feuille de route. En effet, la conception d’un nouveau langage de programmation requiert un investissement important et nous avons donc utilisé les langages de programmation les plus courants jusqu’en 2013. Mais, en gagnant de l’expérience, nous avons réalisé qu’un langage entièrement adapté à la logistique nous permettrait de compléter plus rapidement les missions sur-mesure confiées par nos clients.

En 2014, lorsque l’équipe Lokad a commencé à utiliser Envision sur certains projets internes, il est devenu évident que toutes les initiatives qui reposaient sur cette technologie obtenaient des résultats bien supérieurs aux résultats de celles basées sur des langages de programmation génériques, même avec des développeurs de haut niveau. Notre propos n’est pas de dire qu’Envision est généralement meilleur que le C#/Java/Python/SQL/etc. Il se trouve cependant que, dans les cas spécifiques au secteur de la logistique, ces langages, même s’ils sont excellents, ne sont pas idéaux.

Les propriétés d’un langage bien conçu

Soyons honnêtes : la plupart des langages de programmation « d’entreprise » sont mauvais voire très mauvais. Lors de la phase de conception d’Envision, nous avons décidé d’en faire un langage génial avec une seule limite non-négociable : la logistique devait être au cœur de cet outil.

Le langage :
  • aucune boucle, aucun saut (oui c’est une fonctionnalité) ;
  • fortement typé ;
  • appels de fonctions sans effets secondaires ;
  • compilation native du code ;
  • exécution extrêmement rapide avec des algorithmes spécialisés.

L’environnement de développement :

  • mise en couleur et autocomplétion du code ;
  • compilateur intelligent qui donne des messages d’erreur compréhensibles ;
  • gestion complète des versions, des modifications et des exécutions ;
  • parcours contextuel des données d’entrée.

En ce qui concerne le style de code, Envision s’inspire principalement de la syntaxe concise du Python, tout en empruntant également quelques bonnes idées à d’autres langages comme le C#.

SQL vs Envision

SQL et Envision sont tous deux proches des données. Mais, ce sont des requêtes sur un modèle de données transactionnel qui sont au cœur de SQL, en mettant l’accent sur les propriétés ACID (atomicité, cohérence, isolation et durabilité), tandis qu’Envision n’interroge que des « fichiers tabulaires plats ». En effet, dans la plupart des cas d’optimisation logistique, il n’est pas nécessaire de disposer de données en temps réel, celles accumulées jusqu’à la veille suffisent. Ces données sont passées et immuables. Ces fichiers peuvent donc être traités plus rapidement (1) que des tables relationnelles car il n’y a pas d’insertion, de mise à jour ou de suppression, mais simplement des consultations.

Avec Envision, il est possible d’afficher un tableau avec des informations similaires à celles obtenues par la commande SELECT en SQL.

show table "Product List" with Id, Name, Supplier

Les développeurs SQL expérimentés remarqueront certainement qu’il manque dans cette ligne la partie FROM que l’on trouve généralement après une commande SELECT. En logistique, presque toutes les données tournent autour des produits (ou des SKU) et presque tout l’historique des données peut être décrit à travers des événements rattachés aux produits. Donc, au lieu d’avoir à utiliser la commande JOIN à tout bout de champ, Envision contient des jointures « naturelles ». Par exemple, le script ci-dessous vous montre comment obtenir la liste des produits les plus vendus à partir de l’historique des ventes sans utiliser de jointure explicite.

LastYearQty = sum (Orders. Quantity) when date > end - 365
show table "Top Sellers" with Id, Name, LastYearQty order by LastYearQty desc

Nous avons également remarqué que les agrégations temporelles sont très fréquentes : les dirigeants ont besoin de chiffres au jour, à la semaine ou au mois. Bien qu’il s’agisse d’un besoin de base, il est assez difficile d’obtenir un graphique hebdomadaire en SQL, alors qu’Envision permet de le faire en deux lignes très simples.

Week. quantity : = sum (Orders. Quantity)
show linechart "Weekly quantities sold" with Week. quantity

Enfin, l’outillage autour de SQL met l’accent sur un mode de fonctionnement du type « une requête à la fois ». Pourtant, un bon tableau de bord doit contenir, pour être utile, plusieurs indicateurs métiers très spécifiques. Par conséquent, les scripts Envision sont conçus pour générer en « une seule fois » un tableau de bord complexe.

(1) Il est effectivement possible de régler votre base de données SQL pour obtenir un niveau de performance similaire à celui obtenu en manipulant de simples fichiers plats ; mais les efforts nécessaires annulent presque toujours les bénéfices d’une telle base de données.

Excel vs Envision

Bien qu’Envision soit un langage de programmation, il est censé être accessible à des utilisateurs avancés d’Excel. Nous ne sommes pas en train de snober Excel : il est difficile de faire mieux que ces feuilles de calcul et notre équipe d’experts en données et de développeurs l’utilise souvent, pour regrouper rapidement les résultats d’une expérience par exemple.

L’un des domaines d’excellence d’Excel est sa capacité à effectuer rapidement des opérations sur des lignes ou des colonnes entières : des calculs vectoriels avec la puissance du copier-coller. Les calculs vectoriels sont très utiles mais la logique du copier-coller l’est beaucoup moins. Si par exemple, nous voulons calculer le prix moyen des produits sur l’année précédente, à partir des transactions passées, alors la commande s’écrit en quelques lignes avec Envision.

Orders. UnitPrice = Orders. NetAmount / Orders. Quantity
UnitPrice = mode (Orders. UnitPrice) when date > end - 365
show table "Median Price" with median (UnitPrice)

La première ligne correspond à un calcul vectoriel équivalent à l’ajout d’une colonne appelée UnitPrice dans la table Orders. Puis, la deuxième ligne est également un calcul vectoriel qui donne le mode (la valeur observée la plus fréquemment) de chaque produit. Comme dans Excel, l’introduction de valeurs intermédiaires est très directe avec Envision, tout comme l’utilisation de ces valeurs par la suite.

Envision met aussi l’accent sur l’aspect compact des tableaux de bord, à peu près comme les feuilles de synthèse dans Excel. Chaque commande show dans Envision définit une « vignette » à afficher dans le tableau de bord et ces vignettes sont alignées sur une grille similaire à celle utilisée par 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)

Le script ci-dessus définit trois vignettes, dont les positions sont A1 : D1, A2 : B2 et C2 : D2, conformément à la convention utilisée dans Excel, avec des lettres pour les colonnes et des chiffres pour les lignes.

Pas de boucle, pas de saut et plus encore

La syntaxe d’Envision est claire et fonctionnelle. Il n’y a pas de boucle, pas de saut et pas de valeur null et, si vous vous posez la question, ce n’est pas un langage Turing-complet. Dans la pratique, ces fonctionnalités ne n’ont pas été écartées, Envision offre simplement des constructions intégrées qui aboutissent aux mêmes résultats de façon bien plus simple. De par l’absence de ces fonctions, il n’y a pas de problèmes difficiles à déboguer et la productivité est bien meilleure.

Essayons d’afficher le volume des ventes des 10 meilleurs produits pour chaque semaine de cette année puis de comparer ces totaux hebdomadaires à ceux de l’année précédente pour les mêmes 10 meilleurs produits. C’est faisable avec les quelques lignes ci-dessous :

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{$}"

De plus, Envision est rapide, extrêmement rapide. Nous avons non seulement réussi à tirer parti d’algorithmes spécifiques au domaine en question (2), mais nous mettons également en mémoire tampon chaque nœud de calcul de nos scripts. Par conséquent, lorsqu’un script légèrement modifié est exécuté, seuls les nœuds qui ont été modifiés dans le calcul sont réévalués. Dans la pratique, une fois que vous saurez ce que c’est de traiter 20 GO de données en 5 secondes, vous ne voudrez plus entendre parler de requêtes SQL.

(2) Nous avons un algorithme de tri par seaux qui est souvent 500 fois plus rapide que les algorithmes de tri rapides plus classiques. En effet, malgré la limite théorique des algorithmes de tri à O (n.log (n)), il est possible de les accélérer 500 fois si la situation est favorable (le tri par date par exemple). Et les situations sont souvent très favorables dans la logistique.