Communauté Laravel : tout savoir !

Laravel est bien plus qu’un simple framework PHP ; c’est aussi toute une communauté qui joue un rôle essentiel dans son évolution et son succès. Cette communauté se distingue par son engagement, ses contributions, et ses ressources éducatives qui facilitent l’adoption et l’utilisation du framework. Dans cet article, nous explorerons quelques aspects de la communauté Laravel : les événements, les contributeurs notables, et les nombreuses ressources disponibles pour les développeurs.

Laracon : La Conférence Internationale de Laravel

Laracon est l’événement phare de la communauté Laravel. Cette conférence se tient deux fois par an, historiquement aux États-Unis et en Europe, bien que des éditions en ligne aient eu lieu ces dernières années en raison de la crise sanitaire. Laracon rassemble des développeurs du monde entier pour discuter des dernières nouveautés du framework, partager des expériences et apprendre de nouveaux concepts.

La comunauté Laravel se réunit pour le Laracon EU 2025 Amsterdam

Les sujets abordés lors de Laracon vont au-delà de Laravel et couvrent des thèmes variés du développement web. C’est un lieu de rencontre où les développeurs peuvent non seulement améliorer leurs compétences techniques mais aussi nouer des relations professionnelles et personnelles. L’édition en présentiel de 2024 à Amsterdam a marqué un retour très attendu à une interaction en face-à-face, renforçant encore la cohésion de la communauté.

La prochaine étape à Dallas, Texas, prévue en août 2024 est déjà complète, et nous attendons avec impatience le Laraconn EU 2025 !

Spatie : Un Pilier de l’Open Source Laravel

Spatie est une société belge qui s’est distinguée par la création de nombreux paquets open-source pour Laravel. Ces paquets sont reconnus pour leur qualité et leur utilité, et sont largement utilisés dans la communauté. Parmi les paquets les plus populaires de Spatie, on trouve :

  • spatie/laravel-permission : Ajoute facilement des rôles et des permissions à une application Laravel.
  • spatie/image-optimizer : Optimise les images pour améliorer les performances des sites web.
  • spatie/laravel-activitylog : Enregistre les actions des utilisateurs pour un suivi précis de l’activité.
  • spatie/laravel-backup : Simplifie la mise en place de sauvegardes complètes de l’application.
  • spatie/laravel-medialibrary : Permet d’associer des fichiers médias aux modèles Eloquent.

Ces contributions font de Spatie une référence incontournable dans l’écosystème Laravel. Lisez également notre article sur nos paquets préférés de l’écosystème Laravel.

Laracasts : Apprendre et Maîtriser Laravel

Laracasts est une plateforme éducative dédiée au développement web, avec un focus particulier sur Laravel. Elle propose des screencasts et des tutoriels couvrant une large gamme de sujets, allant de Laravel et PHP à JavaScript, Vue.js, et bien d’autres technologies pertinentes.

communauté laravel découvre laracast pour apprendre et maîtriser laravel

Jeffrey Way, le fondateur de Laracasts, est lui-même un contributeur actif à la communauté Laravel. Ses vidéos sont réputées pour leur clarté et leur pédagogie, rendant l’apprentissage de Laravel accessible même aux débutants. Laracasts est devenu une ressource incontournable pour de nombreux développeurs souhaitant approfondir leurs connaissances et rester à jour avec les meilleures pratiques du développement Laravel.

Laravel News

Le blog le plus complet autour de Laravel ! Laravel News est un incontournable pour les développeurs qui utilisent le framework Laravel. Il propose un large contenu autour des actualités de Laravel, que ce soit la présentation de paquets, la mise en avant d’événements, la centralisation de ressources documentaires, ou encore la description détaillée de toutes les nouvelles versions du framework disponibles. Une newsletter hebdomadaire est disponible, recensant les nouveautés et les meilleures informations de la semaine.
Laravel News est une aubaine pour tous ceux qui veulent faire une veille active autour de l’éco-système Laravel.

Conclusion

Le dynamisme de la communauté Laravel explique aussi le succès de ce framework. Les événements comme Laracon, les ressources éducatives de Laracasts et les nombreux paquets open-source disponibles montrent l’engagement et la passion des développeurs pour améliorer et étendre Laravel. Que vous soyez débutant ou développeur expérimenté, la communauté Laravel offre toutes les ressources pour bien développer.
TheCodingMachine est spécialisé sur Laravel depuis 2025, vous avez un projet en Laravel ? Contactez-nous.

WordPress : 10 optimisations pour l’éco-conception

À l’heure où la réduction de l’empreinte écologique numérique devient une priorité, le concept d’éco-conception s’impose comme un enjeu clé pour les entreprises et les développeurs. Dans ce contexte, WordPress, le CMS le plus utilisé au monde, se retrouve au cœur des débats. Bien que puissant et flexible, WordPress peut parfois être énergivore en termes de ressources, que ce soit par l’utilisation de thèmes lourds, d’extensions mal optimisées ou de pratiques de développement inefficaces.

L’éco-conception WordPress vise à réduire cette consommation d’énergie tout en maintenant une expérience utilisateur optimale. Dans cet article, nous examinerons dix optimisations concrètes qui permettent de concevoir des sites WordPress plus respectueux de l’environnement, tout en garantissant performance et accessibilité.

Optimiser vos images

Sur un site vitrine classique, les images représentent souvent 50 % du poids d’une page. Il y a trois moyens de diminuer l’impact des images : 

  • Les compresser et adapter leur format, le format WebP est recommandé. Pour cela, vous pouvez utiliser des plug-ins dédiés comme WebP Express pour WordPress. 
  • Ne pas charger toutes les images systématiquement. Par exemple dans le cas d’un slider, faire en sorte que l’image ne se télécharge que si l’utilisateur clique sur la flèche pour voir l’image suivante.
  • Limiter tout simplement le nombre d’images sur votre site.

Mettre en place du cache

Les systèmes de cache permettent d’éviter de recharger des éléments déjà téléchargés (ex : des images, des données, …).  Ceci permet d’alléger ou d’éviter les requêtes auprès des serveurs. 

Les navigateurs des visiteurs gèrent leur propre cache. A part quelques options configurables par l’utilisateur, le fonctionnement de ce cache est défini par les paramètres du serveur. Pour des sites vitrines, de nombreuses solutions et plug-ins existent.

Toutefois, mettre en place un système de cache peut être technique et cela dépend du niveau de complexité de votre application : calculs et algorithmes avancés, traitement et envoi d’un grand nombre de données, … Dans ce cas, il s’agira d’un sujet à traiter à part avec votre prestataire dans une logique d’arbitrage coût / bénéfice.

Mettre en place du lazy loading

Le lazy loading ou chargement différé est une technique qui permet de charger les ressources d’un site web en différant le chargement des ressources non critiques, non essentielles, au début du temps de chargement d’une page.

Il s’agit d’une technique qui peut être utilisée pour empêcher un navigateur de charger des ressources non critiques sur une page web lorsqu’il commence à générer la page. Par exemple, cela ne sert à rien de charger à l’arrivée de l’utilisateur une image tout en bas de la page, elle sera téléchargée lorsque l’utilisateur descendra.

Le lazy loading est aussi à rapprocher de la notion de First Contentful Paint expliquée par l’illustration ci-dessous.

GT Metrix - Eco-conception wordpress

Le First Contentful Paint (FCP) mesure le temps entre le clic sur le lien d’un site Internet et le moment où il affiche le premier bit de contenu de la page. Le FCP a été défini par Google comme une donnée de référence de son algorithme de référencement. Mettre en place du lazy loading est donc aussi important pour votre référencement.

Mettre en place du lazy loading n’est pas toujours évident, il s’agit de faire des arbitrages entre ce qui est considéré comme du contenu critique ou non. Sur WordPress, il existe néanmoins des plugins pour mettre en place un lazy loading simple comme par exemple LazyLoad.

Minimiser le code HTML, CSS et JS

Minimiser du code signifie optimiser du code pour gagner de l’espace sans en altérer la fonctionnalité. Concrètement il s’agit de supprimer tous les espaces blancs inutiles, les commentaires, les caractères de nouvelle ligne et tout ce qui rendait initialement le code lisible. Ainsi, une fois qu’il a été minifié, le code devient presque illisible à l’œil nu.

La minification du code est possible dans toutes les technologies de programmation de base, notamment HTML, CSS et JavaScript. Cependant, le processus n’est pas instantané. Un certain travail est nécessaire pour rendre le code plus compact tout en le gardant fonctionnel.
Pour vous aider, il existe des outils de minification spécifique à chaque langage. Vous trouverez une première liste d’outils dans cet article.

Limiter les animations Javascript sur votre site

Evitez les bibliothèques et les frameworks Javascript volumineux, privilégiez des alternatives légères et n’incluez que les parties nécessaires de bibliothèques ou frameworks pour réduire la taille finale du bundle.

Dans le code, évitez aussi les manipulations fréquentes du DOM qui peuvent ralentir votre application. Utilisez des techniques de manipulation de DOM efficaces, comme l’agrégation de modifications avant une mise à jour du DOM ou l’utilisation de Virtual DOM dans des frameworks modernes.

Éviter ou optimiser l’usage de la vidéo

Dans la mesure du possible, il est préférable de ne pas utiliser de vidéo. En revanche si son usage est nécessaire du point de vue de la compréhension du message alors il est très important de l’optimiser. 

Au-delà de la possibilité de compresser cette vidéo pour avoir une qualité adaptée au web, il est également possible de questionner la nature de la vidéo. A-t-elle besoin de faire plus d’une minute alors que de nombreux utilisateurs ont tendance à scroller  sans regarder la vidéo dans son intégralité ? Bref, une vidéo plus courte et mieux ciblée permet une meilleure attention de l’utilisateur et réduit la consommation énergétique.

Il est aussi important de se demander si la vidéo doit se lancer de manière automatique. En effet, il est préférable pour l’expérience utilisateur et l’impact écologique de la page d’insérer une fonction ‘play’ pour que l’utilisateur puisse la lancer seulement si cela est pertinent pour lui.

Désactiver ou optimiser les CRON

CRON est une abréviation de crontab, elle-même une abréviation de chrono table qui signifie table de planification.

