Be Software Architecture Wise
Be Wise Apps

Read in English · Leer en español · Auf Deutsch lesen

Section 1.2 sur 1.8 · Débutant · 17 min de lecture

Architecture, conception et code : importance, portée et niveaux

Leçon vidéo

5 min · narré en anglais, avec sous-titres
Écouter seulement (audio)
Lire la transcription

Quand une décision relève-t-elle de l’architecture, et quand est-ce simplement de la conception ? Cette leçon vous donne des critères pratiques, et montre pourquoi la réponse ne se trouve pas toujours là où on l’attend.

Pensez à la conception d’une maison. Certains choix déterminent tout le reste : le nombre d’étages, l’emplacement de l’escalier, la position des murs porteurs. D’autres peuvent être modifiés en un week-end : la peinture, les étagères, les luminaires. Les deux relèvent de la conception. Mais seul le premier type relève de l’architecture, car le changer plus tard oblige à éventrer la maison. Dans le logiciel, la façon dont un système est découpé en parties relève de l’architecture. La façon dont une fonction est écrite à l’intérieur d’une partie relève de la conception.

Grady Booch l’a joliment résumé : toute architecture est conception, mais toute conception n’est pas architecture. Il n’y a pas de mur net entre les deux, seulement un continuum de décisions, ordonnées selon leur importance. La question utile n’est donc pas de savoir si quelque chose relève de l’architecture dans l’absolu. C’est de savoir quelle est l’importance de cette décision ici, et quel soin elle mérite.

Alors, qu’est-ce qui rend une décision importante ? Premièrement, elle est difficile ou coûteuse à annuler. Demandez-vous : si elle s’avère mauvaise dans un an, que coûtera son changement ? Deuxièmement, une large portée. Elle touche de nombreux composants, équipes ou systèmes, comme le format des identifiants clients utilisés par tous les services. Troisièmement, elle décide si vous atteignez un objectif clé de performances, de disponibilité, de sécurité ou de coût. Quatrièmement, elle impose une contrainte aux autres, en limitant ce que d’autres équipes peuvent choisir. Et cinquièmement, elle implique des compromis importants, ou une réelle nouveauté et un vrai risque, comme une base de données que personne dans l’organisation n’a jamais exploitée en production.

Ce diagramme place une décision sur le continuum. L’extrémité gauche est plus architecturale ; l’extrémité droite relève davantage de la conception et du code. La première dimension est le coût d’annulation : des mois de travail pour de nombreuses équipes à un bout, quelques minutes pour une seule personne à l’autre. La deuxième est la portée de l’impact : tout le système ou toute l’organisation, face à une seule fonction ou classe. La troisième est l’effet sur les qualités clés : la décision en détermine-t-elle une, ou son effet est-il local, voire nul ? Les points placent une décision donnée en exemple, le choix d’un format de message, sur chaque ligne. Une décision peut obtenir un score différent sur chaque dimension, c’est pourquoi on examine les trois.

Voici comment le responsable technique d’une start-up de VTC classe cinq décisions. Stocker les positions des trajets dans une base de données de séries temporelles est coûteux à annuler et touche les trajets, la facturation et l’analytique. C’est architectural, donc la décision est rédigée et passée en revue. Choisir une bibliothèque cliente HTTP dans le service de tarification est peu coûteux à annuler et ne touche qu’un service. C’est de la conception, et l’équipe tarification décide. Calculer les tarifs sur le serveur, jamais sur le téléphone, concerne à la fois les applications et le backend, et protège l’intégrité de la tarification. C’est architectural : un principe directeur. Représenter partout l’argent en pence ou en centimes entiers ressemble à un détail de code. Mais dès que des données et des systèmes partenaires en dépendent, cela devient très coûteux à changer. Architectural, bien qu’il s’agisse d’un détail de bas niveau. Et les couleurs du mode sombre dans l’app du chauffeur ? Une annulation sans aucun coût. De la conception. Remarquez que deux des trois décisions architecturales ne concernent pas du tout des boîtes et des flèches.

