Be Software Architecture Wise
Be Wise Apps

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

Section 1.1 sur 1.8 · Débutant · 18 min de lecture

Ce qu’est l’architecture logicielle : les définitions de référence et leurs points communs

Leçon vidéo

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

Demandez à dix ingénieurs expérimentés ce qu’est l’architecture logicielle, et vous entendrez dix réponses différentes. Dans cette leçon, nous allons donc préciser le sens du mot, car une bonne définition vous dit quoi regarder et quoi protéger.

Partons d’un bâtiment hospitalier. Son architecture n’est pas le plan punaisé au mur. C’est la façon dont le bâtiment est réellement agencé : où se trouvent les services, et quels couloirs les relient. Où passent les ascenseurs, et quelles portes doivent rester verrouillées. Et les règles que tout le monde suit quand on l’agrandit. Certains choix, comme l’emplacement des ascenseurs, coûteraient une fortune à modifier. Les rideaux, non. L’architecture logicielle, c’est la même idée appliquée à un système logiciel.

Les définitions viennent de trois sources. La norme internationale de description des architectures parle des propriétés fondamentales de quelque chose dans son environnement, ainsi que des principes qui régissent sa construction et son évolution. Le Software Engineering Institute, ou SEI, donne la définition la plus enseignée : les structures nécessaires pour raisonner sur un système, faites d’éléments, des relations entre eux, et des propriétés des uns et des autres. Les praticiens sont plus brefs. Ralph Johnson y voyait la compréhension partagée des développeurs experts. Grady Booch y voyait les décisions de conception importantes, leur importance se mesurant au coût du changement.

Voici ce que cela donne pour un système de livraison de repas. À l’intérieur de la frontière du système se trouvent les éléments : une application mobile, un service des commandes, une base de données des commandes, un service des livreurs et un module de paiement. Les relations montrent comment ils sont reliés. L’application mobile appelle le service des commandes en HTTPS, et le service des commandes interroge sa base de données en SQL. Les propriétés sont notées à côté des éléments. Par exemple, le service des commandes est sans état et tourne en trois copies. Hors de la frontière se trouve l’environnement : les clients, les livreurs, les restaurants et le prestataire de paiement par carte. L’environnement comprend aussi la loi, le budget, l’organisation et ses équipes, et la plateforme cloud. On ne peut pas juger une architecture sans eux.

Un système possède plusieurs structures à la fois, de trois types. Voici une boutique en ligne, vue de trois façons. Les structures de modules montrent comment le code est découpé : un paquet validation qui utilise un paquet catalogue et des outils communs. Elles répondent à la question : qui peut changer quoi, et que casse-t-on ? Les structures de composants et connecteurs montrent ce qui s’exécute : un frontend web appelle un service de validation, qui envoie un message à une file de paiements. Elles répondent à des questions d’exécution : quelle rapidité, quelle fiabilité, quelle sécurité ? Les structures d’allocation font correspondre le logiciel à des choses extérieures à lui : le cluster de conteneurs dans la région cloud A, et l’équipe validation qui le gère. Elles répondent à la question : combien cela coûte-t-il, et qui le construit et l’exploite ?

Lues côte à côte, les définitions partagent sept idées. Vous venez de voir les quatre premières : les structures, faites d’éléments, de relations et de propriétés. Cinquième idée, les décisions : les choix qui ont produit les structures, avec leurs raisons. Sans les raisons, d’autres personnes défont plus tard de bonnes décisions par accident. Sixième idée, l’importance. Seules certaines choses sont architecturales : celles qui sont coûteuses à changer, qui touchent de nombreuses parties, ou qui déterminent une qualité clé. Et septième idée, l’environnement : les utilisateurs, les systèmes, l’organisation, les lois et les budgets qui entourent le système, qui le façonnent et sont façonnés par lui.