Issu du monde Unix, le programme CRON, lancé au démarrage d’un système d’exploitation, permet de planifier l’exécution automatique de tâches avec une certaine fréquence ou à un moment donné. Parmis les tâches les plus régulièrement exécutées via des CRON :

  • Planification d’un job de sauvegarde de votre site (extension BackWPup pour WordPress par exemple).
  • Planification de l’optimisation de la base de données (extension WP-Optimize pour WordPress par exemple).
  • Mise à jour automatique de votre version (de WordPress ou autre),

Bien que la plupart de ces actions restent recommandées, l’exécution de chacune de ces tâches consomme des ressources. Il est donc important de se demander quelle doit en être la bonne fréquence ou s’il est préférable de gérer cela manuellement.

Eviter les iFrames qui s’affiche directement au chargement de la page

Une iframe est un élément HTML qui permet d’intégrer une page web dans une autre page web. Cette méthode permet par exemple d’intégrer une vidéo hébergée sur une plateforme tierce en l’affichant directement sur votre site web. L’exemple le plus répandu est celui d’une vidéo Youtube.

Fonctionner à travers des Iframes ne permet pas d’avoir le contrôle total sur le contenu de l’autre page qui sera affichée. Il est donc possible de se retrouver à charger des fonctionnalités et du contenu inutiles.
Dans le cas des vidéos, il est ainsi recommandé de les héberger vous même sur votre propre site comme expliqué dans cet article.  Enfin, il est important de faire en sorte que les Iframes ne soient affichés et chargés qu’à la demande de l’utilisateur (dans la mesure du possible).

Limiter le recours direct à des services tiers complexes pour des usages simples (ex : Google Map)

GoogleMap est l’exemple le plus répandu. Bien souvent, une simple image / capture d’écran avec votre adresse sur une carte suffira amplement à votre utilisateur. D’autant que, désormais, de nombreux téléphones permettent la reconnaissance automatique d’une adresse dans un texte et l’ouverture automatique de Google Map via un simple clic.

De manière plus générale, pour vous inscrire dans une démarche d’éco-conception, il est nécessaire de vous demander si toutes les fonctionnalités d’un service tiers sont utiles pour le parcours utilisateur visé.

Pour réutiliser l’exemple de GoogleMap :  est-il nécessaire d’avoir les fonctionnalités de calcul d’itinéraire, de gestion des avis ou de géolocalisation si le but est simplement d’afficher une adresse ?

La multiplication des services tiers, des solutions SAAS et la démocratisation des API a néanmoins rendu complexe une telle approche. Il n’est pas toujours évident de savoir et de maîtriser toutes les fonctionnalités d’une application tierce d’autant qu’elles évoluent potentiellement à chaque mise à jour.

Bref, dans une démarche d’éco-conception, une des meilleures solutions semble être encore de limiter au maximum l’usage de ces solutions.

Enfin, certains types d’API, comme GraphQL par exemple, permettent de personnaliser les requêtes afin de ne récupérer que les données nécessaires au besoin de votre utilisateur.

Choisir un hébergeur éco-responsable et bien dimensionner son hébergement

Comme expliqué précédemment, la performance écologique de votre service numérique va en grande partie se traduire par une consommation d’électricité côté client (téléphone et PC de vos utilisateurs) et côté serveur. Pour connaître les émissions associées à celle-ci, il est donc nécessaire d’analyser l’origine de l’électricité consommée. 

Si il est difficile de savoir si vos utilisateurs chargent leur téléphone avec des panneaux solaires, il vous est en revanche possible d’agir côté serveur en choisissant un hébergeur “green”.
Ces hébergeurs utilisent de l’électricité d’origine renouvelable et effectue différentes actions à impact positif (planter des arbres par exemple). Attention toutefois au Green Washing, vous trouverez une approche du sujet dans cet article. Les différentes normes ISO en lien avec l’environnement (ISO 14 001 et ISO 50 001) sont de bonnes preuves de sérieux de la part d’un hébergeur.

En résumé

L’éco-conception WordPress est bien plus qu’une tendance, elle représente un engagement envers une approche plus responsable et durable du développement web. En optimisant l’utilisation de WordPress grâce à des pratiques telles que la réduction du poids des pages, la gestion intelligente des plugins ou encore l’optimisation des médias, il est possible de créer des sites à faible impact environnemental, sans compromettre la qualité. À l’heure où les utilisateurs sont de plus en plus sensibles aux questions écologiques, adopter ces bonnes pratiques peut non seulement améliorer la performance de votre site, mais aussi renforcer l’image éthique et durable de votre marque.

TypeScript : 10 astuces pour gérer les erreurs

Aujourd’hui, TypeScript a le vent en poupe grâce à la consistance et la cohérence que le typage permet d’apporter au code JavaScript. Toutefois, il n’est pas si simple d’exploiter pleinement le potentiel de TypeScript et de son typage.

En effet, une mauvaise implémentation de votre typage et des règles qui lui sont associées entraînent une non-détection des erreurs par le compilateur ainsi qu’un code complexe, difficilement maintenable et refactorable.

Dans cet article, le cofondateur de TheCodingMachine, David Négrier, vous donne ses astuces et outils pour exploiter pleinement le potentiel du typage et éviter les erreurs.

Bref, facilitez-vous la vie avec un code simple, bien construit et facile à retravailler !

Typer, mais pourquoi faire ?

  • Éviter les régressions: en cas de changements du code (refactoring, correction de bugs, ajout de fonctionnalité etc…), le compilateur vous alertera des incohérences ou oublis
  • Gagner du temps: grâce au typage l’IDE est plus pertinent dans ses suggestions d’autocomplétion.

Les outils et les solutions qu’on vous propose

TS-reset

Un paquet qui prend tous les typages codés par défaut (JSON.parse(), …) et remplace le typage any par un typage unknown.

Ceci permet d’être plus stricte dans l’analyse des types et donc remonter une erreur sur ce type de code:

const user = JSON.parse('{"id": 1, "firstName": "John"}')
console.log(user.firstName) // 'user' is of type 'unknown'.

Sans ts-reset aucune erreur ne sera remontée car tout est autorisé sur any. Alors qu’avec le développeur est forcé de vérifier le typage:

const user = JSON.parse('{"id": 1, "firstName": "John"}')
if (
  user instanceof Object
  && 'firstName' in user
  && typeof user.firstName === 'string'
) {
  console.log(user.firstName) // 'user.firstName' is a string.
}

– Créer une interface

Il est important de créer des interfaces pour définir la structure d’un objet avec ses différents champs.

interface User {
  id: number;
  firstName: string;
}

// On ajoute `as User` pour indiquer que cette variable est de type User
const user = JSON.parse('{"id": 1, "firstName": "John"}') as User
console.log(user.firstName) // Affiche "John"

Mais que se passe-t-il si le format change dans le JSON d’origine ?

Par exemple, si on remplace firstName par first_name dans le fichier JSON, un bug est créé et on retrouve ”undefined” dans nos logs (sans message d’erreur). 

Cela est dû au fait que la vérification ne s’effectue pas lors de l’exécution, mais uniquement lors de la compilation. Les interfaces disparaissent dans le code compilé.

L’erreur provient de l’utilisation de as User, le mot clé as en TypeScript permet de définir un “Type Assertion” et donc de forcer, du point de vue du compilateur, le type d’une variable. 
Si le type est faux, l’analyse faite par TypeScript devient incorrecte. L’erreur est humaine et le compilateur a tendance à faire moins d’erreurs. En particulier, lorsque une application complexe évolue au cours du temps. Donc un as dans TypeScript doit toujours être un sujet de vigilance !

– Utiliser les Type predicate

Afin d’éviter le as il faut restreindre (narrow) le type. Une solution lorsqu’on a une interface est d’utiliser un Type predicate:

interface User {
  id: number;
  firstName: string;
}

// On définit un type predicate de la forme `parameterName is Type` 
function isUser(user: any): user is User {
  return user
    && typeof user.id === 'number'
    && typeof user.firstName === 'string'
}

const user = JSON.parse('{"id": 1, "firstName": "John"}')
if (! isUser(user)) { // On appelle le predicate
  throw new Error('Invalid user')
}
console.log(user.firstName) // Ici on est sûr d'avoir un User

Avec ce code, si firstName devient first_name on aura une erreur “Invalid user” au runtime. En effet, le type predicate est conservé et exécuté.

Toutefois, implémenter des types predicate c’est fastidieux et repose toujours sur la responsabilité du développeur qui doit l’implémenter dans son code de manière proactive. 

Il faut aussi être vigilant lors de l’écriture du type predicate pour ne pas faire d’erreur à ce moment-là et bien penser à le mettre à jour lorsqu’on modifie le type lié.

– La librairie Zod

Zod est une libraire qui écrit des types predicate pour nous.
Grâce à elle nous pouvons remplacer le type predicate isUser et définir une variable UserSchema qui est un objet zod:

interface User {
  id: number;
  firstName: string;
}

const UserSchema = z.object({
  id: z.number(),
  firstName: z.string(),
})

const maybeUser = JSON.parse(...)
const user = UserSchema.parse(maybeUser)
// À partir d'ici user est de type `{ id: number, firstName: string }

Zod peut aussi déduire l’interface à partir du Type Guard et on peut donc se passer d’écrire l’interface :

type User = z.infer<typeof UserSchema>

Lors de l’exécution, Zod affichera une erreur détaillé s’il y a un soucis:

ZodError: [{
  "code": "invalid_type",
  "expected": "string",
  "received": "undefined",
  "path": ["firstName"],
  "message": "Required",
}]

Zod est donc particulièrement utile : 

  • Dans les projets Front qui utilisent des inputs venant de l’extérieur, en particulier d’API.
  • dans les projets Back qui utilisent Node.JS, en cas d’input HTTP, d’upload de fichier, d’input CLI ou de réponse d’API, …

Il est néanmoins inutile d’utiliser Zod pour un service qui utilise déjà des données validées (données en provenance d’un Controller par exemple). Dans ce cas, les interfaces peuvent suffir… ou alors il est possible d’utiliser l’inférence propre à TypeScript.
Une autre librairie similaire est valibot.

– Type Inference

TypeScript fait de l’inférence de type. C’est-à-dire qu’en analysant les contraintes appliquées à chaque variable il peut en déduire son type. Ceci évite de devoir tout typer tout le temps :

const a = 1 // a est de type number
const b = [0, 1, null] // b est de type (number | null)[]
const c = a // c est de type number
const d = { id: 1, firstName: "John" } // d est de type { id: number; firstName: string; }
window.onmousedown = function (e) { /* ... */ }; // e est de type MouseEvent

