
Portail de commandes B2B
Sortir les commandes d'un Excel interne pour en ouvrir la saisie aux clients.
Lead technique
- React
- TypeScript
- NestJS
- MySQL
- TypeORM
- TanStack Query
- Azure
- commandes par campagne
- 1 000+
- utilisateurs
- ~100
- jusqu'à la v1.0
- 5 mois
Le contexte
- L'équipe interne gère seule les engagements de campagne, les commandes et le planning de livraison, dans Excel.
- Ses données commerciales vivent déjà dans un ERP, qu'il n'est pas question de remplacer.
- Le portail ouvre la saisie à plus de cent clients, qui n'accèdent qu'à leurs propres données.
Ma mission
- Choix de la stack et conception des besoins d'infrastructure sur Azure.
- Rédaction du dossier d'architecture technique.
- Implémentation de l'intégralité du backend.
- Chaîne de livraison sur Azure DevOps : build, quality gate SonarQube et absence de vulnérabilité critique conditionnent le déploiement.
- Encadrement du développeur frontend et définition des conventions communes aux deux applications.
- Interlocuteur technique du client : alignement des spécifications et chiffrage des évolutions.
Décisions et arbitrages
- 01
Livrer par incréments plutôt qu'en une fois
ProblèmeLe client attend un produit abouti et fait évoluer ses demandes en continu, pendant que la synchronisation ERP prend du retard.
SolutionRedécoupage du backlog pour mettre en production les fonctionnalités déjà prêtes.
Pourquoi ce choixLes demandes ne se stabilisent qu'à partir du moment où le client utilise le produit.
- 02
Développer la synchronisation avant l'API
ProblèmeL'API de l'équipe ERP arrive avec deux mois de retard. La synchronisation en dépend, avec sa logique de transaction et de résolution des conflits.
SolutionDéveloppement et tests contre le contrat d'interface, avec des jeux de données produits pour l'occasion. La fonctionnalité reste désactivée en production jusqu'à la livraison de l'API.
Pourquoi ce choixLe contrat est disponible et figé. Attendre immobilise la partie la plus complexe du backend sur une dépendance externe.
- 03
Une reprise pilotée plutôt qu'automatique
ProblèmeLa synchronisation échoue de deux façons : la récupération des données depuis l'ERP, et l'envoi vers l'ERP qui expire quand celui-ci met trop de temps à répondre.
SolutionEn entrée, aucun retry automatique : l'administrateur voit le statut par catégorie et relance seulement celle qui a échoué. En sortie, une icône signale l'échec et une file interne rejoue une fois les envois expirés.
Pourquoi ce choixL'administrateur relance quand il a besoin de données à jour, là où un retry aveugle resynchroniserait sans qu'on l'ait demandé. Sur les envois, un seul rejeu absorbe environ 90 % des erreurs rencontrées.
- 04
Écarter Next.js au profit d'un backend autonome
ProblèmeL'équipe maintient du Go, du C# et du JavaScript. Le choix doit rester tenable par elle sur la durée. Next.js est proposé pour couvrir le front et le back d'un seul tenant.
SolutionFront React séparé, backend NestJS autonome.
Pourquoi ce choixLa synchronisation ERP repose sur un cron porté par l'application, et une évolution prévue demande des websockets tenus dans la même instance. Le modèle d'exécution de Next.js suppose des requêtes ponctuelles, pas ce type de traitement continu. Un backend autonome rend ce cycle de vie explicite, sans dépendre des contraintes d'une plateforme d'hébergement.
- 05
Une architecture identique sur les deux applications
ProblèmeDeux applications pour un même produit, développées par des personnes différentes.
SolutionMême découpage en tranches fonctionnelles des deux côtés. Côté front, cela revient à sortir la logique des composants dans des hooks et à confier l'état serveur à React Query.
Pourquoi ce choixLe périmètre métier se lit dans l'arborescence, et un développeur passe d'une application à l'autre sans se réorienter. Le coût tient dans une montée en compétences du développeur front, sur des pratiques React courantes.
Ce que ce projet m'a apporté
- Encadrement technique d'un développeur sur un projet client, après plusieurs projets internes.
- Recadrage de la méthode de livraison : passage du déroulé en cascade attendu à des livraisons courtes et incrémentales, face à un besoin mal défini et des requirements mouvants.
- Gestion d'une dépendance externe bloquante, l'API de l'équipe ERP étant arrivée tard et ayant décalé le planning.
- Reprise d'un projet chiffré par un tiers, avec l'écart entre l'estimation initiale et le besoin réel.
- Rédaction de documentation d'architecture à un niveau au-dessus du code.
- Chiffrage des évolutions, qui impose d'évaluer l'impact de chaque demande sur l'ensemble du projet.
Avec le recul
- Mettre en place une première chaîne de déploiement et une tranche fonctionnelle minimale dès le démarrage, afin de confronter rapidement le produit à son environnement réel.
- Passer par une séance de maquettage interactif avec un client pour capter le besoin avant le cadrage, plutôt que sur spécification.