JSJS Memo🎙️ Coach

Architecture React

Mon approche consiste à poser une architecture qui sépare:

  • le domaine mĂ©tier
  • la logique applicative
  • la couche d'accès aux donnĂ©es
  • le design system / UI layer

Je privilégie une organisation architecture vertical slice, avec des frontières par domaine fonctionnel, pour éviter un front monolithique difficile à faire évoluer. L'objectif est que chaque feature puisse évoluer sans créer de couplage excessif avec le reste de l'application. Je fais aussi très attention à la distinction entre :

  • server state : donnĂ©es issues du backend, cycle de vie rĂ©seau, cache, invalidation
  • client state : prĂ©fĂ©rences UI, Ă©tat local, navigation, formulaires
  • Ă©tat dĂ©rivĂ© : donnĂ©es calculĂ©es Ă  ne pas stocker inutilement

Bon Architecture

Pour moi, une bonne architecture front, c'est une architecture qui permet de livrer vite aujourd'hui sans compromettre demain. Elle doit ĂŞtre :

  • modulaire, pour isoler les Ă©volutions
  • lisible, pour faciliter l'onboarding
  • testable, pour limiter les rĂ©gressions
  • et Ă©volutive, pour absorber les changements mĂ©tier

Je fais aussi très attention à la séparation des responsabilités : UI, logique métier, et accès aux données. L'objectif, ce n'est pas d'avoir une architecture parfaite, mais une architecture adaptée au contexte et capable d'évoluer.

Choix d'architecture