Il est donc possible de se passer d’interface la plupart du temps. Nous recommandons fortement de s’appuyer sur l’inférence de type et utiliser Zod  là où c’est nécessaire pour gagner en efficacité et en maintenabilité de votre code !

GraphQL et le paquet graphql-codegen

L’utilisation de Zod et TypeScript peut être synonyme de verbosité. En effet, pour être correcte nous devrions ré-écrire les structures des objets renvoyés par l’api dans notre code front. Le travail est fait 2 fois: en back et en front.

Contrairement à du JSON, GraphQL définit un schéma, or cela va typer l’API correctement.

Le paquet graphql-codegen est un outil qui va scanner votre code TypeScript et va trouver les requêtes GraphQL à l’intérieur. 

Puis, à partir de ces requêtes et du schéma généré par le serveur, graphql-codegen va générer automatiquement des types TypeScript. 

Néanmoins, mettre en place graphql-codegen nécessite un peu de travail notamment en CI/CD.

– Swagger/OpenAPI (via API Platform)

Dans la même idée, certains framework (type API Platform) permettent de générer les interfaces typescript en fonction des retours des endpoints REST.

Il existe aussi des générateurs pour les standards Swagger/OpenAPI.

– Framework trpc

Il s’agit d’un framework Node.Js dans lequel on définit côté serveur une procédure qui prend un type Zod en input puis côté client on appelle la fonction ce qui permet un typage fort des deux côtés.

Il s’agit de faire des appels RPC entre le serveur et le client.
Hono propose aussi ce genre de fonctionnalité.

Protobuf

Solution plus bas niveau, il s’agit d’un mécanisme de Serialization, un peu comme du JSON mais fortement typé.

On définit des types Protobuf qui génèrent des interfaces TypeScript.

Particulièrement utile pour optimiser les performances car les messages sont compressés de manière binaire.

– No Front, l’approche JS Less

Solution la plus radicale, mais sans Front, la question ne se pose plus ! On appelle cela le JS Less et de nombreuses solutions existent, vous pouvez lire notre article sur le sujet.

Multisituation : La stratégie pour gérer un grand nombre de sites web

Gérer un grand nombre de sites internet peut vite devenir un casse-tête, surtout lorsque chaque site nécessite des mises à jour régulières, une maintenance continue et une sécurité renforcée. Cependant, des solutions existent pour simplifier cette gestion ! Dans cet article, nous allons explorer trois approches différentes pour gérer efficacement un ensemble de sites web, que ce soit pour une petite agence web ou une grande entreprise.

Solution 1 : Utiliser un outil d’administration centralisée

La première solution consiste à utiliser un outil d’administration qui permet de centraliser la gestion de nombreux sites internet. Par exemple, pour WordPress, parmi les outils disponibles sur le marché, WP Umbrella se distingue par sa simplicité d’utilisation et ses nombreuses fonctionnalités.

Pourquoi choisir WP Umbrella ?

WP Umbrella est un service en ligne qui facilite la maintenance et la gestion d’un ensemble de sites WordPress à partir d’un seul tableau de bord. Ce type d’outil est particulièrement utile pour les agences web ou les freelances qui gèrent plusieurs sites pour différents clients.

Voici quelques avantages clés de WP Umbrella

  1. Centralisation des mises à jour : Avec WP Umbrella, vous pouvez mettre à jour tous vos sites WordPress en un clic, qu’il s’agisse des plugins, des thèmes ou du core de WordPress. Cette centralisation permet de gagner un temps précieux et d’éviter les oublis qui peuvent compromettre la sécurité de vos sites.
  2. Surveillance de la performance : WP Umbrella propose également un suivi des performances de chaque site. Vous pouvez surveiller le temps de réponse, la disponibilité, et recevoir des alertes en cas de problème. Cela permet d’intervenir rapidement avant que les utilisateurs finaux ne soient impactés.
  3. Gestion des sauvegardes : La gestion des sauvegardes est un autre atout majeur de WP Umbrella. Vous pouvez planifier des sauvegardes régulières et les stocker sur un service de cloud sécurisé. En cas de problème, la restauration d’un site se fait en quelques clics.

Sécurité renforcée : En utilisant un outil comme WP Umbrella, vous pouvez automatiser des tâches de sécurité telles que le scan de malwares ou la vérification des failles de sécurité. Cela permet de réduire les risques d’attaques sur vos sites.

Gestion de nombreux sites internet avec WP Umbrella

Limitations

Bien que WP Umbrella soit une solution puissante, elle est spécifiquement conçue pour les sites WordPress. Si vous gérez des sites utilisant d’autres CMS ou des technologies différentes, cette solution ne pourra pas centraliser l’administration de tous vos sites.


Solution 2 : Utiliser une image Docker standardisée

La deuxième solution consiste à utiliser une image Docker standardisée pour déployer et gérer vos sites avec un outil CMS unique (WordPress ou autre). Docker est une technologie de conteneurisation qui permet d’isoler chaque application dans un environnement léger et portable. En créant une image Docker standardisée, vous pouvez simplifier le déploiement et la gestion de vos sites.

Avantages d’une image Docker standardisée

  1. Uniformité des environnements : Une image Docker permet de garantir que tous vos sites fonctionnent dans un environnement identique, indépendamment de la machine ou du serveur sur lequel ils sont déployés. Cela élimine les problèmes liés aux différences de configuration entre les environnements de développement, de test et de production.
  2. Facilité de mise à jour : En mettant régulièrement à jour votre image Docker, vous pouvez rapidement déployer ces mises à jour sur tous vos sites. Pour WordPress par exemple, cela inclut les mises à jour du core, des plugins et des thèmes. En automatisant ce processus, vous réduisez le risque d’oublis ou d’erreurs humaines.
  3. Scalabilité : Docker permet de scaler vos sites très facilement. Vous pouvez déployer de nouvelles instances de vos sites en quelques secondes, sans avoir à reconfigurer manuellement chaque serveur. Cela est particulièrement utile lorsque vous devez gérer un grand nombre de sites ou lorsque vous anticipez une augmentation de trafic.
  4. Isolation et sécurité : Chaque conteneur Docker est isolé des autres, ce qui renforce la sécurité. Si un site est compromis, les autres restent protégés. De plus, cette isolation facilite le debugging en cas de problème.

Inconvénients

Cependant, une image Docker standardisée pour WordPress ne permet pas la gestion de sites multi-tenant (multi-locataires). Cela signifie que chaque site doit être déployé dans un conteneur séparé, ce qui peut augmenter les coûts en termes de ressources serveur si vous gérez un très grand nombre de sites.


Solution 3 : Opter pour une solution multi-tenant avec Prismic par exemple

La troisième solution consiste à utiliser une véritable architecture multi-tenant pour gérer un grand nombre de sites. Prismic, un CMS headless populaire, offre une telle solution, permettant de gérer plusieurs sites web à partir d’une seule instance.

Avantages de Prismic pour une gestion multi-tenant

  1. Centralisation des contenus : Prismic permet de centraliser la gestion de contenu pour plusieurs sites. Cela signifie que vous pouvez gérer toutes les pages, articles, et autres contenus depuis une seule interface, tout en les distribuant vers différents sites.
  2. Flexibilité et personnalisation : Avec une solution multi-tenant, chaque site peut avoir sa propre identité visuelle et ses propres fonctionnalités, tout en partageant la même base de contenu. Cela permet de personnaliser l’expérience utilisateur en fonction des besoins spécifiques de chaque marque ou entité.
  3. Références solides : Prismic est utilisé par des entreprises de renommée mondiale comme la Fédération Française de Tennis (FFT) ou LVMH, ce qui démontre sa capacité à gérer des déploiements complexes avec une exigence élevée en termes de performance et de fiabilité.
  4. Sécurité et scalabilité : En tant que solution headless, Prismic offre une séparation claire entre le backend (gestion du contenu) et le frontend (affichage du contenu). Cela permet de renforcer la sécurité et de faciliter la scalabilité. Vous pouvez gérer des centaines de sites sans compromettre la performance.

prismic builder

Limitations

L’une des principales limitations de Prismic réside dans son coût, qui peut être plus élevé que les solutions précédentes, surtout pour les petites entreprises ou les projets à budget limité. De plus, la mise en œuvre d’une solution multi-tenant nécessite une certaine expertise technique, ce qui peut impliquer un temps de mise en place plus long.

Conclusion

Gérer un grand nombre de sites web est parfois complexe, mais les solutions existent pour simplifier cette tâche tout en garantissant une performance optimale. Que vous choisissiez d’utiliser un outil d’administration centralisée comme WP Umbrella, de déployer vos sites via des images Docker standardisées, ou d’opter pour une solution multi-tenant avec Prismic, il est essentiel de bien évaluer vos besoins spécifiques avant de prendre une décision.

Chacune de ces solutions présente des avantages et des inconvénients, mais toutes peuvent vous aider à gérer efficacement un grand nombre de sites, à améliorer leur sécurité, et à assurer leur performance sur le long terme. Le choix de la solution dépendra principalement de votre environnement technologique, de la complexité de vos sites, et de vos ressources disponibles.

Front-End As a Service (FEaaS) : La solution aux complexités Headless

Avec l’émergence des solutions Headless, pas facile de disposer d’un front-end rapidement alors de nouvelles solutions arrivent pour vous simplifier la vie. Chez TheCodingMachine on commence à être fan des solutions Front-End As a service… Découvrez pourquoi :

Le problème d’une plateforme Headless est qu’elle est … Headless !

Lorsque l’on met en œuvre une solution Headless (parce qu’ils présentent de nombreux avantages), difficile de disposer d’un Front-end rapidement ! C’est même le principe… Malheureusement, investir dans le développement d’une interface Front-end entièrement sur-mesure représente un coût souvent assez important : prestation d’un designer, développement HTML et CSS, optimisation du SEO et du responsive design, … Est-ce que cela veut dire que les meilleures solutions du marché sont hors de portée pour les entreprises qui ne disposent pas de budgets conséquents ?

Il est parfois aussi tout simplement difficile de se projeter en partant d’une feuille totalement blanche. C’est particulièrement risqué dans un secteur où une partie des usages sont ancrés et associés à un certain nombre de bonnes pratiques (gestion du panier, des favoris, parcours d’achat,…).

