Architecture
Prendre le temps de concevoir l’architecture évite les migrations coûteuses
Contexte : Notre prototype initial était développé en FastAPI (Python). Nous avons décidé de migrer vers Laravel pour bénéficier d’un écosystème plus complet.
Problèmes rencontrés :
Leçons apprises :
“Mieux vaut prendre le temps de choisir les bonnes technologies au départ que de devoir migrer en cours de projet.”
Résolution :
Contexte : La génération de cartes par l’IA prenait parfois plus de 30 secondes, causant des timeouts et une mauvaise expérience utilisateur.
Problèmes rencontrés :
Analyse :
Avant optimisation:├── Extraction contenu: 2s├── Appel LLM (10 questions): 25s ❌├── Validation: 3s└── Total: ~30s
Après optimisation:├── Extraction contenu: 1s├── Appel LLM (batch): 8s ✅├── Validation (parallel): 1s└── Total: ~10sSolutions implémentées :
Contexte : En décembre 2025, nous avons lancé une version beta qui s’est révélée être un échec technique majeur.
Bugs critiques découverts :
| Bug | Impact | Cause |
|---|---|---|
| Crash au démarrage sur iOS 16 | Bloquant | Dépendance incompatible |
| Perte de données synchronisation | Critique | Race condition |
| Lenteur extrême en offline | Majeur | Pas de cache local |
| Auth token expiré silencieusement | Majeur | Pas de refresh automatique |
Retours utilisateurs :
“L’app crash à chaque ouverture” - 3 utilisateurs
“J’ai perdu toutes mes cartes” - 2 utilisateurs
“C’est inutilisable sans internet” - 5 utilisateurs
Leçons apprises :
Plan d’action post-mortem :
Contexte : La synchronisation de l’état entre l’application et le serveur causait des incohérences.
Problèmes rencontrés :
Solution : Architecture avec Zustand + Query
// Avant : État global fragileconst [cards, setCards] = useState([]);
useEffect(() => { fetchCards().then(setCards);}, []);
// Après : Cache intelligent avec invalidationconst { data: cards, isLoading } = useQuery({ queryKey: ['cards', collectionId], queryFn: () => cardsService.getByCollection(collectionId), staleTime: 5 * 60 * 1000, // 5 minutes});Contexte : Configuration de l’infrastructure Kubernetes sur OVHcloud.
Difficultés :
Résolutions :
Défis :
Solutions adoptées :
Défis :
Opportunités :
Questionnements :
Actions entreprises :
Architecture
Prendre le temps de concevoir l’architecture évite les migrations coûteuses
Tests
Écrire les tests AVANT le code (TDD) améliore la qualité
Documentation
Documenter les décisions techniques aide à la maintenance
Revue de code
Le regard d’un pair détecte les problèmes tôt
Avant (Phase prototype) :
Idée → Code → Test manuel → Production ↓ Bugs en prod 😱Après (Phase actuelle) :
Idée → Conception → Tests → Code → Review → Tests → Staging → Production ↓ Stabilité 😊| Aspect | Pourquoi |
|---|---|
| Stack technique | Choix pragmatiques adaptés à notre équipe |
| Communication équipe | Rituels réguliers et transparence |
| Pivot B2B | Réactivité face aux retours du marché |
| Concours PEPITE | Validation externe et visibilité |
| Aspect | Amélioration possible |
|---|---|
| Tests | Commencer par TDD dès le début |
| Lancement beta | Faire une vraie phase de beta fermée |
| Migration Laravel | Mieux évaluer les frameworks au départ |
| Scope | Éviter le feature creep |
L’aventure Mindlet nous a enseigné que :
“L’échec n’est pas l’opposé du succès, c’est une partie du succès.” - Arianna Huffington