Je commence toujours par le contexte :

  • taille de l'Ă©quipe
  • complexitĂ© mĂ©tier(je parle du niveau de logique, de règles, de cas particuliers et d'interactions nĂ©cessaires pour implĂ©menter une fonctionnalitĂ©. Plus il y a de règles, de variations et de dĂ©pendances, plus la complexitĂ© mĂ©tier est Ă©levĂ©e.)
  • contraintes de performance
  • horizon du projet

Ensuite, je compare plusieurs options et j'analyse les trade-offs :

  • complexitĂ©
  • maintenabilitĂ©
  • coĂ»t d'Ă©volution

Et surtout, je distingue les décisions réversibles des décisions structurantes. Je préfère souvent une solution simple au départ, quitte à la faire évoluer, plutôt qu'une sur-architecture trop tôt.

Dégrader architecture

Pour éviter la dégradation de l'architecture, c'est une question de gouvernance.

Je mets en place :

  • des règles de structure
  • des conventions
  • des revues rĂ©gulières

Et je traite la dette technique de manière continue.

Une architecture ne se dégrade pas d'un coup, elle dérive progressivement si on ne la maintient pas.

Qualité architecture

Je mets des garde-fous automatiques et des standards d'équipe.

Pourquoi

Sur plusieurs applications, la qualité ne peut pas dépendre uniquement de la bonne volonté des développeurs.

Comment

  • TypeScript strict ;
  • ESLint ;
  • Prettier ;
  • tests unitaires ;
  • tests composants ;
  • tests E2E sur parcours critique ;
  • CI GitLab ;
  • règles d'import ;
  • revue de code ;
  • Storybook.

Exemple: Une MR qui modifie une règle métier doit lancer :

  • typecheck
  • lint
  • tests rules
  • tests composants
  • build storybook
  • E2E parcours souscription

Architecture horizontale

On découpe par type technique: components/ hooks/ services/ store/ utils/

Pourquoi

Au début, c'est facile à comprendre : tous les composants sont ensemble, tous les services sont ensemble.

Limite

Quand le projet grossit, une feature est dispersée partout. Exemple : pour modifier la souscription, je dois toucher : components/ hooks/ services/ store/ utils/

Donc c'est plus difficile Ă  maintenir.

Architecture verticale / Vertical Slice

On découpe par domaine métier.

Pourquoi

Parce que toute la logique d'une feature est au mĂŞme endroit.

Comment Pour un parcours de souscription

Exemple

Si je dois modifier la règle "offre premium \= justificatif obligatoire", je vais directement dans : features/subscription/rules/[documents.rules.ts](http://documents.rules.ts)

Pas besoin de chercher partout.

L'architecture horizontale organise le code par technique, la verticale l'organise par capacité métier.

Structuration du code

Je structure le code autour des capacités métier, pas autour des types techniques uniquement. Typiquement, je distingue :

  • un socle app/core pour le bootstrap, routing, providers, configuration transverse
  • des modules features par domaine mĂ©tier
  • des Ă©lĂ©ments shared uniquement quand ils sont rĂ©ellement mutualisables
  • une couche ui/design-system sĂ©parĂ©e du mĂ©tier
  • une couche api/services pour les contrats et Ă©changes backend

Je suis vigilant sur un point : beaucoup de projets ont un dossier shared ou common qui devient un fourre-tout. le mieux de mettre des règles de gouvernance pour éviter:

  • ownership explicite
  • conventions d'import
  • contrĂ´le des dĂ©pendances entre modules
  • lint rules

Je cherche à préserver :

  • la lisibilitĂ©
  • l'isolabilitĂ© des features
  • la testabilitĂ©
  • la capacitĂ© Ă  onboarder rapidement de nouveaux dĂ©veloppeurs

Organiser les composants

Je distingue les composants UI purs, les composants de pattern(un composant qui encapsule une logique réutilisable ou une structure d'interaction, afin d'éviter de répéter du code et d'uniformiser les comportements dans l'application) et les composants métier.

Pourquoi Tous les composants ne doivent pas vivre au mĂŞme niveau. Sinon le design system devient un fourre-tout.

Comment

  • design-system(Button, Input, Modal, Select)
  • patterns(FormSection, Stepper, ErrorSummary)
  • features/subscription/IdentityStep DocumentsStep/SubscriptionSummary

Button est générique, donc design system. Stepper peut être un pattern réutilisable. IdentityStep reste métier, donc dans subscription.

Maîtrise de React et TypeScript

Pour moi, la bonne maîtrise ne se limite pas aux hooks standards. Elle se mesure à la capacité à utiliser React et TypeScript pour réduire la complexité, pas pour la déplacer.

Sur React, j'attends une vraie maîtrise de (je maitrise) :

  • la composition de composants
  • les hooks custom
  • le contrĂ´le des re-renders
  • la sĂ©paration container / presentational quand elle a du sens
  • les patterns de rendu conditionnel robustes

Sur TypeScript, j'attends (je maitrise) :

  • un mode strict assumĂ©
  • des types mĂ©tier explicites
  • des unions discriminĂ©es pour gĂ©rer les Ă©tats applicatifs
  • des generics utiles et lisibles
  • un typage fiable des contrats d'API
  • l'Ă©limination progressive des zones non typĂ©es

Design system

Un design system n'est pas une bibliothèque de composants. C'est un produit transverse qui sert à industrialiser la cohérence visuelle, fonctionnelle et technique. Je le vois comme un ensemble de couches :

  • design tokens : couleurs, spacing, typo, radius, motion
  • fondations : grille, iconographie, responsive, accessibilitĂ©
  • composants primitifs : bouton, input, modal, tooltip, etc.
  • composants composites : patterns mĂ©tier ou d'usage
  • documentation : règles d'usage, do/don't, exemples
  • gouvernance : versioning, roadmap, ownership, contribution model

Mise en place D/system

Oui, j'ai eu l'occasion de travailler sur la mise en place et l'évolution d'un design system, notamment chez OUIGO. Au départ, on avait surtout une collection de composants, mais pas un vrai design system structuré. L'enjeu a été de passer d'une logique de composants isolés à un système cohérent et industrialisé. On a commencé par poser des bases claires :

  • des design tokens (couleurs, spacing, typographie)
  • une sĂ©paration entre composants UI gĂ©nĂ©riques et composants mĂ©tier
  • une logique de composants rĂ©utilisables et composables

L'objectif était d'éviter la duplication et d'avoir une cohérence visuelle sur toute l'application. On a mis en place Storybook comme source de vérité. Chaque composant était :

  • documentĂ©
  • testĂ© visuellement

Ça a vraiment aidé à aligner les équipes dev, QA et design.

Storybook

Storybook est pour moi un outil d'industrialisation, pas juste une vitrine.

Je l'utilise pour :

  • documenter les composants
  • exposer leurs variantes
  • rendre visible le contrat d'usage
  • intĂ©grer des tests visuels et d'accessibilitĂ©
  • faciliter l'alignement entre design, QA et dĂ©veloppement

Dans un cadre mature, Storybook devient un point central pour :

  • la revue de composants
  • la validation des Ă©tats edge cases
  • la diffusion des bonnes pratiques
  • la rĂ©duction des rĂ©gressions UI

Je veille aussi à ce que les stories reflètent la réalité produit :

  • Ă©tats loading / error / empty
  • donnĂ©es rĂ©alistes
  • variantes d'accessibilitĂ©
  • responsive
  • thème clair / sombre si nĂ©cessaire

Mise en place StoryBook

j'ai utilisé Storybook principalement comme un outil d'industrialisation du design system, pas juste comme une documentation de composants. Chez OUIGO, je suis intervenu dans sa mise en place et son adoption.

1- Structuration

J'ai contribué à organiser les composants dans Storybook :

  • composants UI gĂ©nĂ©riques (boutons, inputs, modals…)
  • composants plus complexes(exemple formulaire complexe, recheche/filtre)
  • sĂ©paration claire entre UI et logique mĂ©tier

L'idée était d'avoir une vision claire et navigable du système de composants.

2. Documentation

  • J'ai documentĂ© chaque composant avec :
  • ses props typĂ©es (TypeScript)
  • ses diffĂ©rents Ă©tats (loading, disabled, error…)
  • des exemples d'usage

Ça permet aux devs et aux QA de comprendre rapidement comment utiliser les composants sans aller lire le code.

Redux, Zustand et React Query / SWR ?

Je pars toujours de la nature du problème, pas de la mode technique. Ma règle principale est la suivante :

  • React Query / SWR pour le server state
  • Redux Toolkit pour les logiques globales complexes, traçables et structurĂ©es
  • Zustand pour des besoins plus locaux ou transverses simples, quand on veut de la lĂ©gèretĂ©

Cette séparation de responsabilité, ça permet d'éviter d'utiliser un store global pour stocker des données serveur qui devraient être gérées par un moteur de cache spécialisé.

Redux Toolkit reste pertinent quand il y a :

  • workflows complexes
  • orchestration mĂ©tier
  • besoin de prĂ©dictibilitĂ©
  • debugging fin
  • historique des transitions d'Ă©tat

Mais je m'assure toujours que son usage reste justifié, car une mauvaise utilisation de Redux rigidifie rapidement l'application.

Optimisation Perf

Je traite la performance comme un sujet d'architecture et de mesure, pas comme une série de micro-optimisations.

Je travaille Ă  trois niveaux :

1. Performance de chargement

  • dĂ©coupage du bundle
  • lazy loading par route et par feature
  • rĂ©duction du JavaScript inutile
  • optimisation des dĂ©pendances
  • stratĂ©gie de prĂ©chargement raisonnĂ©e

2. Performance de rendu

  • limitation des re-renders
  • memoization ciblĂ©e
  • normalisation Ă©ventuelle des donnĂ©es
  • virtualisation des longues listes
  • composants contrĂ´lĂ©s avec discipline

3. Performance perçue

  • skeletons cohĂ©rents
  • priorisation du contenu critique
  • gestion fine des transitions

Je m'appuie sur des indicateurs concrets :

  • Core Web Vitals(evitez)
  • Lighthouse
  • Web Vitals en production
  • bundle analysis
  • profilage React

Je fais attention Ă  ne pas "optimiser au hasard". Je cherche d'abord les vrais goulets :

  • sur-rendu
  • requĂŞtes redondantes
  • surcoĂ»t de librairies
  • hydration ou routing coĂ»teux
  • composants trop gĂ©nĂ©riques ou trop connectĂ©s au store

Core Web Vitals

Je les traite comme des indicateurs de qualité de service. Les seuils "bons" généralement visés sont LCP ≤ 2,5 s, INP ≤ 200 ms et CLS ≤ 0,1. Je regarde en priorité :

  • LCP(Largest Contentful Paint) pour la vitesse d'affichage de l'Ă©lĂ©ment principal
  • CLS(Interaction to Next Paint) pour la stabilitĂ© visuelle
  • INP(Cumulative Layout Shift) pour la rĂ©activitĂ© de l'interface

Mais surtout, je ne me limite pas aux mesures de labo. Je veux de la donnée terrain, segmentée si possible par :

  • device
  • navigateur
  • type de parcours
  • contexte rĂ©seau

Comment je les utilise

Ma démarche est toujours en trois temps : mesurer, diagnostiquer, corriger."

D'abord, je regarde la métrique qui dégrade le parcours. Pour ça, je combine généralement plusieurs sources :

  • terrain / field data quand c'est disponible, parce que c'est ce qui reflète la vraie expĂ©rience utilisateur ;
  • mesures locales pour reproduire le problème ;
  • puis trace DevTools pour identifier la cause racine. Les outils Chrome rĂ©cents mettent justement en avant les mĂ©triques CWV directement dans le panneau Performance, avec une vue live puis une analyse dĂ©taillĂ©e via les traces.

Ensuite, je ne traite pas tous les problèmes de la même façon :

  • si le sujet est LCP, je regarde surtout le poids des ressources critiques, l'ordre de chargement, les images, le JS bloquant, ou parfois le backend si la rĂ©ponse initiale est lente ;
  • si le sujet est INP, je vais plutĂ´t chercher du JavaScript lourd, des handlers trop coĂ»teux, des re-renders inutiles, ou des interactions qui dĂ©clenchent trop de travail cĂ´tĂ© UI ;
  • si le sujet est CLS, je cherche les dĂ©calages de layout : images sans dimensions, contenu injectĂ© tardivement, composants qui changent de taille après rendu.

Ce que j'ai fait concrètement

"Chez OUIGO, sur des pages critiques de parcours, j'ai utilisé cette logique pour cibler les problèmes de performance plutôt que d'optimiser à l'aveugle."

Sur un cas de page de résultats ou de parcours sensible, la première étape a été d'identifier ce qui pénalisait réellement l'expérience :

  • appels API redondants,
  • composants non critiques chargĂ©s trop tĂ´t,
  • et re-renders inutiles cĂ´tĂ© React.

À partir de là, j'ai mis en place des actions ciblées :

  • meilleure gestion du cache et du refetch avec un outil de server state,
  • lazy loading sur les blocs secondaires,
  • code splitting sur certaines parties du parcours,
  • rĂ©duction des re-renders avec une meilleure maĂ®trise de la composition et des dĂ©pendances des hooks,
  • et stabilisation de certains composants pour Ă©viter les sauts visuels.

"L'idée n'était pas de 'faire plaisir à Lighthouse', mais d'améliorer un parcours business critique, notamment sur mobile.

Approche sur l'accessibilité

Je travaille sur trois axes :

  • sĂ©mantique : structure HTML correcte, rĂ´les natifs privilĂ©giĂ©s
  • interaction : navigation clavier, focus management, pièges Ă  focus maĂ®trisĂ©s
  • perception : contrastes, feedback, libellĂ©s, erreurs comprĂ©hensibles

Je cherche à rendre les composants accessibles par défaut, au niveau du design system, pour éviter de redécouvrir les mêmes problèmes feature par feature.

Dette technique

Je distingue toujours :

  • la dette utile et assumĂ©e, prise pour livrer un besoin
  • la dette subie, qui dĂ©grade durablement la capacitĂ© de delivery

Je pilote la dette avec une logique de risque :

  • impact business
  • frĂ©quence de friction
  • coĂ»t de maintenance
  • risque de rĂ©gression
  • blocage pour les futures Ă©volutions

Je formalise les sujets via backlog technique, critères de priorisation et parfois ADR. Je cherche surtout à rendre la dette visible et objectivable, pour sortir du débat subjectif.

Dans une taskforce, je ne me contente pas de corriger localement : je cherche les causes systémiques :

  • conventions absentes
  • architecture floue
  • tests insuffisants
  • ownership faible
  • dĂ©pendances mal maĂ®trisĂ©es

AI

Je vois l'IA comme un accélérateur de productivité, mais pas comme un substitut à l'ingénierie. Elle est très efficace pour augmenter la vitesse d'exécution, mais la responsabilité de la qualité, de l'architecture et de la cohérence reste clairement côté développeur."

Dans mon cas, je l'utilise de manière assez ciblée.

Sur mes projets personnels, j'utilise Claude Code, surtout pour :

  • gĂ©nĂ©rer des premiers drafts de code ou de composants
  • explorer rapidement des options d'implĂ©mentation
  • challenger certaines approches techniques
  • gagner du temps sur des tâches rĂ©pĂ©titives

Esprit critique (très apprécié en entretien)

J'ai aussi conscience des limites :

  • elle peut proposer du code non optimal ou obsolète
  • elle ne comprend pas toujours le contexte mĂ©tier
  • elle peut introduire de la dette technique si elle est mal utilisĂ©e

Donc en pratique, je fais toujours :

  • une relecture critique
  • une adaptation au contexte projet
  • et une validation via tests

Je pense que l'IA va surtout changer la manière de travailler : moins de temps sur le code "mécanique", plus de temps sur la conception, la qualité et les décisions d'architecture.

Bon développeur

Pour moi, un bon développeur en 2026, ce n'est plus seulement quelqu'un qui sait coder.

C'est quelqu'un qui a un vrai mindset d'architecte, capable de prendre du recul et de penser le système dans son ensemble.

Il sait abstraire un problème, transformer un besoin métier en spécifications claires, et concevoir des solutions robustes, maintenables et évolutives.

Il accorde beaucoup d'importance à la qualité du code : un code lisible, testable, facile à faire évoluer. Et il a une vraie rigueur sur les tests, parce qu'il sait que la qualité ne se rajoute pas après.

Mais au-delà de la technique, il comprend le besoin utilisateur, il est capable de le challenger, et de proposer des solutions pertinentes, pas juste d'exécuter.Il sait aussi travailler en équipe : communiquer ses idées, aligner les choix techniques,

Et enfin, il développe de manière itérative, en livrant de la valeur régulièrement, plutôt que de chercher la solution parfaite dès le départ

Complexité

La complexité, je la traite surtout par la structure et la discipline.

Je fais en sorte que :

  • chaque module ait une responsabilitĂ© claire
  • les dĂ©pendances soient maĂ®trisĂ©es
  • les abstractions soient utiles, pas inutiles

Et j'évite de sur-abstraire trop tôt.

Je préfère une complexité visible et contrôlée plutôt qu'une complexité cachée dans des couches trop génériques.

Scalabilité

Je pense la scalabilité à deux niveaux :

Technique :

  • modularitĂ©
  • dĂ©couplage
  • performance

Organisationnel :

  • autonomie des Ă©quipes
  • conventions communes
  • design system partagĂ©

Parce qu'une application ne devient pas complexe uniquement Ă  cause du code, mais aussi Ă  cause du nombre de personnes qui travaillent dessus.

Collaboration avec BE

Je considère que le front doit être représenté très tôt dans les arbitrages, sinon on hérite de contrats sous-optimaux.

Je contribue sur :

  • la dĂ©finition des payloads
  • la granularitĂ© des endpoints
  • la gestion des erreurs
  • la cohĂ©rence des statuts
  • les besoins de pagination, filtrage, tri
  • les contraintes de performance
  • les impacts UX des choix backend

Mon rĂ´le est aussi de faire le lien entre :

  • intention produit
  • faisabilitĂ© UX
  • cohĂ©rence technique
  • coĂ»t long terme

Un front ne doit pas seulement "consommer" l'API : il doit participer Ă  la rendre exploitable efficacement.

Collaboration avec UI/UX

Pour moi, la collaboration avec les équipes UI/UX est essentielle, surtout sur des produits à fort enjeu comme ceux que j'ai pu avoir chez OUIGO.

Je vois ça comme une collaboration continue, pas juste un passage de maquette à implémentation.

Implication en amont: J'essaie d'intervenir le plus tĂ´t possible dans la phase de conception.

Quand les designers travaillent sur une feature, je participe aux discussions pour :

  • challenger la faisabilitĂ© technique
  • anticiper les impacts (performance, accessibilitĂ©, complexitĂ©)
  • proposer des alternatives si nĂ©cessaire

Ça évite de découvrir des problèmes trop tard.

Travail avec le design system: On s'appuie beaucoup sur le design system pour aligner design et développement.

Avec Storybook, on a un référentiel commun :

  • les composants existants
  • leurs limites
  • leurs variantes

Ça évite de redéfinir des composants à chaque fois.

Feedback continu: "Pendant le développement, je fais des points réguliers avec les designers :

  • validation des Ă©crans
  • ajustements
  • gestion des edge cases

On évite l'effet 'livraison finale surprise'."

Collaboration équipe produit

Oui, systématiquement. Sur la plupart de mes missions, j'ai travaillé en collaboration étroite avec les équipes produit, notamment chez OUIGO ou encore chez La Poste.

Pour moi, le développeur ne doit pas être seulement un exécutant, mais un vrai partenaire du produit.

Compréhension du besoin: "Je commence toujours par bien comprendre le besoin métier :

  • quel problème utilisateur on cherche Ă  rĂ©soudre
  • quels sont les objectifs
  • quelles sont les contraintes

Ça me permet de proposer des solutions plus pertinentes, pas juste de coder une spécification."

Challenge des besoins: "Je challenge régulièrement les demandes quand c'est nécessaire.

Par exemple :

  • simplifier une feature trop complexe
  • proposer une alternative plus rapide Ă  implĂ©menter
  • anticiper des cas non couverts

Toujours dans une logique d'apporter de la valeur.

DOR / DOD

Oui, j'utilise le Definition of Ready et le Definition of Done comme des garde-fous pour sécuriser le delivery et éviter les incompréhensions. Je les ai utilisés notamment sur mes projets chez OUIGO et La Poste

Definition of Ready (DoR)

"Le DoR, pour moi, c'est ce qui garantit qu'une user story est prête à être développée. Concrètement, je vérifie que :

  • le besoin est clair et compris
  • les critères d'acceptation sont dĂ©finis
  • les cas limites sont identifiĂ©s
  • les dĂ©pendances sont connues
  • et qu'il n'y a pas de zone d'ambiguĂŻtĂ©

Pendant les refinements, je challenge beaucoup sur ces points. Si une story n'est pas 'ready', je préfère la repousser plutôt que de commencer avec des incertitudes."

Utilisation au quotidien 💬 "Au quotidien, ça me sert surtout à :

  • Ă©viter les allers-retours
  • amĂ©liorer la qualitĂ© dès le dĂ©part
  • aligner toutes les Ă©quipes (dev, QA, produit)

C'est aussi un outil de communication, pas juste une checklist."

Definition of Done (DoD)

💬 "Le DoD, c'est ce qui garantit que la feature est réellement terminée, pas juste développée. Dans mes projets, ça inclut généralement :

  • code dĂ©veloppĂ© et relu
  • tests unitaires passĂ©s
  • intĂ©gration validĂ©e
  • respect des standards (lint, typage)
  • accessibilitĂ© vĂ©rifiĂ©e
  • validation fonctionnelle
  • et dĂ©ploiement sur un environnement de test

Parfois, on ajoute aussi :

  • documentation
  • mise Ă  jour Storybook si nĂ©cessaire"

Agilité

Pour moi, l'agilité est surtout un cadre qui permet de mieux collaborer et de livrer de la valeur rapidement, mais ce n'est pas une fin en soi.

Ce que j'apprécie vraiment :

  • la collaboration transverse: Pouvoir travailler Ă©troitement avec le produit, le design et le backend, ça permet d'aligner rapidement les dĂ©cisions et d'Ă©viter les silos.
  • la livraison incrĂ©mentale: DĂ©couper les features pour livrer rĂ©gulièrement, avoir du feedback rapide, et ajuster en fonction — ça rĂ©duit beaucoup les risques.
  • la flexibilitĂ©: On peut s'adapter aux changements de prioritĂ©s sans remettre tout le projet en cause.

Ce que j'aime moins: Ce que j'aime moins, c'est quand l'agilité devient trop 'ritualisée' ou dogmatique.

Par exemple :

  • trop de cĂ©rĂ©monies sans vraie valeur
  • des sprints remplis mais sans vraie priorisation
  • ou des user stories mal dĂ©finies

Dans ces cas-lĂ , on perd l'objectif principal qui est de livrer de la valeur."

Taskforce

Oui et Non, j'ai déjà travaillé dans des contextes proches d'une taskforce, chez OUIGO et sur des projets critiques chez La Poste.

Même si ce n'était pas appelé officiellement 'taskforce', on était clairement dans des situations avec :

  • des dĂ©lais courts
  • des enjeux forts
  • et une nĂ©cessitĂ© de dĂ©bloquer rapidement

Comprendre rapidement la situation

"Ma première étape, c'est toujours de comprendre :

  • oĂą sont les blocages
  • quelles sont les prioritĂ©s rĂ©elles et quels sont les risques

Je fais souvent un état des lieux rapide :

  • code
  • architecture
  • organisation

Pour éviter d'agir à l'aveugle."

Prioriser l'impact "Dans une taskforce, on ne peut pas tout faire.

Je me concentre sur :

  • les points bloquants
  • les quick wins
  • ce qui apporte le plus de valeur rapidement

L'objectif, c'est de débloquer la situation le plus vite possible."

Simplifier

"J'essaie aussi de simplifier :

  • rĂ©duire le scope
  • Ă©viter la sur-architecture
  • proposer des solutions pragmatiques

Dans ce contexte, la perfection n'est pas l'objectif, la livraison l'est.

Communication

"La communication est clé.

Je fais des points réguliers avec :

  • le produit
  • les Ă©quipes techniques
  • les parties prenantes

Pour aligner tout le monde et éviter les malentendus.

System design et design system(Amardeep)(Martin Fowler)

Les deux termes sont proches, mais ils n'ont pas du tout le même périmètre.

System Design: Le system design concerne la conception globale d'un système.

On parle de :

  • architecture
  • scalabilitĂ©
  • performance
  • communication entre services
  • gestion des donnĂ©es

Par exemple :

  • comment structurer une application front
  • comment elle communique avec le backend
  • comment gĂ©rer la montĂ©e en charge

C'est une vision macro, orientée architecture."

Design System: "Le design system, lui, est centré sur l'interface utilisateur et l'expérience.

Il regroupe :

  • les composants UI
  • les design tokens (couleurs, typo…)
  • les règles d'usage
  • la documentation

L'objectif est d'assurer la cohérence visuelle et fonctionnelle."

Différence clé Donc :

  • le system design → comment le système fonctionne
  • le design system → comment l'interface est construite et prĂ©sentĂ©e

Les deux sont complémentaires, mais à des niveaux différents."

Le system design est une problématique d'architecture, alors que le design system est une problématique d'interface et de cohérence UI.

Micro-frontends

Je vois les micro-frontends comme une solution organisationnelle, pas technique.Le Le frontend est découpé en plusieurs applications indépendantes, souvent par domaine métier ou par équipe.

C'est utile quand :

  • plusieurs Ă©quipes doivent travailler de manière indĂ©pendante
  • les cycles de release doivent ĂŞtre dĂ©couplĂ©s

Mais ça introduit aussi de la complexité :

  • duplication
  • performance
  • cohĂ©rence UI

Donc je ne les utilise que si le besoin est réel.

Sinon, un monolithe modulaire est souvent plus simple et efficace.

Comment l'implémenter

On peut utiliser :

  • Module Federation ;
  • single-spa ;
  • Web Components ;
  • intĂ©gration par routes ;
  • shell applicatif.

Exemple:

Une équipe gère le parcours de souscription, une autre le paiement. Chaque équipe déploie son frontend indépendamment, mais le shell gère la navigation, l'authentification et le layout global.

Les micro-frontends sont une réponse à un problème d'organisation, pas une solution à appliquer par défaut.

Monolithe

Une seule application frontend contient tous les domaines : souscription, profil, paiement, dashboard, etc.

Le monolithe, pour moi, n'est pas un mauvais mot. Un monolithe bien structuré, modulaire, peut être très efficace, surtout quand on veut aller vite, garder une forte cohérence et éviter une complexité distribuée trop tôt.

Je le trouve souvent pertinent au démarrage d'un produit, ou quand les équipes ne sont pas encore suffisamment découplées pour justifier une architecture plus distribuée.

Microservices

Les microservices deviennent intéressants quand on a de vrais besoins d'autonomie entre domaines ou entre équipes, des cycles de livraison différents, ou des contraintes de scalabilité spécifiques.

Mais je reste prudent, parce que ça introduit beaucoup de complexité :

  • gestion du rĂ©seau
  • observabilitĂ©
  • contrats inter-services
  • versioning
  • rĂ©silience
  • et gouvernance globale

Donc je ne recommande jamais les microservices par principe. Je les vois comme une réponse à un problème d'échelle organisationnelle et technique, pas comme un standard par défaut.

Monorepo

Le monorepo, je le trouve très pertinent quand plusieurs applications ou packages doivent partager :

  • des composants
  • des utilitaires
  • des standards
  • ou un design system

Ça facilite la cohérence, la réutilisation, et la mise en place de règles communes.

En revanche, il faut bien le gouverner, sinon ça peut devenir compliqué :

  • builds plus lourds
  • dĂ©pendances mal maĂ®trisĂ©es
  • frontières floues entre modules

Donc pour moi, le monorepo est très puissant, mais il a besoin de discipline.

BFF

Le BFF, je le trouve très utile côté front, surtout quand plusieurs clients ont des besoins différents, par exemple web et mobile.

L'intérêt, c'est de rapprocher la logique d'orchestration du besoin UI :

  • agrĂ©gation de donnĂ©es
  • adaptation des payloads
  • simplification des appels cĂ´tĂ© front
  • meilleure maĂ®trise de l'expĂ©rience utilisateur

Ça permet d'éviter que le front devienne une couche d'assemblage trop complexe.

Par contre, il faut éviter d'y mettre trop de logique métier, sinon on déplace juste la complexité ailleurs.

Prise de décision technique

Pour moi, la prise de décision doit être à la fois collaborative et structurée

Bien cadrer le problème: Je commence toujours par clarifier :

  • le contexte
  • le besoin
  • les contraintes

Proposer des options Ensuite, je propose généralement plusieurs options, avec leurs trade-offs :

  • simplicitĂ© vs scalabilitĂ©
  • rapiditĂ© vs qualitĂ©
  • court terme vs long terme

Ça permet d'avoir une discussion constructive plutôt qu'un débat d'opinions.

Je structure la décision : je clarifie le problème, je propose des options avec leurs trade-offs, j'implique l'équipe, puis on décide rapidement et on documente.

Idée réfus

Ça m'arrive, et pour moi ce n'est pas un problème en soi. Mon objectif, ce n'est pas que mon idée soit retenue, c'est que l'équipe prenne la meilleure décision possible.

Comprendre pourquoi: Je commence par comprendre pourquoi elle est refusée :

  • contraintes que je n'avais pas vues
  • prioritĂ©s diffĂ©rentes
  • risques identifiĂ©s par d'autres

Ça m'aide à ajuster ma vision."

Accepter et s'aligner: Si la décision est prise collectivement, je m'aligne. Même si ce n'était pas mon choix initial, je m'engage à faire en sorte que la solution retenue fonctionne bien."

Apprendre: Je garde aussi un retour d'expérience. Si plus tard on voit que certains points posent problème, ça permet de réévaluer de manière factuelle."

Je pense qu'à ce niveau, il faut être capable de défendre une idée, mais aussi de savoir lâcher prise quand une autre solution est choisie. L'important, c'est le résultat collectif

Pourquoi moi

Je pense que ma valeur ajoutée, c'est surtout ma capacité à aller au-delà du développement pur. Je ne me limite pas à implémenter des fonctionnalités, je travaille sur la cohérence globale du produit et sa capacité à évoluer.

Vision globale: J'ai une approche orientée architecture : Je fais attention à la structuration, à la maintenabilité, et à la qualité long terme.Mon objectif, c'est que ce qu'on construit aujourd'hui reste exploitable demain.

Impact concret: Je suis aussi très orienté impact :

  • amĂ©lioration de la performance
  • mise en place de bonnes pratiques
  • structuration du code
  • rĂ©duction de la dette technique

Je cherche toujours Ă  apporter de la valeur, pas juste Ă  livrer du code.

Collaboration: Je travaille beaucoup en collaboration avec :

  • le produit
  • les designers
  • le backend

Je challenge les besoins quand c'est nécessaire, et je propose des solutions adaptées.

Donc, je peux vous aider à livrer, mais aussi à améliorer durablement la qualité et la structuration de votre front.

Valeur ajoutée

Je peux apporter de la valeur Ă  deux niveaux : livraison et structuration.

Pourquoi Votre enjeu n'est pas uniquement de produire du code, mais de réduire durablement le coût de maintenance.

Comment

  • identifier la duplication ;
  • structurer les composants ;
  • isoler les règles mĂ©tier ;
  • standardiser les validations ;
  • amĂ©liorer les tests ;
  • contribuer aux choix d'architecture ;
  • collaborer avec produit, UX et backend.

Exemple concret Si aujourd'hui une évolution de validation prend plusieurs jours parce qu'il faut modifier 16 applications, mon objectif serait de faire évoluer ça vers un changement centralisé, testé et propagé proprement."

Phrase finale :

"Ma valeur ajoutée, c'est de ne pas seulement livrer des features, mais de rendre le système plus simple à faire évoluer."

Valeur ajouter 1

Même si l'équipe possède déjà ces compétences, je pense que je peux apporter de la valeur par mon expérience terrain et ma manière de travailler.

Mon objectif n'est pas de "réinventer" ce qui existe déjà, mais de renforcer l'équipe et contribuer rapidement sur des sujets complexes.

Par exemple, sur mes expériences chez [OUIGO](https://www.ouigo.com?utm_source=chatgpt.com), La Poste ou Nexity, j'ai travaillé dans des environnements où :

  • les exigences qualitĂ© Ă©taient dĂ©jĂ  Ă©levĂ©es,
  • les Ă©quipes Ă©taient dĂ©jĂ  expĂ©rimentĂ©es,
  • les pratiques Ă©taient dĂ©jĂ  bien installĂ©es.

Pourtant, il y avait toujours de la valeur Ă  apporter :

  • amĂ©liorer certains parcours,
  • optimiser des performances,
  • rĂ©duire de la dette technique,
  • fluidifier les Ă©changes entre Ă©quipes,
  • amĂ©liorer la maintenabilitĂ©,
  • renforcer certains standards de dĂ©veloppement.

Je pense aussi qu'une équipe forte devient encore meilleure quand les profils se complètent.

J'apporte notamment :

  • une vision orientĂ©e produit et utilisateur,
  • une expĂ©rience web + mobile,
  • une forte sensibilitĂ© qualitĂ©,
  • et une capacitĂ© Ă  m'adapter rapidement Ă  un contexte existant.

Et surtout, je suis quelqu'un qui aime collaborer et faire progresser le collectif :

  • partager des bonnes pratiques,
  • challenger techniquement de manière constructive,
  • aider sur les sujets complexes,
  • et contribuer Ă  une dynamique technique positive dans l'Ă©quipe.

A venir 5ans

Dans 5 ans, je me vois continuer à évoluer vers un rôle avec plus d'impact, pas forcément en management direct, mais davantage sur la structuration technique et l'architecture."

Évolution naturelle: J'aimerais renforcer mon rôle sur :

  • les dĂ©cisions d'architecture
  • la structuration des projets
  • l'accompagnement des Ă©quipes

Avec une vision plus transverse.

Impact technique: Je me vois intervenir sur des sujets plus globaux :

  • scalabilitĂ©
  • performance
  • design system
  • qualitĂ© globale du front

Et contribuer Ă  des choix structurants.

Offre

Oui, de ce que j'ai compris, vous recherchez un développeur front-end senior React pour intervenir dans une taskforce technique, avec un vrai enjeu de structuration et d'amélioration du front pour le parcours de la soucription.

Ce n'est pas juste un besoin de développement classique. Vous cherchez quelqu'un capable de :

  • construire et faire Ă©voluer des SPA robustes
  • amĂ©liorer la qualitĂ© globale
  • et intervenir sur des sujets structurants

Les enjeux techniques

Plusieurs axes tels que:

  • mise en place ou Ă©volution d'un design system (Storybook, composants rĂ©utilisables)
  • gestion d'Ă©tat avancĂ©e (Redux, React Query…)
  • optimisation des performances (Core Web Vitals, lazy loading…)

J'ai aussi compris que vous attendez un profil capable de :

  • contribuer aux choix d'architecture
  • dĂ©finir des bonnes pratiques
  • et collaborer avec des Ă©quipes

Pourquoi ce poste vous intéresse ?

Ce qui m'intéresse dans ce poste, c'est qu'il ne s'agit pas seulement de développement, mais d'un rôle avec un vrai impact sur la qualité et la structuration du front

Le fait d'intervenir dans une taskforce technique est particulièrement intéressant pour moi, parce que ça implique :

  • analyser un existant
  • identifier des axes d'amĂ©lioration
  • et apporter des solutions concrètes rapidement"

Alignement technique

Je retrouve aussi beaucoup de sujets sur lesquels j'ai déjà travaillé :

  • design system et composants rĂ©utilisables
  • performance front
  • accessibilitĂ©
  • qualitĂ© avec tests et CI/CD
  • gestion d'Ă©tat avancĂ©e
  • Donc je me sens alignĂ© techniquement avec vos enjeux.

Donc ce qui m'intéresse, c'est à la fois le challenge technique, l'impact sur le produit, et la possibilité d'intervenir sur des sujets structurants.

Comprendre-besoin

De ce que j'ai compris, vous avez un enjeu d'industrialisation du parcours de souscription. Aujourd'hui, il existe plusieurs applications ou parcours indépendants, avec probablement de la duplication, des règles métier dispersées, des validations pas toujours homogènes et un coût de maintenance élevé.

Pour moi, le sujet n'est donc pas seulement de développer de nouvelles features React. Le vrai enjeu est de construire un socle plus robuste, mutualisable et maintenable, afin de réduire le temps de delivery et le risque d'erreur.

Pourquoi c'est important :

Parce que si on continue à maintenir chaque parcours séparément, chaque évolution devient coûteuse et risquée.

Comment je ferais :

Je commencerais par cartographier les parcours existants, identifier les étapes communes, isoler les règles métier, mutualiser les composants, standardiser les validations et sécuriser le tout avec des tests.

Exemple concret :

"Si 16 applications ont toutes une étape d'identité client avec nom, prénom, email, téléphone, je ne veux pas maintenir 16 formulaires différents. Je crée une étape IdentityStep configurable, avec un schéma de validation commun, puis chaque application l'adapte via configuration."

Industrialiser le parcours

J'industrialiserais le parcours en passant d'une logique de duplication à une logique de briques réutilisables."

Pourquoi :

Un parcours de souscription est critique : il contient des formulaires, des règles métier, des appels API, des validations, des erreurs et souvent une forte exigence UX. Si chaque application réimplémente ça différemment, on augmente mécaniquement les bugs et le temps de maintenance.

Comment :

  • D'abord, je dĂ©coupe le parcours en Ă©tapes fonctionnelles :IdentityStep, ContactStep, OfferStep, DocumentsStep, SummaryStep, ConfirmationStep
  • Ensuite, je dĂ©finis pour chaque Ă©tape :
  • Puis je compose le parcours par configuration

Une application peut avoir l'étape documents, une autre non. Au lieu de créer deux parcours séparés, j'utilise le même moteur de parcours et je configure les étapes activées.

Cartographier les 16 applications

Je fais une cartographie fonctionnelle et technique."

Pourquoi : Avant de mutualiser, il faut savoir ce qui est vraiment commun et ce qui est spécifique. Sinon, on risque soit de sur-généraliser, soit de créer une abstraction inutilisable.

Comment :

- Pour chaque application, je documente :

  • Ă©tapes du parcours
  • champs demandĂ©s
  • validations
  • règles mĂ©tier
  • composants utilisĂ©s
  • appels API
  • erreurs possibles
  • cas spĂ©cifiques

-Ensuite, je construis une matrice

Si je vois que 14 applications sur 16 utilisent une étape Documents, mais avec des variantes, je crée un DocumentsStep commun avec une configuration des types de documents demandés.

Identifier les étapes communes

Je ne me base pas uniquement sur le nom des écrans, mais sur leur rôle fonctionnel.

Pourquoi :

Deux applications peuvent appeler une étape différemment : "Profil client", "Identité", "Informations personnelles", mais fonctionnellement, c'est la même chose.

Comment :

  • Je regroupe les Ă©tapes par intention : Infos personnelles / IdentitĂ© / Profil client \=> par IdentityStep
  • Puis je dĂ©finis un socle commun :

Si toutes les applications demandent nom/prénom/email, mais seulement certaines demandent le téléphone, je garde téléphone comme champ configurable, pas comme raison de dupliquer tout l'écran.

Isoler les règles métier

Je sors les règles métier des composants React pour les mettre dans des modules dédiés, testables et réutilisables.

Pourquoi :

Si une règle est dans le JSX ou dans plusieurs composants, elle devient difficile à retrouver, difficile à tester et facile à dupliquer.

Comment :

  • Je crĂ©e un module mĂ©tier
  • Puis j'extrais la règle

Tester les règles métier

Je teste les règles métier comme des fonctions pures.

Pourquoi Les règles métier sont critiques. Si elles changent, on doit savoir immédiatement quel comportement est impacté.

Quand le métier change une règle documentaire, je modifie la règle centrale, puis les tests me garantissent que je n'ai pas cassé les cas existants.

Uniformiser les validations

Je mets en place des schémas de validation partagés, avec des extensions pour les cas spécifiques.

Pourquoi : Si chaque application valide différemment, l'utilisateur peut avoir des comportements incohérents et l'équipe multiplie les bugs.

Comment :

  • Avec Zod :
  • Pour une app spĂ©cifique, on va Ă©tendre le schĂ©ma sans dupliquer toute la validation.

Le front valide pour améliorer l'expérience utilisateur, mais le backend reste la source de vérité finale.

Gestion erreurs frontend

Je différencie erreurs techniques et métier.

Pourquoi

Sinon UX mauvaise.

Comment

  • Error Boundary → erreurs React
  • mapping erreurs API → messages user
  • fallback UI

Best Practices

Séparer UI et logique métier

Pourquoi: Sinon les composants deviennent trop gros et difficiles à tester. Les composants affichent, les règles métier décident.

Centraliser les appels API

Pour éviter les fetch dispersés partout

Tester les règles critiques

Les règles métier changent souvent et peuvent casser un parcours.

Éviter la sur-abstraction

Une abstraction créée trop tôt devient souvent plus difficile à maintenir que la duplication initiale. Je préfère une duplication temporaire claire à une abstraction prématurée floue.

Mettre l'état au bon endroit

  • state local pour UI simple ;
  • React Hook Form pour formulaires ;
  • React Query pour server state ;
  • Redux/Zustand pour Ă©tat global complexe.

Patterns frontend

  • Container / Presentational: SĂ©parer logique et affichage
  • Custom Hooks: Extraire la logique rĂ©utilisable.
  • Compound Components: CrĂ©er des composants flexibles.
  • Provider Pattern: Partager un contexte limitĂ© Ă  une zone.
  • Strategy Pattern: Changer un comportement selon le contexte.exemple validation diffĂ©rente selon type d'offre
  • Adapter Pattern: Adapter une API backend Ă  un modèle frontend propre.

Module Federation

C'est une fonctionnalité de Webpack qui permet de charger du code d'une autre app à runtime. Une app peut exposer des composants et une autre peut les consommer

Comment ça marche

Tu as :

  • une app "remote" (ex: subscription)
  • une app "host" (ex: shell)

Exemple

  • Ă©quipe A → dĂ©veloppe subscription-app
  • Ă©quipe B → dĂ©veloppe payment-app
  • shell → assemble tout

Chaque équipe déploie indépendamment

Pourquoi utiliser

  • indĂ©pendance des Ă©quipes
  • dĂ©ploiement sĂ©parĂ©
  • partage de composants dynamiquement

Attention

  • gestion des versions React
  • duplication des dĂ©pendances
  • debugging plus complexe

Module Federation permet de charger dynamiquement du code distant sans rebuild global.

Single-spa

single-spa est un framework pour orchestrer plusieurs apps frontend dans une seule page.

Comment ça marche ?

Tu as une app principale qui décide. Selon la route → une app est montée ou démontée

Exemple

  • /subscription → charge app subscription
  • /payment → charge app payment

Single-spa agit comme un orchestrateur qui monte/démonte des micro-frontends selon la navigation.

Shell applicatif

Une app principale (shell) qui :

  • gère layout
  • auth
  • navigation
  • state global

Et charge les micro-frontends.

Comment ça marche ?

Le shell peut charger :

  • Module Federation
  • single-spa
  • iframe
  • dynamic import

Le shell agit comme la colonne vertébrale de l'application.

Authentifcation SPA

Dans une architecture avec plusieurs applications indépendantes, je ne veux surtout pas que chaque application gère sa propre authentification de manière isolée. Je centralise l'authentification, puis chaque application consomme une session commune et applique ses contrôles d'autorisation.

Authentification centralisée

Pour éviter que les 16 applications aient 16 gestions différentes du login, des tokens, des expirations et des refresh.

Je mets en place un fournisseur d'identité commun :

  • SSO / OAuth2 / OpenID Connect ;
  • Keycloak, Azure AD, Auth0, etc. ;
  • redirection vers un login centralisĂ© ;
  • retour vers l'application avec une session valide.

Exemple

  • Utilisateur → App A
  • App A → redirige vers Identity Provider
  • Identity Provider → authentifie
  • Utilisateur → revient sur App A avec session active

Session partagée entre applications

L'utilisateur ne doit pas se reconnecter quand il passe de l'application A Ă  l'application B.

Comment ?

Si les applications sont sur le même domaine ou sous-domaines, on peut utiliser un cookie sécurisé partagé

Le cookie HttpOnly n'est pas accessible en JavaScript, ce qui réduit le risque XSS.

Autorisation par rĂ´le

On distingue :

  • authentification : "qui es-tu ?"
  • autorisation : "qu'as-tu le droit de faire ?"

Les rôles peuvent venir du token ou d'une API /me. Le front peut adapter l'interface selon les rôles, mais il ne doit jamais être la source de vérité de l'autorisation."

Entre applications indépendantes

Quand l'utilisateur passe d'une app Ă  l'autre : appA -> app B

App B doit :

  • vĂ©rifier que la session existe ;
  • rĂ©cupĂ©rer l'utilisateur courant ;
  • charger ses rĂ´les/permissions ;
  • appliquer les guards de routes ;
  • refuser l'accès si nĂ©cessaire.

Conclusion Je centralise l'authentification via un Identity Provider commun, puis je partage la session entre applications avec des cookies sécurisés ou un mécanisme SSO. Chaque application récupère l'utilisateur courant et ses permissions, applique des guards côté front pour l'UX, mais toutes les autorisations critiques sont revérifiées côté backend. Le front adapte l'interface, le backend garantit la sécurité.

L'authentification peut être partagée entre applications, mais l'autorisation doit toujours être vérifiée à chaque action sensible.

Question

-Sur ce parcours, qu'est-ce qui est déjà en place aujourd'hui et qu'est-ce qui reste à construire pour la mise en production dans 2 mois ?

-Avez-vous déjà défini un MVP clair pour la mise en production, ou le scope est encore en cours d'ajustement ?

-Est-ce que ce parcours s'appuie déjà sur un design system structuré, ou est-ce encore en construction ?

Comment est gérée l'authentification et la session entre les applications ?

Comment se fait la navigation entre les applications aujourd'hui ?(full reload 🔴iframe 🔴/routing partagé 🟢)

Aujourd'hui, les ralentissements viennent plutôt du chargement des applications ou des appels API ?(Est-ce que vous avez des métriques type Core Web Vitals ou Lighthouse sur ce parcours ?)

Question CTO

"Quelle est ton expérience sur React Native et les applications hybrides ?"

---

Réponse

J'ai travaillé plusieurs années sur des applications hybrides React Native, notamment chez Nexity et aujourd'hui chez OUIGO.

Chez Nexity, nous avions une application mobile connectée à des APIs GraphQL avec Apollo, et nous utilisions Expo pour accélérer le développement et simplifier les déploiements.

Chez OUIGO, je travaille dans un contexte plus exigeant en termes de trafic et de qualité utilisateur. L'un des enjeux importants était d'assurer une cohérence entre web et mobile tout en gardant une bonne maintenabilité du code.

Concrètement, j'ai travaillé sur :

  • des composants partagĂ©s,
  • la gestion d'Ă©tat avec Redux,
  • les performances de rendu,
  • les tests,
  • l'accessibilitĂ©,
  • et la stabilitĂ© des releases.

J'ai aussi participé à la mise en place de bonnes pratiques autour du découpage des composants, de la réutilisabilité et des conventions de développement pour limiter la dette technique.

---

Question CTO

"Qu'est-ce que ça veut dire pour toi une approche mobile-first ?"

---

Bonne réponse senior

Pour moi, le mobile-first ne veut pas seulement dire "adapter le responsive".

C'est penser l'expérience utilisateur d'abord pour les contraintes mobiles :

  • performance rĂ©seau,
  • temps de chargement,
  • ergonomie tactile,
  • lisibilitĂ©,
  • stabilitĂ©,
  • consommation mĂ©moire,
  • cycles de release plus longs.

Par exemple chez OUIGO, nous faisons particulièrement attention :

  • au poids des composants,
  • au lazy loading,
  • Ă  l'optimisation des appels API,
  • et aux comportements offline ou rĂ©seau dĂ©gradĂ©.

Sur mobile, une mauvaise expérience est très vite sanctionnée par les utilisateurs. Donc il faut être beaucoup plus rigoureux sur :

  • la fluiditĂ©,
  • les rĂ©gressions,
  • les crashs,
  • et l'observabilitĂ©.

C'est aussi pour ça que j'accorde beaucoup d'importance aux tests automatisés et au monitoring.

---

Question probable

"Quelle est ton approche des tests ?"

---

Réponse forte

Je vois les tests comme un outil de sécurisation du delivery, surtout dans des applications utilisées à grande échelle.

Je privilégie généralement une pyramide de tests équilibrée :

  • tests unitaires pour la logique mĂ©tier,
  • tests d'intĂ©gration pour sĂ©curiser les flux critiques,
  • et quelques tests end-to-end sur les parcours essentiels.

Chez OUIGO et Junior\&Cie, j'ai participé à la mise en place de tests Jest et de tests d'intégration intégrés dans la CI/CD GitLab.

Je fais attention à ne pas sur-tester l'implémentation mais plutôt les comportements métier.

Par exemple :

  • validation de formulaires,
  • gestion des erreurs API,
  • affichage conditionnel,
  • navigation utilisateur,
  • gestion des Ă©tats de chargement.

Sur mobile, les tests sont particulièrement importants parce que les cycles de validation sur stores sont plus coûteux en temps.

---

Question très probable CTO

"Comment tu arbitres entre vitesse et qualité ?"

---

Réponse senior

Je pense qu'il faut ĂŞtre pragmatique.

Toutes les fonctionnalités ne nécessitent pas le même niveau d'investissement technique.

Mon approche est généralement :

  • identifier les zones critiques du produit,
  • Ă©valuer le coĂ»t futur de la dette,
  • puis adapter le niveau de qualitĂ© attendu.

Par exemple, sur des composants stratégiques ou très réutilisés, je vais investir davantage :

  • architecture claire,
  • tests,
  • documentation,
  • Storybook,
  • accessibilitĂ©.

À l'inverse, sur un MVP ou une feature exploratoire, je peux accepter un compromis temporaire si la dette est connue et maîtrisée.

L'important pour moi est que la dette technique soit consciente, documentée et priorisée, pas subie.

---

Question probable

"Comment tu gères un incident en production mobile ?"

---

Réponse

La première étape est de sécuriser les utilisateurs et mesurer l'impact :

  • combien d'utilisateurs sont touchĂ©s,
  • crash ou simple dĂ©gradation,
  • Android/iOS,
  • version concernĂ©e.

Ensuite :

  • reproduction du problème,
  • analyse des logs,
  • vĂ©rification des dernières releases,
  • rollback ou hotfix si nĂ©cessaire.

Chez OUIGO, la stabilité est très importante, donc nous faisons attention à :

  • la CI/CD,
  • les tests avant release,
  • les environnements de validation,
  • et la surveillance post-dĂ©ploiement.

Après résolution, je considère qu'il est important de faire un retour d'expérience :

  • cause racine,
  • actions correctives,
  • amĂ©lioration du process,
  • ajout Ă©ventuel de tests pour Ă©viter la rĂ©gression.

---

Question possible

"Quelle est ton expérience avec Expo ?"

---

Réponse

J'ai utilisé Expo notamment chez Nexity dans le cadre d'une application React Native hybride.

J'apprécie Expo pour plusieurs raisons :

  • rapiditĂ© de setup,
  • simplification du tooling mobile,
  • gestion des builds,
  • OTA updates,
  • et amĂ©lioration de la DX.

Je pense que c'est particulièrement pertinent pour des équipes sans équipe mobile native dédiée, comme chez Epsor.

Mais je connais aussi ses limites :

  • dĂ©pendance Ă  certaines APIs,
  • contraintes natives spĂ©cifiques,
  • gestion des performances dans certains cas.

Donc je vois Expo comme un excellent accélérateur lorsqu'il est utilisé dans le bon contexte produit.

---

Question probable

"Comment travailles-tu avec les PM et Designers ?"

---

Réponse

J'aime travailler très tôt avec le produit et le design.

Pendant les refinements, j'essaie de challenger :

  • les parcours utilisateurs,
  • les cas limites,
  • les impacts techniques,
  • la cohĂ©rence mobile/web,
  • et la faisabilitĂ©.

Le fait d'échanger tôt évite beaucoup de problèmes plus tard.

Avec les designers, je fais particulièrement attention :

  • Ă  la cohĂ©rence des composants,
  • Ă  l'accessibilitĂ©,
  • aux comportements responsive/mobile,
  • et aux Ă©tats d'erreur ou de chargement souvent oubliĂ©s dans les maquettes.

Je préfère une logique de collaboration continue plutôt qu'un simple passage de ticket.

---

Question piège : "Pourquoi quitter OUIGO ?"

Ne jamais critiquer.

---

Bonne réponse

Je suis très reconnaissant de mon expérience chez OUIGO, où j'ai beaucoup appris sur les produits à fort trafic et les enjeux de qualité.

Aujourd'hui, j'ai envie d'un environnement où je peux avoir encore plus d'impact sur les décisions Front et mobile, avec davantage d'ownership technique et de proximité produit.

Le contexte d'Epsor correspond bien Ă  cette recherche, notamment avec :

  • le mobile-first,
  • la structuration des pratiques Front,
  • et le rĂ´le transverse attendu sur les applications.

Le CTO d'Epsor cherchera probablement quelqu'un qui :

  • rassure techniquement
  • structure naturellement
  • communique bien
  • sait prendre des dĂ©cisions
  • est pragmatique
  • comprend les enjeux produit

Réponse forte + contexte réel

J'aime travailler très tôt avec les Product Managers, avant même la phase de développement.

Chez OUIGO par exemple, pendant les refinements et grooming, nous challengions souvent ensemble :

  • les parcours utilisateurs,
  • les cas limites,
  • les impacts mobiles,
  • les dĂ©pendances backend,
  • et les prioritĂ©s de delivery.

Sur les parcours de réservation ou d'après-vente, il y avait beaucoup d'enjeux business et UX. Donc mon rôle n'était pas seulement de développer la feature, mais aussi d'aider à identifier :

  • les risques techniques,
  • les impacts performance,
  • les comportements rĂ©seau,
  • ou les complexitĂ©s inutiles.

Par exemple, sur certaines fonctionnalités mobile, nous avons simplifié des parcours pour réduire le nombre d'étapes utilisateur et limiter les abandons.

J'essaie toujours d'apporter une vision pragmatique :

  • ce qui apporte rĂ©ellement de la valeur,
  • ce qui peut ĂŞtre livrĂ© rapidement,
  • et ce qu'il vaut mieux repousser ou simplifier.

---

Réponse senior

Oui, régulièrement, mais toujours de manière constructive.

Chez Nexity par exemple, sur certains parcours mobiles, nous avions des écrans avec beaucoup d'informations et d'actions utilisateurs.

En travaillant avec le Product Manager et le Designer, j'ai remonté plusieurs points :

  • surcharge cognitive,
  • impacts performance sur mobile,
  • complexitĂ© technique inutile,
  • et risques de maintenance.

Nous avons finalement simplifié le flux :

  • moins d'Ă©tapes,
  • composants plus rĂ©utilisables,
  • meilleure lisibilitĂ© mobile,
  • et moins d'appels API.

Le résultat était meilleur à la fois :

  • pour l'utilisateur,
  • pour le delivery,
  • et pour la maintenabilitĂ©.

Je pense qu'un développeur senior doit challenger quand c'est pertinent, mais toujours avec une logique de collaboration et de recherche de solution.

---

Réponse très alignée Epsor

Je travaille de manière très proche avec les Designers, surtout sur les sujets mobile-first.

Chez OUIGO et Nexity, nous faisions régulièrement des échanges avant même le développement pour valider :

  • les comportements responsive,
  • les Ă©tats de chargement,
  • les cas d'erreur,
  • les animations,
  • et les contraintes techniques mobile.

J'aime aussi anticiper les problèmes d'accessibilité très tôt :

  • contrastes,
  • navigation clavier,
  • tailles tactiles,
  • feedback utilisateur,
  • lisibilitĂ© mobile.

Sur plusieurs projets, Storybook nous aidait beaucoup dans cette collaboration parce qu'il permettait :

  • de partager les composants,
  • valider les comportements UI,
  • et aligner rapidement design et dĂ©veloppement.

Je préfère une logique de co-construction plutôt qu'un simple passage de maquettes.

---

Réponse senior / ownership

J'essaie de participer aux décisions produit avec une approche orientée utilisateur et faisabilité.

Par exemple chez OUIGO, certaines fonctionnalités pouvaient sembler simples côté métier mais avoir :

  • un fort impact performance,
  • des risques mobiles,
  • ou des dĂ©pendances backend importantes.

Mon rôle était alors :

  • d'expliquer les contraintes,
  • proposer des alternatives,
  • estimer les impacts,
  • et aider Ă  prioriser.

Je pense qu'un développeur senior doit aider le produit à prendre des décisions éclairées, pas uniquement exécuter les demandes.

Et inversement, j'essaie aussi de comprendre les enjeux business :

  • acquisition,
  • conversion,
  • satisfaction utilisateur,
  • contraintes de temps,
  • ou objectifs mĂ©tier.

---

Réponse mature

Quand je ne suis pas aligné avec une décision produit, j'essaie d'abord de comprendre les contraintes business derrière la demande.

Ensuite, j'explique mes préoccupations de manière factuelle :

  • dette technique,
  • performance,
  • UX mobile,
  • stabilitĂ©,
  • ou coĂ»t futur.

J'évite les débats purement théoriques. Je préfère proposer :

  • des alternatives,
  • un MVP,
  • un dĂ©coupage,
  • ou une approche progressive.

Chez La Poste par exemple, certains sujets avaient des contraintes fortes de planning et de réglementation. Donc il fallait trouver un équilibre entre :

  • qualitĂ©,
  • rapiditĂ©,
  • et maintenabilitĂ©.

Je pense qu'un bon fonctionnement Produit/Tech repose surtout sur :

  • la confiance,
  • la transparence,
  • et la capacitĂ© Ă  prendre des dĂ©cisions pragmatiques ensemble.

---

Réponse très importante

J'essaie toujours de garder l'utilisateur final en tête pendant le développement.

Chez OUIGO, les utilisateurs sont très variés :

  • mobile,
  • rĂ©seau parfois faible,
  • usage rapide,
  • moments de stress pendant les rĂ©servations.

Donc nous faisions très attention :

  • au temps de chargement,
  • Ă  la simplicitĂ© des parcours,
  • Ă  la lisibilitĂ© mobile,
  • et aux erreurs utilisateurs.

Sur mobile, quelques secondes de friction peuvent suffire Ă  faire abandonner un parcours.

Cela influence beaucoup mes choix techniques :

  • performance,
  • gestion des erreurs,
  • simplicitĂ© UI,
  • et stabilitĂ© des releases.

---

7. "As-tu déjà travaillé dans un contexte de forte collaboration transverse ?"

Réponse contextualisée

Oui, particulièrement chez OUIGO et La Poste.

Chez OUIGO, nous travaillions quotidiennement avec :

  • Product Managers,
  • UX/UI,
  • backend,
  • QA,
  • Ă©quipes mĂ©tier,
  • et parfois marketing ou contenu via Drupal.

Comme les applications sont fortement utilisées, beaucoup de décisions impliquaient plusieurs équipes.

Par exemple, lors de certaines évolutions des parcours de vente, il fallait coordonner :

  • le Front,
  • les APIs,
  • les contenus,
  • le tracking analytics,
  • et les contraintes mĂ©tier.

Cela m'a appris Ă  :

  • communiquer clairement,
  • anticiper les dĂ©pendances,
  • et garder une vision globale du produit.

---

Réponse très CTO-compatible

Pour moi, un développeur senior apporte plus que du développement.

Il aide Ă  :

  • sĂ©curiser les dĂ©cisions,
  • anticiper les risques,
  • simplifier les solutions,
  • amĂ©liorer l'expĂ©rience utilisateur,
  • et maintenir un bon Ă©quilibre entre vitesse et qualitĂ©.

J'aime contribuer sur :

  • la vision technique,
  • la cohĂ©rence produit,
  • les performances,
  • et la maintenabilitĂ© long terme.

Je pense qu'un senior doit aussi aider l'équipe à mieux collaborer :

  • avec le produit,
  • le design,
  • et les autres dĂ©veloppeurs.

---

"Pourquoi la collaboration Produit/Tech est importante ?"

Parce qu'un bon produit ne vient pas uniquement d'une bonne idée ou d'une bonne implémentation technique.

Les meilleures solutions viennent généralement d'une collaboration forte entre :

  • produit,
  • design,
  • et engineering.

Quand les développeurs sont impliqués tôt :

  • on identifie mieux les risques,
  • on simplifie certains parcours,
  • on Ă©vite des coĂ»ts inutiles,
  • et on amĂ©liore souvent l'expĂ©rience utilisateur.

Et inversement, comprendre les enjeux business aide aussi les développeurs à prendre de meilleures décisions techniques.

Quelle est ta vision d'Expo ?"

Je vois Expo comme un très bon accélérateur pour React Native, surtout dans une équipe sans équipe mobile native dédiée.

Expo apporte beaucoup de valeur sur :

  • le setup projet
  • les builds
  • les mises Ă  jour OTA
  • la gestion des assets
  • les permissions
  • la developer experience
  • la standardisation du tooling

Dans un contexte comme Epsor, avec une Universal App et une volonté mobile-first, Expo peut être très pertinent.

Mais je reste pragmatique :

  • il faut vĂ©rifier les besoins natifs
  • les performances
  • les contraintes stores
  • les dĂ©pendances Expo
  • et la stratĂ©gie de release

Chez Nexity, Expo nous avait permis d'accélérer le développement mobile tout en gardant une bonne cohérence avec l'écosystème React.

---

10. "Comment tu garantis la cohérence web/mobile ?"

Pour garantir la cohérence web/mobile, je distingue ce qui doit être partagé et ce qui doit rester spécifique.

Je partage volontiers :

  • logique mĂ©tier
  • validation
  • types TypeScript
  • hooks
  • clients API
  • design tokens
  • conventions UX

Mais je garde spécifique :

  • certains composants UI
  • navigation
  • interactions tactiles
  • permissions natives
  • comportements liĂ©s au cycle de vie mobile

L'objectif n'est pas d'avoir 100 % de code partagé. L'objectif est d'avoir une expérience cohérente, maintenable et adaptée à chaque plateforme.

Chez OUIGO, cette approche était importante parce qu'il fallait garder une cohérence entre portail web, mobile et parcours utilisateur.

Comment vous gérez la publication sur l'App Store et le Play Store ?"

Sur mobile, la publication store est plus cadrée qu'un déploiement web, parce qu'on ne maîtrise pas entièrement le délai de validation ni la vitesse d'adoption par les utilisateurs.

Dans mes expériences React Native / Expo, le process était généralement le suivant :

  • PrĂ©paration de la release On dĂ©finit le pĂ©rimètre : features, bugfixes, version applicative, changelog et risques Ă©ventuels.
  • GĂ©nĂ©ration du build On gĂ©nère un build iOS et Android via la CI/CD ou via Expo EAS Build selon le projet.
  • Validation interne Le build est testĂ© sur un environnement de staging ou prĂ©production, avec validation QA / Product Owner sur devices rĂ©els ou BrowserStack.
  • Distribution de test Pour iOS, on passe par TestFlight. Pour Android, on utilise une piste interne ou fermĂ©e Google Play.
  • Validation finale On vĂ©rifie les parcours critiques : login, navigation, formulaires, affichage des donnĂ©es, erreurs rĂ©seau, performance et tracking.
  • Soumission store Une fois validĂ©, on soumet la version Ă  l'App Store et au Play Store, avec les release notes, screenshots ou metadata si nĂ©cessaire.
  • DĂ©ploiement progressif Quand c'est possible, on fait un rollout progressif, surtout sur Android, pour limiter le risque.
  • Monitoring post-release Après publication, on surveille les crashs, erreurs API, analytics, retours utilisateurs et avis store.

Rôle d'un développeur senior

Pour moi, un développeur senior ne se limite pas à produire des composants React.

Il doit être capable de prendre du recul sur l'architecture, la performance, la maintenabilité et l'expérience utilisateur. Next.js est un framework très complet, donc les mauvais choix peuvent avoir un impact important : trop de composants clients, mauvaise stratégie de cache, mauvais découpage des pages, ou surconsommation d'API.

Un senior doit aussi accompagner l'équipe. Cela passe par les revues de code, la documentation, les bonnes pratiques, mais aussi par la capacité à expliquer pourquoi on choisit une solution plutôt qu'une autre.

Enfin, il doit comprendre le produit.

Dans votre contexte, ce qui m'intéresse beaucoup, c'est justement le lien entre technique, Datadog, UX et métriques utilisateurs. Pour moi, la qualité technique n'est pas seulement interne à l'équipe. Elle doit se traduire par une application plus rapide, plus stable, plus accessible et plus agréable à utiliser.

Usage des Server Components

Dans mon projet actuel, nous avons surtout une logique React avec des parcours métiers assez riches côté client. Donc je n'ai pas systématiquement utilisé les Server Components partout comme sur un nouveau projet Next.js App Router.

Par contre, quand je travaille sur une architecture Next.js moderne, j'utilise les Server Components pour tout ce qui concerne le rendu initial de données : pages de contenu, pages détail, listes, blocs peu interactifs, récupération de données côté serveur.

L'idée est simple : si un composant n'a pas besoin d'état local, de useEffect, de localStorage ou d'événement utilisateur, je préfère le garder côté serveur. Cela évite d'envoyer trop de JavaScript au navigateur.

Par exemple, sur une page de souscription ou une page récapitulative, je peux garder côté serveur les blocs qui affichent les informations du contrat, les données du client ou les contenus réglementaires. Ensuite, j'isole côté client uniquement les parties interactives : formulaire, bouton de validation, modale, sélection d'option, upload de document.

L'intérêt est double. D'abord, on améliore la performance parce que le navigateur hydrate moins de composants. Ensuite, on garde une architecture plus claire : le serveur prépare les données et le rendu statique, tandis que le client gère uniquement l'interaction utilisateur.

Donc ma logique est : server-first par défaut, client uniquement quand il y a une vraie interaction navigateur.

Décision technique fier

Une décision dont je suis particulièrement fier concerne un sujet que on a rencontré sur des parcours de souscription.

On a des pages de plus en plus complexes avec beaucoup de règles métiers, de validations et de comportements différents selon le contexte.

Au départ, chaque nouvelle règle était ajoutée directement dans les composants React. Progressivement, le code devenait difficile à comprendre et à maintenir.

J'ai proposé de séparer davantage la logique métier de l'interface utilisateur.

L'idée était que React ne fasse principalement que de l'affichage tandis que les règles métiers soient regroupées dans des services ou des modules dédiés.

Cette décision n'a pas apporté de valeur visible immédiatement pour l'utilisateur final, mais quelques mois plus tard on a constaté que les évolutions étaient beaucoup plus rapides à développer, les bugs plus faciles à corriger et les nouveaux développeurs montaient plus rapidement en compétence.

Cette expérience m'a conforté dans l'idée qu'une bonne architecture doit avant tout faciliter l'évolution du produit.

Arch devenir problématique ?

J'ai appris avec l'expérience qu'une architecture dégradée se remarque souvent dans la vitesse de livraison avant même qu'elle ne soit visible dans le code.

Par exemple lorsque plusieurs développeurs hésitent régulièrement sur l'endroit où implémenter une fonctionnalité, lorsque les revues de code deviennent compliquées ou lorsqu'une simple évolution nécessite des modifications dans de nombreux fichiers.

J'observe également les indicateurs techniques.

Une augmentation du temps de build, des tests instables, une difficulté croissante à refactoriser ou encore des dépendances circulaires sont souvent des symptômes d'un problème plus profond.

Vision de la dette technique

Je considère la dette technique comme un investissement, pas comme une erreur.

Comme une dette financière, elle peut être utile lorsqu'elle est maîtrisée.

Par exemple, lorsqu'un produit démarre, il peut être pertinent de privilégier la rapidité d'exécution pour valider un besoin métier.

En revanche, la dette devient dangereuse lorsqu'elle n'est plus visible ou lorsqu'elle ralentit durablement l'équipe.

Dans plusieurs missions, j'ai toujours essayé d'intégrer le remboursement de la dette dans les développements courants plutôt que de demander plusieurs mois de refonte.

Je préfère améliorer progressivement les zones sur lesquelles nous travaillons déjà plutôt que lancer un grand chantier dont le retour sur investissement est souvent difficile à démontrer.

Revue de code

Pour moi, une revue de code ne consiste pas uniquement à vérifier si le code fonctionne. Je regarde plusieurs dimensions. Je vérifie d'abord que la solution répond bien au besoin métier. Ensuite je m'intéresse à la lisibilité du code.

Je me pose souvent la question suivante :

si un développeur rejoint l'équipe dans six mois, comprendra-t-il rapidement ce code ?

Je regarde également les impacts potentiels sur la performance, la sécurité, les tests et l'accessibilité.

Enfin, je fais attention à la manière dont je formule mes retours.

L'objectif n'est pas de critiquer le développeur mais d'améliorer collectivement la qualité du produit.

Désaccords techniques équipe

J'essaie d'éviter les débats basés sur les préférences personnelles.

  • Je prĂ©fère revenir aux faits.
  • Quels sont les objectifs ?
  • Quelles sont les contraintes ?
  • Quels sont les impacts Ă  court et long terme ?

Par exemple, si deux solutions sont proposées, je vais comparer leur coût de maintenance, leur complexité, leur impact sur les performances et leur facilité d'évolution.

Lorsque c'est possible, je privilégie également les expérimentations.

Un petit prototype ou une preuve de concept permet souvent de prendre une décision plus sereinement qu'un long débat théorique.

Amélioration technique à la valeur utilisateur

Je pars toujours d'un indicateur métier. Par exemple chez OUIGO :

si une page de paiement passe de 4 secondes à 2 secondes, techniquement c'est intéressant.

Mais la vraie question est : est-ce que le taux de conversion augmente ?

Pour répondre à cela je compare : avant optimisation :

  • temps de chargement
  • taux d'abandon
  • taux de conversion

après optimisation :

  • mĂŞmes indicateurs

Je pense qu'un développeur doit relier la technique aux métriques métier.

Un gain de 500 ms qui ne change rien aux usages a moins de valeur qu'une amélioration qui réduit l'abandon de panier.

Anomalie complexe que vous avez résolue récemment.

Un exemple récent concerne le parcours IRS chez OUIGO.

Lors de la recherche d'un établissement scolaire via le champ "Code postal ou commune", certaines communes comme Paris ou Cergy ne retournaient aucun établissement.

Au début cela ressemblait à un problème API.

J'ai commencé par analyser :

  • donnĂ©es envoyĂ©es par le front
  • payload rĂ©seau
  • comportement API

J'ai découvert que pour certaines communes possédant plusieurs codes postaux, nous envoyions le code postal à la place du code INSEE.

Exemple :

Cergy :

  • code postal : 95000
  • code INSEE : 95127

L'API attendait :

townInseeCode=95127

mais nous envoyions :

townInseeCode=95000

Le résultat était une liste vide.

j'ai corrigé la construction de l'objet commune pour toujours conserver le code INSEE.

Cette correction a résolu l'ensemble des communes concernées.

Ce que j'aime dans cet exemple c'est qu'il fallait comprendre :

  • le mĂ©tier
  • la donnĂ©e
  • l'API
  • le front

et pas uniquement corriger une ligne de code.

Rejoindre notre équipe ?

Trois raisons principales.

La première est la forte culture produit.

J'apprécie particulièrement le fait que les développeurs participent à la réflexion UX et s'appuient sur les données réelles utilisateurs pour prendre des décisions.

La deuxième est l'importance accordée à l'accessibilité.

Dans mes expériences chez OUIGO, Junior & Cie et Nexity, j'ai souvent travaillé sur ces sujets et je considère que l'accessibilité fait partie intégrante de la qualité logicielle.

Enfin, le poste correspond parfaitement Ă  mon expertise.

Depuis plusieurs années je travaille quotidiennement avec React, Next.js, GraphQL, TypeScript, CI/CD, tests automatisés et amélioration continue de la qualité.

Je pense pouvoir apporter autant sur la partie technique que sur la réflexion produit et la performance utilisateur.

Next.js 15 oĂą 90% des composants sont en "use client"

Je ne commence pas par réécrire le projet.

Je mesure d'abord :

  • taille bundle
  • LCP
  • INP
  • temps d'hydratation

Ensuite j'identifie les composants réellement interactifs.

Puis je migre progressivement : client -> server -> client

L'objectif n'est pas d'avoir 100% de Server Components.

L'objectif est d'envoyer le moins de JavaScript possible pour offrir la meilleure expérience utilisateur.

C'est exactement l'approche que j'adopterais sur votre projet, en m'appuyant sur les métriques réelles issues de Datadog RUM pour mesurer l'impact de chaque optimisation.

Projet dont vous êtes particulièrement fier

Le projet dont je suis le plus fier est probablement Junior & Cie chez SNCF.

La raison n'est pas uniquement technique. Ce projet m'a permis d'intervenir sur plusieurs dimensions : architecture, qualité, accessibilité, SEO et expérience utilisateur.

Le contexte était une refonte de l'application en Next.js 14 et Node.js. L'objectif était de moderniser l'application, réduire la dette technique et améliorer les performances tout en conservant les règles métier complexes liées au transport de mineurs.

J'ai participé à la conception de l'architecture front, à la mise en place de Storybook, à la stratégie de tests, à l'amélioration de l'accessibilité et aux choix autour du SSR et de l'ISR.

Ce qui me rend particulièrement fier, c'est que nous n'avons pas seulement livré des fonctionnalités. Nous avons construit une base technique plus robuste qui permet aujourd'hui de faire évoluer le produit plus rapidement.