Linus Torvalds illustre ici ce qu’il considère comme du « garbage code » : des abstractions inutiles qui alourdissent la compréhension du code, comme une fonction make_u32_from_two_u16(a,b) qui masque la simplicité et la clarté de l’opération (a << 16) + b. Son argument central : le bon code optimise la charge cognitive. Chaque abstraction ou fonction helper impose un coût en termes de contexte (pour les humains comme pour les LLMs), car elle nécessite de « sauter » mentalement vers une autre partie du code, ce qui consomme de l’énergie et augmente le risque d’erreurs. Parfois, la duplication ou l’écriture explicite est préférable à une abstraction prématurée, surtout si celle-ci ne clarifie pas le code ou n’est pas réutilisée massivement. Torvalds rappelle aussi que le coût de la duplication a diminué avec les outils modernes de refactoring. Enfin, l’article souligne l’importance de la bienveillance dans les revues de code, même si le fond du message de Linus reste pertinent : privilégier la lisibilité et la localité du code.
Eugene Yan partage ses conseils pour les nouveaux Principal Engineers (ou ICs - contributeurs individuels - techniques principaux), inspirés de ses observations et de mentors, notamment dans un contexte Amazon. Il souligne que le rôle varie selon les profils : certains excellent dans la technique pure, d’autres dans l’influence transversale ou l’alignement d’équipes. À ce niveau, le codage devient secondaire ; l’impact passe par la vision technique, le mentorat, la connexion des équipes et la résolution de problèmes ambigus que personne d’autre ne traite. Le Principal Engineer doit aussi savoir convaincre, déléguer, et créer de l’espace pour les autres, tout en évitant de devenir un goulot d’étranglement. L’article insiste sur l’importance de rester "hands-on" ponctuellement, de clarifier le "pourquoi" derrière les décisions, et de se préserver des réunions inutiles pour garder du temps de réflexion stratégique. Enfin, il rappelle que ce poste exige une autonomie totale dans le choix des problèmes à résoudre, avec une responsabilité accrue envers l’organisation et soi-même. Une lecture utile pour comprendre les attentes et défis de ce rôle clé en ingénierie.
En 2025, jQuery reste largement utilisé, surtout pour la maintenance de projets legacy, où le coût et les risques d’une migration vers des frameworks modernes ne justifient pas les bénéfices. L’article souligne aussi son utilité pour le prototypage rapide, la manipulation DOM complexe dans des environnements multi-navigateurs, ou encore les animations et requêtes AJAX simples. Cependant, pour les applications modernes, et ciblant uniquement les navigateurs récents, jQuery n’est plus pertinent : les API natives (comme fetch, querySelector) et les frameworks (React, Vue) offrent des alternatives plus légères et mieux adaptées. L’auteur conclut que jQuery reste un outil valable pour certains cas d’usage, mais qu’il faut savoir choisir la bonne technologie selon le contexte.
Cet article présente une approche pragmatique pour construire une application SaaS multi-tenant avec Symfony, en utilisant une base de données partagée et une seule codebase pour plusieurs clients (tenants). L’article s’appuie sur l’expérience de l’auteur, qui a développé une plateforme pour des marques de retail, chacune ayant ses propres magasins, utilisateurs et règles d’accès.
Points clés :
- Résolution du tenant : Identification du client actif via la session (back-office) ou le sous-domaine (front-office), stockée dans un service
TenantContextaccessible partout dans l’application. - Isolation des données : Toutes les entités liées à un client incluent un
brand_id, et les requêtes sont automatiquement filtrées par ce contexte. - Contrôle d’accès (ACL) : Gestion des fonctionnalités et permissions par client via des listes de contrôle d’accès (ACL) et des voters Symfony, permettant d’activer/désactiver des fonctionnalités par marque.
- Architecture unifiée : Le même
TenantContextest utilisé pour le back-office (session) et le front-office (domaine), garantissant une cohérence et une sécurité optimale.
L’article insiste sur la simplicité, la maintenabilité et l’évolutivité de cette solution, idéale pour les SaaS nécessitant une isolation des données sans complexité infrastructurelle.
L’article explique comment concevoir des tableaux clairs et efficaces, en s’appuyant sur les travaux d’Edward Tufte et de Charlie Munger. Il souligne que le choix entre tableau et graphique dépend de l’usage : les tableaux conviennent mieux aux petits jeux de données et aux comparaisons précises, tandis que les graphiques mettent en valeur les tendances et le mouvement des données. Pour rendre un tableau lisible, il recommande de limiter les bordures et les couleurs, d’aligner correctement le texte et les nombres (à droite pour ces derniers), et d’éviter les répétitions inutiles. L’article propose aussi des bonnes pratiques en HTML/CSS pour structurer et styliser les tableaux, comme l’utilisation de <thead>, <tbody>, et <tfoot>, l’alignement vertical sur la baseline, et l’adaptation responsive pour mobile. Enfin, il insiste sur l’importance de maximiser le ratio "data-ink" (encre utile) et de supprimer tout élément redondant ou superflu pour faciliter la compréhension. Une référence utile pour quiconque souhaite améliorer la présentation de données.
Cet article remet les pendules à l'heure : Postman et consorts ne servent à rien... puisque cURL fait tout ce qu'ils font en plus rapide et léger. L'article rappelle les options à passer pour les principaux cas d'usage : requêtes POST, ajout d'entêtes, upload de fichiers, cookies, authentification basique / OAuth / etc.
Pour le partage, tout peut s'écrire dans des scripts versionnables.
L’article raconte une expérience douloureuse : l’utilisation du tag latest pour une image Docker a causé une panne en production après qu’une mise à jour silencieuse de l’image de base (PostgreSQL) ait changé la version de collation du système d’exploitation, rendant la base de données incompatible. L’auteur explique que latest n’est pas synonyme de « stable » ou « sûr », mais simplement de « dernière version disponible », ce qui peut varier à tout moment. Il détaille trois raisons d’éviter latest : stabilité (comportement cohérent), reproductibilité (diagnostic et audit facilités), et contrôle des mises à jour (éviter les surprises). La solution ? Toujours spécifier un tag explicite (ex: postgres:15.3-alpine) dans Docker, Docker Compose ou Kubernetes. Un rappel utile : ne jamais laisser le choix de la version à quelqu’un d’autre, surtout en production.
Les fichiers .http offrent une alternative légère et efficace aux outils comme Postman pour tester et documenter des APIs directement depuis un éditeur de code. Ces fichiers texte, basés sur la syntaxe HTTP standard, permettent de décrire, versionner et exécuter des requêtes HTTP sans dépendre d’un outil externe ou d’un compte cloud. Intégrés nativement dans des IDE comme VS Code (via l’extension REST Client) ou JetBrains, ils facilitent le versionnement avec Git, la collaboration via des pull requests, et servent de documentation vivante pour les APIs. Leur simplicité et leur indépendance technologique en font un choix idéal pour les équipes souhaitant éviter les outils lourds et centraliser leurs tests d’API dans leur repository. L’article propose des exemples concrets avec les APIs publiques françaises (comme l’API Geo et Adresse), montre comment gérer les variables et environnements, et explique comment automatiser ces tests dans des pipelines CI/CD avec des outils comme httpyac. Une solution pragmatique pour les développeurs cherchant à simplifier leur workflow tout en gardant une documentation et des tests à jour.
Josh W. Comeau explique comment la fonction CSS linear() permet de créer des animations avancées (ressorts, rebonds, etc.) directement en CSS, sans dépendre de bibliothèques JavaScript. Contrairement aux courbes de Bézier traditionnelles, linear() utilise une série de points pour dessiner une courbe d'animation personnalisée, offrant ainsi plus de flexibilité. L'article présente des outils comme Linear() Easing Generator et EasingWizard pour générer automatiquement ces valeurs, optimisant ainsi la création d'animations fluides et naturelles. Cependant, cette approche a des limites : elle reste basée sur le temps (contrairement aux animations physiques réelles), peut mal gérer les interruptions, et nécessite beaucoup de points pour un rendu réaliste. Malgré cela, les tests montrent un impact minimal sur les performances. L'auteur recommande d'utiliser des variables CSS pour stocker les fonctions linear() et de prévoir des alternatives pour les navigateurs non compatibles. Une méthode efficace pour enrichir les animations CSS tout en respectant les préférences utilisateur (comme prefers-reduced-motion).
Jim Nielsen rappelle dans ce billet les balises HTML essentielles à ne pas oublier pour que vos pages s’affichent correctement dans les navigateurs. Il met en avant quatre éléments clés :
<!doctype html>: évite le mode "quirks" et garantit un rendu cohérent.<html lang="en">: améliore l’accessibilité, le référencement et les outils locaux (comme la correction orthographique).<meta charset="utf-8">: assure un affichage correct des caractères spéciaux, emojis et symboles.<meta name="viewport" content="width=device-width,initial-scale=1.0">: rend le site responsive et évite un affichage miniature sur mobile.
Un rappel utile pour éviter les pièges courants lors de la création de fichiers HTML basiques ! (via sebsauvage.net)
L’article explique comment déployer des applications PHP sans interruption de service en utilisant la méthode blue-green : deux environnements identiques (blue et green) sont maintenus, l’un actif, l’autre en standby. Le déploiement consiste à installer la nouvelle version sur l’environnement inactif, à vérifier son bon fonctionnement, puis à basculer le trafic de manière instantanée et réversible (via un lien symbolique, un load balancer ou Kubernetes). Les avantages incluent un temps d’arrêt quasi nul et un retour arrière rapide en cas de problème. Pour PHP, il est crucial de centraliser les sessions (Redis/Memcached), les uploads (dossier partagé ou S3), et de gérer l’Opcache et les migrations de base de données avec la méthode "expand/contract" pour éviter les ruptures. L’article propose des scripts prêts à l’emploi pour un serveur unique avec Nginx/PHP-FPM, un load balancer ou des conteneurs, ainsi qu’une checklist pour un déploiement sécurisé, incluant des vérifications de santé et la gestion des caches. Les pièges courants (sessions perdues, caches obsolètes, migrations bloquantes) et des outils comme Deployer ou GitHub Actions sont aussi abordés, soulignant que cette approche transforme les déploiements en opérations sans stress.
Ahmad Shadeed explore dans cet article comment construire une mise en page de section moderne et dynamique en CSS, en s’appuyant sur des techniques avancées comme les container queries, le sélecteur :has(), la fonction clamp(), et les unités de requête de conteneur (cqw). Il propose une solution pour adapter automatiquement la disposition d’une section (en-tête + grille de cartes) selon le nombre d’éléments, en évitant les orphelins visuels et en optimisant l’espace. L’auteur détaille aussi l’utilisation de la typographie fluide, des layouts responsives pour les cartes, et des styles conditionnels (par exemple, si une image est absente). Des astuces comme display: contents pour intégrer l’en-tête dans la grille ou random() pour des bordures aléatoires (expérimental) sont également présentées. Une démonstration pratique et des exemples de code illustrent chaque concept, montrant comment le CSS moderne permet de créer des designs flexibles et adaptatifs sans JavaScript.
Andy Clarke explore dans cet article comment les animations ambiantes, discrètes et lentes, peuvent enrichir l’identité visuelle et la narration d’un site web sans distraire l’utilisateur. À travers trois études de cas (Reuven Herman, Mike Worth et EPD), il illustre des techniques concrètes : morphing de chemins SVG, superposition de mouvements pour créer de la profondeur, interactions subtiles et respect des préférences d’accessibilité (comme prefers-reduced-motion). Ces animations, réalisées avec CSS ou GSAP, transforment des éléments statiques en expériences vivantes, tout en restant en arrière-plan. L’article met l’accent sur l’optimisation des SVGs, la performance et l’intégration harmonieuse du mouvement dans le design, prouvant que même dans des secteurs traditionnels, l’animation peut renforcer une marque sans dominer le contenu.
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.
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.
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.
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.
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.
Cet article explique comment utiliser GoAccess, un outil open-source d’analyse de logs web, pour surveiller le trafic de son serveur Apache/Nginx directement depuis le terminal ou via des rapports HTML. L’article détaille l’installation sur Ubuntu, la configuration du format des logs, les commandes de base pour analyser les logs (y compris en temps réel), et des astuces pour filtrer le trafic (exclure les bots, les pages admin, etc.). Il propose aussi des alias pour simplifier l’utilisation, des méthodes pour sécuriser les rapports générés, et des techniques avancées comme l’automatisation via des scripts et cron. L’outil est présenté comme une alternative légère, performante et respectueuse de la vie privée à Google Analytics, idéale pour les développeurs qui veulent garder le contrôle sur leurs données. En résumé : installation rapide, configuration flexible, et résultats complets (visiteurs, pages, OS, géolocalisation, etc.) sans dépendre d’un service externe.
Jared Norman réagit à un post Reddit sur la pratique réelle du TDD (Test-Driven Development) en entreprise, soulignant que si les tests sont souvent perçus comme une contrainte, leur valeur dépend de leur pertinence et de leur utilité. Il insiste sur trois points clés : privilégier les cas de failure utiles, éviter les tests redondants ou inutiles, et toujours avoir une raison claire d’écrire un test. Les réactions au post varient : certains développent en TDD surtout pour le backend (plus facile à tester), d’autres écrivent les tests après le code, et quelques-uns utilisent l’IA pour générer des tests—une approche que Jared critique, jugeant les outils actuels peu efficaces pour produire des tests de qualité. Il rappelle que le TDD est un outil parmi d’autres, à adapter selon le contexte (durée de vie du code, complexité, besoin de maintenance), et que l’important est d’en tirer un maximum de valeur, surtout dans des projets à long terme. En résumé, le TDD n’est pas une obligation absolue, mais une méthode qui, bien maîtrisée, peut accélérer le développement et sécuriser les évolutions futures.