Appliquons cela. Une entreprise de livraison de repas demande à un nouvel architecte de lui dire quelle est son architecture. Elle ne dispose que d’un seul diagramme, obsolète. En utilisant les idées partagées comme liste de contrôle, l’architecte recense les éléments et les relations. Les applications appellent le service des commandes, qui écrit dans une base de données partagée et publie des événements que l’attribution des livreurs récupère. Ensuite, les propriétés. Le service des commandes est sans état et tourne en trois copies. L’attribution des livreurs conserve son état en mémoire et tourne en une seule copie. Ensuite, l’architecture voulue face à l’architecture réelle. L’ancien diagramme montre une base de données distincte par service. En réalité, le service des livreurs lit directement les tables des commandes. Cela fait apparaître deux risques que personne n’avait formulés : un point de défaillance unique, et une base de données partagée qui lie deux équipes entre elles. Aucun des deux n’était visible dans le code d’un service pris isolément. Tous deux sont des propriétés de la structure, donc ils relèvent de l’architecture.

Deux leçons en découlent. Premièrement, tout système a une architecture, que quelqu’un l’ait conçue volontairement ou non. La question est de savoir si elle est adaptée à son usage, comprise et façonnée délibérément. Deuxièmement, l’architecture n’est pas la même chose que sa description. Un diagramme est un produit de travail qui l’exprime, et il peut être incomplet ou obsolète. Et quand vous avez un doute, posez trois questions. Serait-ce coûteux à changer plus tard ? Cela touche-t-il plusieurs parties ou plusieurs équipes ? Cela détermine-t-il une qualité importante, comme la rapidité ou la sécurité ? Si une seule réponse est oui, traitez-le comme de l’architecture.

Voilà ce qu’est l’architecture. La section complète compare les définitions côte à côte et passe en revue les idées reçues courantes. Ensuite, dans la section un point deux, nous verrons où s’arrête l’architecture et où commence la conception. À très vite.

Ce qu’il faut savoir

Pourquoi il faut définir le mot

Demandez à dix ingénieurs expérimentés ce qu’est l’architecture logicielle et vous entendrez dix réponses différentes : le diagramme de boîtes et de flèches affiché au mur, le choix du fournisseur de cloud, le schéma de la base de données, le découpage en services, les règles indiquant quel code peut appeler quel autre, ou simplement « les décisions difficiles ». Chaque réponse saisit quelque chose de réel, et chacune, prise isolément, passe à côté de quelque chose. Un cours qui entend enseigner l’architecture doit donc commencer par préciser de quoi il parle.

Cela compte pour des raisons pratiques. Si une équipe pense que l’architecture, c’est « le diagramme », elle cessera d’y prêter attention une fois le diagramme dessiné, alors même que le système continue de changer en dessous. Si elle pense que l’architecture, c’est « la pile technologique », elle débattra des frameworks en ignorant la façon dont les responsabilités sont réparties et dont circulent les données. Une bonne définition vous dit quoi regarder, quoi protéger et de quoi discuter avec les autres.

Les définitions ci-dessous proviennent d’une norme internationale, du Software Engineering Institute (SEI) de l’université Carnegie Mellon, et de praticiens. Elles ont été écrites dans des buts différents, mais elles s’accordent plus qu’elles ne divergent, et leurs points d’accord forment le cœur de la discipline.

La définition normative : ISO/IEC/IEEE 42010:2022

ISO/IEC/IEEE 42010 est la norme internationale de description des architectures. Son édition actuelle, publiée en novembre 2022, a remplacé l’édition de 2011. Elle définit l’architecture, en paraphrasant de près, comme les concepts ou propriétés fondamentaux d’une entité dans son environnement, ainsi que les principes qui régissent la réalisation et l’évolution de cette entité et ses processus de cycle de vie associés.

Trois caractéristiques de cette définition méritent l’attention. D’abord, elle parle d’une entité, et pas seulement d’un système logiciel. L’édition 2022 a délibérément élargi le champ pour que les mêmes idées s’appliquent aux logiciels, aux systèmes de systèmes, aux produits, aux lignes de produits et aux entreprises entières. Ensuite, elle place l’entité dans son environnement : on ne peut pas comprendre une architecture sans les utilisateurs, les autres systèmes, l’organisation, les lois et les budgets qui l’entourent. Enfin, elle inclut des principes directeurs sur la façon dont l’entité est construite et dont elle change. L’architecture n’est pas seulement un instantané de la structure ; elle comprend les règles qui maintiennent la cohérence de la structure à mesure que le système évolue, comme « chaque service possède ses propres données » ou « le code du domaine ne dépend jamais du framework web ».

