L'article explique comment organiser efficacement votre code pour améliorer la lisibilité et la maintenabilité. Il couvre l'utilisation de lignes shebang pour rendre les scripts exécutables, l'organisation des instructions d'importation selon les conventions PEP 8, et la création de points d'entrée principaux avec des blocs if name == "main". L'article aborde également la gestion des dépendances avec PEP 723, la manipulation des arguments en ligne de commande avec des bibliothèques comme Click, et l'amélioration de la structure interne des données avec des énumérations et des dataclasses. Enfin, il propose des conseils pour améliorer les retours des scripts, comme l'utilisation de bibliothèques telles que Rich pour une meilleure présentation des sorties.
L'article détaille la stack technique de Shopify, révélant comment la plateforme gère une échelle massive avec une architecture qui semble simple en surface, mais qui est en réalité le résultat de décisions architecturales astucieuses et de nombreuses années de refactoring. Shopify utilise principalement Ruby on Rails pour son backend, avec des investissements significatifs dans des outils comme YJIT et Sorbet pour améliorer les performances et la sécurité du typage. Le frontend est principalement construit avec React et TypeScript, tandis que React Native est utilisé pour le développement mobile. Shopify s'appuie sur MySQL pour sa base de données principale, avec des stratégies de sharding et de pods pour assurer l'isolation et la scalabilité. Kafka est utilisé pour la messagerie et la distribution d'événements, tandis que des outils comme Memcached et Redis sont utilisés pour le caching et la gestion des files d'attente. L'infrastructure ML de Shopify utilise des embeddings pour la recherche en temps réel et des pipelines de données basés sur Apache Beam. La plateforme est déployée sur Kubernetes, avec des processus CI/CD robustes et des outils d'observabilité pour assurer la fiabilité et la sécurité. Shopify traite des milliards de requêtes par jour, démontrant l'efficacité de sa pile technologique à grande échelle.
L'article explore l'impact des outils de génération de code assistés par l'IA sur le développement logiciel moderne. Il met en lumière des outils comme Cursor et Windsurf, qui intègrent l'IA pour aider les développeurs à écrire du code plus rapidement et plus efficacement. Cursor, basé sur VSCode, offre des fonctionnalités comme la complétion de code intelligente et un chat intégré pour discuter des améliorations de code. Windsurf, quant à lui, va plus loin en permettant des refactorings complexes et une compréhension multi-fichiers. Cependant, l'article souligne également les défis et les pièges potentiels de ces outils, tels que la génération de code qui compile mais ne fonctionne pas comme prévu, l'accumulation de dette technique, et la dépendance excessive à l'IA qui pourrait entraîner une perte de compétences. En outre, l'article aborde l'intégration de ces outils dans les workflows de développement, notamment avec des plateformes comme Graphite et Diamond, qui automatisent les revues de code et améliorent la qualité logicielle. Enfin, il réfléchit sur l'avenir du métier de développeur, suggérant que les rôles évolueront vers une supervision et une orchestration accrues des outils d'IA, tout en maintenant une compréhension solide des fondamentaux du codage.
L'article explore l'impact de l'IA sur le développement logiciel à travers son expérience personnelle. Initialement sceptique, l'auteur a découvert que l'IA pouvait significativement améliorer sa productivité, notamment en générant du code pour des tâches répétitives et en servant de "rubber duck" pour résoudre des problèmes complexes. Il souligne que l'IA excelle dans l'automatisation des tâches banales, permettant aux ingénieurs de se concentrer sur des aspects plus créatifs et architecturaux du développement. Cependant, il met en garde contre une confiance aveugle dans les outils d'IA, insistant sur la nécessité de revoir et de tester soigneusement le code généré. l'auteur partage également des stratégies pour intégrer l'IA dans les flux de travail, comme l'utiliser dans les éditeurs de code et expérimenter avec différents modèles de prompts. En fin de compte, il encourage les développeurs à adopter l'IA de manière critique et réfléchie pour rester compétitifs dans un paysage technologique en évolution.
L'article explore comment les développeurs peuvent tirer parti de Cursor pour améliorer leur efficacité en codage. Il met en lumière des techniques pratiques telles que l'établissement de règles spécifiques au projet, la documentation de la structure du projet, et la rédaction de prompts efficaces pour guider l'IA. L'auteur partage également des conseils avancés comme le chaînage de prompts et l'itération progressive pour affiner les résultats. L'article souligne l'importance de superviser l'IA et de l'utiliser comme un accélérateur pour amplifier les compétences existantes plutôt que de remplacer l'expertise humaine.
L'article explore l'application de la Clean Architecture dans les applications PHP pour créer des systèmes découplés, testables et maintenables. L'auteur explique comment la Clean Architecture sépare les responsabilités en couches distinctes : Entités, Cas d'utilisation et Interfaces, en insistant sur le fait que la logique métier doit être indépendante des frameworks. Les contrôleurs, souvent surchargés dans les applications MVC traditionnelles, sont allégés en déléguant les tâches aux cas d'utilisation spécifiques. L'article souligne l'importance des interfaces sur les implémentations, facilitant ainsi les tests et la flexibilité. En suivant ces principes, les développeurs peuvent obtenir un code plus propre, plus facile à tester et à maintenir, tout en étant prêt pour une croissance future.
L'article explore une approche pour construire des applications en combinant les principes du Domain-Driven Design (DDD) et de l'architecture Clean. L'auteur propose de se concentrer sur les cas d'utilisation plutôt que sur les entités pures du DDD, en utilisant des cas d'utilisation pour orchestrer la logique métier inter-aggregats de manière claire et ciblée. L'article présente un exemple d'application simple avec des entités comme Student et Course, illustrant comment modéliser le domaine et gérer les relations entre les agrégats. Il préconise l'utilisation de l'ORM pour les opérations C(r)UD et des requêtes JDBC directes pour les requêtes impliquant plusieurs agrégats, s'inspirant des principes CQRS. Les cas d'utilisation sont transactionnels pour garantir la cohérence des états des agrégats. L'article conclut en soulignant les avantages de cette approche, notamment une meilleure compréhension du code et une facilité de test.
L'auteur décrit comment il a utilisé Claude pour développer une simple application météo : depuis le choix des technologies jusqu'à l'implémentation. Il donne quelques conseils sur le bon usage de l'IA pour l'aide au développement : importance du contexte, questionner les choix, etc.
L'auteur donne une série de conseils pour l'écriture de regex en JavaScript, du plus basique au plus complexe : ajout de flags, groupes de capture nommés, etc.
L'article présente une liste de conseils pour les tests avec PHPUnit, certains spécifiques à Laravel et d'autres non. J'en retiens :
- assertEqualsCanonicalizing qui permet de vérifier que 2 tableaux sont "égaux", sans tenir compte de l'ordonnancement des valeurs
- l'attribut #[\PHPUnit\Framework\Attributes\DoesNotPerformAssertions] qui permet de dire à PHPUnit qu'un test ne vérifie aucune assertion (ce qui déclenche normalement une erreur dans PHPUnit)
- l'attribut #[\PHPUnit\Framework\Attributes\RunInSeparateProcess] permet de préciser à PHPUnit d'exécuter les tests dans plusieurs processus... ça permet par exemple de définir une même constante dans 2 méthodes de tests de la même classe.
- la méthode $this->markTestSkipped('test are skipped because ...'); permet de sauter l'exécution d'un test, $this->markTestIncomplete('test are incomplete but not in error'); permet d'indiquer qu'un test est incomplet (??) et $this->fail('test are failed !'); permet de marquer un test comme échoué quoi qu'il arrive.
- phpunit --order-by=random permet de lancer les tests dans un ordre aléatoire - c'est très pratique pour détecter les dépendances implicites entre les tests. phpunit --order-by=random --random-order-seed=1234 permet même de rejouer le même ordre aléatoire, notamment pour reproduire un échec.
- phpunit --stop-on-failure --stop-on-error permet de stopper l'exécution des tests dès la première erreur rencontrée
- enfin en utilisant l'attribut #[\PHPUnit\Framework\Attributes\Group('mon_super_groupe')], on peut exclure les tests de ce groupe vendor/bin/phpunit --exclude-group mon_super_groupe ou au contraire ne jouer que les tests de ce groupe vendor/bin/phpunit --group flaky
L'article introduit les Signaux en tant que nouveau modèle mental pour la réactivité dans Angular, en se concentrant sur des variables réactives plutôt que sur des flux de données. Contrairement à RxJS, où les données sont traitées comme des flux, les Signaux permettent de lire les valeurs comme des variables, simplifiant ainsi la gestion des dépendances et des réactions. Cependant, cette approche nécessite une attention particulière pour éviter les dépendances implicites et les recalculs inattendus. Bien que les Signaux ne remplacent pas RxJS, ils offrent une alternative efficace pour la gestion de l'état local et les données dérivées dans les composants.
L'auteur présente les éléments à prendre en compte pour générer un flux RSS :
- choix du format (RSS, Atom, JSON)
- balises selon le format
- découvrabilité du flux
- catégories
- adaptation des règles HTTP selon la charge du serveur
L'auteur expose plusieurs concepts et bonnes pratiques de git, en revisitant Blanche-Neige. C'est assez drôle, bien écrit et surtout très compréhensible.
L'article est une introduction pour comprendre et utiliser correctement les Accessible Rich Internet Applications. Il explique que ARIA est utilisé pour améliorer l'accessibilité des sites web en fournissant des informations supplémentaires aux technologies d'assistance, comme les lecteurs d'écran. L'auteur souligne l'importance d'utiliser des éléments HTML natifs chaque fois que possible et de ne pas modifier leur sémantique inutilement. Il met également en garde contre certaines idées fausses courantes et fournit des conseils pour aborder ARIA de manière efficace. Enfin, l'article insiste sur le fait que l'utilisation correcte d'ARIA peut grandement améliorer l'expérience des utilisateurs dépendant de technologies d'assistance.
L'article critique deux pratiques courantes dans le domaine du monitoring : le sampling des données et l'utilisation de S3 comme solution de stockage principale. Le sampling, bien que présenté comme une solution économique, peut entraîner une perte de granularité cruciale, rendant invisibles des problèmes intermittents et compliquant le débogage. De plus, l'utilisation de S3, bien que durable et économique, introduit des latences importantes et des coûts cachés, rendant les opérations de monitoring inefficaces et coûteuses en situation de crise. L'auteur souligne que ces pratiques peuvent transformer le monitoring en un processus inefficace, avec des conséquences graves lors d'incidents majeurs. Il recommande d'investir dans des solutions de monitoring adaptées pour éviter ces pièges et garantir une visibilité opérationnelle complète.
L'article présente une comparaison des bibliothèques de journalisation pour Node.js, mettant en avant leurs forces et leurs cas d'utilisation spécifiques. Par exemple, Winston est apprécié pour sa grande configurabilité, ce qui le rend idéal pour les applications complexes, tandis que Pino est privilégié pour ses performances élevées, adaptées aux systèmes à haut débit. L'article souligne également l'importance de choisir une bibliothèque de journalisation en fonction des besoins spécifiques du projet, tels que la structure des données, l'expérience de l'équipe et les exigences d'intégration. Il conclut sur une liste de bonnes pratiques et recommandations
L'article explique comment Docker utilise par défaut le pilote json-file pour stocker les logs, ce qui peut entraîner des problèmes d'espace disque si non configuré correctement. Il propose des solutions pour configurer et limiter la taille des fichiers de logs via le fichier /etc/docker/daemon.json et présente divers pilotes de logs comme syslog, journald, et des solutions plus avancées comme Splunk ou AWS CloudWatch Logs pour des environnements critiques. Enfin, l'article souligne l'importance des bonnes pratiques telles que la rotation des logs, l'étiquetage, et la centralisation pour une gestion efficace des logs dans Docker.
L'article rappelle l'intérêt des connexions SSH sans mot de passe. Il détaille ensuite, étape par étape, comment générer une clé SSH et configurer l'accès sans mot de passe. Il donne quelques conseils pour renforcer la sécurité, et répond à quelques questions courantes. Enfin, il présente les bonnes pratiques : renouvellement périodique des clés, etc.
L'article présente des choses à ne plus faire avec Docker :
- mettre le champ "version" dans le fichier compose
- ne pas mettre de "healthchecks"
- être root par défaut
- ne avoir de .dockerignore
- avoir des Dockerfiles en une seule étape surchargée -> il faut utiliser les builds en plusieurs étapes
- des builds manuels sans cache, il y a même la possibilité de faire du hot reload
Docker peut servir aussi bien en développement local qu'en production.
Cet article explique l'importance de ne pas jeter vos vieux ordinateurs sous Windows 10. Il met en lumière des solutions pour leur donner une seconde vie, comme les recycler ou les réutiliser pour d'autres tâches. L'article souligne également les impacts environnementaux de la surconsommation de matériel électronique. Enfin, il offre des conseils pratiques pour optimiser et prolonger la durée de vie de ces appareils.