Le mot architecture s’emploie aussi à différents niveaux de portée, et les intitulés de poste les suivent. L’architecture d’entreprise couvre toute une organisation : ses capacités, ses informations, ses applications et sa technologie. Le cadre le plus connu dans ce domaine est TOGAF, de The Open Group. L’architecture de solution traite un problème métier qui s’étend sur plusieurs systèmes, comme un hôpital qui ajoute la prise de rendez-vous en ligne et doit la relier à ses systèmes existants. L’architecture logicielle ou applicative, sujet principal de ce cours, concerne les structures et les qualités d’un seul système. En dessous viennent la conception détaillée, à l’intérieur d’un composant, puis le code lui-même. Chaque niveau contraint celui du dessous. À droite, trois spécialités traversent tous les niveaux : l’architecture des données, l’architecture de sécurité et l’architecture d’infrastructure.

Pourquoi est-ce important ? Parce que le niveau d’abstraction seul est un mauvais critère. Les formats d’identifiants, les conventions pour l’argent et le temps, et les contrats d’API sont souvent architecturaux, même s’ils semblent de bas niveau. Les décisions devraient être prises au niveau le plus bas qui dispose d’assez de contexte et de responsabilité. Les architectes qui décident des structures de classes deviennent un goulot d’étranglement ; les équipes qui font seules des choix touchant tout le système créent une incohérence coûteuse. Et les bonnes équipes réduisent l’ensemble des décisions architecturales. Masquer un fournisseur derrière une interface, ou garder une base de données privée à un seul service, rend une décision peu coûteuse à annuler, et la rapproche de la conception.

Voilà la frontière entre architecture et conception. La section complète présente davantage d’exemples de décisions et indique qui prend généralement chaque type de décision. Ensuite, dans la section un point trois, nous verrons pourquoi l’architecture compte autant. À très vite.

Ce qu’il faut savoir

Un continuum, pas un mur

Si l’architecture est l’ensemble des décisions et des structures importantes (section 1.1), alors la conception est tout le reste : les nombreuses décisions plus modestes sur le fonctionnement interne de chaque partie. La difficulté est qu’il n’existe pas de frontière nette entre les deux. Choisir de découper une plateforme de livraison de repas en un système de commandes et un système de livreurs est clairement architectural. Nommer une variable ne l’est clairement pas. Entre ces extrêmes s’étend une vaste zone intermédiaire de décisions (le format d’erreur d’une API, une règle de cache, le découpage d’un module en paquets) dont le statut dépend du contexte.

Grady Booch l’a joliment résumé : toute architecture est conception, mais toute conception n’est pas architecture. L’architecture et la conception détaillée sont des points d’un même continuum de décisions de conception, ordonnées selon leur importance. C’est pourquoi la question la plus utile n’est pas, dans l’absolu, « est-ce de l’architecture ou de la conception ? », mais « quelle est l’importance de cette décision ici, et quel soin mérite-t-elle ? ».

Une deuxième façon répandue de tracer la frontière est le niveau d’abstraction : l’architecture serait la vue de haut niveau (« des boîtes et des flèches »), la conception la vue de bas niveau (« des classes et des méthodes »). C’est une première approximation raisonnable, mais elle échoue dans les deux sens. Un détail de bas niveau peut être architectural : le format d’un identifiant partagé par vingt services, ou le choix d’une convention de fuseau horaire pour les dates stockées, peut coûter des mois à changer. Et une boîte de haut niveau peut être anodine : qu’un outil d’administration interne soit ou non un service séparé peut n’avoir aucune importance.

Ce qui rend une décision architecturalement significative

Une décision est architecturalement significative lorsqu’elle présente une ou plusieurs des caractéristiques suivantes. Ce ne sont pas des règles formelles issues d’une norme unique ; elles résument ce que disent, en d’autres termes, le SEI, Martin Fowler, Mark Richards et Neal Ford, entre autres.

Signes qu’une décision est architecturalement significative