Pour remédier à cela, la plupart des solutions Headless proposent un Front-end basique. C’est le cas de Sylius, par exemple, qui propose une interface Front-end de base reposant sur Twig (moteur de templating basé sur PHP). Bien que cette version standard soit parfaitement adaptée pour des boutiques simples, elle est moins optimisée qu’une vitrine reposant uniquement sur des pures technologies Front-end comme Vue.Js ou React.Js. Ainsi, à moins d’investir sur des développements spécifiques, ce thème standard peut vite atteindre des limites en termes de performances à la fois techniques et SEO.

Bref, il est difficile d’avoir le meilleur des deux mondes ! C’est-à-dire un Front-End (votre vitrine) pouvant évoluer séparément de votre Back-End (votre arrière-boutique) sans développements supplémentaires et des performances optimales.

Front-End As a Service

Heureusement des solutions Front End As a Service émergent …

C’est la problématique à laquelle Alokai (anciennement Vue Storefront) répond. Ce type de solutions sont appelées Front-End As a Service. Le principe du Headless est de pouvoir connecter tous les composants de votre e-commerce (Front, Paiement, ERP, Gestion des stocks,…) à travers des API. Alokai propose donc un Front-end “clé en main” prêt à être connecté au reste de votre éco-système via des API prêtes à l’emploi et respectant toutes les bonnes pratiques.

Les avantages sont nombreux : 

  • Déploiement rapide et sécurisé. La séparation du Front-End et du Back-End permet des mises à jour et des améliorations indépendantes, réduisant ainsi les temps d’arrêt et les risques d’erreurs ;
  • Migration progressive de votre e-commerce, plus besoin de tout bouleverser pour simplement changer de vitrine. Redonnez le pouvoir à vos équipes marketing ! Vous pouvez même offrir des expériences utilisateur personnalisées en utilisant des données comportementales et de navigation pour adapter le contenu ;
  • Optimisation conséquente des performances techniques avec l’usage de technologies adaptées comme Vue.Js et Nuxt.Js qui permettent par exemple un chargement asynchrone ou le lazy loading ou bien encore l’optimisation des images voire la gestion simplifiée de la logique de cache ;
  • Un mode Progressive Web Application directement disponible afin d’améliorer le responsive design et l’expérience mobile ;
  • L’optimisation du SEO grâce à la génération côté Front.

Chez TheCodingMachine nous sommes assez convaincus par ces solutions Front-End as a Service et c’est pourquoi nous avons décidé de faire un socle technique (Sylius + Alokai) prêt à l’emploi. On peut alors aller vite, très vite pour le déploiement d’une solution toute nouvelle.

Et, cerise sur le gâteau, ces solutions peuvent aussi fonctionner si l’on a envie de cacher des vieilleries (vous n’auriez pas un Drupal ou un Magento 1 qui trainent ?)…

Bref, si vous souhaitez en discuter avec nous, nous serions ravis de vous présenter ce que l’on peut faire et vous faire une démonstration.

Langchain : Comment générer des requêtes SQL avec le Langage Naturel

Google Colab link

Introduction

Lors d’un échange avec l’un de nos clients, la question de l’automatisation des requêtes SQL est rapidement devenue un sujet de discussion. Notre client nous a fait part du gain de temps potentiel en adoptant une approche où les requêtes SQL pourraient être générées à partir de questions formulées en langage naturel. Intrigués par cette perspective, nous avons décidé d’explorer cette piste.

Afin d’utiliser des LLM (Grand modèle de langage) tout en ayant une structure modulaire et évolutive, notre choix s’est naturellement porté sur le framework Langchain qui semble être l’étoile montante des frameworks IA.

Langchain est une bibliothèque qui utilise le traitement du langage naturel (NLP) qui permet en partie de convertir des phrases en requêtes SQL. Cette approche promet de simplifier l’accès aux données pour les utilisateurs non techniques, tout en améliorant l’efficacité des processus d’analyse de données.

Chez The Coding Machine, nous avons exploré différentes options afin d’automatiser et simplifier nos workflows liés à la gestion des données, notamment dans le cas de multiples statistiques sur une base de données client. Après avoir examiné les avantages potentiels de Langchain, nous avons décidé de mettre ce framework à l’épreuve en utilisant la base de données open source Chinook. Cet article a pour ambition de vous guider à travers notre expérience, en détaillant comment nous avons configuré notre environnement de travail avec Google Colab et Jupyter Notebook.

Notre objectif est de partager cette expérience afin que d’autres puissent tirer parti de ces outils pour améliorer leurs propres processus d’analyse et de gestion des données. Que vous soyez analyste de données, ingénieur ou simplement curieux des nouvelles technologies, cet article vous fournira des outils pratiques pour optimiser votre utilisation des bases de données.

Pourquoi utiliser LangChain ?

Pour répondre à cette question, je vous invite à aller lire l’article d’introduction qui traite de la génération de requêtes depuis un modèle d’intelligence artificielle.

Présentation de la Base de Données Chinook

1. Qu’est-ce que Chinook_DB ?

Chinook_DB est une base de données open source largement utilisée dans l’enseignement et les exemples pratiques de gestion de bases de données relationnelles. Initialement conçue pour représenter un magasin de musique en ligne, Chinook_DB offre une structure de données réaliste et plus ou moins complexe, idéale pour simuler des scénarios réels d’interrogation et d’analyse de données.

Cette base de données comprend plusieurs tables interconnectées représentant divers aspects d’une entreprise de vente de musique. Voici quelques-unes des principales tables et leurs relations :

  • Albums : Contient des informations sur les albums disponibles à la vente.
  • Artistes : Liste des artistes associés à chaque album.
  • Clients : Informations sur les clients qui ont acheté des albums.
  • Commandes : Détails de chaque commande effectuée par les clients.
  • Pistes audio : Liste des pistes audio disponibles à la vente, avec des informations telles que le nom, la durée et l’album auquel elles appartiennent.
  • Employés : Détails sur les employés de l’entreprise.

Chinook_DB est structurée de manière à refléter les relations typiques entre les entités dans une plateforme e-commerce de musique.

2. Utilité de Chinook_DB

Chinook_DB est particulièrement utile pour les démonstrations et les apprentissages pratiques dans le domaine de la gestion de bases de données relationnelles. En raison de sa structure bien définie et de ses données réalistes, Chinook_DB permet aux utilisateurs d’explorer des requêtes SQL et de simuler divers scénarios d’analyse de données. Dans le cadre de notre exploration de Langchain et la génération de requêtes SQL, Chinook_DB offre un environnement idéal pour illustrer l’efficacité et la précision de Langchain dans la transformation des questions en langage naturel en requêtes SQL fonctionnelles.

3. Modèle de données

Langchain - modèle de données Chinook

Environnement de développement

La mise en place d’un environnement de développement est important afin d’explorer efficacement les capacités de Langchain dans la génération de requêtes SQL à partir de langage naturel. Dans cette partie, nous détaillerons les étapes pour configurer votre environnement de travail avec Google Colab et Jupyter Notebook, deux plateformes populaires pour le développement interactif en Python.

1. Choix de l’environnement

Google Colab (cloud) : Google Colab est un service de notebook Jupyter hébergé par Google qui permet d’écrire et d’exécuter du code Python dans le cloud, sans nécessiter de configuration locale. Il offre un accès gratuit à des processeurs et de la RAM pour des calculs intensifs, ce qui peut être avantageux pour le traitement de données volumineuses.

Jupyter Notebook (local) : Jupyter Notebook est une application web open source qui vous permet de créer et de partager des documents contenant du code, des équations, des visualisations et du texte explicatif. Il est idéal pour le développement interactif et l’analyse de données.

En optant pour Google Colab et Jupyter Notebook, nous avons choisi des outils qui non seulement facilitent le développement et le débogage, mais qui améliorent aussi la documentation, la collaboration. Ces plateformes offrent des avantages significatifs par rapport à l’utilisation de fichiers Python séparés, rendant le processus de test et de mise en œuvre de Langchain plus efficace et plus convivial.

2. Installation des outils

Pour commencer, assurez-vous d’avoir un compte Google pour utiliser Google Colab et d’avoir installé Python sur votre machine pour Jupyter Notebook. Voici les étapes générales pour configurer votre environnement :

Google Colab

1. Ouvrez un navigateur web et accédez à Google Colab
2. Créez un nouveau notebook ou importez un notebook existant depuis Google Drive ou GitHub

Avantages :

– Python est disponible en dernière version et il est très simple d’installer des librairies (“!pip install langchain” par exemple)

– Pas besoin d’un environnement local

– Partage et collaboration simplifié

Jupyter Notebook

1. Installez Jupyter Notebook en utilisant pip si ce n’est pas déjà fait (Les frameworks populaire tel que JetBrains ou Visual Studio ont des modules pour Jupyter)
2. Jupyter pourra alors être complètement intégré à votre IDE

Avantages :

– Pas de dépendance au cloud

– Moins de déconnexion intempestive

– Un environnement local plus souple et maîtrisable

Pratique : Mise en place technique

Dans cette partie, nous allons voir comment utiliser Langchain concrètement étape par étape. L’objectif de cet article est d’arriver à un résultat où nous pourrons poser une question naturelle et le modèle devra nous répondre une requête SQL fonctionnelle puis l’exécuter directement afin d’avoir le résultat.

Notez que nous allons aborder une infime partie de ce que propose Langchain cependant nous ne pouvons pas couvrir la totalité dans cet article, si ce framework vous intéresse, rendez-vous sur la documentation officielle.

⚠️ Attention ⚠️
Comme le précise Langchain, connecter une base de données de production à un LLM n’est pas sans risque, des instructions DML pourraient sans doute être exécutées par une personne malveillante. Il est donc très important de mettre en place une stratégie de sécurité :
– Dupliquer la base de données avec une lecture seule (Master / slave par exemple)
– Anonymiser les informations critiques tels que les users (Données personnelles, mots de passes, etc.) ou les API key

Avant d’aller plus loin, voici les éléments que nous allons aborder :

1. L’utilisation du Toolkit SQL Database

Un toolkit est un ensemble de tools qui permettent d’exécuter un groupe de fonction mis à disposition. Dans notre exemple, le Toolkit SQL Database va nous permettre d’avoir un ensemble de fonctions pré paramétré et notamment avec des prompts déjà mis en place.

2. L’utilisation d’un agent

