Glossaire

Le vocabulaire de l’architecture logicielle a un défaut : plusieurs de ses mots les plus employés ont deux ou trois sens différents, et les confusions qui en résultent ne sont pas innocentes — elles conduisent à de mauvaises décisions de conception.

Cette page sert deux usages. Les mots ambigus sont traités d’abord, avec leurs sens distingués un par un. Le reste du vocabulaire suit, groupé par thème, avec un renvoi vers la page qui le développe. Pour une recherche ponctuelle d’un terme précis, la zone de recherche en haut du menu est plus rapide.

Les mots qui portent à confusion

Domaine

Trois sens, dont deux sont couramment mélangés dans une même phrase.

SensCe que ça désigneContexte
L’activitéCe que fait l’entreprise : la billetterie, le transport, l’assuranceDDD — l’espace du problème
La coucheL’endroit du code où vivent les règles métier, sans dépendance techniqueN-Tiers, hexagonal
Le modèleL’ensemble des objets qui représentent l’activité — « le domaine contient trois agrégats »DDD tactique

Le premier existe indépendamment de tout logiciel : personne ne le décide, on le constate. Les deux autres sont des choix de conception. Dire « il faut mettre ça dans le domaine » emploie le deuxième sens ; dire « notre domaine est complexe » emploie le premier. Les distinguer évite de croire qu’on discute d’architecture alors qu’on discute de métier, ou l’inverse.

Entité

Le mot le plus surchargé de la section, avec trois sens qui n’ont presque rien en commun.

SensDéfinitionReconnaissable à
Entité DDDUn objet défini par son identité, qui persiste à travers ses changements d’état, et qui porte du comportementDes méthodes au nom métier : confirmer(), suspendre()
Entité ORMUne classe mappée à une table de base de donnéesUne annotation : @Entity, Base, #[derive(FromRow)]
Entité, au sens largeN’importe quel objet métier, n’importe quel nom du domaineUsage courant, sans définition précise

La confusion coûteuse est entre les deux premiers. Ils peuvent coïncider — un même objet jouant les deux rôles — mais leurs exigences sont opposées : l’ORM demande un constructeur sans argument, des champs mutables et des accesseurs publics ; l’entité DDD demande l’inverse, puisque son travail est d’interdire les états invalides.

Un projet qui parle d’« entités » sans préciser laquelle finit régulièrement avec des classes annotées, sans comportement, appelées entités par tout le monde — c’est-à-dire un modèle anémique.

Voir Entités et objets valeur.

Service

Quatre sens, et il est fréquent d’en croiser trois dans la même conversation.

SensRôleContient
Service de domaineUne règle métier qui croise plusieurs agrégatsDe la logique métier pure
Service applicatif (cas d’usage)Orchestrer : charger, appeler, sauvegarder, publierAucune règle métier
La couche service du 3-tierLa strate entre contrôleur et dépôtRègles et orchestration mélangées
Un service au sens déploiementUn processus déployé séparément — un microserviceCe qu’on veut

Le troisième sens est celui qui pose problème : en confondant règles et orchestration dans une seule couche, il crée le point de départ de plusieurs pathologies décrites dans N-Tiers. La distinction entre les deux premiers est détaillée dans Services, dépôts et fabriques.

Conteneur

SensDéfinition
Conteneur C4Une unité exécutable ou déployable qui héberge du code ou des données : une application web, une API, une base de données, une file de messages
Conteneur DockerUn mécanisme d’empaquetage et d’isolation d’un processus

Une base de données PostgreSQL est un conteneur C4 et n’est pas un conteneur Docker ; un sidecar de collecte de journaux est un conteneur Docker et n’est pas un conteneur C4. Voir C4 Model.

Composant

SensDéfinition
Composant C4Un regroupement de code derrière une interface, à l’intérieur d’un conteneur, non déployable seul
Composant de frameworkUne unité d’interface utilisateur — un composant Angular, React, Vue
Composant, au sens largeUn morceau de logiciel réutilisable