CaractéristiqueQuestion à se poserExemple
Difficile ou coûteuse à annulerSi elle s’avère mauvaise dans un an, que coûtera son changement ?Choisir un modèle de données en event sourcing plutôt que de stocker l’état courant
Large portéeCombien de composants, d’équipes ou de systèmes touche-t-elle ?Définir le format des identifiants clients utilisés par tous les services
Détermine une qualité cléDécide-t-elle si nous atteignons un objectif de performances, de disponibilité, de sécurité ou de coût ?Placer un cache devant le catalogue de produits pour tenir un objectif de temps de réponse de 200 ms
Impose une contrainte aux autresLimite-t-elle ce que d’autres équipes peuvent choisir ?Imposer que tous les services publient leurs événements vers un seul courtier partagé
Implique des compromis importantsRenonçons-nous à quelque chose d’important pour obtenir autre chose ?Accepter une cohérence à terme entre les commandes et le stock pour que l’étape de paiement reste disponible
Forte nouveauté ou risque élevéQuelqu’un ici l’a-t-il déjà fait ? Et si la technologie nous lâche ?Adopter une base de données que l’organisation n’a jamais exploitée en production

Mark Richards et Neal Ford, dans Fundamentals of Software Architecture, décrivent le spectre architecture/conception en des termes semblables : une décision penche d’autant plus vers l’architecture qu’elle est stratégique (long terme, nombreuses personnes impliquées), qu’elle demanderait d’efforts pour être changée et que ses compromis sont importants. Martin Fowler en propose une version condensée : l’architecture, c’est ce qui est difficile à changer, ce qui signifie aussi que l’un des objectifs d’un architecte est de rendre davantage de choses faciles à changer. Rendre une décision peu coûteuse à annuler, par exemple en la plaçant derrière une interface, la fait de fait glisser de l’architecture vers la conception. Cette idée, la réversibilité, est approfondie à la section 1.6.

Placer une décision sur le continuum

Un continuum de l’architecture au code, avec trois dimensions qui y placent une décisionPlus architecturalPlus conception/codeCoût d’annulationmois, multi-équipesminutes, une personnePortée d’impacttout le système/org.une fonction ou classeEffet sur qualités clésfixe une qualité clélocal ou nulPoints : une décision (choix du format des messages) placée sur chaque dimension
Trois dimensions placent une décision entre architecture et conception ; une décision peut obtenir un score différent sur chacune.

Décisions stratégiques et tactiques

Une distinction voisine oppose décisions stratégiques et décisions tactiques. Les décisions stratégiques fixent une direction pour longtemps et pour de nombreuses personnes : adopter un fournisseur de cloud, choisir entre un monolithe et des services distribués, décider que les données clients auront un système maître unique. Elles demandent généralement l’avis de plusieurs parties prenantes et méritent d’être consignées avec leurs raisons. Les décisions tactiques résolvent un problème immédiat dans un périmètre circonscrit : quelle bibliothèque utiliser pour analyser les dates dans un service, comment structurer une requête de base de données particulière, comment nommer les endpoints d’une API interne.

Stratégique ne veut pas dire lent. Beaucoup de décisions stratégiques peuvent et doivent être prises rapidement une fois les options claires, et certaines sont réversibles si elles sont bien structurées. Tactique ne veut pas dire sans importance : une mauvaise décision tactique répétée à cinquante endroits (par exemple, chaque service qui écrit sa propre logique de nouvelle tentative sans backoff) peut finir par constituer un problème architectural. Les architectes surveillent les décisions tactiques qui sont sur le point de devenir stratégiques à force de répétition, et les transforment en principe commun ou en capacité de plateforme.

Architecture ou conception ? Exemples de décisions et raisonnement

