Une sacrée journée !
Arrivée la veille, nous sommes dans le même hôtel que les organisateurs. Stéphane, comme speaker des années précédentes, connaît bien ce milieu. Nous nous retrouvons au même restaurant et partageons un moment très convivial. Toute l’équipe de l’AFUP, de la SCOP Les Tilleuls, Exakat, etc.
C’est une communauté qui ne se prend pas la tête. Très sympa.
La journée du 20 mai commence un peu en avance pour CH Studio. Etant sponsors de la journée, il faut installer les « goodies » offerts aux conférenciers.
Je vous propose un retour sur chacune des conférences de cette journée marathon, notamment :
- Les nouveautés de PHP 8.1
- Une introduction au principe de ranking d’Elastic Search
- Guide UX pour la conception de features
- Ça vous dit d’embarquer du Go dans PHP ?
- Les subtilités du e-commerce à la française
- RabbitMQ montée en puissance avec PHP
- CECIL générateur de site statique en PHP
- Étendre SQL avec PHP ?
- Attirer et Retenir les femmes en équipes de dev PHP
PHP AFUP-DAY LILLE 2022
Intro et remerciements par Grégoire Hebert CTO de « Les Tilleuls »
AFUP-DAY LILLE 2022 : PHP 8.1
Damien Seguy Directeur Technique chez « Exakat »
Exakat propose une solution d’analyse de code ayant plus de 1500 règles. Fort de son expérience client, il nous livre les particularités de PHP 8.1 et les points de vigilance à avoir sur la prochaine migration.
Il est important de considérer la migration par couches, dans ce qu’il appelle le Sandwich de Migration :
- Gérer les incompatibilités
- MAJ des dépendances
- Appliquer les Nouveautés
Parmi les nouveautés de PHP 8.1 que j’ai retenu :
array_is_list()
PHP possède une structure Array pouvant être tout à la fois liste, queue et map. Cette nouvelle fonction permet de s’assurer que les index sont numériques et continus. Par exemple elle retournera faux pour :
// The array does not start at 0
array_is_list([1 => 'apple', 'orange']); // false
// The keys are not in the correct order
array_is_list([1 => 'apple', 0 => 'orange']); // false
// Non-integer keys
array_is_list([0 => 'apple', 'foo' => 'bar']); // false
// Non-consecutive keys
array_is_list([0 => 'apple', 2 => 'bar']); // false
fsync / fdatasync()
Ces deux fonctions s’assurent de l’écriture réelle des data sur disque et que les caches sont vidés.
Énumération
enum RolesClassLikeNamespacedEnum: string implements TestFor {
case Admin = 'Administrator';
case Guest = 'Guest';
case Moderator = 'Moderator';
}
Un nouveau typage, « enum », fonctionne comme une classe, à la Java. On retiendra une fonction particulière, Enum::tryFrom(), qui permet de demander si une valeur peut être en concordance avec celles de l’énumération.
Fibers
Une solution de PHP au parallélisme. Utilisé par des frameworks comme Amphp ou ReactPHP, pour une réponse de PHP à l’asynchrone.
Cela rend PHP interruptible : on peut interrompre une méthode pendant son exécution, à la façon d’un générateur.
Never
Quand une méthode ne retourne jamais !
never
est un type de retour à utiliser en place de void
lorsqu’il n’y a pas d’autre instruction à suivre :
function redirect(string $url): never {
header('Location: ' . $url);
exit();
}
Constantes finales
Marquez vos constantes avec « final » pour qu’elles ne puissent être réécrites lors d’un héritage.
class Foo
{
final public const X = "foo";
}
class Bar extends Foo
{
public const X = "bar";
}
// Fatal error: Bar::X cannot override final constant Foo::X
Readonly
Les propriétés marquées comme telles ne peuvent être assignées qu’une seule fois, par le constructeur de classe ou un setter. (classe en 8.2)
class Test1 {
public readonly string $prop;
}
$test1 = new Test1;
// Initialisation illégale en dehors de la portée privée.
$test1->prop = "foobar";
// Error: Cannot initialize readonly property Test1::$prop from global scope
→ attention aux accès aux propriétés avant assignation !
Pratique pour des value object immuables et le concept d’objet neutre.
New
New est maintenant valide dans les expressions statiques (arguments attributs, variables statiques, constantes globales).
Type Intersection
La déclaration de type de la propriété d’objet doit être à la fois de TOUS les types déclarés (« & » comme colle des types) Ex. :
public Countable&Stringable $Intersection;
Étalage de tableau
Le dépaquetage de tableaux ( « …$array » ) fonctionne maintenant avec des tableaux contenants des index. Cela est possible par application de la même logique que les array_merge().
Découvrir le sens du text avec Elasticsearch
Mathias de « Les Tilleuls »
Elasticsearch utilise le moteur Apache Lucene, plongée dans le scoring avec des exemples simples à comprendre. Les scores sont calculés à partir de la formule :
Σ(TF.IDF).C → somme des présences * pertinence * corrélation
La pertinence se calcule par la fréquence d’apparition dans TOUS les documents indexés. Le « coordination factor » récompense les docs en fonction du nombre de mots de la requête trouvée dans le document.
Les analyseurs d’Elasticsearch génèrent des tokens (texte nettoyé). Parmis les filtres de token, stemmer fait disparaître les variances d’un mot vers sa racine ex :
developpera → developp
Guide UX pour la conception de features
Jessica Martel, Product Manager chez « Unow »
Problème
Les fonctionnalités utilisateurs sont souvent génératrices de conflits entre les personnes orientées métier (client / PO / UX / testeurs) et celles orientées techniques (DEV). Jessica propose une méthodologie pour éviter nombre de ces petites accroches.
Équipe
La constitution d’une équipe projet pour avoir une bonne adhésion / culture / exhaustivités des besoins doit être diverse et inclusive. Il faudrait idéalement que l’équipe soit constituée comme suit :
- Product Owner / Product Manager,
- Design,
- Vente.
L’intérêt d’avoir une équipe multiculturelle est la diversité de points de vue. Cette adhésion des équipes métier évite les conflits ultérieurs.
Étapes de la conception
- Product / concept
- UX / Research / Audit → principe WBS (gestion de projet)
- User journey et workflows découpés en 4 grandes étapes : Essentiel / Secondaire / Bof / Non. Cela aide à définir le MVP → créer workflows : chemins d’utilisation de la feature (mindmap) : cette étape est hyper importante pour structurer et prioriser les features.
- Les spécifications fonctionnelles : définir cas d’usage, les règles métier, les versions, les Kpi permet de coordonner en amont les versions (éviter les conflits)
Specs techniques : définir exhaustivité, découpage en lots techniques, scenarii de tests automatisés. - Le design les wireframes, maquettes UI, prototypes
Les limites
C’est une méthode d’envergure, assez longue à mettre en place, avec un risque de downsize.
Non adaptée aux refontes de parcours : étapes variables / spécificités contextuelles, produit / multiplicité de parcours, des besoins et des utilisateurs.
FrankenPHP: Embarquer du Go dans PHP
Kevin Dunglass, fondateur de la SCOP « Les Tilleuls »
Problème
Conteneuriser un serveur PHP demande souvent l’utilisation de plusieurs conteneurs : Web + PHP
Kevin nous explique son projet pour aider à embarquer simplement et en même temps le moteur PHP et un serveur web dans un seul conteneur.
Analyse
Le langage go est utilisé dans Docker & Kubernetes, tout comme le Symfony CLI (serveur web de dev) est écrit en Go !
Les SAPI permettent aux serveurs web de communiquer avec le moteur PHP. Les SAPI les plus populaires :
- « Module Apache » : simple à mettre sous Docker. Moins performant que FPM.
- « PHP FPM » : populaire. Nécessite un serveur séparé (plus complexe à gérer, deux conteneurs…)
Kevin recherche le meilleur des deux mondes : simplicité des modules apache et performance de FPM. Voici les détails de son cheminement, en tout cas ce que j’en ai compris :
- L’interpréteur PHP est écrit en C.
- Il existe un « Sapi embed » qui permet d’intégrer l’interpréteur PHP dans un exécutable en quelques lignes de C → permet d’utiliser le code PHP comme une librairie.
- Go est compilé. Il peut exécuter du code C. Du code C et Go peuvent être compilés ensemble.
- La librairie « CGO » permet d’appeler C ou Go depuis C ou Go.
- Go est optimisé pour faire des services réseaux.
- Les « Goroutines » est un système de thread léger, exécutées en parallèle, et utilise les threads system, jusqu’à plusieurs centaines de « Goroutines » dans un même thread.
- Il existe un mode de PHP : ZTS Zend Thread Safety → l’interpreteur PHP est isolé des autres en mémoire.
- Pour qu’un SAPI soit compatible avec l’OPCache il faut recompiler PHP avec la bonne info. RTFM.
Kevin rappelle que sur un démarrage de Symfony, chaque requête implique un rechargement complet.
Solution: FrankenPHP
- Il présente son projet → compilé statiquement (pas de dépendance)
- Le mode « worker » permet de conserver les contextes PHP en mémoire partagée. Il n’y a aucun rechargement entre requêtes HTTP. Ne détruis pas le script PHP.
- Il devrait s’ensuivre un gain de performance assez important.
- Le code est sur un dépôt privé pour le moment, il sera bientôt publié.
Les subtilités du e-commerce à la française
David Buros Développeur chez « Monsieur Biz »
Problème
La solution e-commerce open-source « Sylius » n’est adaptée, ni au double affichage HT /TTC, ni aux mandats administratifs.
Analyse
David rappelle quelques tendances en fonction des pays :
- Italie : contre-remboursement
- GB : click & collect
- Allemagne : taux de retour élevé. Les frais de port sont remboursés par le vendeur. Les gens ont pris l’habitude de commander plusieurs tailles et de renvoyer ce qui ne va pas.
- Norvégien panier moyen à 152 € contre 60 € en France
David rappelle les dispositions légales des sites e-commerce en France :
- Mentions légales
- Contrat de vente et délai de livraison
- Moyens de paiement
- Rétractation.
Une petite explication, faite avec humour, sur les taxes :
Les taux : taux normal 20 % | intermédiaire 10 % | réduit 5,5 % | super réduit 2,1 % | produits pétroliers vendus en corse 13 % | outre-mer 8,5 %
Une petite remarque sur les éco-taxes : Eco contribution DEEE, meubles, activités polluantes…
Les éco-taxes étant soumises à la TVA, nous sommes taxés sur les taxes !
David nous explique le fonctionnement d’un mode de paiement réservé aux administrations : le « Mandat administratif » :
- la commande est passée par Administration,
- vérification chez le vendeur, par API, du Siret de l’administration,
- signature de la commande par l’Administration,
- envoi de la facture par le commerçant à Chorus Pro (service en ligne basé sur SAP),
- consultation par Administration,
- paiement
- livraison par commerçant.
Solution
Les compléments à Sylius de chez « Mr Biz » :
- double affichage HT/TTC
- module éco-taxes
- paiement par mandat administratif
RabbitMQ montée en puissance avec PHP
Cédric Driaux de chez « Trustt »
« Trustt » est une plateforme SAS qui développe les communautés d’ambassadeurs aux marques. Leur métier est le recrutement de personnes ambassadeur pour les marques.
Problème
Leur problématique : un goulot d’étranglement lors de l’envoi d’e-mails, réalisé par un système « CRON » lançant les processus toutes les 15 min. La charge serveur était inégale, mal distribuée et donc pas optimisée.
Analyse
Les personnes, futures ambassadeurs, candidatent en ligne et peuvent recevoir plus de 21 types d’e-mail différents.
Il y a bien sûr des règles métier qui contraignent l’envoi d’e-mail :
- horaires 9 h – 18 h pour envoi
- pas plus de 5 e-mails par jour,
- pas plus de 2 types d’e-mail par jour,
- priorité par types d’e-mail,
- notion de fraîcheur par type d’e-mail. Un e-mail de non-sélection doit être envoyé dans les 3 h.
Solution
« RabbitMQ » avec son API système intégrée.
Ils ont choisi d’externaliser avec « CloudMQP », qui est une solution reconnue, avec outils de monitoring intégré.
« NetData » pour analyse des résultats : les résultats montrent un lissage des ressources sur la journée au lieu des pointes de charge chaque 15 min du système précédent.
Mise en place supervisor.org
Mise en place de « AMQPRoxy ». Il évite que les « consumers » se connectent/déconnectent sans cesse. Attention, le consumer doit vérifier la connexion avant de travailler.
Résultats et bénéfices :
- Diminution de la charge serveur avec lissage
- Augmentation du nombre d’e-mails.
- Gain en agilité (21+ type d’e-mail)
- Maîtrise. On peut stopper et redémarrer les « consumers » individuellement sans impacter le reste
- Monitoring des APIs
- Partage de connaissances et montée en compétences de l’équipe.
Conseils et astuces :
- traiter les messages « NACK » : mettre en « deep-queue » pour 5 ré-essais max
- loguer tu devras… Un « ACK » est reçu si le message n’est pas frais ou retry excessifs. Il faut analyser à posteriori les logs.
Chez CH Studio nous aimons « RabbitMQ ». Il est open-source et s’installe très bien sur Docker.
CECIL générateur de site statique en PHP
Arnaud Ligny Consultant fonctionnel & technique indépendant.
Problème
La mise à jour des petits sites perso, tant technique que rédactionnelle, prends du temps. Il faudrait une solution simple.
Analyse
Il existe des générateurs de contenu SSG (Static Site Generator) comme :
- « Jekyll » (Ruby)
- « Hugo » (Go. Système de template complexe)
- « Hexo » (JavaScript, cool. Trop limité)
Solution
Arnaud nous présente CECIL, son travail de plus de 9 ans. C’est une suite de publication de sites web statiques complet, avec flux RSS, navigation, optimisation SEO, etc. Cecil est une archive PHAR et s’utilise avec du texte « markdown »
Pourquoi faire ?
Refonte des sites perso facilement. Dans le pipeline de production, nous notons l’usage de Style CI, Scruinizer (code review + couverture). L’édition des textes peut se faire via « Forestry » ou « Netlify ». Les templates utilisent « Twig ».
Il nous rappelle combien la documentation est hyper importante.
Étendre SQL avec PHP ?
Antoine Bluchet, Directeur technique Les Tilleuls Nantes
Problème
Il s’est retrouvé dans un cas d’usage ou Doctrine n’était pas efficace : une table « catégories » avec des liens de sous-catégories vers elle-même. Doctrine générait plein de requêtes et chargeait inutilement la base. Antoine rappelle que la base de données est souvent le goulot d’étranglement des systèmes.
Analyse
En créant une requête SQL à la main, de manière récursive (en utilisant un Common Table Expression :
WITH
temp (n, fact) etc., la base de données est soulagée. Quid du mapping de la recherche vers des entités métier ?
Regard sur Doctrine :
- C’est une ré-implémentation de Hibernate… ;
- Inconvénients : abstraction : ne tire pas parti des spécificités de chaque moteur de base de données ;
- Avantages : peut éviter des failles de sécurité, surtout chez les débutants. Requêtes dynamiques.
Solution
Antoine présente son travail : PHP Extended SQL ESQL → librairie en PHP basée sur la métadonnée d’un ORM.
Cette librairie permet l’écriture de requêtes complexes et des mappings dans des DTO (qui ne sont pas des Entités natives).
Attirer et Retenir les femmes en équipes de dev PHP
Marcy Erika Charollois. Content Strategist in recruiting and social tech.
Problème
Les femmes sont peu nombreuses dans la tech et beaucoup songent à quitter le salariat pour de l’auto-entrepreneuriat.
Analyse
Marcy énonce :
En 2022 les femmes sont à filtre : racisée, musulmane, monoparentale, etc.
Marcy nous rappelle quelques notions :
- « Habitus » = famille + école + corps + langage
- Groupe majoritaire : biais de confirmation + Effet de halo (réassurance de votre 1ere expression) + Biais de sympathie / antipathie.
- Le Groupe Majoritaire met toujours en place un statu quo. C’est ce qui référence les valeurs sociales et la culture d’entreprise.
- 30 % des freins de progression dans la tech résultent du statu quo du GM.
Les annonces qui mettent en avant des valeurs de l’entreprise attirent de plus en plus les candidats.
Marcy insiste sur le fait qu’il faut insuffler un changement en faveur des femmes. Dans son étude on remarque une faible sensibilisation :
- 15 % de réfractaires,
- 70 % neutres,
- 15 % de motivés
La courbe du deuil chez les personnes qui ne savent pas (70 % des personnes) :
Informer → Guider → Encourager → Reconnaître
Solution
Comment on fait ? 52 % des femmes pensent que leur genre ou expression de genre posera un pb dans leur carrière.
Les propositions de Marcy :
- Aller chercher les femmes dans les formations.
Ne jugez pas la provenance des profils féminins (reconvertis).
- Féminisez les titres de poste
- Recherchez des développeuses et des développeurs femmes.
- Promettez du concret pas de l’hypothétique dans votre annonce.
Marque employeur
- mettre les femmes en avant
- annoncer le style de management
- mettre en avant le style et les démarches de recrutement
Ne pas se proclamer alliée ou bienveillante. Laisser les personnes en minorité le déclarer elles-mêmes.
Retenir les femmes dans les équipes
Créez une culture safe : être hyper visant l’inclusion dans sa diversité au sens large. Discuter avec ouverture d’esprit, ne pas être dans une culture sachant/ignorant.
Être clair et mettre en place une transparence salariale, transparence sur les évolutions de poste avec un système juste, des moments de convivialités qui ne misent pas sur la « bro culture ».
Proposition de démarche :
Sortir de nos habitudes. Ne pas minimiser ou interrompre les prises de paroles. Écoutez les besoins de vos employés. Accommodez-les. Pourquoi pas un libre service protection menstruelle ?
Offrez des ressources sans juger :
- Parentalité / Menstruation
- Assistance psychologique
- Mentora en interne est un motif d’attraction dans les annonces (67%)
- Encouragez les femmes à prendre la parole
- En investissant financièrement dans leurs actions d’empowerment
- Encouragez une femme à devenir un rôle modèle parce qu’elle est compétente et non parce qu’elle est la femme de service de l’équipe.
Conclusion
Marcy nous propose de retenir ces quelques points pour l’inclusion :
- La diversité est un indispensable
- La diversité et l’inclusion augmente la productivité et la satisfaction globale de vos effectifs.
- L’inclusion sur le lieu de travail commence par la lutte contre les préjugés et la compréhension de votre habitus.
Clôture
Remise des résultats du concours Karafun :
- 25 petits éléphpants
- 5 gros éléphpants
Le prochain forum PHP aura lieu :
- à Paris : à l’hôtel Marvel à Disneyland Paris
- les 13 et 14 octobre
Conclusion
Ma visite à l’AFUP-DAY LILLE 2022 m’a séduit. J’ai apprécié la diversité des conférences, des sujets, des techniques et des niveaux.
Je trouve que les bénévoles font un boulot extraordinaire, avec une gentillesse infinie et sans mégalomanie.
Bravo à vous et merci de cette journée !