Notre stack technique

Combier Camille
Esker-Labs
Published in
6 min readMar 26, 2019

Nous proposons à nos clients une solution (Esker on Demand) pour les aider à valider des documents critiques pour leur entreprise. C’est une application SaaS sur laquelle nos clients se connectent et peuvent interagir avec leurs clients et/ou fournisseurs autour des documents de gestion. Je détaille dans cet article notre stack technique, avec ses avantages et aussi les améliorations que nous y apportons au quotidien. Je terminerai par un petit retour sur ce que je retiens de mes 7 ans de développement sur ce produit.

Notre SOLUTION en quelques mots

Esker On Demand permet à nos clients de classer, consulter et valider des documents avant leur envoi ou leur intégration dans leur progiciel de gestion intégré (PGI, ou ERP en Anglais). Nous proposons 4 applications qui permettent la validation de documents entrants avant la saisie dans l’ERP (bon de commandes et factures) et de documents sortants (factures et devis).

Par exemple, pour la gestion des bons de commandes, notre solution les récupère depuis différents canaux (web services, email, fax, FTP , AS2, …) et avec des formats variés (pdf, tif, txt, EDI …). Nous pré-traitons ces documents afin de pouvoir les présenter dans notre interface web et les faire valider par le service client. Lors de ce pré-traitement, nous allons par exemple analyser l’image pour reconnaître les champs spécifiques au document ou transférer le document vers les bons utilisateurs.

Des applications ÉVOLUTIVES

Par défaut, nous proposons à nos clients des applications standard permettant de fournir une solution clef en main pour traiter leurs différents types de documents. Ces applications standard sont ensuite configurées par un consultant Eskerien pour l’adapter aux spécificités demandées par le client. Par exemple, en activant l’application “Gestion des factures fournisseurs”, notre consultant obtient ainsi l’ensemble du script spécifique au traitement des factures qu’il va pouvoir modifier et configurer selon les besoins du client. Ces applications sont codées en TypeScript.

Il est possible de mettre à jour nos applications simplement pour permettre à nos clients de bénéficier de nouvelles fonctionnalités. Pour cela, toutes les adaptations réalisées par nos équipes de consultants sont implémentées dans des fonctions spécifiques. Elles ne sont pas modifiées lors d’une montée de version et sont appelées “User Exits”.

Chaque application utilise le même framework métier et est maintenue par des équipes fonctionnelles dédiées. Nous avons plusieurs équipes travaillant sur l’application “Gestion des demandes d’achats”, plusieurs équipes sur “Gestion des factures clients”, etc. Cependant, toutes ces équipes sont composées de développeurs “Full Stack”, ce qui signifie qu’elles peuvent travailler dans toutes les couches du produit, depuis la couche application jusque dans les bases de données.

Un framework métier en JavaScript

Nous avons développé au cours de ces dernières années un framework JavaScript spécialisé dans la manipulation de documents. Nous l’avons conçu complètement adaptable pour être au plus proche des besoins métiers de nos clients.

Il se présente sous la forme d’un écran affichant le document ainsi que l’ensemble des informations extraites et calculées permettant à nos clients de visualiser et de traiter efficacement leurs données métiers. Ce framework permet très simplement d’ajouter des champs, de déplacer des panneaux, de cacher des informations et de réagir à des évènements utilisateurs (clic sur un bouton, focus sur un champ, etc.). Il permet l’exécution de scripts Javascript à différents moments du cycle de vie des documents arrivant sur la plateforme. On va ainsi trouver des scripts pour extraire des informations des documents, d’autres pour vérifier les données validées par l’utilisateur ou alors pour générer de nouveaux formulaires pour d’autres utilisateurs.

Bien évidemment, ces scripts sont adaptés en fonction des documents et des métiers associés. Plus spécifiquement, notre R&D fournit un ensemble de scripts de base pour plusieurs types de documents : bons de commande (entrants), factures clients (sortantes), factures fournisseurs (entrantes), demandes d’achat.

Un backend en C#

