Ce billet explore le pattern Backend-for-Frontend (BFF), une solution architecturale pour les applications modernes où plusieurs frontends (web, mobile, TV) consomment les mêmes services backend. Le BFF agit comme une couche de traduction dédiée à chaque client, agrégeant les appels API, transformant les données et gérant la logique spécifique (cache, authentification, etc.), le tout possédé et maintenu par l’équipe frontend.
Les signes qu’un BFF pourrait être utile incluent des problèmes de performance (appels multiples, sur/sous-récupération de données), une lenteur de développement (dépendances entre équipes, duplication de logique) ou des frictions organisationnelles (API mal adaptées aux besoins UX). Le BFF permet d’aligner les priorités des équipes, d’améliorer les performances (notamment sur mobile) et d’accélérer la livraison de fonctionnalités.
Cependant, le BFF n’est pas une solution universelle : il ajoute de la complexité opérationnelle et peut être excessif pour des applications simples ou des petites équipes. Des alternatives existent (GraphQL, API Gateway, refonte backend). L’article souligne l’importance d’un pilote pour évaluer son impact avant une adoption large, et rappelle que le succès dépend d’une appropriation par les équipes frontend et d’une approche itérative.
Ce billet explique comment configurer Coolify et Traefik pour gérer des certificats SSL wildcard sur des sous-domaines dynamiques (comme user1.monapp.com, user2.monapp.com, etc.). L’auteur détaille d’abord le problème : avec des sous-domaines dynamiques, la validation HTTP classique de Let’s Encrypt ne fonctionne pas, car les domaines n’existent pas encore au moment de la demande de certificat. La solution passe par le DNS challenge, qui consiste à prouver le contrôle du domaine en ajoutant un enregistrement TXT dans la zone DNS, plutôt qu’un fichier sur le serveur.
Le guide décrit la configuration d’un résolveur de certificats dans Traefik (via Coolify) en utilisant l’API d’un fournisseur DNS compatible (comme bunny.net), puis montre comment appliquer ce résolveur à une application. Enfin, il aborde la gestion des custom domains, où l’utilisateur peut utiliser son propre domaine, en combinant un routeur Traefik avec une règle HostRegexp pour capturer tout le trafic inconnu et générer automatiquement les certificats via HTTP challenge. Un retour d’expérience utile pour qui veut automatiser la gestion du SSL sur des architectures multi-tenants.
L’article explique pourquoi il n’est plus nécessaire de développer des APIs REST à partir de zéro en 2025. Il met en avant des frameworks modernes comme tRPC, Fastify et Hono, qui permettent de réduire la quantité de code répétitif grâce à une approche basée sur les schémas, améliorant ainsi la rapidité et la sécurité des développements. L’idée centrale est d’utiliser ces outils pour automatiser et standardiser la création d’APIs, plutôt que de tout coder manuellement. Une lecture utile pour les développeurs souhaitant optimiser leur workflow et adopter des pratiques plus efficaces.
Jérémy Buget partage son retour d’expérience sur la création d’un chatbot IA spécialisé dans l’inclusion socio-professionnelle, en s’appuyant sur un corpus de documents issus de La communauté de l’inclusion. Le projet utilise une architecture locale avec Ollama (modèle gpt-oss:20b
), un script de crawling en Node.js pour récupérer les fiches d’information, une base PostgreSQL avec l’extension pgvector pour stocker et indexer les embeddings (768 dimensions) générés via Sentence Transformers (nomic-embed-text-v2-moe
). Le chatbot fonctionne en vectorisant les questions utilisateurs, en recherchant les documents pertinents par comparaison vectorielle (similarité cosinus), puis en générant des réponses sourcées via un LLM, le tout encapsulé dans une API FastAPI et une webapp simple. L’objectif était d’explorer l’exploitation de l’IA pour un usage métier précis, en garantissant des réponses fiables et ancrées dans le corpus documentaires. Le code source est disponible sur GitHub. Une démonstration concrète de RAG (Retrieval-Augmented Generation) avec des outils open-source.
Cet article explique comment Go gère efficacement les entrées/sorties réseau grâce à son modèle basé sur les goroutines et le netpoller, permettant de créer des applications scalables et performantes (comme des serveurs TCP, HTTP ou WebSocket). L'article détaille le fonctionnement interne de Go pour la gestion des connexions (via epoll
/kqueue
), illustre avec des exemples de code simples (serveur TCP, gestion des timeouts), et partage des bonnes pratiques : fermeture des connexions, optimisation des buffers, gestion des erreurs, et monitoring avec Prometheus. Un cas pratique montre la création d'un serveur WebSocket capable de gérer des milliers de connexions simultanées. L'auteur souligne aussi les pièges courants (fuites de goroutines, épuisement des descripteurs de fichiers) et propose des outils pour tester et déboguer (wrk, pprof). Idéal pour comprendre pourquoi Go excelle dans les applications réseau haute performance.
L’article explique comment résoudre un conflit de noms de groupes de volumes LVM (VG Name) sous Ubuntu, lorsque deux installations (une sur SSD interne, une sur SSD externe) utilisent le même nom par défaut (ubuntu-vg
). Après avoir branché le SSD externe, l’auteur constate que la partition principale ne monte pas à cause de ce conflit. La solution consiste à identifier les volumes avec sudo vgdisplay
, puis à renommer l’ancien groupe de volumes à l’aide de son UUID via la commande sudo vgrename <UUID> <nouveau_nom>
(exemple : sudo vgrename Kr38B5-Jt8d-3s42-0TLH-l3fe-av3a-C8a1Xt oldSSD
). Une fois renommé, le volume peut être monté et accessible normalement après saisie de la phrase de passe de déchiffrement.
L’article "Simplify Your Code: Functional Core, Imperative Shell" (adapté d’un épisode Google Tech on the Toilet) propose une méthode pour structurer son code en séparant la logique métier pure (le cœur fonctionnel) des effets de bord (la coquille impérative). L’idée est d’isoler la logique métier dans des fonctions pures, faciles à tester et à réutiliser, tandis que les interactions externes (base de données, envoi d’emails, etc.) sont reléguées à une couche impérative. Par exemple, au lieu de mélanger requêtes base de données et envoi d’emails dans une seule fonction, on extrait d’abord les utilisateurs expirés via une fonction pure (getExpiredUsers
), puis on génère les emails avec une autre fonction pure (generateExpiryEmails
), avant de les envoyer via une couche impérative. Cette approche améliore la testabilité, la maintenabilité et la flexibilité du code.
Devstral est un modèle LLM agentique open source développé par Mistral AI, spécialement optimisé pour les tâches de développement logiciel. Il se distingue par sa capacité à résoudre des problèmes complexes de programmation, comme la navigation dans de grandes bases de code, la modification de plusieurs fichiers et la correction de bugs, en agissant de manière autonome. Avec seulement 24 milliards de paramètres, il surpasse certains modèles fermés et open source plus volumineux sur le benchmark SWE-Bench Verified, tout en restant léger et utilisable en local sur des machines avec 32 Go de RAM ou une RTX 4090. Sous licence Apache 2.0, il s’intègre facilement à des frameworks comme OpenHands ou SWE-Agent.
L’article détaille son installation (via Ollama, plugins IDE ou OpenHands) et ses cas d’usage : génération de documentation, refactoring de code, création de projets structurés (ex. Spring Boot en DDD), ou amélioration de projets existants. Bien que performant, son efficacité dépend de la qualité des prompts et de l’environnement fourni. Devstral représente une solution prometteuse pour les développeurs souhaitant un assistant local, sécurisé et puissant, malgré quelques limites comme la génération occasionnelle de code inutile ou trop complexe. Une version "Large" est annoncée pour l’avenir.
Le Forum PHP 2025 a célébré les 30 ans de PHP, les 25 ans de l’AFUP, les 20 ans de Symfony et les 15 ans d’API Platform, avec des annonces et retours d’expérience marquants. Symfony 8 a été présenté avec ses évolutions (PHP 8.4 minimum, typage renforcé, suppression de code obsolète) et ses outils phares comme Flex, Autowiring ou Symfony AI. PHP 8.5 introduit notamment le pipe operator pour le chaînage de fonctions et des améliorations sur les URL et les emojis. L’IA était au cœur des discussions, avec des démonstrations du protocole MCP pour rendre les LLM capables d’agir via des outils serveurs, ainsi que des réflexions sur l’impact des IA génératives sur le métier de développeur. Des talks ont aussi mis en lumière des alternatives comme HTMX pour des applications dynamiques sans SPA, l’optimisation SQL face aux ORM, et des solutions pour la résilience des applications. Enfin, des retours sur la sécurité (WannaCry), l’accessibilité (RGAA) et l’embarquement de PHP dans des binaires autonomes ont complété ce panorama technique et inspirant. Une édition riche en innovations et en partage d’expertise pour la communauté PHP.
L’article de Bohdan Pastukh critique l’approche souvent enseignée par la documentation Symfony, qui pousse vers un Anemic Domain Model : les entités (comme User
) se réduisent à des conteneurs de données avec des getters/setters, tandis que la logique métier est déplacée vers des services externes (ex : ContactDataService
). L’auteur souligne que cette pratique, bien que courante dans les tutoriels, conduit à un code moins cohésif et moins orienté objet. Il encourage à privilégier les Rich Models, où la logique métier est encapsulée directement dans les entités, pour un design plus robuste et maintenable.
Exemple critiqué :
class User {
private string $contactType;
private string $contact;
public function setContactType(string $contactType): void { ... }
public function setContact(string $contact): void { ... }
}
class ContactDataService {
public function changeContactData(string $contactType, string $contact): void { ... }
}
Alternative suggérée : Intégrer la validation et la logique dans l’entité User
elle-même.
L’article explique comment automatiser la découverte et l’enregistrement des commandes console dans une application PHP utilisant le framework Power Modules et Symfony Console. L’auteur part du constat que la registration manuelle des commandes (via une boucle sur les modules et leurs composants exportés) est répétitive et peu élégante. Il propose une solution basée sur un PowerModuleSetup
dédié, qui s’intègre au cycle de vie des modules pour collecter et enregistrer automatiquement les commandes, en s’appuyant sur le conteneur de dépendances de Symfony. La solution évolue vers une approche optimisée avec un ContainerCommandLoader
, permettant un chargement paresseux des commandes. Le résultat est un code plus modulaire, réutilisable et sans duplication, idéal pour les architectures basées sur Power Modules. Le package est disponible via Composer : power-modules/console
.
Ce billet explique comment tirer pleinement parti du composant symfony/object-mapper, bien au-delà d'une simple hydratation d'objets à partir de tableaux. L'auteur montre que cet outil, basé sur le puissant Serializer de Symfony, permet de gérer des cas avancés comme la création de DTO immutables (avec promotion de propriétés dans le constructeur), la gestion de structures imbriquées et de collections, l'application de logiques personnalisées (ex : conversion de chaînes en DateTimeImmutable), et l'adaptation entre différentes conventions de nommage (snake_case ↔ camelCase). Grâce à des exemples concrets en Symfony 7.3, il démontre comment configurer et utiliser l'ObjectMapper pour des transformations de données élégantes et maintenables, tout en intégrant la validation et la gestion des erreurs. Un guide pratique pour optimiser la manipulation de données dans des applications PHP modernes.
Tout est dans le titre... et c'est génial !
L’auteur partage son retour sur le DevFest Nantes 2025, une première pour lui en tant que participant et conférencier. Au programme : une keynote sur le "techlore" (folklore technologique moderne) par Dasha Ilina, des découvertes sur les trésors méconnus de PostgreSQL (CTE, JSONB, Foreign Data Wrapper…), une réflexion philosophique sur l’IA et la conscience, une analogie ludique entre Factorio et l’ingénierie logicielle, et un side project technique autour de la série Bref. Il a aussi co-animé un talk sur Kubernetes (Limits, QoS, PriorityClasses) avec Quentin Joly, et assisté à des retours d’expérience sur Karpenter/KEDA pour le FinOps et un agent vocal "trouveur de chaussettes" mêlant RAG et LLM. L’ambiance networking et les soirées ont complété une édition riche en échanges et en apprentissages.
L’auteur, développeur expérimenté, partage son retour sur l’utilisation de la GenAI (Claude Code) au quotidien. Il distingue trois usages principaux : le "vibe coding" (génération complète de scripts ou interfaces simples, gain de temps énorme), le "mode chirurgien" (résolution ciblée de bugs complexes ou manipulation de SDK obscurs), et l’assistance pour du code de production (génération de couches techniques répétitives, reviews, agents automatisés). Selon lui, la GenAI ne remplace pas les développeurs — elle libère du temps pour se concentrer sur la réflexion architecturale, l’intégration système et les bonnes pratiques, domaines où l’expertise humaine reste indispensable. Un outil à adopter pour booster sa productivité, mais sans illusions sur la disparition du métier.
ndiff
(Nmap) permet de comparer deux scans réseau au format XML pour détecter rapidement les changements (nouveaux hôtes, ports, services). Installation simple, utilisation en une commande (ndiff scan1.xml scan2.xml
), sortie exploitable en texte ou XML pour automatisation. Idéal pour surveiller l’évolution d’un réseau et repérer les anomalies.
L’article présente comment renforcer un système RAG (Retrieval-Augmented Generation) en intégrant Neo4j, une base de données graphe, pour améliorer la pertinence et la précision des réponses générées par un LLM (comme Claude d’Anthropic via AWS Bedrock). L’approche combine le LLM pour extraire et structurer des données semi-structurées (via des prompts ciblés) et Neo4j pour stocker ces données sous forme de graphe, permettant des requêtes complexes et contextualisées. Grâce à LangChain, les questions en langage naturel sont traduites en requêtes Cypher, exploitant ainsi la puissance des relations pré-établies dans Neo4j pour fournir des réponses précises, même sur des données métiers spécifiques. L’auteur souligne aussi l’importance de la sécurité, de la performance, et de l’itération sur les prompts pour optimiser les résultats. Une solution idéale pour des cas d’usage professionnels où la précision et le contexte sont cruciaux.
L’article explique comment améliorer l’UX d’un site en affichant automatiquement les favicons devant les liens externes, sans JavaScript ni surcharge inutile. L’auteur utilise une approche côté serveur (via un MarkdownProcessor
en PHP) pour détecter les liens externes, ajouter dynamiquement leur favicon via l’API publique de DuckDuckGo, et appliquer des attributs de sécurité (target="_blank"
, rel="noreferrer nofollow"
). Le CSS assure un alignement parfait et un soulignement du texte seulement. Résultat : une navigation plus intuitive et visuellement claire, avec un impact minimal sur les performances grâce au lazy loading et au cache HTTP. Une astuce simple mais efficace pour soigner les détails et renforcer la confiance des utilisateurs.
L’article explique comment prioriser les développements logiciels en s’appuyant sur le Domain Driven Design (DDD) : il propose de classer les domaines métier en trois catégories — Core (cœur de métier, différenciant, à développer en interne avec soin), Support (nécessaire mais non différenciant, pouvant être externalisé ou standardisé), et Generic (standard, sans valeur stratégique, à traiter avec des solutions existantes et un investissement minimal). L’idée est d’aligner les ressources et l’effort sur ce qui crée vraiment de la valeur pour l’entreprise, afin de construire une stratégie de développement cohérente et efficace.
L’article explique comment mettre en place un système de visioconférence performant dans Nextcloud, en dépassant les limites des solutions traditionnelles comme Talk ou l’intégration de BigBlueButton. Il propose deux méthodes d’installation : un script de déploiement pour un serveur dédié, ou un déploiement en conteneurs Docker (pour le signaling et l’enregistrement), avec des exemples de fichiers docker-compose et de configurations Apache. L’objectif est d’offrir une solution scalable, intégrée à Nextcloud, permettant notamment l’enregistrement de webinaires ou de démonstrations. L’auteur partage aussi des captures d’écran et un exemple concret d’utilisation réussie. Idéal pour ceux qui cherchent à optimiser la visio et l’enregistrement dans leur instance Nextcloud.