Monsieur Biz conférencier de l'AFUP Day Lille 2022

L’AFUP Day se tenait physiquement cette année après 2 ans d’absence, et nous nous sommes rendu à Lille pour y participer.

Ce vendredi 20 mai 2022 avait lieu le mythique AFUP Day à Lille. À cette occasion, une partie de la team de Monsieur Biz a fait le déplacement et nous tenions à vous faire un debrief de cette super journée !

L'équipe de Monsieur Biz était une nouvelle fois présente afin de promouvoir Sylius. Pour cette édition David Buros 🌯 était conférencier à propos des subtilités du e-commerce à la française et il en parle bien évidemment dans le cadre de Sylius ;)

David quelques secondes avant son talk sur Les subtilités du e-commerce à la française

Keynote d’ouverture

Grégoire nous a fait le plaisir d’ouvrir cette journée de conférence en nous présentant quelques chiffres importants de l’AFUP :

  • L’association existe depuis 2001 !
  • Plus de 10 antennes dans toute la France !
  • Plus de 600 membres ! (Si vous ne l’êtes pas encore, c’est le moment)

PHP 8.1 en détail - Damien SEGUY

Au fil des années, nous avons pris goût à voir Damien nous présenter les nouveautés de chaque itération de PHP. Globalement, l’upgrade d’une version se passe de la façon suivante :

  • Correction des incompatibilités
  • Mise à jour des dépendences
  • Ajout des nouveautés apportés par la nouvelle version

Parmi les nouveautés apportées par PHP 8.1, il y a tout d’abord de nouvelles fonctions qui viennent s’ajouter comme array_is_list qui vous indique si oui ou non votre tableau est une liste, ou bien encore fscync qui permet de vérifier que le système a bien écrit le contenu de votre fichier.

Pour anticiper les nouveautés dès la version 8.0, on peut utiliser le Symfony Polyfill ou tester l’existence de la méthode avec function_exists.

On retrouve aussi le support des énumérations qui vont nous permettres de définir des listes fixes de valeurs et qui se déclarent un peu comme des classes :

enum Status
{
    case Draft;
    case Published;
    case Archived;
}
function acceptStatus(Status $status) {...}

Il est également possible d’utiliser des propriétés en readonly qui vous autorise à setter la valeur de votre variable une et une seule fois. Attention toutefois, si vous passez un objet, cet objet sera modifiable mais c’est la liaison entre vos deux objets qui sera en readonly (Le pointeur).

S’ajoute à cela la possibilité d’utiliser les ... pour donner les callables, les intersections de types qui nous permettent de donner plusieurs types à une variable comme Traversable&Countable, les constantes final pour que les sous classes ne puissent plus modifier la valeur d’une constante, ou encore le type de retour never, qui se différencie de void et s’utilise si votre méthode ne retournera “jamais” (Utilisation de die, exit ou encore un suspend d’une Fiber).

En parlant des Fibers, celles-ci vous permettront de lancer un traitement en asynchrone et de continuer votre script sans attendre son retour.

Toutes les nouveautés sont listées dans la documentation de PHP 8.1, c’est le moment de migrer !

De l’humain à l’ordinateur, ou découvrir le sens d’un texte avec ElasticSearch - Mathias ARLAUD

Mathias commence son talk par un exemple simple, très pertinent et représentatif de la différence de compréhension entre le cerveau humain et celui de la machine en représentant deux phrases de même sens, mais avec un code hexadécimal différent :

  • “Je m’appelle Mathias”
  • “Mon nom est Mathias”

C’est le moment de nous expliquer comment ElasticSearch, outil permettant de faire des recherches complexes, calcule le score des requêtes qui lui sont envoyées. Une équation digne des pires cauchemars des maths pour certains s’affiche à l’écran :

La formule de scoring d'Elasticsearch

A chaque explication des étapes, il arrive à nous simplier la formule afin que ce calcul deviennne plus clair avec 3 variables simples :

  • Term frequency: Compte les occurences de chaque mot de la recherche dans l’entièreté du document.
  • Inverse document frequency: Recherche la pertinence avec la recherche globale. En gros, plus le mot apparaît dans tous les documents indexés, moins il sera pertinent (La rareté fait gagner des points).
  • Coordination factor: Récompense donnée au document ayant le plus haut pourcentage d’élément de la requête dans son contenu. Donc plus on a de mots de la requête dans le document, plus il a de points.