Inversion et injection de dépendances

Deux notions distinctes que la proximité des noms fait confondre en permanence.

NatureQuestion
Inversion des dépendancesUn principe de conceptionQui déclare l’interface : celui qui l’utilise, ou celui qui l’implémente ?
Injection de dépendancesUne technique de câblageQui fournit l’implémentation concrète : l’objet lui-même, ou quelqu’un d’autre ?

On peut injecter sans rien inverser — passer une classe concrète au constructeur respecte l’injection et ne renverse aucune dépendance. L’inversion suppose que l’interface appartienne au module de haut niveau, ce qui est le point difficile. Voir SOLID.

Le métier, et ce qui n’en est pas

Le mot métier désigne trois choses à la fois, et c’est acceptable parce qu’elles sont liées : l’activité de l’entreprise, les règles qui la gouvernent, et les personnes qui les connaissent. « Demander au métier » veut dire aller voir ces personnes ; « une règle métier » désigne une contrainte issue de cette activité ; « le métier est complexe » parle de l’activité elle-même.

Ce qui compte est la frontière avec la technique. Un test simple et fiable :

Une règle métier peut être énoncée sans nommer aucune technologie, et un expert du domaine peut dire si elle est vraie ou fausse.

« Une commande de plus de 1 000 € exige une validation du client » est une règle métier : aucune technologie n’y figure, et le service commercial peut la confirmer. « La requête doit utiliser un index sur client_id » est une contrainte technique : personne au commerce ne peut se prononcer.

Cette frontière est l’objet de presque toute la section. Le métier est la partie stable et précieuse — les règles de facturation valent dix ans ; la technique est la partie volatile — le choix de la base de données change trois fois dans l’intervalle. Presque toutes les décisions d’architecture discutées ici reviennent à empêcher la seconde de contaminer la première.

Le métier et son modèle

TermeDéfinitionPage
MétierL’activité de l’entreprise, ses règles, et les gens qui les connaissent—
Domaine (domain)L’activité que le logiciel prend en chargeSous-domaines
Sous-domaine (subdomain)Une partie distincte du domaine — cœur, support ou géneriqueSous-domaines
Cœur de métier (core domain)Le sous-domaine qui distingue l’entreprise de ses concurrentsSous-domaines
Modèle (model)Une simplification volontaire du domaine, retenue parce qu’elle est utile — pas parce qu’elle est fidèleDDD
Règle métier (business rule)Une contrainte énonçable sans technologie et vérifiable par un expert—
InvariantUne règle vraie à chaque instant, sans délai ni exceptionAgrégats
Expert du domaine (domain expert)La personne qui connaît le métier et peut arbitrer un cas limiteLangage omniprésent
Langage omniprésent (ubiquitous language)Un vocabulaire unique, du métier jusqu’aux noms de méthodesLangage omniprésent
Contexte délimité (bounded context)La frontière à l’intérieur de laquelle un mot a exactement un sensContextes délimités
Cas d’usage (use case)Une chose que l’application sait faire, du point de vue de celui qui la déclencheHexagonal
CRUDCreate, Read, Update, Delete — une application qui déplace des données sans en déciderN-Tiers

Les objets du modèle

TermeDéfinitionPage
Objet valeur (value object)Défini par ses attributs, immuable, sans identité — deux montants égaux sont le même montantEntités et objets valeur
Entité (entity)Définie par son identité, qui persiste à travers ses changements d’étatEntités et objets valeur
Agrégat (aggregate)Un groupe d’objets traité comme une unité de cohérence, donc de transactionAgrégats
Racine d’agrégat (aggregate root)L’entité par laquelle on accède à l’agrégat — le seul point d’entréeAgrégats
Dépôt (repository)L’illusion d’une collection en mémoire d’agrégats ; un par racineServices et dépôts
DAO (data access object)Un objet d’accès aux données, orienté table et non agrégat — à ne pas confondre avec un dépôtServices et dépôts
Fabrique (factory)Encapsule une construction complexe, ou la reconstitution depuis la persistanceServices et dépôts
DTO (data transfer object)Une structure sans comportement, dédiée au transport à une frontière — ni entité, ni objet valeurN-Tiers
Événement de domaine (domain event)Un fait métier survenu, immuable, nommé au passéÉvénements
Événement d’intégration (integration event)Le même fait, traduit en contrat stable pour l’extérieurÉvénements
Modèle anémique (anemic domain model)Des objets réduits à des accesseurs, et des services qui font tout le travailMise en œuvre
Obsession des primitifs (primitive obsession)Décrire un domaine avec des string et des number, donc sans règlesEntités et objets valeur