L’agent, dans notre contexte, est un module proposé par Langchain qui agit comme un intermédiaire entre l’utilisateur et la base de données. Il est capable de comprendre des requêtes en langage naturel, de les traduire en requêtes SQL en suivant les fonctions mise à disposition par le Toolkit.

3. L’utilisation de LangSmith

LangSmith va nous permettre d’avoir une visibilité sur l’utilisation de Langchain, nombres de tokens par requête, coûts, organisation des fonctions, input, output, etc.
Cela permet de déboguer plus facilement du code.

Pour la suite de cet article nous allons utiliser Google Colab, ce qui permettra de vous partager le Notebook de cet article

Installation des paquets

Cette ligne installera tous les paquets nécessaires au code que nous allons utiliser.

!pip install langchain langchain-openai langchain_experimental

Note : Le ! devant pip dans Google Colab est utilisé pour exécuter des commandes de shell directement depuis une cellule du notebook. En mettant !pip, vous dites à Google Colab d’exécuter la commande pip

Variable d’environnement

Google Colab met à disposition un gestionnaire de clés, vous pouvez donc renseigner de façon sécurisée vos secrets et les appeler directement dans le code.

# Getting env variables from Google Colab secrets
from google.colab import userdata
import os

# OpenAI key 
os.environ["OPENAI_API_KEY"] = userdata.get('OPENAI_API_KEY')
# LangSmith
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = userdata.get('LANGCHAIN_API_KEY')

Initialisation de la base de données

Nous allons vérifier que la base de données existe car Colab supprime très régulièrement les données. Si vous souhaitez persister vos données, regardez l’intégration Colab de Google Drive.

from langchain.sql_database import SQLDatabase

db_path = "[path]/chinook_data.db"
if not os.path.exists(db_path):
    raise FileNotFoundError("Database file not found.")

db = SQLDatabase.from_uri(f"sqlite:///{db_path}")

Nous allons maintenant instancier notre classe Chat model afin de traiter la demande de l’utilisateur. LangChain va maintenant nous permettre de créer un agent, celui-ci pourra appeler à de multiples reprises le chat model ainsi que la base de données.

from langchain_openai import ChatOpenAI
from langchain_community.agent_toolkits import create_sql_agent

# Instanciate the class ChatOpenAI
chat_model = ChatOpenAI(model_name='gpt-4o', temperature=0.5)

# Create a new sql agent
agent_executor = create_sql_agent(model, db=db, agent_type="openai-tools", verbose=True)

# Run the user query
agent_executor.invoke("How much artists are in the db ?")

Nous sommes maintenant prêts à réaliser quelques tests. Le paramètre “verbose” va nous permettre de consulter le chemin parcouru par notre Toolkit pour arriver à un résultat. Notez qu’il est également possible (et recommandé) de consulter ce parcours sur LangSmith.

Nous allons prendre pour exemple un cas simple pour l’instant, nous voulons savoir combien d’artistes sont présents dans la base de données.

Notre question sera donc : How many artists are in the db ?

Note : Les tests semblent montrer que les requêtes peuvent être écrites en Français mais nous le ferons en anglais dans cet article

La question est simple, si nous reprenons notre modèle de données, il n’y aucune relation, voici donc la requête :

SELECT COUNT(*) FROM artists;

Lançons maintenant le script :

> Entering new SQL Agent Executor chain...

Invoking: `sql_db_list_tables` with `{}`


albums, artists, customers, employees, genres, invoice_items, invoices, media_types, playlist_track, playlists, tracks

Invoking: `sql_db_schema` with `{'table_names': 'artists'}`

CREATE TABLE artists (
	"ArtistId" INTEGER NOT NULL, 
	"Name" NVARCHAR(120), 
	PRIMARY KEY ("ArtistId")
)

/*
3 rows from artists table:
ArtistId	Name
1	AC/DC
2	Accept
3	Aerosmith
*/

Invoking: `sql_db_query_checker` with `{'query': 'SELECT COUNT(*) as artist_count FROM artists;'}`


```sql
SELECT COUNT(*) as artist_count FROM artists;
```

Invoking: `sql_db_query` with `{'query': 'SELECT COUNT(*) as artist_count FROM artists;'}`


[(275,)]There are 275 artists in the database.

> Finished chain.
{
  'input': 'How much artists are in the db ?',
  'output': 'There are 275 artists in the database.'
}

Le résultat est cohérent et celui attendu. Nous pouvons voir les différentes fonctions utilisées par notre toolkit. Pour aller plus loin, allons jeter un oeil sur LangSmith.

Capture décran 2024 06 27 à 14.38.39

Sans rentrer dans les détails, cela fera peut être l’objet d’un article sur ce sujet, mais nous pouvons constater que 4 différentes fonctions avec des tâches bien précises sont appelées.

1. sql_db_query

Cette fonction a pour objectif de recevoir une requête SQL correcte (syntaxiquement parlant) et de l’exécuter. Dès lors que l’exécution de celle-ci renvoie une erreur, le prompt précise qu’il doit essayer de réécrire la requête.

Si un problème de “Unknown column” est présent, alors il faut rappeler la fonction “sql_db_schema” afin de vérifier le schéma.

Dans le cas où l’exécution de la requête est un problème de syntaxe SQL, alors il rappelle “sql_db_query_checker” et tente de réécrire la requête.

2. sql_db_schema

Cette fonction a pour objectif de recevoir en entrée une liste de tables séparées par des virgules. La sortie est le schéma et les lignes d’exemples des tables de l’entrée.

Une vérification peut être faite afin de vérifier que les tables existent en appelant “sql_db_list_tables”

3. sql_db_list_tables

Renvoie toutes les tables de la base de données.

4. sql_db_query_checker

Cette fonction est appelée avant l’exécution de la requête SQL afin de vérifier sa syntaxe.

Note : Il faut bien comprendre ici que les Tools (ou fonctions) sont appelées par le LLM. Il est capable de comprendre une question et/ou un problème et donc d’appeler un tool en fonction du problème rencontré.

Allons un peu plus loin maintenant, si nous analysons notre modèle de données, l’idéal serait d’avoir une demande qui recherche dans plus de trois tables différentes pour ajouter un peu de complexité.

Imaginons que nous souhaitions connaître les clients les plus éclectiques, cherchons ceux qui ont acheté des pistes dans plus de 9 genres musicaux différents et calculons combien ils ont dépensé au total. Idéalement, nous souhaiterions avoir les clients avec le plus de genres affichés en premier.

Voici le prompt : Identify customers who purchased tracks from more than nine different genres, calculate the total amount spent by these customers and sort the result by highest number of genre

Voici l’output de l’agent : 

> Entering new SQL Agent Executor chain...

Invoking: `sql_db_list_tables` with `{}`


albums, artists, customers, employees, genres, invoice_items, invoices, media_types, playlist_track, playlists, tracks
Invoking: `sql_db_schema` with `{'table_names': 'customers, genres, invoice_items, invoices, tracks'}`



CREATE TABLE customers (
	"CustomerId" INTEGER NOT NULL, 
	"FirstName" NVARCHAR(40) NOT NULL, 
	"LastName" NVARCHAR(20) NOT NULL, 
	"Company" NVARCHAR(80), 
	"Address" NVARCHAR(70), 
	"City" NVARCHAR(40), 
	"State" NVARCHAR(40), 
	"Country" NVARCHAR(40), 
	"PostalCode" NVARCHAR(10), 
	"Phone" NVARCHAR(24), 
	"Fax" NVARCHAR(24), 
	"Email" NVARCHAR(60) NOT NULL, 
	"SupportRepId" INTEGER, 
	PRIMARY KEY ("CustomerId"), 
	FOREIGN KEY("SupportRepId") REFERENCES employees ("EmployeeId")
)

/*
3 rows from customers table:
CustomerId	FirstName	LastName	Company	Address	City	State	Country	PostalCode	Phone	Fax	Email	SupportRepId
1	Luís	Gonçalves	Embraer - Empresa Brasileira de Aeronáutica S.A.	Av. Brigadeiro Faria Lima, 2170	São José dos Campos	SP	Brazil	12227-000	+55 (12) 3923-5555	+55 (12) 3923-5566	luisg@embraer.com.br	3
2	Leonie	Köhler	None	Theodor-Heuss-Straße 34	Stuttgart	None	Germany	70174	+49 0711 2842222	None	leonekohler@surfeu.de	5
3	François	Tremblay	None	1498 rue Bélanger	Montréal	QC	Canada	H2G 1A7	+1 (514) 721-4711	None	ftremblay@gmail.com	3
*/


CREATE TABLE genres (
	"GenreId" INTEGER NOT NULL, 
	"Name" NVARCHAR(120), 
	PRIMARY KEY ("GenreId")
)

/*
3 rows from genres table:
GenreId	Name
1	Rock
2	Jazz
3	Metal
*/


CREATE TABLE invoice_items (
	"InvoiceLineId" INTEGER NOT NULL, 
	"InvoiceId" INTEGER NOT NULL, 
	"TrackId" INTEGER NOT NULL, 
	"UnitPrice" NUMERIC(10, 2) NOT NULL, 
	"Quantity" INTEGER NOT NULL, 
	PRIMARY KEY ("InvoiceLineId"), 
	FOREIGN KEY("TrackId") REFERENCES tracks ("TrackId"), 
	FOREIGN KEY("InvoiceId") REFERENCES invoices ("InvoiceId")
)

/*
3 rows from invoice_items table:
InvoiceLineId	InvoiceId	TrackId	UnitPrice	Quantity
1	1	2	0.99	1
2	1	4	0.99	1
3	2	6	0.99	1
*/


CREATE TABLE invoices (
	"InvoiceId" INTEGER NOT NULL, 
	"CustomerId" INTEGER NOT NULL, 
	"InvoiceDate" DATETIME NOT NULL, 
	"BillingAddress" NVARCHAR(70), 
	"BillingCity" NVARCHAR(40), 
	"BillingState" NVARCHAR(40), 
	"BillingCountry" NVARCHAR(40), 
	"BillingPostalCode" NVARCHAR(10), 
	"Total" NUMERIC(10, 2) NOT NULL, 
	PRIMARY KEY ("InvoiceId"), 
	FOREIGN KEY("CustomerId") REFERENCES customers ("CustomerId")
)