Il met par la suite en avant le fait que les pourcentages trouvés par le biais de ce calcul peuvent être affinés. Mais aussi qu’ils sont parfois biaisés par la tendance humaine à ajouter ce qu’il qualifie de “bruit” ou de mots parasites dans nos phrases, par exemple nous utilisons des mots de liaisons, très utiles pour un humain mais inutiles dans le cas d’une recherche.

Il nous montre donc par la suite par le biais de filtres de caractères, de générateurs de token et de filtres de token, comment un message peut être réduit à sa plus simple expression sans superflu et ainsi permettre d’obtenir des pourcentages plus précis dans une recherche.

Pour plus d’informations sur les calculs et le talk, Mathias a mis à disposition les slides de son talk.

Guide pratique d’une méthodologie UX pour la conception de features - Jessica MARTEL

Fort de son expérience passée dans l’UX, Jessica nous présente sa gestion actuelle des différents projets de ses équipes.

Elle met en avant la nécessité d’impliquer tous les corps de métier lors des différentes étapes de réflexion / décision / construction du projet. La méthode présentée repose sur une bonne structuration et compréhension de la demande en amont, permettant par la suite le respect d’un plan d’action établi selon tous les scénarios.

L’apsect très intérressant de la gestion évoquée ici est la définiton des étapes en fonction de la nécessité actuelle. Chaque feature est rangée selon un tableau d’émotions avec les catégories suivantes :

  • Essentielle : la feature doit être dans le MVP (Minimum Viable Product).
  • Secondaire : C’est un nice to have mais pas nécessaire pour le lancement.
  • Bof : La feature n’a pas d’intérêt particulier.
  • Non : C’est un no-go et on ne veut absolument pas que ce cas se produise.

S’en suit une rédaction des specs fonctionnelles et techniques sur lesquelles peuvent aussi s’ajouter l’élaboration de wireframes et de maquettes.

Chez Monsieur Biz, nous agissons un peu différemment, même si certaines pensées peuvent se rejoindre, en utilisant la méthode Shape Up.

Le Prométhée moderne : embarquer PHP dans Go - Kévin DUNGLAS

Kevin nous fait le constat que les SAPI PHP, qui permettent de faire le lien entre une requête HTTP et votre serveur web, sont vieillissantes. Nous avons bien PHP-FPM, qui est performant et supporté par tous les serveurs web, mais qui est difficilement containérisable car il s’agit d’un service externe, donc un container spécifique. Kévin nous fait le constat qu’une application PHP pourrait gagner en rapidité si on pouvait garder le Kernel entre chaque requête. Pourquoi ne pas apporter un vent de fraicheur et créer sa propre SAPI ?

Pour le language, il est tout choisi, ça sera Go. Ce language est réputée pour ses performances et est utilisé par des acteurs comme Docker, le serveur web Caddy, mais aussi le Symfony CLI. Mais pour cela il faut réussir …

Pour rappel, le language PHP est interprété (pas besoin de le compiler), et écrit en C. Aussi, il existe la librairie PHP Embed, qui permet d’utiliser PHP comme une librairie C. Go, qui est un language compilé, peut aussi intégrer du code en C. Mieux encore, ces programmes peuvent être compilé ensemble !

PHP <-> CGo (C <-> Go)

Ni une, ni deux, Kévin écrit quelques lignes et obtient son 1er SAPI en Go ! Mais l’espoir retombe rapidement quand l’erreur bien connue des développeurs C apparaît :

Segmentation Fault

Autant PHP est assez libre dans l’utilisation de la mémoire, mais ce n’est pas le cas de C. Le problème réside dans le fait qu’une requête PHP est un process distinct à chaque fois, alors que Go fonctionne sous forme de thread. L’idée de Kévin est alors d’utiliser la version ZTS de PHP (Zend Thread Safety). Et là…

Segmentation Fault

