2.0

Voir en anglais

2.0 Introduction à la partie 2 : la programmation logicielle

La partie 2 porte sur l’art quotidien d’écrire un logiciel que beaucoup de gens peuvent lire, changer, et en qui faire confiance sur une longue durée de vie. La partie 1 a posé les fondations de comment les équipes s’organisent et décident. Cette partie se tourne vers le code lui-même : les conventions que vous suivez, la façon dont vous façonnez les conceptions et les interfaces, comment vous testez et révisez votre travail, comment vous gérez l’historique source, et comment vous écrivez les choses. Ce sont les pratiques qui séparent une base de code qui accélère la livraison d’une qui combat chaque changement.

Dans une grande équipe, l’art n’est pas une question de goût personnel. C’est comment vous vous coordonnez. Quand des centaines ou des milliers d’ingénieurs, prestataires, et successeurs touchent les mêmes systèmes, les conventions partagées et les contrats clairs sont ce qui laisse tout le monde travailler en parallèle sans collisions constantes. Souvenez-vous que le code est lu bien plus souvent qu’il n’est écrit, et qu’une grande partie de cette lecture se produit des années plus tard, par des gens que vous ne rencontrerez jamais.

Dans les contextes d’entreprise et gouvernementaux, les enjeux montent davantage. Les systèmes survivent couramment à leurs auteurs d’une décennie ou plus. La réglementation et l’audit exigent une preuve documentée de contrôle. La connaissance doit se transférer à travers le renouvellement de personnel et les frontières contractuelles. Donc les chapitres ici traitent la qualité non comme de l’héroïsme mais comme une propriété conçue et largement automatisée de comment toute l’équipe travaille.