La norme trace aussi une frontière nette entre une architecture et une description d’architecture. L’architecture est l’ensemble des propriétés fondamentales que le système possède réellement. La description est un produit de travail (documents, modèles, diagrammes, enregistrements de décisions) qui l’exprime. ISO/IEC/IEEE 42010 est avant tout une norme sur les descriptions : elle indique ce qu’une bonne description doit contenir, comme les parties prenantes identifiées, leurs préoccupations et les vues qui répondent à ces préoccupations. Elle ne vous dit pas comment concevoir une architecture. La section 1.5 revient sur les parties prenantes et les préoccupations, et le chapitre 4 traite des vues.

La définition du SEI : structures, éléments, relations et propriétés

La définition la plus enseignée vient de Software Architecture in Practice de Len Bass, Paul Clements et Rick Kazman (4e édition, Addison-Wesley, 2021), dont les auteurs ont travaillé au SEI. Selon eux, en paraphrasant : l’architecture logicielle d’un système est l’ensemble des structures nécessaires pour raisonner sur le système, et ces structures se composent d’éléments logiciels, des relations entre eux et des propriétés des uns et des autres.

Chaque partie de cette phrase a son utilité. Structures, au pluriel : un système possède plusieurs structures à la fois (ses modules de code, ses processus en cours d’exécution, son déploiement sur des machines) et aucune n’est à elle seule « l’architecture ». Nécessaires pour raisonner sur le système : pour savoir si quelque chose est architectural, on se demande si l’on en a besoin pour répondre à des questions importantes, comme « Cela résistera-t-il au pic de charge ? » ou « Deux équipes peuvent-elles y travailler indépendamment ? ». Les éléments sont les parties : modules, services, bases de données, files d’attente. Les relations sont la façon dont ils sont reliés : utilise, appelle, publie vers, est déployé sur. Les propriétés sont ce qui fait que les éléments et les relations se comportent comme ils le font : un service est sans état, un appel est synchrone avec un délai d’expiration de deux secondes, une base de données contient des données personnelles et doit rester dans l’UE.

La référence au raisonnement explique aussi ce qui n’est pas de l’architecture. Le nom d’une variable locale, l’algorithme interne d’une routine de tri ou la disposition d’un écran de paramètres n’aident généralement pas à raisonner sur le système dans son ensemble ; ils relèvent donc de la conception détaillée plutôt que de l’architecture. La section 1.2 examine où passe cette frontière.

Éléments, relations, propriétés et environnement

Un système de livraison de repas fait d’éléments et de relations dans une frontière, entouré de son environnementSystème de livraisonClientsLivreursRestaurantsPrestataire depaiementApp mobileSvc commandesSvc livreursModule paiementBD des commandesHTTPSSQLévén.sans état, 3 copiesChamp PCI DSSL’environnement inclut aussi : loi, budget,l’organisation et ses équipes, plateforme cloud
Des éléments (boîtes) reliés par des relations (flèches), avec leurs propriétés notées à côté, dans une frontière de système située dans un environnement plus large.

Les définitions des praticiens : compréhension partagée, ce qui est important et décisions

Les praticiens ont proposé des définitions plus courtes qui mettent l’accent sur les personnes et les décisions plutôt que sur les structures. Martin Fowler en a popularisé deux, dues à Ralph Johnson (l’un des quatre auteurs du livre Design Patterns de 1994). La première veut que l’architecture soit la compréhension partagée qu’ont les développeurs experts de la façon dont le système est conçu. La seconde, issue de la même discussion, est délibérément ouverte : L’architecture, c’est ce qui est important. Quoi que ce soit. Johnson a aussi suggéré que l’architecture est l’ensemble des décisions que l’on aimerait réussir tôt dans un projet, non parce qu’on a plus de chances de les réussir tôt, mais parce qu’il est si coûteux de se tromper.