/*
3 rows from invoices table:
InvoiceId	CustomerId	InvoiceDate	BillingAddress	BillingCity	BillingState	BillingCountry	BillingPostalCode	Total
1	2	2009-01-01 00:00:00	Theodor-Heuss-Straße 34	Stuttgart	None	Germany	70174	1.98
2	4	2009-01-02 00:00:00	Ullevålsveien 14	Oslo	None	Norway	0171	3.96
3	8	2009-01-03 00:00:00	Grétrystraat 63	Brussels	None	Belgium	1000	5.94
*/


CREATE TABLE tracks (
	"TrackId" INTEGER NOT NULL, 
	"Name" NVARCHAR(200) NOT NULL, 
	"AlbumId" INTEGER, 
	"MediaTypeId" INTEGER NOT NULL, 
	"GenreId" INTEGER, 
	"Composer" NVARCHAR(220), 
	"Milliseconds" INTEGER NOT NULL, 
	"Bytes" INTEGER, 
	"UnitPrice" NUMERIC(10, 2) NOT NULL, 
	PRIMARY KEY ("TrackId"), 
	FOREIGN KEY("MediaTypeId") REFERENCES media_types ("MediaTypeId"), 
	FOREIGN KEY("GenreId") REFERENCES genres ("GenreId"), 
	FOREIGN KEY("AlbumId") REFERENCES albums ("AlbumId")
)

/*
3 rows from tracks table:
TrackId	Name	AlbumId	MediaTypeId	GenreId	Composer	Milliseconds	Bytes	UnitPrice
1	For Those About To Rock (We Salute You)	1	1	1	Angus Young, Malcolm Young, Brian Johnson	343719	11170334	0.99
2	Balls to the Wall	2	2	1	None	342562	5510424	0.99
3	Fast As a Shark	3	2	1	F. Baltes, S. Kaufman, U. Dirkscneider & W. Hoffman	230619	3990994	0.99
*/
Invoking: `sql_db_query_checker` with `{'query': 'SELECT c.CustomerId, c.FirstName, c.LastName, COUNT(DISTINCT t.GenreId) AS GenreCount, SUM(i.Total) AS TotalSpent\nFROM customers c\nJOIN invoices i ON c.CustomerId = i.CustomerId\nJOIN invoice_items ii ON i.InvoiceId = ii.InvoiceId\nJOIN tracks t ON ii.TrackId = t.TrackId\nGROUP BY c.CustomerId, c.FirstName, c.LastName\nHAVING GenreCount > 9\nORDER BY GenreCount DESC\nLIMIT 10;'}`

responded: To identify customers who purchased tracks from more than nine different genres and calculate the total amount spent by these customers, I need to join several tables and perform the necessary aggregations.

Here's the plan:
1. Join the `customers`, `invoices`, `invoice_items`, and `tracks` tables to get the necessary data.
2. Group by `CustomerId` and count the distinct `GenreId` for each customer.
3. Filter out customers who purchased from more than nine different genres.
4. Calculate the total amount spent by these customers.
5. Sort the results by the highest number of genres.

Let's write and check the query.

```sql
SELECT c.CustomerId, c.FirstName, c.LastName, COUNT(DISTINCT t.GenreId) AS GenreCount, SUM(i.Total) AS TotalSpent
FROM customers c
JOIN invoices i ON c.CustomerId = i.CustomerId
JOIN invoice_items ii ON i.InvoiceId = ii.InvoiceId
JOIN tracks t ON ii.TrackId = t.TrackId
GROUP BY c.CustomerId, c.FirstName, c.LastName
HAVING GenreCount > 9
ORDER BY GenreCount DESC
LIMIT 10;
```
Invoking: `sql_db_query` with `{'query': 'SELECT c.CustomerId, c.FirstName, c.LastName, COUNT(DISTINCT t.GenreId) AS GenreCount, SUM(i.Total) AS TotalSpent\nFROM customers c\nJOIN invoices i ON c.CustomerId = i.CustomerId\nJOIN invoice_items ii ON i.InvoiceId = ii.InvoiceId\nJOIN tracks t ON ii.TrackId = t.TrackId\nGROUP BY c.CustomerId, c.FirstName, c.LastName\nHAVING GenreCount > 9\nORDER BY GenreCount DESC\nLIMIT 10;'}`


[(57, 'Luis', 'Rojas', 12, 415.6200000000001), (45, 'Ladislav', 'Kovács', 11, 446.6200000000003), (3, 'François', 'Tremblay', 10, 338.62000000000006), (14, 'Mark', 'Philips', 10, 334.6200000000001), (17, 'Jack', 'Smith', 10, 352.62000000000035), (24, 'Frank', 'Ralston', 10, 378.6200000000001), (34, 'João', 'Fernandes', 10, 352.62000000000035), (37, 'Fynn', 'Zimmermann', 10, 388.6200000000001)]Here are the customers who purchased tracks from more than nine different genres, along with the total amount they spent, sorted by the highest number of genres:

1. **Luis Rojas** - Purchased from 12 genres, Total Spent: $415.62
2. **Ladislav Kovács** - Purchased from 11 genres, Total Spent: $446.62
3. **François Tremblay** - Purchased from 10 genres, Total Spent: $338.62
4. **Mark Philips** - Purchased from 10 genres, Total Spent: $334.62
5. **Jack Smith** - Purchased from 10 genres, Total Spent: $352.62
6. **Frank Ralston** - Purchased from 10 genres, Total Spent: $378.62
7. **João Fernandes** - Purchased from 10 genres, Total Spent: $352.62
8. **Fynn Zimmermann** - Purchased from 10 genres, Total Spent: $388.62

Ce cas est très intéressant, car la réponse n’est pas bonne.

Notez qu’il y a une subtilité, dans cette base de données les informations financières sont gérées dans deux tables différentes, invoices et invoice_items.

Capture décran 2024 07 08 à 09.57.09

Invoice_items correspond à l’achat d’une piste. Si un client achète 2 pistes, nous aurons alors 2 lignes liées à invoices.

Pour illustrer cet exemple, prenons un cas concret de la base de données, la facture id 1 a deux lignes rattachées donc un client a acheté 2 pistes pour un prix unitaire de 0,99 €. Nous avons donc 1,98 € dans la colonne du total de la ligne invoices.

Capture décran 2024 07 08 à 10.02.37
Capture décran 2024 07 08 à 10.02.48

Lorsque nous réalisons une requête, si nous ne regroupons pas les résultats (GROUP BY), nous aurons alors les lignes invoices dupliquées autant de fois qu’il y a de ligne invoice_items rattachées. Utiliser alors la fonction SUM ne donnera pas le bon résultat, ce qui est notre problème actuellement.

Si j’exécute cette requête nous pouvons constater ce résultat

SELECT i.* FROM invoices i
LEFT JOIN invoice_items ii ON i.InvoiceId=ii.InvoiceId
WHERE i.InvoiceId=1
Capture décran 2024 07 08 à 10.05.56

Faire un SUM sur Total n’est pas absolument pas la bonne solution.

Si nous reprenons le résultat de notre requête SQL nous pouvons constater que Luis Rojas a dépensé 415,62 €. Ce montant provient de cette fonction SUM(i.Total) AS TotalSpent

Le fait d’avoir écrit the total amount spent by, le LLM se base donc sur la colonne total.

Nous ne pouvons pas maîtriser parfaitement l’interprétation du LLM et c’est d’ailleurs tout son intérêt, nous avons donc trouvé une solution afin de corriger ce petit problème.

L’agent utilisé est “create_sql_agent » et il prend en paramètre un suffixe. Nous pouvons donc créer un prompt complémentaire qui ajoute des instructions spécifiques.

Nous pouvons ajouter le code suivant :

[...]

suffix = """
  Here is some additionnal information about the database, 
  there are two tables that deal with the subject of financial amount. 
  The 'Invoices' table and the 'Invoice_items' table. You must always 
  rely on the 'quantity' and 'UnitPrice' columns in order to make 
  calculations relating to a financial aspect. You should NEVER 
  use the 'Total' column of the 'Invoices' table. Use this information 
  only when necessary.
"""

agent_executor = create_sql_agent(model, db=db, agent_type="openai-tools", verbose=True, suffix=suffix)

[...]

Nous précisons au LLM la subtilité de cette base en ce qui concerne l’aspect financier de la demande. A présent, dès lors que nous demanderons au LLM une information financière, il utilisera cette fonction SUM(ii.UnitPrice * ii.Quantity)

Après avoir relancé le même prompt avec ce changement, voici notre résultat, qui lui est correct !

1. **Luis Rojas** - Purchased from 12 genres, Total Amount Spent: $46.62
2. **Ladislav Kovács** - Purchased from 11 genres, Total Amount Spent: $45.62
3. **François Tremblay** - Purchased from 10 genres, Total Amount Spent: $39.62
4. **Mark Philips** - Purchased from 10 genres, Total Amount Spent: $37.62
5. **Jack Smith** - Purchased from 10 genres, Total Amount Spent: $39.62
6. **Frank Ralston** - Purchased from 10 genres, Total Amount Spent: $43.62
7. **João Fernandes** - Purchased from 10 genres, Total Amount Spent: $39.62
8. **Fynn Zimmermann** - Purchased from 10 genres, Total Amount Spent: $43.62

Conclusion

Les résultats sont plutôt bons, les requêtes sont construites de manière cohérente. Cependant, il faut prendre en compte le nom des tables ainsi que des colonnes de la base de données.

En effet, le modèle de langage interprète les demandes et recherche des cohérences dans le nom des tables et des colonnes. Si les tables sont mal nommées, cela ne fonctionnera pas.

Modifier ces éléments dans une base de données existante peut se révéler assez complexe. Comme vu précédemment, il est donc possible d’ajouter du contexte au LLM afin de créer une logique entre les tables et les colonnes.

Il devient donc très intéressant de travailler par itération sur une base de données existante et les résultats pourront être satisfaisants.

Merci d’avoir suivi cet article, afin de tester par vos propres moyens, vous trouverez le lien ci-dessous afin de tester par vous même.

Google Colab link

Merci à Alexis PREVOT, directeur de notre filiale Lyonnaise pour cet article.

IA : Que faire ? Comment faire ?

Deux questions se posent rapidement lorsque l’on parle d’IA : que faire et comment faire ! Déjà le « que faire » n’est pas si évident parce nous sommes habitués à réfléchir en termes de processus ou de données et assez peu de manière globale. Alors, même si vous pouvez trouver beaucoup de uses case sur le web, difficile de les faire correspondre à sa problématique. 