Chapitres de cette partie

  • 2.1 Normes de codage et style : Des conventions partagées et automatiquement appliquées pour le nommage, le formatage, et les idiomes qui laissent de nombreux auteurs écrire comme si un seul auteur méticuleux l’avait écrit, afin que les réviseurs dépensent leur attention sur la conception plutôt que le style.

  • 2.2 Principes de conception logicielle : Des heuristiques comme SOLID (cinq principes de conception orientée objet), DRY (ne vous répétez pas), le couplage et la cohésion, et la conception pilotée par le domaine (modéliser le logiciel dans le langage du domaine métier), traitées comme des outils avec un domaine d’applicabilité et des modes d’échec connus plutôt que des lois à obéir.

  • 2.3 API et conception d’interfaces : Concevoir les contrats à travers lesquels les systèmes et les équipes se rencontrent, afin que des équipes indépendantes puissent changer leurs internes sans casser les consommateurs ni forcer un déploiement en lockstep.

  • 2.4 Stratégie de test : Des choix délibérés sur quoi tester, à quel niveau, et avec quelle confiance, construisant un filet de sécurité rapide et digne de confiance qui laisse une grande organisation déployer fréquemment et en sécurité.

  • 2.5 Revue de code et collaboration : Examiner les changements avant qu’ils fusionnent pour attraper les défauts, diffuser la connaissance, faire appliquer les normes, et satisfaire les contrôles de conformité, tout en gardant la revue rapide et constructive plutôt que cérémoniale.

  • 2.6 Contrôle de version et gestion du code source : Le système d’enregistrement pour chaque changement, et la discipline de branches, de dépôt, et de commit qui gardent la ligne principale livrable, l’historique lisible, et la piste d’audit intacte.

  • 2.7 Documentation : La connaissance écrite, des guides de démarrage aux procédures d’exploitation (des procédures opérationnelles étape par étape) et aux journaux de décision, qui défend contre le risque de personne-clé, accélère l’intégration, et transfère la compréhension à travers les années et les frontières contractuelles.

  • 2.8 Exigences logicielles : Recueillir, spécifier, valider, et gérer ce que le logiciel doit faire et à quel point bien, avec la traçabilité que le travail réglementé et gouvernemental exige.

  • 2.9 Construction logicielle : L’art de construire un logiciel qui fonctionne : minimiser la complexité, construire pour la vérification et le changement, la programmation défensive, et la réutilisation disciplinée.

  • 2.10 Gestion de configuration logicielle : Identifier, contrôler, et auditer chaque élément de configuration (tout artefact dont les versions doivent être suivies et contrôlées) et chaque changement, afin que les publications soient reproductibles et que la piste d’audit soit intacte.

  • 2.11 Qualité logicielle : La qualité comme propriété gérée plus large que le test : modèles de qualité, assurance contre contrôle, mesure, gestion des défauts, et coût de la qualité.

  • 2.12 Modèles et méthodes logiciels : Quand et comment modéliser, couvrant les modèles structurels et comportementaux, les méthodes formelles (spécification et vérification mathématiquement fondées), le prototypage, et les méthodes agiles, et quand modéliser est du gaspillage.

  • 2.13 Fondations informatiques, mathématiques, et d’ingénierie : Les fondamentaux durables sous la pratique : algorithmes et structures de données, logique et probabilité, et la méthode d’ingénierie empirique.

  • 2.14 Structure de projet et de dépôt : Des conventions cohérentes pour organiser une solution et son dépôt, incluant des dossiers standards, un point d’entrée README, et une configuration partagée, afin que n’importe quel ingénieur puisse naviguer n’importe quelle base de code.

  • 2.15 Débogage et dépannage : Trouver et corriger les défauts comme une pratique disciplinée et enseignable de reproduction, d’isolation par recherche binaire, de formation et de test d’hypothèses, et de capture de chaque correction comme un test de régression, plutôt que de la devinette et des changements au hasard.

  • 2.16 Ingénierie de la performance : Rendre le logiciel assez rapide à dessein en fixant des budgets de performance, en mesurant et profilant avant d’optimiser, en comprenant le coût algorithmique et la latence de queue, et en se gardant des régressions, tout cela au niveau du code et du composant.

  • 2.17 Concurrence et parallélisme : Écrire du code concurrent correct en optant par défaut pour l’immuabilité et le passage de messages, en comprenant les courses, les interblocages, et la visibilité mémoire, en choisissant la bonne synchronisation et les bons modèles de plus haut niveau, et en testant délibérément le comportement non déterministe.

  • 2.18 Gestion des dépendances et de la chaîne d’approvisionnement : Gérer le code tiers qui compose la plupart d’un système moderne à travers la discipline de version et les fichiers de verrouillage, une cadence de mise à jour régulière, une empreinte de dépendances minimale et vérifiée, et le suivi d’origine et une nomenclature logicielle pour une chaîne d’approvisionnement digne de confiance.

  • 2.19 Refactorisation et dette technique : Améliorer la conception interne du code qui fonctionne derrière une suite de tests digne de confiance, reconnaître les odeurs de code et appliquer de petites refactorisations nommées, utiliser le figuier étrangleur pour un changement plus large, et gérer la dette technique comme un portefeuille visible et financé plutôt qu’une faute morale.

  • 2.20 Gestion des erreurs et modèles de résilience : Décider délibérément comment le code échoue et récupère, à travers des contrats d’erreur clairs, des choix d’échec rapide contre échec sûr, des nouvelles tentatives avec repli et idempotence, des disjoncteurs et une dégradation gracieuse, et ne jamais avaler silencieusement une erreur.

  • 2.21 Systèmes de types et analyse statique : Attraper des classes entières de défauts avant que le code ne s’exécute, à travers le typage statique et graduel qui rend les états illégaux non représentables, et des linters, vérificateurs de types, et analyseurs câblés dans l’éditeur et le pipeline.

Comment ces chapitres s’articulent

Le fil conducteur de la partie 2 est la changeabilité à grande échelle. Chaque pratique ici existe pour laisser de nombreuses personnes modifier un système partagé et à longue durée de vie avec confiance. Les normes de codage (2.1) et les principes de conception (2.2) façonnent le code afin que vous puissiez le comprendre et le modifier. La conception d’interfaces (2.3) dessine les frontières qui laissent les équipes changer leurs internes indépendamment. Le test (2.4) fournit le filet de sécurité qui rend le changement sûr. La revue de code (2.5) est où le travail individuel rencontre l’appropriation collective, et où les normes sont réellement appliquées. Le contrôle de version (2.6) est la fondation sur laquelle la revue, l’intégration, et l’audit reposent tous. Et la documentation (2.7) préserve l’intention derrière tout cela pour les gens qui viennent après.

Ces chapitres alimentent aussi le reste du guide. Les interfaces et les principes de conception ici deviennent les blocs de construction des systèmes de la partie 3, spécialement les fondamentaux de l’architecture (chapitre 3.1). La stratégie de test (2.4) et le contrôle de version (2.6) sont la matière première pour les pipelines de livraison automatisés du chapitre 8.1. Les pratiques de documentation (2.7) se connectent directement aux procédures d’exploitation et à l’observabilité des opérations, comme le chapitre 9.2. Et toute la partie s’appuie sur les valeurs et les fondations de prise de décision posées dans la partie 1, transformant des principes partagés en un art quotidien concret.