Grady Booch, l’un des créateurs d’UML, l’a formulé en termes économiques : l’architecture est constituée des décisions de conception importantes qui façonnent un système, leur importance se mesurant au coût du changement. Cela transforme une idée abstraite en critère utilisable. Le choix de la couleur d’un bouton est facile à annuler. Le choix entre une base de données relationnelle et une base orientée documents, ou entre une seule unité déployable et quarante, est coûteux à annuler une fois que les données, le code et les équipes se sont développés autour. Booch a aussi fait remarquer que toute architecture est conception, mais que toute conception n’est pas architecture.

Ces définitions ajoutent ce que les définitions structurelles laissent implicite. L’architecture vit en partie dans la tête des gens ; un système dont les ingénieurs seniors partagent une image claire de son fonctionnement a une architecture plus cohérente qu’un système où chacun a une image différente, même si aucun des deux n’a de diagramme. Et l’architecture est façonnée par des décisions, dont beaucoup impliquent un compromis : choisir une option, c’est renoncer aux avantages d’une autre. La section 1.6 examine en détail les décisions et les compromis.

Les définitions comparées

SourceIdée centrale (paraphrasée)Ce qu’elle met en avantSurtout utile pour
ISO/IEC/IEEE 42010:2022Les concepts ou propriétés fondamentaux d’une entité dans son environnement, ainsi que les principes qui régissent sa réalisation et son évolutionEnvironnement, principes, évolution ; l’architecture distincte de sa descriptionLes contrats, le travail de normalisation, la description cohérente des architectures dans toute une organisation
Bass, Clements et Kazman (2021)L’ensemble des structures nécessaires pour raisonner sur le système : éléments, relations et propriétés des uns et des autresStructures multiples ; raisonnement sur les qualitésL’analyse et la conception : se demander si une structure atteindra ses objectifs
Ralph Johnson, via Martin FowlerLa compréhension partagée des développeurs experts ; ce qui est important, quoi que ce soitLes personnes, la communication, le jugement sur ce qui est importantLa pratique d’équipe : entretenir un modèle mental commun
Grady BoochLes décisions de conception importantes qui façonnent un système, leur importance se mesurant au coût du changementLes décisions et leur dimension économiqueDécider où consacrer l’effort d’analyse

Ce que les définitions ont en commun

Lues côte à côte, les définitions convergent vers sept idées, qui forment ensemble une définition de travail pour la suite de ce cours.

Sept idées partagées

  1. StructuresUn système possède plusieurs structures à la fois, chacune le montrant sous un angle différent. Aucun diagramme ne représente à lui seul toute l’architecture.
  2. ÉlémentsLes parties qui composent ces structures : modules, composants, services, stockages de données, files d’attente, serveurs.
  3. RelationsLa façon dont les éléments sont reliés et dépendent les uns des autres : appels, messages, données partagées, déploiement, propriété.
  4. PropriétésLes caractéristiques visibles de l’extérieur des éléments et des relations, comme le fait d’être sans état, chiffré, asynchrone ou répliqué, qui déterminent ensemble les attributs de qualité du système.
  5. DécisionsLes choix qui ont produit les structures, avec les raisons et les alternatives écartées qui les sous-tendent. Sans les raisons, d’autres personnes défont plus tard de bonnes décisions par accident.
  6. ImportanceSeules certaines choses sont architecturales : celles qui sont coûteuses à changer, qui touchent de nombreuses parties ou qui déterminent une qualité clé. L’architecture est sélective par définition.
  7. EnvironnementLe système se situe parmi des utilisateurs, d’autres systèmes, une organisation, des lois et des budgets. Ceux-ci façonnent l’architecture et sont façonnés par elle.

Trois types de structures

Les travaux du SEI sur la documentation, publiés sous le titre Documenting Software Architectures : Views and Beyond (Clements et ses collègues, 2e édition, 2010), regroupent les structures en trois types, et Software Architecture in Practice utilise le même regroupement. Connaître ces trois types vous protège de l’erreur la plus courante dans les discussions d’architecture : parler d’un type de structure alors que votre interlocuteur pense à un autre.

Les structures de modules montrent comment le code est découpé en unités d’implémentation, comme des paquets, des bibliothèques et des espaces de noms, et comment ces modules dépendent les uns des autres. Elles existent au moment du développement. Elles répondent à des questions comme : quelle équipe peut modifier quoi sans casser le travail des autres, et quel code peut être réutilisé ?

