Sujet : coding-practice
-
Concevoir un outil en ligne de commande Python : argparse, main() et codes de sortie
Placer l'interface dans une fonction main(argv) -> int enregistrée comme script console, valider avec les paramètres type et choices d'argparse et respecter la convention des codes de sortie (0 pour le succès, 2 pour une erreur d'utilisation, 1 pour les autres échecs, les codes de sysexits uniquement s'ils sont documentés). Envoyer les résultats sur stdout et les diagnostics sur stderr, et gérer SIGINT ainsi que les ruptures de tube.
-
Conventions d'injection de dépendances en .NET : durées de vie, portées et piège de la dépendance captive
Microsoft.Extensions.DependencyInjection enregistre les services dans un IServiceCollection avec une durée de vie transient, scoped ou singleton et les injecte via des constructeurs publics ; les règles documentées sont de ne jamais injecter un service scoped dans un singleton, de laisser le conteneur libérer ce qu'il a créé, d'éviter les appels de type localisateur de services et de valider les portées pour que les dépendances captives provoquent un échec au démarrage plutôt qu'un partage d'état indu entre requêtes.
-
Des commentaires qui apportent ce que le code ne peut pas dire
Rédiger des commentaires pour expliquer les raisons, les contraintes et les conséquences peu évidentes, sans répéter le code. Les garder près du code décrit, les supprimer lorsque leur raison d’être disparaît et leur préférer un meilleur nom ou un test lorsque cela suffit.
-
Refactoriser par petites étapes vérifiées
La refactorisation modifie la structure sans changer le comportement ; procéder par petites étapes avec des tests réussis entre chacune, et séparer les commits de refactorisation des changements de comportement, permet de la sécuriser et de faciliter sa revue.
-
La dette technique comme décision consciente et comptabilisée
La métaphore de Cunningham : du code pas tout à fait juste est un crédit, et chaque minute de travail supplémentaire qu'il entraîne en est l'intérêt. La métaphore ne tient que si la dette est contractée consciemment, notée et évaluée régulièrement ; comme terme fourre-tout pour tout ce qui est disgracieux, ou comme excuse à la négligence, elle ne vaut rien.
-
Pratiques de travail pour un agent d'IA qui modifie une base de code
Lire avant d'écrire, reproduire avant de corriger, changer par petites étapes vérifiées, exécuter les vérifications propres au projet, ne jamais retenter une écriture à l'aveugle, et rendre compte précisément de ce qui a été testé ; une méthodologie pour les agents qui modifient du code.
-
Le rétrécissement de type en TypeScript : unions, unknown et any
TypeScript rétrécit un type union à l'intérieur d'une branche après des vérifications typeof, instanceof, in, d'égalité et de véracité (truthiness), ou après un prédicat de type défini par l'utilisateur ; les unions discriminées combinées à une vérification never garantissent l'exhaustivité. unknown accepte n'importe quelle valeur mais interdit de l'utiliser tant qu'elle n'a pas été rétrécie, tandis que any désactive toute vérification.
-
La dette technique : métaphore et décision
La dette technique décrit le coût futur d'un raccourci ; la métaphore est utile lorsque la dette est délibérée et suivie, et trompeuse lorsqu'elle sert à excuser un travail négligé ou à désigner la moindre imperfection.
-
Nommer les identifiants pour que le code exprime l'intention
Choisir des noms qui énoncent ce qu'une chose est ou fait, dans le vocabulaire du domaine, avec une longueur proportionnelle à leur portée ; éviter les encodages, les abréviations et les types trompeurs, et renommer à mesure que la compréhension s'améliore.
-
Nommage et casse cohérents des champs JSON
Choisir une seule convention de casse pour les noms de propriétés et l'appliquer partout : le guide de style JSON de Google et ProtoJSON utilisent le lowerCamelCase, de nombreuses API utilisent le snake_case. Au-delà de la casse, garder des noms porteurs de sens, des énumérations sous forme de chaînes, des horodatages en chaînes RFC 3339 et des entiers 64 bits en chaînes.
-
Les gestionnaires de contexte en Python : garantir le nettoyage
L'instruction with exécute __enter__ et __exit__ autour d'un bloc, de sorte que fichiers, verrous et connexions soient libérés même en cas d'exception ; contextlib.contextmanager transforme un générateur en gestionnaire de contexte.
-
Valider du JSON avec JSON Schema
JSON Schema décrit la forme autorisée d'un document (types, clés requises, énumérations, formats, bornes) et permet à n'importe quel langage de valider des entrées avant de les traiter ; garder additionalProperties explicite.
-
Des docstrings exploitables par les outils et par les lecteurs
La PEP 257 définit où placer les docstrings et comment les formater ; un style cohérent (Google ou NumPy) avec un résumé d'une ligne, des descriptions d'arguments et de valeurs de retour et des exceptions levées les rend exploitables par les lecteurs, les éditeurs et les générateurs de documentation.
-
Nombres à virgule flottante : pourquoi 0.1 + 0.2 n'égale pas 0.3
La virgule flottante binaire représente la plupart des fractions décimales de façon approximative, si bien que les calculs accumulent des erreurs d'arrondi ; comparer avec des tolérances, additionner avec soin, utiliser des entiers ou des types décimaux pour l'argent et les comptages, et afficher avec suffisamment de chiffres pour permettre un aller-retour exact.
-
Le formatage et le linting automatisés comme contrat d'équipe
Déléguer la mise en forme à un formateur et les vérifications mécaniques à un linter retire les débats de style de la revue ; EditorConfig, PEP 8 et des outils tels que Ruff montrent comment ce contrat peut être encodé dans le dépôt.
-
Mise à l'échelle des variables et encodage des catégories : quoi transformer, et ajuster uniquement sur les données d'entraînement
Les modèles fondés sur les distances ou sur le gradient ont besoin de variables numériques à des échelles comparables (StandardScaler, MinMaxScaler, RobustScaler) ; les colonnes catégorielles deviennent des nombres par encodage one-hot, ordinal ou par cible, selon la cardinalité et le type de modèle. Chaque transformateur est ajusté sur le jeu d'entraînement puis appliqué sans modification aux lignes de validation, de test et de production.
-
Les classes Protocol : typage structurel pour le duck typing en Python
Une classe typing.Protocol déclare les méthodes et attributs dont une partie appelante a besoin ; tout objet qui les possède satisfait le type sans en hériter. Définir les protocoles à proximité du code qui en dépend, les garder minimaux, et n'utiliser runtime_checkable que là où isinstance est réellement nécessaire.
-
Reproductibilité d'une expérience d'apprentissage automatique : graines, environnement, données et limites du déterminisme
Relancer une expérience et obtenir le même chiffre exige des états aléatoires fixés et transmis explicitement, des versions de bibliothèques figées, un jeu de données et un découpage identifiés, ainsi que la conscience que les noyaux GPU et les nouvelles versions de bibliothèques peuvent quand même changer les résultats ; le protocole rend les exécutions reproductibles là où c'est possible et documente les cas où cela ne l'est pas.
-
Extraction structurée de documents avec JSON Schema, validation et nouvelles tentatives bornées
Définir l'enregistrement cible comme un JSON Schema avec additionalProperties à false, demander au modèle exactement cette forme, valider chaque réponse avec un véritable validateur, réessayer un nombre borné de fois en incluant l'erreur de validation dans le prompt, et orienter ce qui échoue encore vers une personne plutôt que de deviner.
-
NULL en SQL : logique à trois valeurs et ses pièges
NULL signifie inconnu, si bien que les comparaisons avec NULL donnent inconnu plutôt que vrai ou faux ; les filtres WHERE écartent les lignes inconnues, NOT IN avec un NULL ne trouve plus aucune correspondance, et les agrégats ignorent les NULL. Utiliser IS NULL, IS DISTINCT FROM et COALESCE délibérément.
Lisible par machine : JSON