Cela n’a pas résolu le problème car en réalité, Go fonctionne avec des goroutines, et un thread gère plusieurs goroutines. Ce qui ne fait pas bon ménage pour la gestion de la mémoire. Finalement en parcourant la documentation de Go. Kévin va trouver, l’option qui va lui sauver la mise : LockOSThread.

Avec tout ça, il est parvenu à faire tourner un projet Symfony avec son SAPI qu’il a nommé FrankenPHP. Mais dans la toolbar Symfony, il constate que l’opcache n’est pas activé. La raison est étonnante car cette liste est harcodée dans le code source de PHP (en C). Une Pull Request est en cours pour venir y greffer FrankenPHP.

Kévin fini son talk en beauté en nous montrant comment fonctionner avec un système de worker afin de gagner en performance. Pour le moment tout ceci est encore expérimental, mais c’est très prometteur !

Les subtilités du e-commerce à la française - David BUROS

Monsieur Biz était une nouvelle fois conférencier pour un événement AFUP et cette fois-ci c’est David qui nous a montré les différentes subtilités du e-commerce en France.

Tout d’abord nous avons eu droit à un tour d’horizon des différents taux de taxes. Nous connaissons généralement les taux à 20% et 5.5%, mais saviez-vous que les médicaments remboursables par la Sécu était taxés à 2.1% ? Et que les produits pétroliers en directions de la Corse l’étaient à 13% ?

Avant de parler plus en détail de la France, David nous a aussi parlé de l’Europe. Les Allemands sont de grands fans des retours, ils commandent plusieurs articles en plusieurs tailles par exemple et renvoient ce qui ne leur va pas. Les Anglais quant à eux, sont friands du Click’N’Collect, qu’on a pas mal connu en France durant les confinements.

Vient alors le moment de parler de gestion des taxes avec Sylius. La solution étant bien faite, elle permet de gérer plusieurs choses :

  • Des catégories (ou groupe) de taxe
  • Des zones
  • Des taux de taxe

Pour la France, si nous voulons gérer les taux à 20% et 5.5% nous aurons :

  • Une catégorie de taxe “Taux normal” et une seconde “Taux réduit”
  • Une zone France Métropolitaine (Car l’Outre-Mer à d’autres taux)
  • Un taux de taxe à 20% pour la zone “France Métropolitaine” sur la catégorie “Taux normal”
  • Un taux de taxe à 5.5% pour la zone “France Métropolitaine” sur la catégorie “Taux réduit”

Une fois ceci fait, David nous parle un peu du projet Medisafe qui nous a challengé sur la mise en place d’un affichage HT et TTC des prix. Pour la fiche produit, cela s’est passé plutôt simplement et quelques méthodes on suffit pour gérer l’affichage des deux prix. Cela s’est avéré plus difficile au niveau des lignes de commandes, mais c’est là que David nous présente le principe d’“Ajustements” dans Sylius, qui sont des montants qui peuvent être positifs ou négatifs et qui peuvent s’appliquer sur :

  • La commande (Pour la TVA sur l’expédition par exemple)
  • Ligne de commande
  • Unité de ligne de commande (Une ligne commande de quantité 2, contient 2 unités.) Une fois compris ce principe, des méthodes ont été mises en place pour obtenir les différents montant de lignes de commande ou de totaux en HT et TTC.

Pour la gestion de l’écotaxe, le principe des ajustements a été utilisé en ajoutant de nouveaux ajustements. Mais la subtilité ici est que l’écotaxe est soumise à la TVA ! Une taxe dans une taxe ! 🤯

Enfin, David nous montre comment le paiement par Mandat administratif a été ajouté sur le projet en permettant aux clients de télécharger leur bon, et de l’uploader depuis le tunnel de commande.

Si vous voulez en savoir plus sur les taxes et les autres subtilités du e-commerce français, retrouvez les slides du talk.

Comment on est passé de 1800 emails à 70 000 par jour chez Trustt en 1 mois avec RabbitMQ - Cedric DRIAUX

Cedric nous présente sa problématique, il a un parcours assez complexe jonché d’envoi de mails qui sont conditionnés selon les différentes étapes de chaque personne. Le souci ici est que le volume de mail étant grandissant, les problèmes du système commençaient à apparaître.

