Monolithe modulaire, ou la frontière qu'on trace avant le réseauModular monolith, or the boundary you draw before the network
L'application tient en un seul processus — c'est sain. Mais à l'intérieur, « commandes », « facturation » et « stock » ne sont que des dossiers qui lisent et écrivent les tables des autres : pas des modules, une boule de boue où renommer une colonne casse trois domaines. Le monolithe modulaire trace la couture là où passe le vrai métier : chaque module possède ses données et expose une API, un seul déployable mais des frontières réelles. Le piège des deux côtés : croire que séparer les processus crée les frontières (le monolithe distribué), ou sur-modulariser une appli qui tient dans une tête. La frontière logique d'abord ; le réseau, seulement si la douleur l'exige.The app fits in one process — that's healthy. But inside, 'orders', 'billing' and 'inventory' are just folders reading and writing each other's tables: not modules, a ball of mud where renaming a column breaks three domains. The modular monolith draws the seam where the real business runs: each module owns its data and exposes an API, one deployable but real boundaries. The trap on both sides: believing that separating processes creates the boundaries (the distributed monolith), or over-modularizing an app that fits in one head. The logical boundary first; the network, only if the pain demands it.
AudienceAudience
Dev dont les « modules » sont des dossiers qui se lisent mutuellement les tablesDev whose 'modules' are folders that read each other's tables
Format
Self-paced
ChapitresChapters
5
Date
Juin 2026June 2026
≈ 18 min●●○○Découper le systèmeMonolithe modulaireTradeoff
Un seul déployable, aucune frontière dedans. Où passe la vraie couture ?One deployable, no boundary inside. Where does the real seam run?
L'application tient en un seul processus — c'est sain, on n'a pas besoin de plus. Mais à l'intérieur, « commandes », « facturation » et « stock » ne sont que des dossiers : chacun lit et écrit les tables des autres en direct. Il n'y a pas de module, il y a une grande base où tout le monde tape partout. Ce qui varie, ce n'est pas le nombre de serveurs : c'est l'endroit où passent les frontières entre domaines. Le réflexe : tracer ces frontières en logique — chaque module possède ses données et n'expose qu'une API — avant de songer à les tracer en réseau. La frontière logique d'abord ; le déploiement séparé, peut-être, plus tard.The app fits in one process — that's healthy, you need no more. But inside, 'orders', 'billing' and 'inventory' are just folders: each reads and writes the others' tables directly. There is no module, there's one big database where everyone reaches everywhere. What varies isn't the number of servers: it's where the boundaries between domains run. The reflex: draw those boundaries in logic — each module owns its data and exposes only an API — before thinking of drawing them over the network. The logical boundary first; separate deployment, maybe, later.
Le code naïf — des dossiers qui se prennent pour des modulesThe naive code — folders pretending to be modules
# un seul déployable, et chaque module lit les tables des autres directement# module "commandes"def place_order(cart):
user = db.query("SELECT * FROM auth_users WHERE id = ?", cart.user_id) # 💥 table d'un autre module
price = db.query("SELECT amount FROM billing_invoices WHERE ...") # 💥 idem
db.execute("UPDATE inventory_stock SET qty = qty - 1 WHERE ...") # 💥 et il écrit dedans
db.execute("INSERT INTO orders ...")
# il n'y a pas de "module" : il y a UNE base, et tout le monde tape partout.# "facturation", "stock", "commandes" sont des dossiers, pas des frontières.# changer le schéma de billing_invoices casse un code qu'on ne soupçonne pas.
La boule de boue vs le moduleThe ball of mud vs the module
une base, tout le monde tapeone DB, everyone reaches in
dossiers · pas de frontièrefolders · no boundary
⇄
ouor
chaque module possède ses donnéeseach module owns its data
frontière logique · une APIlogical boundary · one API
Un monolithe n'est pas un défaut : c'est le bon point de départ. Le défaut, c'est l'absence de frontières dedans. Tant que « facturation » peut lire la table de « commandes » sans demander, le découpage en dossiers est une illusion — rien n'empêche le couplage, et le jour où l'on voudra extraire un morceau, tout y est accroché.A monolith isn't a flaw: it's the right starting point. The flaw is the absence of boundaries inside it. As long as 'billing' can read 'orders'' table without asking, the split into folders is an illusion — nothing stops the coupling, and the day you want to extract a piece, everything is hooked to it.
Le réflexe du volumeThe volume's reflex
« Cette frontière suit-elle une vraie couture métier, ou juste un découpage technique ? » Ici, la couture passe entre les domaines — commandes, facturation, stock —, pas entre les couches techniques. Le monolithe modulaire trace ces coutures en logique : chaque module possède ses tables, expose une API, et personne ne lit les données d'un autre en douce. On gagne des frontières réelles sans payer le réseau : un seul déployable, une seule base, mais des modules qu'on peut faire évoluer — et un jour extraire — parce qu'ils ne se touchent que par l'API.'Does this boundary follow a real business seam, or just a technical split?' Here, the seam runs between domains — orders, billing, inventory —, not between technical layers. The modular monolith draws those seams in logic: each module owns its tables, exposes an API, and no one quietly reads another's data. You gain real boundaries without paying for the network: one deployable, one database, but modules you can evolve — and one day extract — because they touch only through the API.
Le monolithe n'est pas le contraire de « bien architecturé ».The monolith isn't the opposite of 'well architected'.
On confond souvent « monolithe » et « boule de boue », et « microservices » et « propre ». C'est faux : la propreté est une affaire de frontières, pas de processus. Un monolithe aux modules nets est plus sain qu'une nuée de services qui se lisent mutuellement les bases. Ce numéro ouvre le Vol 6 (« découper le système ») en posant le défaut sain — la frontière logique — avant que le #2 ne montre ce que coûte de la transformer en frontière réseau.People often conflate 'monolith' with 'ball of mud', and 'microservices' with 'clean'. That's wrong: cleanliness is a matter of boundaries, not processes. A monolith with crisp modules is healthier than a swarm of services reading each other's databases. This issue opens Vol 6 ('splitting the system') by laying down the healthy default — the logical boundary — before #2 shows what it costs to turn it into a network boundary.
№ 02La douleurThe pain4 min
Tout touche à tout, et plus rien ne s'extrait.Everything touches everything, and nothing extracts anymore.
Un monolithe sans frontières internes a trois coûts qui se renforcent. Le couplage devient invisible : « facturation » lit la table de « commandes », un script lit celle de « stock », et personne ne sait plus qui dépend de quoi. Le schéma se fige : changer une colonne de billing_invoices peut casser cinq endroits dans trois domaines, alors on n'ose plus y toucher. Et l'extraction devient impossible : le jour où un module mérite vraiment son propre service, il est accroché par cinquante jointures à tout le reste — on ne peut pas le détacher sans tout démêler. La boule de boue ne se paie pas à la construction ; elle se paie quand on veut bouger.A monolith with no internal boundaries has three costs that reinforce each other. Coupling becomes invisible: 'billing' reads 'orders'' table, a script reads 'inventory''s, and no one knows who depends on what anymore. The schema freezes: changing one column of billing_invoices can break five places across three domains, so no one dares touch it. And extraction becomes impossible: the day a module truly deserves its own service, it's hooked by fifty joins to everything else — you can't detach it without untangling it all. The ball of mud isn't paid for at build time; it's paid when you want to move.
№ 1 · Le couplage est invisibleCoupling is invisible
N'importe quel module lit la table de n'importe quel autre. Aucune API, aucun contrat : juste des requêtes SQL éparpillées. Personne ne peut répondre à « qui dépend de billing_invoices ? » sans grepper toute la base de code — et encore, en oubliant les scripts et les rapports.Any module reads any other's table. No API, no contract: just SQL queries scattered around. No one can answer 'who depends on billing_invoices?' without grepping the whole codebase — and even then, missing the scripts and reports.
№ 2 · Le schéma se figeThe schema freezes
Comme tout le monde tape dans toutes les tables, renommer une colonne ou changer un type devient un saut dans le vide : ça casse peut-être cinq endroits dans trois domaines, peut-être zéro, impossible à savoir. Alors on n'y touche plus. Le schéma, censé être un détail, devient une dette qu'on ne rembourse jamais.Since everyone reaches into every table, renaming a column or changing a type becomes a leap in the dark: it might break five places across three domains, might break none, impossible to know. So no one touches it. The schema, meant to be a detail, becomes a debt never repaid.
№ 3 · Rien ne s'extraitNothing extracts
Le jour où « facturation » mérite son propre service — charge différente, équipe dédiée — on découvre qu'il est tissé au reste par cinquante jointures. Extraire un module devient un projet de plusieurs mois, parce qu'on n'a jamais tracé la frontière qu'on aurait dû tracer dès le départ, gratuitement, en logique.The day 'billing' deserves its own service — different load, dedicated team — you discover it's woven into the rest by fifty joins. Extracting a module becomes a multi-month project, because you never drew the boundary you should have drawn from the start, for free, in logic.
Une colonne renommée — et trois domaines qui cassent sans prévenirOne renamed column — and three domains break without warning
# on renomme billing_invoices.amount → amount_cents (un détail, croit-on)# … et on découvre, en prod, qui lisait la table en douce :
commandes/checkout.py: SELECT amount FROM billing_invoices # 💥 cassé
stock/report.py: JOIN billing_invoices ON ... amount # 💥 cassé
analytics/daily.sql: SUM(amount) FROM billing_invoices # 💥 cassé, vu en retard# le module "facturation" ne possédait pas ses données : tout le monde les lisait.
Le diagnostic.The diagnosis.
Le détecteur : « si je renomme une table d'un domaine, est-ce que je peux savoir, sans deviner, qui va casser ? ». Si la réponse est « il faut grepper toute la base », il n'y a pas de frontière — il y a une boule de boue déguisée en dossiers. Le réflexe : donner à chaque module la propriété exclusive de ses tables, et obliger les autres à passer par une API plutôt que par le SQL. La frontière devient explicite et défendable ; le schéma de chaque module redevient son détail privé ; et le couplage, désormais visible, passe par des appels qu'on peut compter, tester, et un jour remplacer par le réseau — si la douleur le justifie.The detector: 'if I rename one domain's table, can I know, without guessing, who will break?'. If the answer is 'you must grep the whole codebase', there is no boundary — there's a ball of mud disguised as folders. The reflex: give each module exclusive ownership of its tables, and force the others to go through an API rather than SQL. The boundary becomes explicit and defensible; each module's schema becomes its private detail again; and the coupling, now visible, runs through calls you can count, test, and one day replace with the network — if the pain justifies it.
№ 03La coutureThe seam5 min
On trace la couture en logique, avant de songer au réseau.Draw the seam in logic, before thinking of the network.
Le monolithe modulaire trace les frontières là où passent les vraies coutures métier, sans rien déployer de plus. L'animation part de la boule de boue où trois domaines se lisent mutuellement les tables, encadre chaque domaine d'une frontière logique, donne à chacun la propriété de ses données derrière une API, puis montre l'enjeu : parce que la couture logique était la bonne, un module peut un jour passer derrière le réseau sans qu'on démêle quoi que ce soit. La frontière logique d'abord ; la frontière réseau, peut-être, et seulement si la douleur l'exige.The modular monolith draws boundaries where the real business seams run, without deploying anything more. The animation starts from the ball of mud where three domains read each other's tables, frames each domain with a logical boundary, gives each ownership of its data behind an API, then shows the stake: because the logical seam was the right one, a module can one day go behind the network without untangling anything. The logical boundary first; the network boundary, maybe, and only if the pain demands it.
Animation — de la boule de boue au module extractableAnimation — from the ball of mud to the extractable module
Départ — une base, tout le monde tapeStart — one DB, everyone reaches in · 1/4
commandesorders
facturationbilling
stockinventory
⇄ ⇄ ⇄
un seul déployable · une seule baseone deployable · one DB
chacun lit les tables des autres · frontières illusoireseach reads the others' tables · illusory boundaries
Trois domaines dans un seul processus, mais aucune frontière : commandes lit la table de facturation, stock écrit dans celle des commandes. Les flèches partent dans tous les sens. « Modules » est un mot ; en réalité, c'est une boule de boue.Three domains in one process, but no boundary: orders reads billing's table, inventory writes into orders'. Arrows shoot every which way. 'Modules' is a word; in reality, it's a ball of mud.
La frontière : un module demande, il ne lit plus la table de l'autreThe boundary: a module asks, it no longer reads the other's table
# AVANT — commandes lit la table de facturation en direct
price = db.query("SELECT amount FROM billing_invoices WHERE ...") # couplage caché# APRÈS — commandes passe par l'API du module facturation
price = billing.get_invoice_amount(order_id) # un appel, en mémoire, dans le même process# billing possède billing_invoices. personne d'autre ne la lit.# le jour où l'on extrait billing : ce SEUL appel devient un appel réseau.
Le motif transférable.The transferable pattern.
« Une frontière se trace d'abord en logique : qui possède quelles données, et qui doit demander plutôt que prendre. » C'est exactement le Bounded Context du Domain-Driven Design — la couture suit le langage et les règles d'un domaine, pas un schéma technique. Le même réflexe vaut pour un paquet, un module, une lib interne, un service : décide la frontière sur le sens métier, rends-la défendable (la propriété des données), et tu pourras toujours la durcir plus tard en frontière de déploiement. L'inverse — partir du réseau pour découvrir la couture après — coûte un démêlage distribué.'A boundary is drawn first in logic: who owns which data, and who must ask rather than take.' That's exactly Domain-Driven Design's Bounded Context — the seam follows a domain's language and rules, not a technical schema. The same reflex holds for a package, a module, an internal lib, a service: decide the boundary on business meaning, make it defensible (data ownership), and you can always harden it later into a deployment boundary. The reverse — start from the network and discover the seam afterward — costs a distributed untangling.
Modèle mentalMental model
L'imageThe image
Tracer des frontières de modules, c'est poser des clôtures dans un champ, pas déménager dans des maisons séparées. La clôture — la frontière logique — dit à qui appartient quoi, pour rien ; le déménagement — le réseau — coûte cher et vient après, si jamais.Drawing module boundaries is putting up fences in a field, not moving into separate houses. The fence — the logical boundary — says who owns what, for free; the move — the network — is expensive and comes later, if ever.
La règleThe rule
Trace la couture en logique — qui possède quelles données, qui doit demander au lieu de prendre —, un seul déployable ; ne la durcis en frontière réseau que si une douleur concrète l'exige.Draw the seam in logic — who owns which data, who must ask instead of take —, one deployable; harden it into a network boundary only if a concrete pain demands it.
Où l'analogie casseWhere the analogy breaks
La clôture rassure : « je pourrai toujours la déplacer ». Vrai — tant qu'on reste dans un seul processus. Mais l'extractibilité qui fait tout l'intérêt du module tente de sauter le pas ; et une fois le module passé derrière le réseau, la clôture est devenue un mur. La déplacer n'est plus un refactoring, c'est une migration distribuée. Le « gratuit à bouger » cesse d'être vrai exactement au moment où l'on encaisse l'extraction.The fence reassures: 'I can always move it'. True — as long as you stay in one process. But the extractability that makes the module worthwhile tempts you to take the leap; and once the module is behind the network, the fence has become a wall. Moving it is no longer a refactor, it's a distributed migration. The 'free to move' stops being true at the exact moment you cash in the extraction.
№ 04Le piègeThe trap4 min
Du réseau n'a jamais créé une frontière. Le monolithe distribué.The network never created a boundary. The distributed monolith.
Le piège n'est pas le monolithe — c'est de croire que séparer les processus crée les frontières qu'on n'a pas tracées. On « passe aux microservices » avant d'avoir des modules nets : on met du HTTP entre des bouts toujours couplés, et l'un lit encore la base de l'autre, par le réseau cette fois. Résultat : le même couplage qu'avant, mais le moindre changement devient un bug distribué — timeout, retry, versions d'API, panne partielle —, et deux services qu'on doit toujours déployer ensemble. C'est le monolithe distribué : tous les coûts du réseau, aucun de ses bénéfices. La frontière réseau ne vaut que si la frontière logique existait déjà. Bascule le toggle : cherche le service qui lit la base d'un autre.The trap isn't the monolith — it's believing that separating processes creates the boundaries you never drew. You 'move to microservices' before having crisp modules: you put HTTP between still-coupled pieces, and one still reads the other's database, over the network this time. The result: the same coupling as before, but the smallest change becomes a distributed bug — timeout, retry, API versions, partial failure —, and two services you must always deploy together. That's the distributed monolith: all the costs of the network, none of its benefits. The network boundary is only worth it if the logical boundary already existed. Flip the toggle: hunt the service that reads another's database.
# frontière LOGIQUE : un process, mais chaque module est propriétaire et fermé# module facturation — possède billing_invoices, expose une API, rien de plusclass Billing:
def get_invoice_amount(self, order_id) -> int: ... # le SEUL accès public# billing_invoices n'est lue/écrite QUE par ce module# module commandes — demande, ne prend pasclass Orders:
def __init__(self, billing: Billing): # dépend de l'API, pas du schéma
self._billing = billing
def checkout(self, order_id):
price = self._billing.get_invoice_amount(order_id) # appel en mémoire# une frontière défendable, gratuite : pas de réseau, pas de sérialisation, pas de latence.
Pourquoi c'est justeWhy it's right
La frontière est tracée là où elle compte : facturation possède ses tables, expose une API, et commandes en dépend sans connaître son schéma. Tout reste dans un seul processus — l'appel est en mémoire, sans réseau, sans sérialisation, sans latence. On a une frontière réelle et défendable pour un coût nul. Et c'est précisément ce qui rend l'extraction possible plus tard : le jour où facturation mérite son propre service, ce seul appel d'API devient un appel réseau, et rien d'autre ne bouge. La frontière logique est l'investissement ; la frontière réseau, une option qu'on lève si — et seulement si — la douleur le justifie.The boundary is drawn where it matters: billing owns its tables, exposes an API, and orders depends on it without knowing its schema. Everything stays in one process — the call is in-memory, no network, no serialization, no latency. You have a real, defensible boundary at zero cost. And that's exactly what makes extraction possible later: the day billing deserves its own service, that one API call becomes a network call, and nothing else moves. The logical boundary is the investment; the network boundary, an option you exercise if — and only if — the pain justifies it.
La règle qui tranche.The rule that settles it.
Trace la frontière en logique d'abord ; ne la transforme en frontière réseau que lorsqu'une douleur concrète le réclame — une équipe qui veut déployer seule, une charge à scaler indépendamment, une techno différente. Le test : « si j'extrayais ce module en service, combien d'appels deviendraient des appels réseau ? ». Un, deux : la couture est nette, l'extraction est mûre. Trente : la frontière n'existe pas encore, et la mettre derrière le réseau ne fera que distribuer la boule de boue. On n'achète le réseau que quand le module est déjà autonome en logique — jamais pour le rendre autonome.Draw the boundary in logic first; turn it into a network boundary only when a concrete pain demands it — a team that wants to deploy alone, a load to scale independently, a different tech. The test: 'if I extracted this module into a service, how many calls would become network calls?'. One, two: the seam is crisp, extraction is ripe. Thirty: the boundary doesn't exist yet, and putting it behind the network will only distribute the ball of mud. You buy the network only when the module is already autonomous in logic — never to make it autonomous.
Le piège jumeau : le module qui n'existe pas.The twin trap: the module that isn't one.
L'excès inverse : sur-modulariser une appli minuscule. Trois modules avec API interne, contrats et adaptateurs pour un CRUD que deux personnes maintiennent — de la cérémonie (YAGNI, Vol 0 #3) qui paie un loyer d'indirection (Vol 0 #2) sans douleur à soulager. Le monolithe modulaire est le bon défaut, pas une obligation : tant que l'appli tient dans une tête et qu'aucune couture métier ne se détache, les dossiers suffisent. La frontière se mérite à la première vraie tension entre domaines — ni avant (cérémonie), ni au moment de l'extraction (trop tard).The opposite excess: over-modularizing a tiny app. Three modules with internal APIs, contracts and adapters for a CRUD two people maintain — ceremony (YAGNI, Vol 0 #3) paying an indirection rent (Vol 0 #2) with no pain to relieve. The modular monolith is the right default, not an obligation: as long as the app fits in one head and no business seam stands out, folders suffice. The boundary is earned at the first real tension between domains — neither before (ceremony), nor at extraction time (too late).
№ 05Bilan & éditoWrap-up & editorial2 min
Du réseau qu'on espère structurant, ou une frontière qu'on a tracée.A network you hope structures things, or a boundary you actually drew.
Boule de boue, monolithe modulaire, monolithe distribuéBall of mud, modular monolith, distributed monolith
boule de boueball of mud
modulairemodular
distribuédistributed
FrontièreBoundary
aucunenone
logiquelogical
réseau, mais faussenetwork, but false
DonnéesData
tout le monde tapeeveryone reaches in
possédées par moduleowned per module
lues par le réseauread over the network
DéploiementDeployment
uniquesingle
unique (sain)single (healthy)
séparé mais coupléseparate but coupled
Changer un schémaChange a schema
casse au hasardbreaks at random
reste privéstays private
bug réseau distribuédistributed network bug
Extraire un serviceExtract a service
impossibleimpossible
un appel → réseauone call → network
déjà payé, sans gainalready paid, no gain
Quand le monolithe (tout court) suffitWhen the (plain) monolith is enough
Le monolithe modulaire est le bon défaut, mais la modularité a un loyer : des API internes, des contrats, une discipline à tenir. On reste avec de simples dossiers — et c'est correct — quand :The modular monolith is the right default, but modularity has rent: internal APIs, contracts, a discipline to maintain. Stay with plain folders — and that's fine — when:
l'appli tient dans une tête : un CRUD que deux personnes maintiennent n'a aucune couture métier à protéger. Y poser trois modules avec adaptateurs, c'est de la cérémonie (YAGNI, Vol 0 #3) qui paie une indirection sans douleur à soulager (Vol 0 #2).the app fits in one head: a CRUD two people maintain has no business seam to protect. Laying three modules with adapters on it is ceremony (YAGNI, Vol 0 #3) paying for indirection with no pain to relieve (Vol 0 #2).
aucune couture ne se détache encore : tant que les domaines changent ensemble et pour les mêmes raisons, la frontière serait arbitraire. Attends la première vraie tension — deux domaines qui évoluent à des rythmes différents — pour tracer la ligne là où elle veut naturellement passer.no seam stands out yet: as long as domains change together and for the same reasons, the boundary would be arbitrary. Wait for the first real tension — two domains evolving at different rhythms — to draw the line where it naturally wants to run.
il n'y a aucune raison de déployer séparément : pas d'équipe distincte, pas de charge à scaler à part, pas de techno différente. Sans cette douleur, passer au réseau n'achète rien et ne fait que distribuer le couplage.there's no reason to deploy separately: no distinct team, no load to scale apart, no different tech. Without that pain, going to the network buys nothing and merely distributes the coupling.
Le réflexe n'est donc pas « modularise tout, c'est plus propre » : c'est « existe-t-il une vraie couture métier, et une raison concrète de la défendre ? Alors un module qui possède ses données. Sinon, des dossiers honnêtes valent mieux qu'une frontière qu'on invente. »So the reflex isn't 'modularize everything, it's cleaner': it's 'is there a real business seam, and a concrete reason to defend it? Then a module that owns its data. Otherwise, honest folders beat a boundary you invent.'
Mot de l'éditeurFrom the editor
Ce numéro ouvre le Vol 6 — découper le système — par son défaut sain : la frontière logique avant la frontière réseau. La leçon n'est pas « le monolithe c'est bien, les microservices c'est mal » : c'est que la propreté tient aux frontières, pas au nombre de processus. Un monolithe aux modules nets est déjà découpé là où ça compte ; il a juste choisi de ne pas payer le réseau tant que rien ne l'exige. La couture se trace sur le sens métier (le Bounded Context), elle se défend par la propriété des données, et elle reste une option qu'on durcit plus tard — jamais un réseau qu'on ajoute en espérant qu'il crée l'ordre qu'on n'a pas mis.This issue opens Vol 6 — splitting the system — with its healthy default: the logical boundary before the network boundary. The lesson isn't 'monoliths good, microservices bad': it's that cleanliness lies in boundaries, not in the number of processes. A monolith with crisp modules is already split where it matters; it just chose not to pay for the network until something demands it. The seam is drawn on business meaning (the Bounded Context), defended by data ownership, and stays an option you harden later — never a network you add hoping it creates the order you didn't put there.
Avec le défaut posé, le #2 prend l'autre côté : les microservices, ce qu'on achète (le déploiement vraiment indépendant) et ce qu'on paie (le réseau devient le bug). Il prendra explicitement le contre-pied de la mode — on ne commence presque jamais en microservices —, et son anti-héros sera celui de ce chapitre : le monolithe distribué, ce qui arrive quand on découpe le réseau avant d'avoir découpé la logique. Tout le Vol 7, ensuite, vivra dans le monde qu'ouvre cette frontière réseau : que se passe-t-il quand l'autre côté ne répond pas — ou répond deux fois ?With the default laid down, #2 takes the other side: microservices, what you buy (truly independent deployment) and what you pay (the network becomes the bug). It will explicitly go against the fashion — you almost never start in microservices —, and its anti-hero will be this chapter's: the distributed monolith, what happens when you split the network before splitting the logic. All of Vol 7, then, will live in the world this network boundary opens: what happens when the other side doesn't answer — or answers twice?
Les voisins que ce numéro débloqueThe neighbors this issue unlocks
Bounded Context — le concept du Domain-Driven Design qui dit OÙ tracer la couture : autour d'un domaine cohérent où un même mot (« commande », « client ») garde un seul sens. La frontière du module suit le langage métier, pas le schéma technique — c'est lui qui transforme « découpage » en « vraie couture ».the Domain-Driven Design concept that says WHERE to draw the seam: around a coherent domain where one word ('order', 'customer') keeps a single meaning. The module's boundary follows the business language, not the technical schema — it's what turns a 'split' into a 'real seam'.
Modular monolith — le nom propre de ce numéro : l'architecture qui assume un seul déployable tout en maintenant des modules fermés, à la propriété des données stricte. C'est la cible par défaut pour la grande majorité des systèmes — et la rampe de lancement la plus sûre vers les microservices, le jour où ils se justifient.this issue's proper name: the architecture that embraces a single deployable while maintaining closed modules with strict data ownership. It's the default target for the vast majority of systems — and the safest launch ramp toward microservices, the day they're justified.
Distributed monolith — l'anti-pattern du chapitre 4, à connaître pour le fuir : des services déployés séparément mais toujours couplés, qui se lisent les bases et doivent changer ensemble. Tous les coûts du réseau, aucun de ses bénéfices. Le voisin qu'on nomme pour ne jamais y tomber — au cœur du prochain numéro.chapter 4's anti-pattern, to know so you flee it: services deployed separately but still coupled, reading each other's databases and forced to change together. All the network's costs, none of its benefits. The neighbor you name so you never fall into it — central to the next issue.
Le kata de décision — où passe la couture ?The decision kata — where does the seam run?
Rien à implémenter : le geste qui ancre, c'est de trancher où — et quand — tracer la frontière. Une appli, quatre candidats. Pour chacun, parie avant de dérouler : simple dossier, module fermé, ou mûr pour l'extraction ? Deux critères se croisent — la netteté de la couture (combien d'accès directs de l'extérieur ?) et la douleur concrète (une équipe, un scale, une contrainte). La dernière question est la sournoise : elle sépare « proprement séparable » de « à séparer ».Nothing to implement: the anchoring gesture is deciding where — and when — to draw the boundary. One app, four candidates. For each, bet before you scroll: plain folder, closed module, or ripe for extraction? Two criteria cross — the seam's crispness (how many direct accesses from outside?) and the concrete pain (a team, a scale need, a constraint). The last question is the sneaky one: it separates 'cleanly separable' from 'to be separated'.
# Une appli e-commerce, un seul process, cinq "dossiers" aujourd'hui.# Pour chacun : simple dossier, module fermé (qui possède ses données),# ou mûr pour l'extraction en service ? Le test décisif : combien d'accès# directs à SES tables viennent de l'extérieur — et quelle douleur concrète ?
CATALOGUE : 40 requêtes SQL sur ses tables, dispersées dans tout le code
PAIEMENT : touché seulement via pay() / refund() · 0 SQL externe · PCI, équipe dédiée
BLOG : contenu marketing · aucune donnée partagée avec le commerce · aucune douleur
RECO : lit catalogue + commandes en lecture seule · doit scaler ×10 en soldes
Chez toi, cette semaine.In your codebase, this week.
Choisis le domaine que tu crois le plus « module » de ton appli, et mesure sa couture avant d'y croire. Prends le nom d'une de ses tables et compte qui la touche depuis l'extérieur : grep -rn "billing_invoices\|FROM billing\|JOIN billing" src/ | grep -v "src/billing/". Zéro ou un ou deux : la frontière est nette, l'extraction serait un déménagement. Trente : ce n'est pas encore un module, c'est un dossier au milieu de la boue — et aucun réseau ne le changera. Trace d'abord la couture en logique.Pick the domain you believe is the most 'module'-like in your app, and measure its seam before trusting it. Take one of its table names and count who touches it from outside: grep -rn "billing_invoices\|FROM billing\|JOIN billing" src/ | grep -v "src/billing/". Zero or one or two: the boundary is crisp, extraction would be a move. Thirty: it isn't a module yet, it's a folder in the mud — and no network will change that. Draw the seam in logic first.