Les structures de composants et connecteurs montrent ce qui existe quand le système s’exécute : processus, services, clients, bases de données, et les connecteurs entre eux, comme les appels HTTP, les files de messages et les flux d’événements. Elles répondent à des questions d’exécution : quelle est la rapidité d’une requête, que se passe-t-il quand une partie tombe en panne, où les données sont-elles conservées ?

Les structures d’allocation font correspondre le logiciel à des choses extérieures au logiciel : au matériel et à l’infrastructure cloud (déploiement), aux équipes (affectation du travail), et aux fichiers et dépôts (implémentation). Elles répondent à des questions de coût, d’exploitation et d’organisation : où cela s’exécute-t-il, qui le construit, qui est réveillé la nuit quand il tombe en panne ?

Un même élément peut apparaître dans les trois. Une fonctionnalité de validation de commande est un paquet dans la structure de modules, un service en cours d’exécution dans la structure de composants et connecteurs, et un ensemble de conteneurs dans une région cloud dont l’équipe validation est propriétaire dans les structures d’allocation. La correspondance entre les structures n’est pas toujours biunivoque : un même module peut être déployé sous forme de plusieurs services, ou plusieurs modules peuvent s’exécuter dans un même processus. C’est précisément dans cet écart que se cachent bien des surprises.

Un système, trois types de structures

La même boutique en ligne vue par ses structures de modules, composants et connecteurs, et allocationStruct. de modulesdécoupage du codeComposants et connecteursexécution et interactionsStructure d’allocationoù il tourne, qui le détientpaquet cataloguepaquet validationoutils communsdépenddépendFrontend webService validationFile paiementsappel RESTmessageRégion cloud ACluster conteneursÉq. validations’exécutegèreQuestions : qui peut changerquoi, et que casse-t-on ?Questions : quelle vitesse,fiabilité, sécurité ?Questions : quel coût, qui leconstruit et l’exploite ?
Les structures de modules, de composants et connecteurs, et d’allocation montrent la même boutique en ligne sous trois angles et répondent à des questions différentes.

Tout système a une architecture

Comme l’architecture est faite de structures et des propriétés qu’elles ont réellement, tout système logiciel a une architecture, que quelqu’un l’ait conçue volontairement ou non, et qu’elle soit écrite ou non. Une macro de tableur devenue un outil critique pour l’entreprise a une architecture. Le code d’une start-up écrit à la hâte par trois personnes aussi. La question n’est jamais de savoir si un système a une architecture, mais si cette architecture est adaptée à son usage, comprise par les personnes qui y travaillent et façonnée délibérément.

Cela conduit à une distinction utile. L’architecture voulue (ou prescriptive) est ce que l’équipe croit ou a décidé que la structure devrait être : le diagramme du wiki, les règles convenues. L’architecture réelle (ou descriptive) est ce que font vraiment le code et l’infrastructure. Les deux s’éloignent avec le temps à moins que quelqu’un ne les maintienne alignées, et cet écart est l’une des principales sources de dette technique, traitée à la section 1.7. Une architecture non documentée n’est pas absente ; elle est simplement plus difficile à voir, à analyser et à modifier sans risque.

Exemple commenté

Exemple commenté : appliquer les définitions à une application de livraison de repas

Une entreprise de livraison de repas demande à un nouvel architecte de « nous dire quelle est notre architecture ». Il existe un seul diagramme, obsolète. En utilisant les idées partagées comme liste de contrôle, l’architecte produit une première description en une semaine.