Le système fonctionnait avec un cron qui était lancé toutes les 15 minutes, venait calculer tous les mails à envoyer, et ensuite les distribuait.

  • Calcul toutes les 15 minutes des mails à envoyer (Charge sur le serveur)
  • Appels API à un outil externe qui potentillement peur être lent et ralentir le process
  • Reliquats de mails non envoyés

Pour en finir avec ces soucis, l’idée est d’utiliser une file (queue) afin de mettre en attente les différents messages, et d’utiliser un consumer pour traiter chaque message. L’avantage de tout cela est qu’il est également possible de définir des priorités sur chacun des messages pour être sûr que les plus importants soient envoyés avant.

C’est vers RabbitMQ que Cedric jette son dévolu pour gérer tout cela et les impacts ont été immédiats :

  • Baisse de la charge serveur, car le calcule des mails à envoyer ne se fait plus toutes les 15 minutes
  • Augmentation de nombre de mails envoyés
  • 100% des mails traités dans une journée, les erreurs étant mises de côté pour être rejouée
  • Possibilité d’ajouter des mails dans la queue durant la journée

Avec ce système en place, le volume de mails envoyé par jour a pu exploser, et le serveur peut continuer à vivre sa vie paisiblement !

Cecil, mon générateur de site statique - Arnaud LIGNY

Arnaud est venu nous présenter ce que nous pourrions appeler “son bébé” (à défaut de 9 mois, la gestation aura mis 9 ans 😅), il nous raconte sa mésaventure à vouloir mettre à jour ses vieux sites persos utilisant des CMS types Drupal, Wordpress etc… juste pour faire quelques articles. De là lui est venue l’idée de passer sur du site généré en statique pour s’en débarasser.

Sauf qu’en 2013, Jekyll est en v1.0.0 et écrit en Ruby, Hugo utilise un moteur de template très compliqué, et surtout, Arnaud a envie de s’amuser sur un side-project ! Dans sa tête les objectifs sont clairs, l’outil doit :

  • Être rapide à prendre en main
  • Avoir un moteur de templates intuitif (Coucou Twig)
  • Séparer le contenu de la mise en forme (Coucou Markdown pour le contenu)

Plus qu’un simple projet, c’est un véritable produit qui va se créer durant toutes ces années avec plusieurs étapes :

  • Idée : Générer des sites en statiques pour être libéré, délivré.
  • Prototype : Création d’un script bien dégueu mais qui fait ce qu’on lui demande.
  • Industrialisation : Mise en place des bonnes pratiques (PSR-4 Autoloader, PSR-1/2 Coding Standards, PSR-3 LoggerInterface, PSR-16 Simple Cache), de tests et d’un déploiement automatique.
  • Produit final : Mise en place d’un beau site internet, et surtout la rédaction d’une documentation.

Et tout y est ! Cecil est utilisé par Arnaud, pour gérer ses sites, mais aussi par sa femme et une bonne centaine d’autres personnes.

Pour les slides de la présentation, c’est par ici.

Et si on étendait SQL avec du PHP ? - Antoine BLUCHET

Si vous travaillez avec Symfony, vous devez très certainement connaître Doctrine. Doctrine est apparu dans sa version 1.0 en 2008 et son premier commit date de 2006 ! Il s’insipire grandement de l’ORM Hibernate de Java et sa version 2.0 est sortie en 2010.

Ses avantages sont multiples :

  • Configuration via annotations, XML, YAML.
  • Support de plusieurs SGBD (Système de Gestion de Bases de Données)
  • Le DQL (Doctrine Query Language) qui permet de créer des requêtes en manipulant des objets

Sur ce dernier justement, je pense que nous nous sommes tous plus ou moins cassé les dents en voulant créer des requêtes SQL un peu plus complexes que de simples SELECT. Mises à part certaines méthodes manquantes qui sont gérées par le paquet beberlei/doctrineextensions, dès que nous avons besoin de faire des requêtes plus avancées, nous allons avoir besoin d’autre chose que DQL pour parvenir à nos fins.

L’idée la plus simple et de finalement basuler sur des requêtes en SQL, Doctrine étant en capaciter de les lancer. Mais en faisant cela on perd les avantages de doctrine et il va falloir mapper manuellements ses résultats d’un tableau à un objet. Pire encore, Doctrine ne gère pas les CTE (Common Table Expression), comme par exemple dans cette requête :