Décision (pour une boutique en ligne)VerdictRaisonnement
Découper le système en services déployables séparément pour le catalogue, le paiement et la livraisonArchitecturaleTouche chaque équipe, le déploiement, la propriété des données et le comportement en cas de défaillance ; très coûteuse à annuler.
Utiliser PostgreSQL plutôt qu’une base de données orientée documents comme stockage principal des commandesArchitecturaleFaçonne le modèle de données, les transactions et les compétences d’exploitation ; une migration ultérieure est coûteuse et risquée.
Utiliser une bibliothèque JSON précise dans le service de paiementConceptionLocale à un service et remplaçable en une journée si elle est masquée derrière le code propre au service.
Exiger que chaque service émette des logs structurés avec un identifiant de corrélation communArchitecturaleUne préoccupation transversale : elle ne fonctionne que si tout le monde la respecte, et elle détermine la rapidité avec laquelle les incidents peuvent être diagnostiqués.
Nommer la méthode qui calcule les frais de livraisonConception (code)Purement locale ; le renommage est automatisé par les outils.
Choisir le format des numéros de commande affichés aux clients et partagés avec le partenaire logistiqueArchitecturaleDe bas niveau, mais elle franchit les frontières entre systèmes et entre entreprises, et le numéro est imprimé sur les colis ; le changer exige une coordination avec une partie externe.
Utiliser le patron Strategy pour prendre en charge plusieurs règles de frais de livraisonConceptionFaçonne l’intérieur d’un seul composant ; les autres composants ne sont pas concernés.
Mettre en cache les prix des produits pendant 60 secondesCela dépendConception si les prix changent rarement et qu’un prix périmé est sans conséquence ; architecture si un prix périmé crée un problème juridique ou financier, car la décision détermine alors une qualité clé (l’exactitude).

Les niveaux d’architecture

Le mot architecture s’emploie aussi à plusieurs niveaux de portée, et les intitulés de poste suivent ces niveaux. Les confondre provoque bien des malentendus : un architecte d’entreprise et un architecte logiciel peuvent tous deux être « l’architecte », alors que leurs travaux se recoupent à peine.

L’architecture d’entreprise porte sur toute une organisation : ses capacités métier (ce qu’elle doit être capable de faire, comme « instruire les sinistres » ou « intégrer de nouveaux clients »), les informations qu’elle détient, son portefeuille d’applications et ses plateformes technologiques, et la façon dont tout cela doit évoluer pour servir la stratégie. Les livrables typiques sont des cartes de capacités, des feuilles de route vers l’état cible, des normes technologiques et des décisions sur les systèmes à retirer. Le cadre le plus utilisé dans ce domaine est TOGAF, publié par The Open Group, dont la version actuelle est le TOGAF Standard, 10e édition (2022). Il fournit une méthode (l’Architecture Development Method) et un ensemble de contenus pour planifier et gouverner les transformations de l’entreprise. Les organisations l’utilisent à des degrés divers ; beaucoup en adoptent certaines parties et d’autres le trouvent lourd, et ce cours ne le décrit que pour que vous puissiez le reconnaître.

L’architecture de solution traite un problème métier ou un programme, qui s’étend généralement sur plusieurs applications, équipes et fournisseurs : par exemple, un hôpital qui met en place la prise de rendez-vous en ligne et doit relier un nouveau frontend web, le système existant de gestion administrative des patients, un prestataire de SMS et le service d’identité. L’architecte de solution fait en sorte que les pièces s’emboîtent, souvent sous des contraintes commerciales et contractuelles.

L’architecture logicielle ou applicative, sujet principal de ce cours, concerne les structures et les qualités d’un seul système : sa décomposition, ses interactions à l’exécution, son déploiement, ses données et son évolution.

Trois spécialités traversent tous ces niveaux. L’architecture des données porte sur la façon dont les données sont modélisées, possédées, stockées, déplacées, gouvernées et utilisées pour l’analytique (chapitre 7). L’architecture de sécurité porte sur l’identité, l’accès, la protection des données, les modèles de menaces et le placement des contrôles de sécurité (chapitre 8). L’architecture d’infrastructure (souvent appelée aujourd’hui architecture cloud ou de plateforme) porte sur le calcul, les réseaux, le stockage, les environnements et les plateformes de déploiement (chapitre 10).

Niveaux et spécialités transversales