La structure du code

TermeDéfinitionPage
Couche (layer)Un regroupement logique de codeN-Tiers
Étage (tier)Une unité de déploiement physiqueN-Tiers
3-tierContrôleur, service, dépôt — la forme dominante de l’architecture en couchesN-Tiers
PortUne interface déclarée par le domaine : ce qu’il offre, ou ce dont il a besoinHexagonal
Adaptateur (adapter)L’implémentation qui relie un port au monde réelHexagonal
Règle de dépendance (dependency rule)Toute dépendance du code source pointe vers l’intérieurHexagonal
Racine de composition (composition root)Le seul endroit qui connaît toutes les implémentations concrètesHexagonal
Couche d’anticorruption (anticorruption layer)La traduction qui empêche le modèle d’un voisin de contaminer le sienCartographie
Noyau partagé (shared kernel)Le peu de modèle que deux contextes détiennent en communCartographie
Monolithe modulaireUn seul déploiement, mais des frontières de modèle réelles et vérifiées à l’intérieurMonolithe, modulaire, microservices
Monolithe distribuéPlusieurs services qui partagent un modèle ou une base : le couplage du monolithe, avec les pannes du distribuéMonolithe, modulaire, microservices
API de moduleLa seule surface publique d’un module ; tout le reste est inaccessibleMonolithe, modulaire, microservices
Nano-serviceUn service découpé plus fin qu’un contexte — un par entité ou par tableMonolithe, modulaire, microservices
Grande boule de boue (big ball of mud)Une zone sans structure discernable ; on l’entoure d’une frontière, on ne la modélise pasCartographie
Système hérité (legacy)Un système qu’on ne peut pas modifier librement, et dont il faut se protégerCartographie
Étranglement progressif (strangler fig)Remplacer un système en détournant ses usages un par un, plutôt qu’en le réécrivantMise en œuvre

Les dépendances

TermeDéfinitionPage
Couplage (coupling)La mesure de ce qui doit changer ailleurs quand on change iciCouplage et cohésion
Cohésion (cohesion)La mesure de ce qui, dans un module, change pour les mêmes raisonsCouplage et cohésion
Connascence (connascence)Le couplage gradué sur trois dimensions : force, degré, localitéCouplage et cohésion
Module profond / superficielBeaucoup de fonctionnalité derrière une interface étroite — ou l’inverseCouplage et cohésion
Dissimulation d’information (information hiding)Un module cache une décision susceptible de changerCouplage et cohésion
Amont / aval (upstream / downstream)Qui influence, qui subit — indépendamment du sens des appelsCartographie
AbstractionUn nom qui masque plusieurs réalisations possiblesSOLID
IndirectionUn niveau de plus à traverser pour lire le code. Toute abstraction en crée une ; l’inverse est fauxSOLID
Injection de dépendancesFournir à un objet ses collaborateurs depuis l’extérieurSOLID
Inversion des dépendancesFaire dépendre le concret de l’abstrait, l’interface appartenant au module de haut niveauSOLID
Loi de ConwayUn système finit par refléter la structure de communication de l’organisation qui le produitCartographie

La cohérence et les transactions