Ensuite, le « comment faire » n’est pas si évident non plus. Faire de la recherche pure n’est pas à la portée de toutes les bourses ! Heureusement, de nombreux outils se développent et vous permettent d’intégrer l’IA de plus en plus facilement. 

Alors cet article vous propose de répondre à ces questions de manière très pratique. Vous allez savoir quoi faire et comment le faire !

La génération de contenus

La génération de contenu est l’application la plus répandue de l’IA. Grâce à des modèles avancés comme GPT-3.5 et GPT-4, vous pouvez automatiser la création de textes, d’images, et autres formats de contenu à partir de simples prompts.

Que faire : 

Recherchez ce que vous produisez comme contenu, avec par exemple : marketing (articles ou publication sur les réseaux sociaux), RH (les fiches de poste par exemple), eCommerce (descriptions de produits)… 

Comment faire : 

  • OpenAI GPT : Offrant une API, les modèles GPT peuvent générer du contenu textuel de haute qualité. GPT-3.5 Turbo et GPT-4o sont accessibles gratuitement via ChatGPT pour des tests, permettant aux développeurs de se familiariser avec les capacités de ces modèles avant une intégration complète.
  • Mistral AI : Ce modèle propose une variété de versions open source et commerciales. Les modèles open source tels que Mistral 7B sont idéaux pour les projets nécessitant un haut niveau de personnalisation sans coût élevé.

Reconnaissance vocale, homme réalisant une recherche par commande vocale

La reconnaissance vocale et la synthèse vocale

La reconnaissance vocale permet d’améliorer l’accessibilité et l’interaction utilisateur. Elle effectue la transcription automatique de discours, la commande vocale, et l’ajout de sous-titres.

Que faire ?

Soit vous souhaitez améliorer l’accessibilité de vos outils (et c’est une très bonne intention mais c’est un peu limité), soit vous souhaitez permettre aux utilisateurs de contrôler des applications ou des appareils par la voix. Et ça, on peut dire que c’est un domaine tout neuf ! On pourrait tout à fait imaginer remplacer un fastidieux formulaire de rapport d’intervention (avec un gros formulaire au format mobile) par une vraie discussion vocale homme-machine : 

“ Bonjour Jean-Paul, vous êtes bien à tel endroit ? (le mobile est géolocalisé) 

  • Oui, 
  • Vous avez effectué un remplacement du moteur auxiliaire ? (l’application dispose de la liste des interventions)
  • Finalement, non, il y avait juste un fusible à changer
  • ….”

On n’est plus si loin de la Science-fiction !

Comment faire ?

  • Google speech-to-text ou text-to-speech : Avec une API supportant 165 langues, ce service est parfait pour les applications globales. Il propose des modèles spécialisés pour différents types d’audio, comme les appels téléphoniques ou le secteur médical.
  • Whisper : Ce modèle open source de reconnaissance vocale offre une API flexible et fonctionne avec des fichiers et des prompts optionnels, facilitant son intégration dans divers systèmes.
  • TTS (Text-to-Speech) : Ce modèle propose des API pour convertir des textes courts (jusqu’à 4096 caractères) en audio, avec plusieurs choix de voix, idéal pour les notifications ou les assistants personnels.

Analyse de documents

L’IA peut automatiser l’analyse et l’extraction de données à partir de documents, c’est pas mal lorsque vous devez traiter une grande quantité de documents.

Que faire ?

  • Automatiser l’extraction de données de factures, contrats, et autres documents peut considérablement réduire les erreurs et le temps de traitement si vous devez les intégrer dans votre système de gestion.
  • l’IA peut aussi faciliter la recherche d’informations spécifiques dans une grande base de documents (vous pouvez aussi réfléchir à comment générer des documents spécifiques – cf partie 1).

Outils pour l’analyse de documents

  • Document AI : Un outil spécialisé dans l’extraction de données et la classification de documents. Il permet d’automatiser des tâches répétitives et de gagner du temps dans la gestion des documents.

Un exemple concret

Un exemple concret d’intégration de l’IA est la réalisation d’une application de gestion de documents, (projet imaginé par OpenAI). Cette application utilise l’IA pour remplir automatiquement les informations des documents téléchargés (nom, description, type, mots clés) et dans une version avancée, elle pourrait permettre de rechercher des informations sur l’ensemble des fichiers, offrant une gestion documentaire intuitive et efficace :

  • Remplissage automatique : Utilisation de l’IA pour extraire et remplir les informations des documents téléchargés.
  • Requête et recherche : Capacité à rechercher et à requêter des informations spécifiques à travers tous les documents, facilitant ainsi la gestion et l’accès aux données.

Conclusion

Intégrer l’IA dans votre projet web présente de nombreux avantages : génération de contenu, reconnaissance et synthèse vocale et analyse de documents. L’IA peut non seulement vous procurer des gains de productivité mais aussi améliorer l’expérience utilisateur. Ces outils se développent très vite et de plus en plus d’API sont disponibles : Google, OpenAI, et Mistral AI…

« Vers l’infini et au-delà ! » En route vers de nouveaux projets !

Un article de Fourkane, développeur chez TCM Lyon

Ce sujet vous intéresse ? Lisez également notre article sur les applications pour l’entreprise de l’Intelligence Artificielle générative.

Quels enjeux technologiques pour le secteur bancaire en 2024 ?

Le Bank Tech Day 2024 est un événement incontournable pour les acteurs du secteur bancaire, réunissant experts, décideurs et innovateurs autour des défis et des opportunités technologiques qui façonnent l’avenir de la finance. Si vous l’avez manqué, voici les principaux enseignements et enjeux technologiques que nous avons retenus : IA !

Bank Tech Day 2024, représentation d'un conseiller bancaire dans un univers fututiste.

L’intelligence artificielle en passe de révolutionner l’expérience client

L’intelligence artificielle (IA) a été au cœur des discussions, notamment pour améliorer l’expérience client. Les banques et les institutions financières investissent en priorité dans l’optimisation des processus KYC (Know Your Customer) et KYB (Know Your Business), ce qui non seulement permet de prévenir les fraudes potentielles mais aussi de se conformer aux lois et réglementations nationales et internationales.

C’est dans ce contexte que des solutions IA sont de plus en plus utilisées pour créer des scénarios prédictifs, et assurer une maintenance continue des données KYC et KYB​ dans le but de mettre en place des dispositifs pour améliorer la satisfaction client

Cependant une grande importance doit être donnée à la qualité des données pour entraîner les différents modèles d’IA afin d’obtenir des résultats pertinents et proposer des services satisfaisants.

Dans une ère où le client peut changer rapidement de banque, intégrer des outils IA permet aussi d’augmenter le conseiller bancaire. Ce n’est pas le futur mais on y est presque :

Traitement et analyse des demandes des clients au téléphone

Au téléphone, une analyse des échanges permettrait de suggérer plus rapidement des solutions en les proposant aux conseillers bancaires. 

Par exemple : suite à la discussion, l’IA propose de noter un RDV dans l’agenda du conseiller bancaire du client, ou il suggère d’envoyer un email au client avec des solutions de financement… 

A la clé : une plus grande efficacité du conseiller, une réduction des temps de formation…

Utilisation de chatbot reposant sur l’IA dans l’espace client

L’IA peut désormais traiter des demandes d’informations très variées tout en proposant une expérience utilisateur d’une grande qualité. Ainsi, le client pourra en une seule question demander une analyse de ses dépenses, poser des questions de facturation où accéder aux informations des produits. Il faut néanmoins rester vigilant sur la fiabilité de l’information et le respect des normes réglementaires. Le chatbot vient ainsi en complément des échanges téléphoniques afin de répondre à une partie des demandes et gagner en efficacité opérationnelle.

Proposer une transcription automatique des réunions

Pour continuer dans la même veine, lors des réunions client, il est possible d’effectuer une retranscription automatique des échanges afin de les synthétiser dans le CRM. Il serait même possible de simplifier les saisies avec les échanges (montant du financement par exemple) voire d’analyser les sentiments des clients pour avoir des indicateurs sur la qualité du service (“big brother is watching you”).

Bank Tech Day 2024 – La DSP3 arrive !

La DSP3, ou Directive sur les services de paiement 3, est un ensemble de nouvelles règles européennes qui visent à rendre les paiements plus sûrs, plus innovants et plus centrés sur le client.

Quels sont les objectifs de la DSP3 ?

  • Sécurité renforcée pour mieux protéger les consommateurs contre la fraude
  • APIs Open banking boosté : L’expérimentation, l’exploitation et l’optimisation des APIs d’Open Bankin pour atteindre la maturité technologique permettant leur ouverture et accessibilité mais aussi leur sécurité.  
  • Lutte contre la fraude optimisée : les acteurs peuvent partager des infos sur les transactions frauduleuses pour mieux les identifier et les bloquer.
  • Protection des consommateurs accrue : plus de contrôle sur leurs données et plus de transparence dans les services de paiement.

Comment s’adapter ? ️

Suite au Bank Tech Day 2024, les acteurs du secteur devront s’appuyer sur des solutions technologiques innovantes telles que l’authentification forte, les plateformes d’open banking sécurisées, les systèmes de détection de fraude basés sur l’IA, et puis surtout des outils de gestion des données robustes. ️

Banking As a Service : les API au coeurs des partenariats entre banque et Fintech

L’ère des APIs permet le développement de nouveaux business models, tels que la Banking-as-a-Service (BaaS) ou Open Banking. Ces modèles favorisent la co-création de valeur avec des partenaires, offrant de nouveaux services aux clients. 

Les APIs facilitent la collaboration entre les grandes banques et les fintechs, permettant une intégration rapide et efficace des nouvelles technologies ou offres. Les API sont aussi la clé de l’utilisation de l’IA à partir des données clients pour proposer des solutions plus pertinentes et adaptées. Évidemment, la mise en œuvre de ces APIs doit respecter les réglementations en vigueur pour garantir la sécurité et la confidentialité des données clients. 

Ce sujet, nous le connaissons bien chez TheCodingMachine. Nous avons eu l’opportunité de mettre en place techniquement de telles solutions notamment en intégrant des solutions comme Bridge ou Ubble au sein des parcours utilisateurs de nos clients.

Quelle banque pour demain ?

