Le refactor à 18 mois
L'app marche, elle grossit, et chaque nouvelle feature coûte plus cher que la précédente. Le moment où il faudrait accélérer est celui où on réécrit.
Architecture Flutter / Firebase — le layou-dev-kit
Une architecture qui tient sur de la bonne volonté ne tient pas. Celle-ci est découpée en packages dont les dépendances sont vérifiées par le compilateur Dart. Si presentation importe data, ce n'est pas un warning, ni un lint, ni une remarque en revue : c'est une erreur rouge qui bloque le build.
Les 5 packages, et ce que chacun a le droit de voir
Le coût du sans-archi
L'app marche, elle grossit, et chaque nouvelle feature coûte plus cher que la précédente. Le moment où il faudrait accélérer est celui où on réécrit.
Une seule personne sait pourquoi ce fichier est là. La connaissance est dans une tête, pas dans la structure.
On discute d'indentation et de nommage pendant qu'un appel Firestore se glisse dans un widget.
Ce que ça rapporte
Une promesse d'architecture sans mécanisme, c'est du slogan. Pour chacune, voilà ce qui l'applique concrètement.
Ajouter du monde sans ralentir l'équipe
Le monorepo est découpé par couche, pas par écran. Deux devs sur deux features ne se marchent pas dessus : ils ne touchent pas les mêmes packages.
Le rayon d'impact d'un changement est connu d'avance
Quand une règle métier bouge, elle bouge dans domain. Rien d'autre ne compile différemment. C'est ça, une archi tenue : savoir ce qu'on ne casse pas.
domain est pur : testable sans émulateur, sans Firebase, sans widgetdataLe MVP et la V3 sont le même code
Clean Architecture dès le jour 1, même pour un MVP. Pas de code jetable, donc pas de réécriture au moment où l'app commence enfin à marcher.
sealed class Failure + switch exhaustif — ajouter un cas d'échec devient une erreur de compilation partout où il manqueEither sur les writes : le chemin d'échec est dans la signature, pas dans un try/catch oubliéPeu de points de passage, donc peu de choses à auditer
Une architecture ne sécurise pas une app — elle décide du nombre d'endroits par lesquels il faut passer. C'est ce nombre qui rend un audit faisable.
status: pending, un trigger le traite. Une seule surface d'entrée à gouverner au lieu d'un parc d'endpoints HTTP.env en prod. Côté client, envied les injecte à la compilationFailure typée à la frontière dataLa règle
Chaque package déclare ses dépendances. Ce tableau n'est pas une convention d'équipe affichée sur un mur : c'est l'état réel des pubspec.yaml. Une case rouge, c'est un build cassé.
| Le package… | core | domain | data | presentation | app |
|---|---|---|---|---|---|
| core | · | ✕ | ✕ | ✕ | ✕ |
| domain | ✓ | · | ✕ | ✕ | ✕ |
| data | ✓ | ✓ | · | ✕ | ✕ |
| presentation | ✓ | ✓ | ✕ | · | ✕ |
| app | ✓ | ✓ | ✓ | ✓ | · |
// ✅ OK — presentation → domain
import 'package:myapp_domain/auth/entities/app_user.dart';
// ❌ COMPILATION ERROR — data qui fuite dans presentation
import 'package:myapp_data/auth/datasources/auth_remote_datasource.dart'; L'outillage
Le reste passe par `custom_lint`. Ce sont des règles qu'on n'a plus à défendre en revue de code — elles échouent toutes seules.
molecule_no_riverpod erreur connector_must_be_consumer erreur max_function_lines · 50 avertissement max_class_lines · 200 avertissement one_public_class_per_file avertissement Et il n'y a pas d'échappatoire : désactiver une règle avec // ignore_for_file est interdit par le kit. On refactorise.
Avant / après
| Sans le dev-kit | Avec | |
|---|---|---|
| Import interdit | Ça compile (mais c'est cassé) | Erreur de compilation |
| Widget trop gros | Personne ne le voit | Lint error à 200 lignes |
| Molecule avec Riverpod | Ça marche | Lint error |
| Test d'un widget | Mock hell | Zéro mock |
| Nouvel agent IA | Doit relire toutes les conventions | Le compilateur le guide |
Pourquoi ça compte en 2026
Un agent IA écrit vite, et il triche : un datasource importé dans un widget, trois classes dans un fichier, un setState « parce que c'est plus simple ». Le pire, c'est que ça compile — et que ça pourrit le codebase en silence. Ce qui l'arrête n'est pas un prompt plus long : c'est un projet où le raccourci ne compile pas. L'agent reçoit l'erreur de build, comprend la contrainte, et se corrige sans intervention. Le compilateur est le relecteur qui ne dort jamais et ne perd pas son contexte.
Je n'ai pas besoin de faire confiance à l'IA. L'architecture elle-même est le garde-fou.Voir la boucle de livraison complète →
Honnêtement
Compter 2 à 3 jours de scaffolding Melos + packages sur le premier projet, et environ une journée pour écrire les règles de lint avec leurs tests. Ensuite c'est réutilisable d'un projet à l'autre.
Un hackathon, un prototype qu'on jette dans deux semaines : les 4 couches coûtent plus qu'elles ne rapportent. Ça devient rentable quand le code doit survivre à son auteur.
Le dev-kit ne contient ni règles Firestore, ni politique de chiffrement, ni conformité RGPD. Il réduit le nombre de points de passage — l'audit et les règles restent un travail à part entière.
En détail
Les 9 vues du dev-kit : packages, couches, flux de données, atomic design, injection Riverpod, erreurs, nommage, UI, services. Navigation au clavier (1-9, Échap), ou Auto Tour.
Ouvrir en plein écran ↗Reprise d'un existant ou démarrage from-scratch : on regarde ce que ça coûterait de tenir cette archi chez toi, et ce que ça t'éviterait.