ÉlémentsApplication mobile, application web pour les restaurants, service des commandes, service d’attribution des livreurs, module de paiement, une base de données PostgreSQL partagée, un courtier de messages (message broker), un prestataire externe de paiement par carte.
RelationsLes applications appellent le service des commandes en HTTPS ; le service des commandes écrit dans la base de données partagée et publie des événements « commande passée » ; l’attribution des livreurs consomme ces événements ; le module de paiement appelle l’API du prestataire.
PropriétésLe service des commandes est sans état et tourne en trois copies ; l’attribution des livreurs conserve son état en mémoire et tourne en une seule copie ; la base de données contient des données personnelles et des jetons de carte.
EnvironnementDeux équipes de développement, une autorité de sécurité sanitaire des aliments, la législation sur la protection des données, un budget cloud fixe, des restaurants aux tablettes peu fiables.
Décisions importantes relevéesUne seule base de données partagée par tous les services ; une seule copie de l’attribution des livreurs ; des événements pour l’affectation des livreurs mais des appels directs pour les paiements.
Voulue ou réelleL’ancien diagramme montre une base de données distincte par service. En réalité, le service des livreurs lit directement les tables des commandes, si bien que les deux services ne peuvent pas être modifiés indépendamment.

L’exercice fait apparaître deux risques que personne n’avait formulés : la copie unique de l’attribution des livreurs est un point de défaillance unique, et la base de données partagée couple deux équipes entre elles.

Aucun de ces risques n’était visible dans le code d’un service pris isolément. Tous deux sont des propriétés des structures et des relations, et c’est pourquoi ils relèvent de l’architecture.

La description a pris une semaine parce que personne n’avait consigné les décisions ni leurs raisons. Les consigner est le sujet du chapitre 4.

Comment les professionnels utilisent les définitions

En pratique, les architectes expérimentés récitent rarement une définition, mais ils se servent de chacune comme d’une grille de lecture. La vision de l’ISO leur rappelle de regarder vers l’extérieur, vers l’environnement, et de distinguer ce que le système est de ce que les documents disent. La vision du SEI leur donne un vocabulaire de structures, d’éléments, de relations et de propriétés pour l’analyse, ainsi qu’un critère (« avons-nous besoin de cela pour raisonner sur le système ? »). La vision de Johnson leur rappelle qu’un modèle mental partagé par l’équipe est en soi un actif à entretenir. La vision de Booch leur indique où consacrer leur temps limité : aux décisions qu’il serait coûteux d’annuler.

Il en découle une règle empirique pratique. Quand vous ne savez pas si quelque chose est architectural, posez trois questions. Serait-ce coûteux ou risqué de le changer plus tard ? Cela touche-t-il plusieurs parties du système ou plusieurs équipes ? Cela détermine-t-il si le système atteint un objectif de qualité important, comme la rapidité, la disponibilité ou la sécurité ? Si la réponse à l’une de ces questions est oui, traitez-le comme de l’architecture : décidez-le délibérément, consignez les raisons, et assurez-vous que les personnes concernées le comprennent.

Vérifiez votre compréhension

Quelle est la différence entre une architecture et une description d’architecture ?

L’architecture est l’ensemble des propriétés et structures fondamentales que le système possède réellement. La description est un produit de travail, comme des diagrammes et des documents, qui l’exprime, et elle peut être incomplète ou obsolète.

Quel type de structure examineriez-vous pour savoir quelle équipe est réveillée quand un service tombe en panne ?

Une structure d’allocation, plus précisément la correspondance d’affectation du travail ou de propriété entre le logiciel et les équipes.

Selon le critère de Booch, le choix d’une bibliothèque de journalisation est-il architectural ?

Généralement non, s’il est masqué derrière une petite interface et facile à remplacer. Il devient architectural si chaque module l’appelle directement, ce qui le rend coûteux à changer.

Pourquoi la définition de l’ISO mentionne-t-elle l’environnement ?

Parce qu’une architecture ne peut être jugée qu’au regard des utilisateurs, des systèmes, de l’organisation, des lois et des budgets qui l’entourent ; la même structure peut être bonne dans un environnement et médiocre dans un autre.

Suivant · 1.2Architecture ou conceptionL’architecture et la conception forment un même continuum de décisions. Découvrez ce qui rend une décision architecturalement significative, ce qui distingue les décisions stratégiques des décisions tactiques, et comment s’articulent l’architecture d’entreprise, l’architecture de solution et l’architecture logicielle.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 : « Le seul diagramme d’architecture de mon équipe date de deux ans. Comment déterminer quelle est notre architecture réelle, et quelles parties en sont importantes ? »