Niveaux d’architecture, de l’entreprise jusqu’au code, traversés par les architectures des données, de la sécurité et de l’infrastructureArchitecture d’entrepriseArchi. de solutionun problème métier, plusieurs systèmesArchitecture logicielle / applicativeun système : structures et qualitésConception dét.dans un composantCodeArchi.des donnéesArchi. dela sécuritéArchitecturede l’infra.Chaque niveau contraint le suivant ; les spécialités traversent tous les niveaux
La portée se resserre de l’entreprise jusqu’au code ; les architectures des données, de la sécurité et de l’infrastructure s’appliquent à tous les niveaux.

Qui prend quelles décisions

Dans une organisation saine, les décisions sont prises au niveau le plus bas qui dispose d’assez de contexte et qui répond des conséquences. L’architecture n’est pas la chasse gardée des personnes dont l’intitulé de poste contient le mot « architecte ». Une répartition par défaut raisonnable ressemble à ceci, même si chaque organisation l’ajuste.

Type de décisionGénéralement prise parGénéralement consultés
Normes et plateformes technologiques de l’organisation (p. ex. fournisseur de cloud approuvé, plateforme d’identité)Architectes d’entreprise, CTO, comité d’architectureArchitectes de solution et architectes logiciels, sécurité, finance
La façon dont plusieurs systèmes et fournisseurs se combinent pour résoudre un problème métierArchitecte de solutionProduct owners, architectes d’entreprise, architectes des fournisseurs
La structure principale d’un système : décomposition, style de communication, propriété des donnéesArchitecte logiciel ou responsable technique de l’équipe, avec l’équipeExploitation, sécurité, autres équipes concernées
La conception à l’intérieur d’un composant : classes, patrons, algorithmesL’équipe de développementL’architecte, seulement si un principe ou une qualité est en jeu
Les choix au niveau du code : nommage, refactoring localChaque développeur, via la revue de codePersonne d’autre, normalement

Deux signaux d’alerte montrent que la répartition est mauvaise. Si les architectes décident des structures de classes internes, ils deviennent un goulot d’étranglement et l’équipe cesse de réfléchir. Si les équipes prennent chacune de leur côté des décisions qui ont des effets sur tout le système (chacune choisissant son propre courtier de messages, par exemple), l’organisation paie plus tard le prix de l’incohérence. La façon de consigner quelles décisions exigent une consultation plus large, et de faciliter leur enregistrement, est traitée dans décisions et compromis et, en profondeur, dans la partie du chapitre 4 consacrée aux enregistrements de décision d’architecture (ADR).

Exemple commenté

Exemple commenté : classer les décisions d’une application de VTC

Une start-up de VTC dresse la liste de cinq décisions en attente. Le responsable technique utilise les trois signes (coût d’annulation, portée, effet sur les qualités clés) pour déterminer lesquelles exigent une trace écrite et une revue plus large.

1. Stocker les positions des trajets dans une base de données de séries temporellesAnnulation : coût élevé (migration de données). Portée : trajets, facturation, analytique. Qualité : performances du suivi en temps réel. Verdict : architecturale ; la rédiger et la revoir avec les équipes données et exploitation.
2. Utiliser une bibliothèque cliente HTTP précise dans le service de tarificationAnnulation : coût faible. Portée : un service. Qualité : aucune de notable. Verdict : conception ; l’équipe tarification décide.
3. Calculer les tarifs sur le serveur, jamais sur le téléphoneAnnulation : coût moyen. Portée : applications et backend. Qualité : sécurité et intégrité de la tarification. Verdict : architecturale ; c’est un principe directeur.
4. Représenter partout l’argent en unités monétaires mineures entières (pence, centimes)Annulation : coût très élevé dès que les données et les API des partenaires l’utilisent. Portée : chaque service. Qualité : exactitude. Verdict : architecturale, bien que de bas niveau.
5. Utiliser les couleurs du mode sombre dans l’app du chauffeurAnnulation : coût négligeable. Portée : un ensemble d’écrans. Verdict : conception.

Deux des trois décisions architecturales (3 et 4) ne concernent pas du tout des boîtes et des flèches ; ce sont des principes et des conventions. Le niveau d’abstraction seul les aurait mal classées.