La couche serveur est en C#.NET et gère la récupération de toutes les données, les sessions utilisateurs ainsi que toutes les pages communes à toutes les applications. Le principal challenge de notre backend est de conserver un haut niveau de performance car elle doit pouvoir servir des milliers de clients en même temps.
Elle est codée aujourd’hui en .Net Classique mais des prototypes d’utilisation du .Net Core ont déjà commencé.

Le Cœur en C++

Sous notre backend en C#, nous avons de nombreux modules en C++. Nous retrouvons à ce niveau de la stack tous nos projets permettant d’effectuer des conversions d’un format en un autre (Word→PDF, Tif→Png, …) mais aussi des composants chargés de résoudre des problèmes plus complexes.
Par exemple, c’est en C++ que nous avons nos algorithmes d’apprentissage automatique. Ces algorithmes détectent l’apparence du document et sont capables de déduire des règles d’extraction de données des documents des utilisateurs. Ainsi, en validant des documents, nos clients améliorent la reconnaissance automatique pour tous les prochains documents du même “look” qu’ils recevront par la suite.

Un autre exemple de module C++ est notre API. En effet, le code Javascript de nos applications mentionnées plus haut est interprété par un moteur C++ qui lui, réalisera les traitements attendus. Pour cela, on peut aujourd’hui utiliser un moteur WebKit ou Chakra, mais d’autres moteurs pourraient être ajoutés.

C’est aussi en C++ que nous avons développé un module capable de communiquer avec chacune de nos bases de données. Ce module nous permet de créer nos requêtes avec une syntaxe unique (essentiellement à base de filtres LDAP) qu’il traduira en fonction de la base requêtée.

Des bases !

Pour stocker toutes les données de nos clients, nous utilisons de nombreuses bases de données. Nous choisissons les bases en fonction des besoins de nos applications. Aujourd’hui, nous pouvons lister les bases de données suivantes :

  • PostGreSQL : Support d’un très grand nombre de tables, modification d’index non bloquante
  • Redis : Accès ultra rapide en lecture et écriture
  • ElasticSearch : Agrégats rapides sur de grands volumes de données

La mise en production

Cela fait maintenant plusieurs années que nous travaillons sur la création de nouvelles infrastructures dans Azure. Le provisionnement de l’infrastructure est réalisé à l’aide de Terraform, ce qui nous permet de gérer les déploiements dans un mode “Infrastructure as Code”. Pour configurer de nouvelles machines, nous utilisons maintenant Chef. Cela permet de piloter la configuration de nos machines ce qui rend le processus plus automatisé et surtout plus efficace ! L’infrastructure et la solution sont monitorées grace à Prometheus et ElasticSearch qui nous permettent de collecter et d’exploiter de grands volumes de métriques et de logs.

Et du Machine Learning

Enfin, le Machine Learning a aussi trouvé des utilisations pratiques chez nous. Nous avons plusieurs réseaux de neurones en production. L’un d’eux permet par exemple d’aider l’utilisateur à découper des flux de factures scannées par lots afin d’identifier chaque facture unique au sein du lot. Un autre est capable d’identifier si deux documents ont le même “look” et permet d’appliquer les règles d’extraction des données métiers d’un document sur l’autre.
Ces réseaux utilisent TensorFlow et Python.

Note de l’auteur

Difficile de brosser en un article de blog l’ensemble des modules que nous avons sur notre solution. Tous n’ont pas le même niveau de complexité ni les mêmes langages. Ce que j’ai appris en 7 ans chez Esker ? Ce ne sont pas les langages ou les outils qui importent mais ce que j’en fais ! Quel que soit le langage utilisé (JS, TS, C++, C#, …), je peux pratiquer les principes du CleanCode dont la philosophie est indépendante de la technologie. Ce qui me plaît aujourd’hui:

  • Pouvoir collaborer pour trouver la meilleure solution
  • Rendre tout code que j’utilise plus clair et plus simple pour le prochain Eskérien, développeur ou consultant.
  • Intégrer la sécurité et la performance dans tous mes développements dès la conception.
  • Créer un produit qui est utile et qui apporte de la valeur à nos clients.

--

--