Le client est au cœur de la stratégie : l’avenir du secteur se jouera avec les banques qui développent un fort relationnel avec leur client, qui misent sur un accompagnement proactif. Il faut être facilement joignable et offrir un accompagnement à la fois expert et personnalisé à tout moment. Il est estimé que 30% des ventes passeront en 2025 par des leviers digitaux.

Alors, comment faire ? Il faut prioriser la satisfaction client au niveau des innovations et garantir le plus possible une expérience fluide, sécurisée et personnalisée. 

L’avenir de la banque appartiendra certainement à ceux qui sauront placer l’expertise et la confiance au cœur de leur relation client notamment en exploitant à bon escient leurs données à travers les API.

À retenir du Bank Tech Day 2024

Le Bank Tech Day 2024 a mis en lumière les nombreux défis et opportunités technologiques auxquels le secteur bancaire doit faire face : L’IA, la DSP3, la prévention contre la fraude, les business models digitaux, la collaboration avec les fintechs et la confiance client sont les clés pour construire la banque de demain.

Évidemment, si vous souhaitez parler de projets IA, API, relation client et même DSP3, on se tient à votre disposition !

Si ce sujet vous intéresse, lisez également notre article : L’Intelligence Artificielle Générative, quelles applications pour l’entreprise ?

Bonnes pratiques ADR pour la documentation de votre code PHP

Documenter le code est un aspect clé du développement logiciel. C’est essentiel non seulement pour la maintenance mais aussi pour la compréhension du code par d’autres développeurs. Une des méthodes la plus efficace pour documenter est d’utiliser l’Architecture Decision Records (ADR). Cet article explore comment utiliser les ADR pour documenter le code PHP, garantissant ainsi une compréhension claire des choix architecturaux.

Qu’est-ce qu’un ADR?

Un Architecture Decision Record (ADR) est un document qui détaille une décision architecturale importante, incluant le contexte, les alternatives envisagées et les raisons de la décision finale. L’objectif principal d’un ADR est de fournir une archive des décisions prises, permettant ainsi de comprendre pourquoi les choses ont été faites d’une certaine manière.

Pourquoi utiliser les ADR en PHP ?

L’utilisation des ADR en PHP, comme dans d’autres langages de programmation, aide à :

  • Clarifier les décisions prises : Les ADR aident à expliquer pourquoi certaines décisions architecturales ont été prises, ce qui est crucial lors de la revisite ou de la révision du code.
  • Faciliter l’orientation des nouveaux développeurs : Les nouveaux membres de l’équipe peuvent comprendre plus rapidement le projet en se référant aux ADR.
  • Assurer une cohérence du projet : Les ADR aident à maintenir une ligne directrice claire pour le développement futur et les modifications du projet.

Comment Documenter son Code PHP avec des ADR ?

Choix de la Structure des ADR

Chaque ADR doit suivre une structure claire pour assurer la consistance. Une structure type comprend (bon ca reste simple) :

Titre : Doit clairement refléter la décision prise.
Statut : Par exemple, proposé, accepté, rejeté, déprécié, etc.
Contexte : La description du problème que la décision vise à résoudre.
Décision : La description de la décision architecturale prise.
Conséquences : Les conséquences de la décision, y compris les avantages et les inconvénients.

Intégration des ADR au Workflow de Développement

Les ADR doivent être considérés comme une partie intégrante du processus de développement. Ils doivent être :

  • Créés et mis à jour par les développeurs : Chaque fois qu’une décision significative est prise, un ADR doit être rédigé ou mis à jour.
  • Revus par l’équipe : Les ADR doivent être revus par les pairs pour garantir qu’ils expliquent la décision et son contexte.
  • Accessibles : Les ADR doivent être stockés dans un répertoire accessible à toute l’équipe, souvent à côté du code dans le système de contrôle de version.

Exemple d’un ADR pour un Projet PHP

Titre : Utilisation de Laravel pour le Projet X
Statut : Accepté
Contexte : Nous avons besoin d’un framework robuste qui facilite la rapidité de développement, la maintenance et qui est largement adopté.
Décision : Utiliser Laravel comme framework principal pour le Projet X en raison de son large écosystème, de sa documentation exhaustive, et de sa grande communauté.
Conséquences : Cette décision permet une mise en œuvre rapide des fonctionnalités grâce aux nombreux paquets disponibles. Cependant, cela nous lie à la philosophie et à la structure de Laravel, ce qui peut limiter certaines options d’architecture spécifique.

Conclusion

Documenter les décisions architecturales en utilisant les ADR dans les projets PHP est une pratique qui renforce la transparence et améliore la gouvernance du projet. Cela permet une meilleure compréhension des choix architecturaux, facilitant ainsi la maintenance et l’évolution du système. En intégrant les ADR dans les pratiques de développement quotidien, les équipes peuvent garantir que le contexte et les justifications des décisions prises restent accessibles et compréhensibles pour tous les acteurs du projet.

Projet terminé : Organiser une rétrospective efficace

Parlons un peu du post-mortem ! 💀

Vous venez de réaliser un super projet, il a été mis en production et la phase de garantie est terminée ! Vous vous en souviendrez longtemps, que de beaux souvenirs partagés tous ensemble autour de ce sujet passionnant… Quel dommage qu’il faille à présent passer à autre chose !
Cela vous paraît absurde ? Ça tombe bien, nous aussi !
Et si on parlait un peu de la réunion de post-mortem ?

achèvement d’un projet

Le terme “post-mortem” est-il le terme adéquat ?

👩‍🏫 Le point scolaire

L’expression “post-mortem” vient du latin “post” qui signifie “après” et “mortem” qui signifie “mort”. Donc la réunion de post-mortem est une réunion censée se tenir “après la mort” du projet.
Mais, dans le contexte du web, lorsqu’un projet est achevé, peut-on vraiment parler de la mort de ce projet ?

A quel moment un projet est-il achevé ?

Déjà, il est important de bien différencier l’achèvement d’un projet et l’interruption d’un projet :

  • Un projet est achevé lorsque toutes les phases sont terminées.
  • Un projet est interrompu lorsqu’on décide de le stopper définitivement au milieu ou à la fin de sa réalisation pour une raison ou une autre.

L’appellation “post-mortem” peut donc avoir du sens après l’interruption d’un projet. Après l’achèvement, en revanche, peut-on réellement parler de la mort du projet ?

De notre point de vue, la vie d’un projet continue bien après sa mise en production ! C’est à ce moment-là que les retours des premiers concernés commenceront à remonter car la solution commencera à être réellement éprouvée et les utilisateurs pourront évaluer sa pertinence dans le contexte de leur problématique métier.
Chez TCM, on préfère parler de rétrospective.

Quel est l’objectif de la rétrospective d’un projet ? 🎯

La rétrospective d’un projet est axée autour de 4 points clés :

  • Évaluer le déroulement du projet
  • Discuter des performances de la solution
  • Explorer les perspectives d’évolution
  • Mettre en lumière les points positifs à reproduire et les erreurs à éviter pour la suite

Qui participe à la rétrospective d’un projet ?

Pour déterminer les personnes qui doivent participer à la rétrospective d’un projet, vous pouvez vous poser les questions suivantes :

  • Quelles sont les différentes parties prenantes du projet ?
  • Qui a travaillé à sa réalisation ?
  • Qui va utiliser le projet ?

Chez TCM, nous avons l’habitude de faire participer au moins l’une des personnes suivantes :

  • Un référent technique : une personne qui a participé au développement du projet et qui connait la technique et les défis qu’ont rencontrés les développeurs
  • Un référent gestion de projet : Une des personnes qui ont planifié, coordonné et supervisé le projet
  • Un référent commercial : La personne qui a été le premier contact entre TCM et l’instigateur du projet
  • Le client : Une personne qui est à l’origine du projet

Qu’aborde-t-on lors d’une rétrospective?

Présentation des participants

La première chose à faire est de prévoir un moment pour que chaque participant à la réunion se présente, il est possible que certains des intervenants ne se connaissent pas entre eux et cette présentation permet à chaque participant de connaître ses interlocuteurs et le rôle de chacun dans cette réunion.

Exposition des objectifs de la réunion

Il faut ensuite rappeler les objectifs de la réunion : Pourquoi est-ce qu’on a réuni tout le monde ? En quoi consiste cette réunion ?

Rappel du contexte du projet

Certains intervenants peuvent travailler sur de nombreux sujets en parallèle, rappeler le sujet permet à tout le monde de savoir précisément de quoi on traite.

Déroulement du projet

Donner un aperçu de la manière dont s’est déroulé le projet :

  • Quelles ont été les différentes phases ?
  • Le planning a-t-il été respecté ? Y-a-t-il eu de l’avance ou du retard ? Pour quelles raisons ?
  • Comment le projet a-t-il été géré ?

Intégrer des statistiques représentant le travail abattu peut également être intéressant.

Performance de la solution

Ce point est très important. Évaluer la performance de la solution apportée va permettre de déterminer si vous avez répondu correctement au besoin. Pour ce faire, on peut suivre les étapes suivantes :

  • Rappeler les besoins définis au départ
  • Montrer la solution technique mise en place pour y répondre
  • Déterminer si la solution répond aux attentes et donner des éléments chiffrés sur l’utilisation du projet

Événements marquants

Essayer de mettre en lumière les différents points forts et challenges que vous avez relevés durant le projet

Choses à reproduire ou à éviter

Et si un jour vous deviez refaire un nouveau projet avec la même équipe ou bien faire évoluer le produit actuel, quels sont les points intéressants que vous aimeriez refaire de la même manière ? Quels sont les points à ne surtout pas reproduire ? Pensez à recueillir le ressenti général des équipes, même si les personnes en question ne participent pas à la réunion.

Perspectives d’évolution

Déterminer les évolutions qui pourraient être ajoutées au projet et solliciter les utilisateurs finaux sur leur utilisation de la plateforme.

Inclusion des points transverses

Y-a-t’il des points transverses que vous aimeriez aborder ?
Par exemple : La maintenance du projet.

Étapes suivantes

Quelles sont les étapes suivantes pour le projet ?

Bilan de la réunion

Rappel des points clés évoqués tout au long de la réunion et liste des actions à mener.

Conclusion

La réunion de rétrospective a pour principal objectif de prendre du recul par rapport au travail effectué de manière à continuer la collaboration de la meilleure façon possible. La rétrospective ne vise pas à clôturer le projet, mais bien à le faire vivre et évoluer en tirant un enseignement bénéfique des expériences passées dans un processus d’amélioration continue.