TermeDéfinitionPage
TransactionUn ensemble d’écritures validé ou annulé d’un blocAgrégats
Frontière de cohérenceL’étendue de ce qui doit être cohérent à chaque instant — c’est-à-dire un agrégatAgrégats
Cohérence différée (eventual consistency)Deux choses d’accord un peu plus tard, ce qui est une décision métier et non techniqueAgrégats
Verrou optimiste (optimistic locking)Détecter les modifications concurrentes par un numéro de version, plutôt que les empêcherAgrégats
IdempotenceTraiter deux fois le même message a le même effet que le traiter une foisÉvénements
CQRSSéparer le modèle qui décide de celui qui afficheCQRS et Event sourcing
Event sourcingStocker la suite des faits plutôt que l’état courant ; l’état devient un calculCQRS et Event sourcing
ProjectionUn modèle de lecture construit depuis un flux d’événements, reconstructibleCQRS et Event sourcing
Commande / requêteUne commande change l’état sans rien renvoyer ; une requête renvoie sans rien changerCQRS et Event sourcing
Instantané (snapshot)Un état sauvegardé pour éviter de rejouer tout un flux d’événementsCQRS et Event sourcing
CompensationCorriger un fait par un fait inverse, faute de pouvoir annulerCQRS et Event sourcing
Patron outbox (transactional outbox)Écrire l’événement dans la même transaction que la donnée, et le publier ensuiteÉvénements
Au moins une fois (at-least-once)La garantie de livraison réellement atteignable ; « exactement une fois » n’existe pasÉvénements

La résilience et la panne

TermeDéfinitionPage
Panne partielleDans un système distribué, l’état normal : une partie répond, une autre nonPatrons de résilience
Défaillance en cascade (cascading failure)Une dépendance lente épuise les ressources de son appelant, qui tombe à son tourPatrons de résilience
Délai d’attente (timeout)La borne au-delà de laquelle on abandonne un appel. Le patron numéro unPatrons de résilience
Reprise (retry)Réessayer un appel échoué — uniquement si l’opération est idempotentePatrons de résilience
Recul exponentiel (exponential backoff)Attendre de plus en plus longtemps entre deux tentativesPatrons de résilience
Gigue (jitter)L’aléa ajouté au recul, qui empêche tous les clients de réessayer ensemblePatrons de résilience
Tempête de reprises (retry storm)Des reprises synchronisées qui achèvent un service en cours de rétablissementPatrons de résilience
Disjoncteur (circuit breaker)Échouer vite après un seuil d’échecs, pour libérer l’appelantPatrons de résilience
Cloisonnement (bulkhead)Un pool de ressources par dépendance, pour qu’une seule n’en prive pas les autresPatrons de résilience
Dégradation gracieuseRépondre partiellement plutôt que pas du toutPatrons de résilience
Repli (fallback)La valeur de secours — à signaler comme telle, jamais silencieusePatrons de résilience
Délestage (load shedding)Refuser tôt une partie du trafic pour servir correctement le restePatrons de résilience
Limitation de débit (rate limiting)Borner ce qu’un client donné peut consommerPatrons de résilience
Contre-pression (backpressure)Faire remonter la saturation à l’appelant, au lieu d’empiler dans une filePatrons de résilience

Patrons, principes et pratiques

Trois natures différentes, souvent rangées ensemble à tort.

NatureCe que c’estComment on s’en sert
PrincipeUne direction, sans mise en œuvre imposée — SOLID, la règle de dépendanceOn s’en sert pour arbitrer
Patron (pattern)Une solution nommée à un problème récurrent — Adapter, ObserverOn s’en sert pour nommer une solution vers laquelle le problème mène déjà
Anti-patronUne solution répandue dont on connaît les dégâts — modèle anémique, monolithe distribuéOn s’en sert pour diagnostiquer
IdiomeUne tournure propre à un langage — Option en Rust, les générateurs en PythonOn s’en sert par habitude du langage
PratiqueUne activité — event storming, revue de code, tests d’architectureOn la fait
TermeDéfinitionPage
Patron de conception (design pattern)Une solution nommée à un problème de conception récurrentDesign patterns
Gang of FourLes quatre auteurs du catalogue de 1994 ; par extension, ses 23 patronsDesign patterns
SOLIDCinq principes de conception à l’échelle de la classe et du moduleSOLID
Event stormingUn atelier qui reconstitue un métier comme une suite d’événementsEvent storming
Tests d’architecture (fitness functions)Des tests automatisés qui font échouer la CI si une frontière est franchieTests d’architecture
Fonction d’aptitude (fitness function)Une caractéristique architecturale rendue exécutableTests d’architecture
Cliquet (ratchet)Tolérer les violations existantes, interdire les nouvelles, abaisser le seuilTests d’architecture