La décision 4 est le type le plus souvent manqué : elle ressemble à un détail de code, mais devient très coûteuse à changer dès que d’autres systèmes en dépendent.

Questions fréquentes

Le choix d’un langage de programmation est-il une décision architecturale ?

Souvent, oui. Il influe sur le recrutement, les bibliothèques disponibles, les caractéristiques de performances et la facilité avec laquelle le code peut être partagé entre composants. Dans un système fait de nombreux services indépendants, le langage d’un petit service peut être un choix local ; le langage par défaut de toute l’organisation est architectural.

Un schéma de base de données relève-t-il de l’architecture ou de la conception ?

Cela dépend de qui l’utilise. Une table utilisée uniquement dans un service, derrière sa propre API, relève de la conception. Un schéma lu directement par plusieurs services, des rapports et des exports vers des partenaires relève de l’architecture, car chaque modification doit être coordonnée avec tous. Beaucoup d’équipes rendent les schémas privés à un seul service précisément pour les ramener du côté de la conception.

Le développement agile signifie-t-il qu’il n’y a pas d’architecture ?

Non. Tout système a une architecture ; les approches agiles changent le moment et la manière dont elle est décidée, en privilégiant des étapes petites et réversibles et en reportant les décisions irréversibles jusqu’à ce que l’on en sache assez. La section 1.8 traite de ce sujet.

Qui décide si une décision est importante ?

Généralement l’équipe et son architecte ou son responsable technique, ensemble, à l’aide de critères convenus comme les signes présentés dans cette section. Mettre ces critères par écrit évite deux écueils : débattre de chaque choix, et découvrir après coup qu’une équipe a pris seule une décision qui touche tout le système.

Comment les professionnels appliquent la distinction

Les équipes expérimentées transforment le continuum en une routine légère. Elles conviennent d’une courte liste des types de décisions qui exigent une trace écrite et une consultation plus large, par exemple tout ce qui modifie une API publique, introduit un nouveau stockage de données ou une nouvelle technologie, franchit les frontières entre équipes ou affecte un objectif de qualité déclaré. Tout le reste est décidé par les personnes qui font le travail, au travers de la revue de code habituelle. Elles revoient la liste quand quelque chose passe entre les mailles du filet ou quand les revues ressemblent à de la bureaucratie.

Elles cherchent aussi activement des moyens de réduire l’ensemble des décisions architecturales, car chaque décision qui devient peu coûteuse à annuler est une décision de moins à réussir du premier coup. Masquer un fournisseur derrière une interface, rendre une base de données privée à un seul service, utiliser des feature flags pour les comportements risqués et déployer par petits incréments déplacent tous des décisions de l’extrémité architecturale du continuum vers l’extrémité conception.

Vérifiez votre compréhension

Pourquoi le choix du format d’un identifiant peut-il être architectural ?

Parce qu’une fois que de nombreux services, bases de données et partenaires externes en dépendent, le changer exige un travail coordonné entre tous, si bien que son coût du changement et sa portée sont élevés.

Quelle est la différence entre l’architecture d’entreprise et l’architecture de solution ?

L’architecture d’entreprise couvre les capacités, les informations, les applications et la technologie de toute l’organisation ; l’architecture de solution traite un problème métier qui s’étend généralement sur plusieurs systèmes et équipes.

Comment un architecte peut-il faire passer une décision de l’architecture vers la conception ?

En la rendant moins coûteuse à annuler, par exemple en masquant une technologie derrière une interface pour qu’elle puisse être remplacée localement.

Suivant · 1.3Pourquoi c’est importantL’architecture détermine les qualités d’un système, le coût et la rapidité de chaque changement futur, ses risques et la façon dont les équipes peuvent travailler. Des cas réels, chez Knight Capital, HealthCare.gov et Prime Video, montrent pourquoi.Continuer →

Sources et lectures complémentaires

Une question sur cette section ? ArchitectBot, l’assistant d’étude IA du cours, répond d’abord à partir du cours.

Demander : « Comment décider quelles décisions de mon équipe nécessitent une revue d’architecture et lesquelles les développeurs peuvent simplement prendre eux-mêmes ? »