WITH RECURSIVE temp (n, fact) AS
(SELECT 0, 1 -- Initial Subquery
  UNION ALL
 SELECT n+1, (n+1)*fact FROM temp -- Recursive Subquery
        WHERE n < 9)
SELECT * FROM temp;

C’est là que PHP Extended SQL (PHP ESQL) vient à la rescousse ! C’est une librairie en PHP qui est basé sur la métadonnée d’un ORM et aussi une interface pour récupérer la donnée sous forme d’objet PHP. Reste la question de mapping qui peut être gérée de deux façons :

  • janephp/automapper : new \Soyuka\ESQL\Bridge\Automapper\ESQLMapper($autoMapper);
  • symfony/serializer : new \Soyuka\ESQL\Bridge\Symfony\Serializer\ESQLMapper(new ObjectNormalizer));

Si vous souhaitez des exemples plus concret, et surtout du code qui concrétise tout cela,
Antoine nous met a disposition les slides de sa conférence !

Pourquoi vous n’attirerez et ne retiendrez pas les femmes dans vos équipes tech. - Marcy CHAROLLOIS

Cette question, bon nombre de personnes dans le milieu de la tech se la posent encore, ainsi que Marcy. Au travers de son talk, elle nous transmet ses connaissances et constations à ce sujet pour faire de demain une autre vérité.

S’appuyant sur un certain nombre d’études, elle nous informe que sur 100% des freins dans le domaine de la tech, 30% sont le résultat d’oppression de groupe/sexiste… Alors que l’on entend partout et à tout va lors de recrutement les termes : inclusion, bienveillance et diversité, qu’est ce qui rend leur application si compliquée ? Peut-être l’habitus qui vous défini de part votre origine sociale, votre sexe, votre appartenance religieuse… Ou encore le biais de confirmation qui fait que certaines personnes vont en suivre d’autres pris dans un “effet de groupe”, mais également un effet de halo sur certaines personnes qui en influencent d’autres etc.

Comment changer tout cela quand on sait que face au changement :

  • 15% sont partant et vont le promouvoir
  • 15% sont réfractaires et surement impossibles à convaincre
  • Les restants 70% sont neutres ne savent pas vraiment où se placer ni quoi faire

Mener le changement n’est pas chose aisée et attirer les femmes dans la tech en fait partie. Pour être vecteur de ce changement voici quelques conseils transmis par Marcy :

  • Pousser les femmes de votre entourage à se lancer dans des formations tech
  • Bien se renseigner sur la mixité de genre et la diversité
  • Ne pas juger la provenance des profils féminins, spécialement s’ils sont en reconversion
  • Féminiser les titres des postes dans vos offres de recrutement
  • Promettez du concret dans les annonces
  • Mettre en avant le mentorat et aussi diffuser le témoignage de femmes qui montent en compétences

Enfin se pose aussi la question de la rétention : une fois en poste comment retenir les femmes ? Car d’après les données, une sur cinq songe à quitter son poste. Pour ça il est possible de miser sur la culture safe, discuter, éviter la “bro culture” (du type soirée jeux vidéos, pizza, babyfoot).

D’ailleurs chez Monsieur Biz nous recrutons pour un poste de Développeur(euse) PHP et mettons tout en place pour que les candidates se sentent à l’aise pour postuler.

Keynote de clôture

Fin de journée, il est déjà l’heure de se dire au revoir, mais avant cela, Karafun nous inonde de ses petits et gros ÉléPHPants !

Les jolis ÉléPHPants Karafun

Puis vient pour Grégoire le moment de nous teaser le lieux du Forum PHP 2022 et à nous de feindre l’étonnement (et oui tout le monde était déjà au courant :p). Évidemment nous serons à nouveau de la partie à l’hôtel Marvel de Disneyland Paris le 13 et 14 octobre !

Un grand merci à l’AFUP pour cette superbe journée, et encore bravo à eux pour l’organisation d’un tel événement qui nécessite des ressources et beaucoup de temps ! Coeurs sur vous !