Documenter

TermeDéfinitionPage
Vitesse de péremptionLe critère de classement : immuable, dérivé, généré, ou entretenu — seul le dernier pourritDocumenter une architecture
Architecture-as-codeTout artefact d’architecture vit dans le dépôt, en texte, versionné avec le codeDocumenter une architecture
Docs-as-codeLa documentation suit le cycle de vie du code : même dépôt, même revueDocumenter une architecture
DiátaxisQuatre formes qui ne se mélangent pas : tutoriel, guide pratique, référence, explicationDocumenter une architecture
arc42Douze chapitres pour décrire une architecture — une liste de questions, pas un formulaireDocumenter une architecture
Modèle 4+1L’ancêtre : quatre vues plus les scénarios, sans niveaux d’abstraction fixésDocumenter une architecture
Contrat (OpenAPI, AsyncAPI)La documentation exécutable d’une interface : une forme, jamais un sensDocumenter une architecture
Test de contratVérifier automatiquement qu’un producteur et ses consommateurs restent compatiblesTests d’architecture
Dérive (drift)L’écart entre le modèle décrit et le système réellement déployéDocumenter une architecture
Trace distribuéeLe graphe d’appels réel, reconstitué depuis la production — et souvent différent du modèleDocumenter une architecture
ADR (architecture decision record)Un fichier par décision : contexte, options, choix, conséquences — journalisé, jamais mis à jourADR

Le vocabulaire des diagrammes

TermeDéfinitionPage
C4Quatre niveaux de zoom : contexte, conteneurs, composants, codeC4 Model
Personne (person)Un utilisateur humain, dans un rôleC4 Model
Système logiciel (software system)La plus grande unité livrable, celle dont quelqu’un est responsableC4 Model
Conteneur C4 (container)Une unité exécutable ou déployable qui héberge du code ou des donnéesC4 Model
Composant C4 (component)Un regroupement de code derrière une interface, dans un conteneurC4 Model
WorkspaceChez Structurizr, le modèle et ses vues réunisStructurizr
Vue (view)Une projection du modèle : ce qu’on choisit de montrerVues et styles
UMLQuatorze types de diagrammes, dont trois valent d’être connusUML
Diagramme de séquenceQui appelle qui, dans quel ordre, en synchrone ou en asynchroneUML
Diagramme d’étatsUn cycle de vie, et surtout les transitions qui n’existent pasUML
Multiplicité1, 0..1, *, 1..* aux extrémités d’une relation — souvent un invariant métierUML

Trois distinctions à retenir

Si une seule chose doit rester de cette page, ce sont ces trois oppositions — elles reviennent dans presque toutes les décisions de la section.

Métier contre technique. Le premier est stable et précieux, le second volatile. Toute l’architecture consiste à empêcher le second de contaminer le premier.

Problème contre solution. Le domaine et ses sous-domaines sont constatés ; les contextes délimités, les couches et les services sont décidés. Confondre les deux fait débattre de découpage technique quand la question est de savoir de quoi l’entreprise s’occupe.

Immédiat contre différé. Ce qui doit être vrai à chaque instant définit une frontière de transaction ; tout le reste peut attendre. C’est cette question, posée à l’expert du domaine et non à l’équipe technique, qui détermine la forme du modèle.