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
- L’architecture et la conception forment un continuum : toute architecture est conception, mais seules les décisions de conception importantes relèvent de l’architecture.
- Une décision est architecturalement significative lorsqu’elle est difficile ou coûteuse à annuler, qu’elle a une large portée, qu’elle détermine un attribut de qualité clé, qu’elle impose des contraintes aux autres ou qu’elle implique des compromis importants.
- Le niveau d’abstraction seul est un mauvais critère : des conventions de bas niveau, comme les formats d’identifiants ou de montants, peuvent être architecturales, et certaines boîtes de haut niveau sont anodines.
- Les décisions stratégiques fixent une direction à long terme pour de nombreuses personnes ; les décisions tactiques résolvent des problèmes immédiats et circonscrits, mais des choix tactiques répétés peuvent devenir architecturaux.
- L’architecture d’entreprise couvre toute une organisation (TOGAF est le cadre le plus connu), l’architecture de solution un problème métier à travers plusieurs systèmes, et l’architecture logicielle un seul système ; les architectures des données, de la sécurité et de l’infrastructure traversent tous les niveaux.
- Les décisions devraient être prises au niveau le plus bas qui dispose d’assez de contexte et de responsabilité, avec une consultation plus large pour celles qui touchent de nombreuses équipes.
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éristique | Question à se poser | Exemple |
|---|---|---|
| Difficile ou coûteuse à annuler | Si 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ée | Combien 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 autres | Limite-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 importants | Renonç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
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) | Verdict | Raisonnement |
|---|---|---|
| Découper le système en services déployables séparément pour le catalogue, le paiement et la livraison | Architecturale | Touche 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 commandes | Architecturale | Faç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 paiement | Conception | Locale à 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 commun | Architecturale | Une 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 livraison | Conception (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 logistique | Architecturale | De 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 livraison | Conception | Faç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 secondes | Cela dépend | Conception 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
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écision | Généralement prise par | Gé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’architecture | Architectes 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étier | Architecte de solution | Product owners, architectes d’entreprise, architectes des fournisseurs |
| La structure principale d’un système : décomposition, style de communication, propriété des données | Architecte logiciel ou responsable technique de l’équipe, avec l’équipe | Exploitation, sécurité, autres équipes concernées |
| La conception à l’intérieur d’un composant : classes, patrons, algorithmes | L’équipe de développement | L’architecte, seulement si un principe ou une qualité est en jeu |
| Les choix au niveau du code : nommage, refactoring local | Chaque développeur, via la revue de code | Personne 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 temporelles | Annulation : 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 tarification | Annulation : 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éphone | Annulation : 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 chauffeur | Annulation : 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.
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 ? »