Portfolio

Cette page regroupe les projets que nous sommes fiers d'avoir réalisé. Tous sont indiqués, mais si vous êtes pressé, nous vous proposons une sélection parfaitement subjective.

Pour illustrer notre activité, nous avons choisi OxaControle notre plus vieux projet encore maintenu et installé, préexistant même à l'Atelier, la reprise de Magview pour le groupe Madic, celle du logiciel de gestion de dons pour l'IFP et le refactoring stratégique de Momentum pour Fifty, afin de représenter notre savoir-faire.

Cette liste va évoluer, elle est notre vitrine et sera mise à jour lorsque nous aurons achevé de nouveaux projets.

Pour des raisons de confidentialité, les missions ne sont souvent mises en ligne qu'après leur achèvement.
🔗
Fifty - Décembre 2025 - Avril 2026 - Paris & Distanciel

Industrialisation de Momentum, un coach IA pour managers développé comme une excroissance de la codebase historique de Fifty. Séparation du nouveau produit par slicing, création de ses environnements AWS et de sa chaîne CI/CD.

Intégration de LLM, Text to Speech, Speech to Text, Voice Activity Detection et communication temps réel. Développement d'un VAD adapté au produit à partir du réseau de neurones Silero et orchestration de plusieurs agents IA.

La mission a accompagné le produit de son prototype interne à une bêta fonctionnelle utilisée par une soixantaine de bêta-testeurs, tout en conservant la vélocité nécessaire à un produit encore en recherche de son marché.

Un produit caché dans un autre

Momentum est un coach IA destiné aux managers. Il permet aussi bien des échanges écrits que des conversations vocales avec des agents IA jouant le rôle d'un collaborateur direct du manager.

Lorsque j'arrive sur le projet, Momentum existe sous la forme d'un prototype interne développé au sein de la codebase historique de Fifty. Le fondateur pense que le nouveau produit pourra réutiliser une grande quantité de code existant.

En pratique, les deux produits ont très peu de code réellement commun. Cette situation commence à peser sur la vélocité de l'équipe : faire évoluer Momentum implique de travailler dans une application qui n'a pas été conçue pour lui.

Découper sans tout casser

La première étape consiste donc à sortir Momentum de cette codebase sans altérer le produit historique.

Je pars d'une copie du repository, qui reste temporairement liée à l'original. J'identifie ensuite les points d'entrée utilisés par le nouveau produit et remonte les dépendances nécessaires à leur fonctionnement.

Le code qui n'est plus atteignable depuis ces points d'entrée peut alors être progressivement supprimé. Cette technique de slicing, issue de travaux de recherche des années 1990 mais rarement utilisée dans l'industrie, permet de réduire le projet à ce qui lui appartient réellement.

Le résultat est particulièrement révélateur : environ 90 % du code initial n'appartient qu'à l'ancien produit.

L'opération demande de la méthode et de la prudence. Une dépendance inattendue peut rendre une suppression dangereuse et nécessiter un retour arrière. Après environ un mois, Momentum dispose finalement de son propre dépôt, débarrassé du code qui n'était pas nécessaire à son fonctionnement.

Industrialiser un prototype

Le produit reste alors un prototype qui se cherche encore. Les fonctionnalités évoluent rapidement au gré des retours des premiers utilisateurs. L'objectif n'est donc pas de construire immédiatement une architecture figée et surdimensionnée, mais de donner à l'équipe les moyens de livrer et d'expérimenter.

Je construis les environnements de production et de préproduction sur AWS et la chaîne CI/CD.

Le principe est celui du You build it, you run it : Le produit peut alors être déployé indépendamment de l'application historique.

Dans cette phase, l'effort porte en priorité sur les fonctionnalités et les retours utilisateurs. Le produit évolue encore rapidement : l'enjeu est de conserver une architecture suffisamment souple pour intégrer ces apprentissages sans multiplier prématurément les contraintes. Les investissements de qualité sont renforcés progressivement à mesure que le produit se stabilise.

Faire fonctionner la voix en temps réel

La partie la plus exigeante techniquement concerne la conversation vocale. Momentum combine plusieurs technologies qui doivent fonctionner ensemble en temps réel : Speech to Text, Text to Speech, Voice Activity Detection, communication temps réel et modèles de langage.

J'ai intégré l'ensemble de cette chaîne au produit. Pour la détection d'activité vocale, j'ai notamment développé un algorithme adapté au besoin à partir du réseau de neurones Silero.

Le système ne se limite pas non plus à un appel isolé à un LLM. Plusieurs agents sont orchestrés : certains surveillent d'autres agents, certains gèrent les outils à leur disposition et d'autres interviennent pour reformuler ou traiter les réponses.

La difficulté vient surtout de leur faire fonctionner ensemble. Latence, interruptions, détection de la parole, génération et restitution audio doivent s'enchaîner suffisamment rapidement pour que la conversation reste naturelle.

Deux mois ont été consacrés à fiabiliser cette chaîne et à en améliorer les performances. C'est le principal défi technique de la mission.

La qualité au bon moment

Une fois les premiers utilisateurs embarqués, le contexte évolue. Le produit compte alors environ soixante bêta-testeurs et commence à se rapprocher d'une véritable bêta fonctionnelle.

Il devient alors pertinent d'investir davantage dans la qualité. J'interviens avec le reste de l'équipe sur l'ajout de tests fonctionnels, le remaniement de l'architecture et la fiabilisation de la chaîne CI/CD.

L'objectif n'est pas de revenir sur les choix faits pendant la phase de découverte du produit. Il s'agit de transformer progressivement un prototype qui devait pouvoir changer rapidement en un logiciel capable de continuer à évoluer sans perdre cette vélocité.

Cette approche permet de différer volontairement certains investissements tant qu'ils ne créent pas de valeur, puis de les introduire lorsque le produit commence à se stabiliser.

Du prototype à la bêta

En cinq mois, Momentum passe d'un prototype interne enfoui dans la codebase historique de Fifty à un produit indépendant, disposant de ses propres environnements, de sa chaîne de déploiement et d'une soixantaine de bêta-testeurs.

À mon départ, le produit est une bêta fonctionnelle. La remontée de la qualité logicielle est en cours : les tests, l'architecture et les derniers points techniques sont progressivement renforcés.

Préserver la vélocité

Cette mission illustre une autre facette de mon travail. Toutes les situations ne nécessitent pas immédiatement le même niveau de formalisme.

Sur un produit qui cherche encore son marché, la capacité à expérimenter et pivoter peut être plus importante que l'accumulation de tests et de documentation. Mais lorsque le produit commence à trouver ses utilisateurs, les exigences changent : il faut alors transformer cette vitesse d'apprentissage en capacité durable à évoluer.

Mon objectif n'est pas de ralentir une équipe pour rendre son code parfait. C'est de lui permettre de rester agile sans que la dette technique finisse par lui retirer cette agilité.

🔗
Betclic - Juin 2025 - Septembre 2025 - Bordeaux

Mission à temps plein, au sein de l'équipe Turf (paris hippiques) de Betclic. L'équipe travaille en Scrum, avec une stack .NET.

🔗
Madic - Janvier 2025 - Juin 2025 - St André de Cubzac

Réinternalisation d’un ensemble de plus de 5 millions de lignes de code .NET, développé et maintenu pendant des années par une ESN. L’architecture présentait une complexité largement supérieure aux besoins identifiés et l’entreprise envisageait une réécriture complète en Python.

Audit du système et accompagnement de l’équipe interne. Démonstration que le problème n’était pas la technologie mais une complexité largement disproportionnée par rapport aux besoins : 45 % du code d’une partie témoin pouvait être supprimé à fonctionnalités équivalentes. Reprise progressive de la maîtrise technique, amélioration des performances et mise en place de pratiques de tests plus efficaces.

Réinternaliser un monstre

Madic venait de reprendre en interne une application développée par une ESN pendant plusieurs années. L’objectif était de permettre à l’équipe interne de retrouver progressivement la maîtrise technique du système et de pouvoir en assurer directement l’évolution.

Le système représentait un actif logiciel considérable : plus de 5 millions de lignes de code réparties sur plus de huit solutions .NET. Les versions utilisées étaient récentes et l’ensemble pouvait, au premier regard, donner l’impression d’un système moderne et maîtrisé.

L’entreprise envisageait pourtant de repartir de zéro, en Python. Lorsque je cherche à comprendre les motivations de ce choix, aucune contrainte technique précise ne justifie alors le changement de technologie. Le projet semble surtout motivé par la volonté de repartir sur une base perçue comme plus moderne.

Mon rôle initial est celui d’un expert .NET capable également d’intervenir en Python. Je considère cependant dès le départ qu’une réécriture serait prématurée : l’entreprise possède déjà un actif .NET important, le logiciel fonctionne et rien ne démontre que le langage constitue le problème.

Deux semaines pour comprendre le problème

Je réalise un audit de deux semaines portant sur le code, l’architecture, les bases de données, les performances SQL et Entity Framework, les tests, les dépendances, la chaîne de développement et les pratiques de l’équipe.

Le constat est plus sévère que prévu.

L’application présente un niveau d’abstraction particulièrement élevé. Les mêmes mécanismes sont répétés à grande échelle, parfois avec une abstraction ne possédant qu’un seul type concret. Plusieurs pans du code présentent ainsi une complexité qui ne semble pas justifiée par les besoins fonctionnels identifiés.

Le système possède par ailleurs plusieurs milliers de tests unitaires et affiche environ 95 % de couverture de code. Pourtant, aucun test d’acceptation ou end-to-end ne protège le comportement global de l’application.

Un passage en mutation testing permet de mesurer la différence entre quantité de tests et efficacité réelle : avec 95 % de couverture, seuls environ 20 % des mutants sont détectés.

La couverture est élevée, mais la capacité des tests à détecter une régression est faible.

Le problème n'est pas .NET

Je rédige un rapport d’audit d’environ 50 pages à destination du chef de projet et de sa hiérarchie. Les problèmes sont classés selon leur gravité et leur fréquence afin de distinguer les risques réels de la simple dette technique.

La conclusion est simple : il n’est pas nécessaire de réécrire le logiciel.

Le système fonctionne et sa dette provient principalement d’une complexité excessive. Une réécriture aurait supprimé une partie de cette complexité, mais au prix de la réimplémentation de millions de lignes et surtout de la reconstruction de la connaissance métier accumulée dans l’existant.

La recommandation est donc de conserver le système, de réduire progressivement sa complexité et de renforcer l’équipe interne afin qu’elle puisse en reprendre la maîtrise technique. Un accompagnement ponctuel peut compléter cette montée en compétence, mais la connaissance du legacy doit progressivement rester au sein de l’organisation.

Mesurer la complexité plutôt que la subir

Une partie représentative du projet est utilisée comme terrain d’expérimentation. En conservant les mêmes fonctionnalités, environ 45 % du code peut être supprimé.

Cette expérience permet de rendre concrète une dette qui était jusque-là difficile à appréhender : une part importante de la complexité du système n’apporte aucune valeur métier.

Le travail porte également sur les performances de la base de données et d’Entity Framework, qui sont améliorées au cours de la mission.

Une culture de la simplicité est progressivement introduite dans l’équipe : préférer le code simple à l’abstraction prématurée, remettre en question les couches inutiles et appliquer le principe KISS lorsque le métier ne justifie pas davantage de complexité.

Reprendre le contrôle du legacy

L’équipe interne est de taille réduite au regard de la complexité et de la taille du système. L’accompagnement doit donc permettre de renforcer progressivement son autonomie technique.

Je les accompagne pendant sept mois dans la reprise du projet, avec un objectif qui dépasse la simple résolution de problèmes techniques : transmettre les pratiques nécessaires pour travailler efficacement avec un legacy et tester les évolutions apportées au système.

Les tests des nouvelles fonctionnalités sont réécrits selon une approche beaucoup plus exigeante. Leur score de mutation dépasse alors 80 %. Le temps disponible ne permet cependant pas de reprendre l’ensemble de l’historique du projet.

Le responsable de l’équipe apporte de son côté une connaissance métier approfondie. Ce binôme entre connaissance fonctionnelle et expertise technique permet de distinguer les contraintes réellement nécessaires des complexités héritées du système.

L'équipe interne reprend le projet

À l’issue des sept mois d’accompagnement, l’équipe interne a repris progressivement la responsabilité du logiciel.

La poursuite de la simplification et de la modernisation s’effectue progressivement, au rythme des priorités du projet.

L’équipe dispose désormais des connaissances et des pratiques nécessaires pour comprendre, tester et faire évoluer directement son application.

Ce que cette reprise a réellement changé

Le projet n’avait finalement pas besoin d’un changement de langage. Il avait besoin de moins de complexité, de meilleurs tests et d’une équipe capable de comprendre ce qu’elle maintenait.

L’intervention a permis d’éviter une réécriture sans justification technique, de permettre à l’équipe interne de reprendre la maîtrise du logiciel et de poser les bases d’un pôle de développement interne.

Un legacy n’est pas forcément un vieux logiciel. Parfois, c’est un logiciel récent rendu inutilement compliqué par les années de développement.

🔗
Sparks Formation - 5 sessions entre juin 2022 et novembre 2024 - Région AURA & Distanciel

C'est grâce à Sparks que je suis entré dans le monde de la formation professionnelle. J'ai réalisé 5 formations depuis juin 2022 :

  • Clean Code, à Lyon pour une grande entreprise industrielle.
  • Tendances IT, une introduction au monde du développement pour un futur DSI d'assurance.
  • Legacy Code, en distanciel pour un grand groupe bancaire.
  • Domain Driven Design côté Dev, à Valence pour une PME éditrice de logiciels.
  • Domain Driven Design & Event Storming, à Villeurbanne pour un grand groupe ferroviaire.

Ces formations mêlent théorie et pratique et d'adressent pour la plupart aux praticiens. Elles s'appuient autant sur l'état de l'art que sur la recherche académique et sont personnalisées pour l'entreprise qui les commande.

EDUP Externalisation au forfait

🔗
EDUP - Juillet 2024 - Novembre 2025 - Distanciel

EDUP fournit des solutions logicielles aux acteurs de la formation.
Notre collaboration a porté sur deux missions.

  • L'achèvement d'un script JS de transfert de données entre 2 API, puis sa mise en ligne (paramétrage serveur, création d'un pipeline de CI/CD). Ce script fut refondu intégralement en TypeScript dans un second temps, puis intégralement testé. Aujourd'hui il est régulièrement étendu pour prendre en compte de nouveaux scénarios.
  • Le développement d'un outil automatisant la transmission des documents entre les CFA et les OPCO qui les financent, en ayant très peu d'informations sur les use case finaux et une documentation parcellaire. Ce fut un excellent moyen de pratiquer le développement piloté par les tests et de prouver sa pertinence pour éclairer la voie et sécuriser le savoir acquis, itérativement. Le projet est en PHP/PEst.

Ces deux projets sont supportés par un pipeline d'intégration continue basé sur Teamcity, permettant de rapidement déployer le travail effectué, sans étapes manuelles.

OxaControle Notre plus ancien projet encore développé

🔗
Laurent Frapier Entreprises - Décembre 2018 - Présent - Nouvelle Aquitaine

Reprise d’un projet de contrôle d’accès datant de 2013, réalisé avec Projects Partners en alternance. Maintenance des sites installés précédemment et installation de nouveaux chantiers. Changement d’échelle en 2020 avec un site de 83 portes, 95 lecteurs et plus de 400 badges, nécessitant une refonte de l’architecture logicielle et matérielle.

Migration de Mono vers .NET Core puis .NET 8, refactoring du code historique, séparation du moteur de règles d’accès et des contrôleurs matériels, et renforcement progressif des tests. Le projet est aujourd’hui en production sur des sites allant du petit bâtiment au grand centre aquatique.

Un projet d'alternance

L’histoire commence en 2013, alors que je suis développeur en alternance chez Projects Partners. Un électricien a besoin d’une solution de contrôle d’accès par badge afin de pouvoir répondre à un important marché public. Le besoin est inhabituel pour son entreprise : il connaît l’électricité, mais pas le développement logiciel.

Le projet est confié à Projects Partners. Je le développe seul, accompagné par mon responsable, avec un objectif simple : proposer une solution fiable et peu coûteuse pour de petits bâtiments comportant quelques portes, lecteurs et badges.

La solution repose alors sur des Raspberry Pi, .NET via Mono et des lecteurs communiquant en RS485. Le Raspberry Pi offre suffisamment de puissance pour les petits sites tout en conservant un coût matériel très faible.

Le principal défi était alors de faire fonctionner .NET sous Linux : .NET Core n’existait pas encore et Mono constituait la solution disponible. Le Raspberry Pi ne produisant pas directement de signaux RS485, il a également fallu expérimenter avec différents convertisseurs et une configuration inhabituelle du bus afin d’obtenir le fonctionnement recherché.

Les choix matériels et logiciels sont alors dictés autant par les contraintes techniques que par la nécessité de conserver une solution peu coûteuse. Après plusieurs essais, la solution est déployée sur plusieurs petits sites où elle fonctionne pendant plusieurs années avec très peu d’interventions.

Cinq ans plus tard, le changement d’échelle

Je quitte le projet en 2015 à la fin de mes études. Il continue ensuite à évoluer avec un autre développeur.

En 2020, je reviens comme indépendant. Le client vient de décrocher un chantier d’une toute autre dimension : 83 portes, 95 lecteurs et plus de 400 badges. Une architecture conçue pour quelques portes et quelques lecteurs doit désormais gérer un site d’une ampleur sans commune mesure avec les premiers déploiements.

Le retour sur le projet est aussi un retour sur mon propre code. Entre-temps, quatre années et demie d’expérience en ESN m’ont permis de voir suffisamment de systèmes complexes pour mesurer les limites de mes choix d’étudiant.

Je retrouve un code dont la conception métier reste étonnamment familière : les portes, les lecteurs, les règles d’accès et les différents états du système sont toujours organisés selon la même logique. En revanche, certains choix techniques ont mal vieilli.

Refondre sans perdre le métier

La couche d’accès aux données repose sur des antipatterns et un orienté-objet trop intégriste, tandis que Mono est progressivement remplacé par .NET natif sous Linux. Je profite de cette migration pour nettoyer le code, supprimer les abstractions devenues inutiles et revoir en profondeur l’architecture.

L’évolution majeure consiste à séparer le moteur des règles d’accès de la gestion du matériel. Les Raspberry Pi ne portent plus l’ensemble de la logique applicative : ils deviennent des contrôleurs capables d’interroger une grappe de lecteurs et d’exécuter les décisions qui leur sont transmises.

Le même logiciel peut néanmoins toujours être utilisé sur un petit bâtiment, avec un Raspberry Pi capable de tout gérer seul. L’architecture évolue donc sans abandonner le cas d’usage initial.

La migration vers .NET Core, puis .NET 6 et aujourd’hui .NET 8, accompagne cette refonte sans réécriture fonctionnelle massive. Le comportement métier est conservé autant que possible pendant que le socle technique est profondément assaini.

Corriger aussi ses propres erreurs

Le projet comporte environ 400 tests unitaires hérités de sa première version. Ils traduisent une conviction que j’avais alors : les tests unitaires suffiraient à sécuriser le logiciel.

Avec le recul, je constate leurs limites. Ils ne couvrent pas l’ensemble de la chaîne et aucun test end-to-end ou d’acceptation ne protège réellement le fonctionnement global du système.

La reprise permet donc d’introduire progressivement une autre approche. Le nouveau code est développé avec les tests comme outil de conception et de validation, tandis que le code historique est progressivement renforcé par des tests adaptés.

L’objectif n’est pas de réécrire le passé pour le rendre conforme aux pratiques actuelles, mais de construire suffisamment de sécurité autour de l’existant pour pouvoir continuer à le faire évoluer.

Un système qui finit par se faire oublier

La première année d’exploitation du nouveau système est consacrée au déverminage. Chaque défaillance donne lieu à une analyse des causes racines et à une remédiation, afin d’éviter de simplement corriger le symptôme.

La stabilisation porte ses fruits : les interventions d'exploitation sont désormais exceptionnelles.

OxaControle est aujourd’hui utilisé sur des installations allant du petit bâtiment au grand centre aquatique. Le même code source peut être déployé selon la taille du site, depuis un Raspberry Pi autonome jusqu’à une architecture répartissant le traitement sur plusieurs contrôleurs.

Le projet continue d’évoluer à la demande des clients, avec notamment de nouvelles fonctionnalités développées selon les pratiques de test actuelles.

Dix ans plus tard

OxaControle est probablement le projet qui m’a le plus appris sur le legacy.

J’ai pu revenir sur un logiciel que j’avais conçu étudiant, retrouver intacte la connaissance du métier et constater directement quelles décisions avaient bien vieilli et lesquelles méritaient d’être abandonnées.

Le code a changé, l’architecture a changé, les technologies ont changé. Mais le métier est resté. C’est cette continuité qui permet de moderniser un système sans perdre ce qu’il a accumulé au fil des années.

Mon intérêt pour le legacy et la maintenance à long terme vient en grande partie de là : un logiciel n’a pas besoin d’être remplacé simplement parce qu’il vieillit. Il faut parfois plusieurs années pour apprendre comment le faire durer.

🔗
Institut de formation politique - Janvier 2020 - Présent - Paris

Reprise d’une application PHP/Laravel critique d’environ 100 000 lignes de code, sans aucun test et dont le développeur historique avait quitté le projet. L’application reposait sur PHP 7 et Laravel 5, présentait des vulnérabilités critiques, des traitements automatiques défaillants et de graves problèmes de performances.

Sécurisation et stabilisation de l’existant, puis mise en place d’une stratégie de modernisation progressive plutôt qu’une réécriture risquée. Le projet est toujours en production et fait aujourd’hui l’objet d’une maintenance ponctuelle.

Une application critique devenue intouchable

L’IFP dispose d’une application métier développée sur mesure pour gérer ses campagnes de dons. Livrée en 2015 avec Laravel 5, elle avait été maintenue pendant plusieurs années avant de devenir progressivement difficile à faire évoluer.

Le problème est alors classique : l’application fait environ 100 000 lignes de code, mais ne dispose d’aucun test automatisé. Après plusieurs années d’évolution, il est devenu difficile de distinguer les comportements intentionnels des effets de bord ou des contraintes métier accumulées au fil du temps.

Au fil des années, les mises à jour et les évolutions ont donc été réduites au minimum. L’application repose toujours sur PHP 7 et Laravel 5 et accumule les problèmes : traitements automatiques défaillants, problèmes de performances et plusieurs dizaines de bugs plus ou moins gênants.

La situation était particulièrement sensible : cette application joue un rôle important dans le fonctionnement de l’IFP. Sa disponibilité constituait donc un enjeu important pour l’organisation.

Reprendre un système que je ne connaissais pas

Lorsque l’IFP fait appel à moi en janvier 2020, je possède une ancienne expérience de PHP acquise lors de stages, une dizaine d’années auparavant, mais aucune expérience de Laravel.

Le client me connaît cependant par l’intermédiaire d’un réseau commun et sait que je commence alors à me spécialiser dans la reprise de systèmes existants. Cette confiance permet de commencer directement par le problème plutôt que par la technologie.

En une semaine, je deviens suffisamment opérationnel pour comprendre le fonctionnement général de l’application et intervenir dessus. Le premier mois est consacré à éteindre les incendies sans en provoquer de nouveaux.

Les bugs sont corrigés un par un, avec prudence, en tenant compte de l’absence totale de tests. Les traitements automatiques défaillants sont remis en état, notamment ceux qui intervenaient dans les processus financiers de l’organisation.

La sécurité constitue également une priorité immédiate. L’application présente plusieurs vulnérabilités nécessitant une intervention rapide. Avant d’engager une opération de modernisation, la priorité est donc de réduire son exposition et de renforcer sa sécurité.

Cette première phase n’a pas pour objectif de rendre le logiciel moderne. Elle vise simplement à faire en sorte que l’outil puisse continuer à faire son travail sans mettre l’organisation en danger.

Ne pas réécrire pour le plaisir de réécrire

Une fois les urgences maîtrisées, la question de la mise à niveau de l’application se pose naturellement. Une réécriture complète est alors chiffrée à plusieurs dizaines de milliers d’euros, mais son coût et son niveau de risque rendent cette approche difficile à justifier dans l’immédiat.

Une mise à niveau directe du legacy aurait cependant nécessité de modifier un système d’environ 100 000 lignes de code sans aucun filet de sécurité. Sans tests et avec une connaissance incomplète des comportements historiques de l’application, une telle opération aurait transformé un problème de maintenabilité en risque de régression généralisée.

La stratégie retenue est donc différente : conserver l’existant suffisamment longtemps pour continuer à faire fonctionner le métier, tout en construisant une voie de sortie progressive.

Le projet est assaini et intégré à un pipeline d’intégration continue. Cette nouvelle capacité permet notamment de réutiliser proprement l’application pour un autre projet.

Un rapport sur l’état du système est également produit afin de donner au client une vision claire de la dette technique et du coût réel d’une remise à niveau.

Construire à côté plutôt que casser l'existant

Stratégie de migration progressive entre l'ancien et le nouveau système

Lorsqu’un nouveau besoin apparaît après deux années de maintenance, il fournit l’occasion de construire une nouvelle base technique plutôt que d’ajouter une nouvelle couche de complexité à l’ancien système.

Un nouveau projet Laravel est créé avec une approche test-first (TDD), une intégration continue et un déploiement automatisé. Une variante du Strangler Fig Pattern est utilisée : Apache sert de routeur entre les deux applications. Lorsqu’une fonctionnalité existe dans le nouveau système, elle est servie par celui-ci ; sinon, la requête continue d’être traitée par le legacy.

Cette approche permet de migrer une fonctionnalité à la fois, sans imposer de réécriture globale ni interrompre le fonctionnement de l’application historique.

Une première fonctionnalité est ainsi extraite du legacy et reconstruite sur la nouvelle base.

Le risque est maîtrisé, la décision appartient au client

La modernisation complète n’a finalement pas été engagée : une fois le danger immédiat écarté, le client a choisi de conserver l’existant et de limiter la migration aux évolutions présentant un bénéfice suffisant.

Ce choix est cohérent avec l’objectif initial : l’application continue de fonctionner et peut être maintenue sans imposer immédiatement une réécriture représentant plusieurs dizaines de milliers d’euros.

La nouvelle architecture reste néanmoins une voie de sortie disponible si les priorités du client évoluent. La transformation n’est donc pas devenue une fin en soi : elle pourra reprendre lorsque le besoin métier le justifiera.

Six ans plus tard

L’application est toujours utilisée par l’organisation. Depuis 2020, j’interviens ponctuellement pour assurer sa maintenance et répondre aux besoins du client.

La relation a donc évolué d’une reprise urgente d’un système complexe vers une maintenance ponctuelle et durable. Je reste disponible lorsque le client en a besoin, sans chercher à imposer une modernisation ou un volume de prestation qui ne correspond pas à ses priorités.

Le projet illustre finalement une approche assez simple du legacy : sécuriser d’abord, comprendre ensuite, puis transformer uniquement lorsque le bénéfice justifie le risque et le coût.

🔗
Captronic - 4 sessions entre février 2023 et juin 2024 - Bordeaux

Formation TDD sur 3 jours auprès d'un public de développeurs, majoritairement dans l'embarqué. TDD est abordé sur des projets neufs ainsi que sur du Code Legacy.

La formation est partie du B-A-BA des tests pour cheminer jusqu'au plus complexe : introduire des tests sur un code qui n'en a jamais connu. Nous avons suivi un fil rouge afin d'apprendre le recueil du besoin piloté par les tests.

Les tests fonctionnels sont à l'honneur, mais nous abordons également les tests d'intégration, les tests unitaires ou encore les tests de vulnérabilité.

Beaucoup de clients ont des composants de bas-niveau pour ne pas dire du hardware. Nous évoquons les Fakes, véritables jumeaux numériques, utilisés pour garder la célérité des tests sur la machine du developpement, ainsi que les stratégies permettant de tester avec du vrai matériel en intégration continue.

🔗
YNOV - Printemps 2022 - Présent - Lyon, Nantes & Bordeaux

Modules de 30h à 80h destiné à des M1&M2 en développement.

  • Dev Logiciel avancé : comprend l'économie du logiciel, le recueil du besoin piloté par les tests, la qualité logiciel et le multitasking.
  • L'architecture et donc le design de logiciels, selon une approche rigoureuse et validée par la recherche académique.
  • Les tests, en particulier l'approche TDD&BDD, ainsi que le recueil du besoin piloté par les tests.

Comme à mon habitude, ce sont les étudiants qui ont choisi leur langage de travail, dans la limite de mes connaissances. J'ai eu à travailler selon les écoles avec du TypeScript, du PHP, du Java et du C#.

🔗
Projects Partners - Janvier 2023 - Mars 2023 - Marseille (Hybride)

Projects Partners n'est pas n'importe quel client. Il s'agit de l'entreprise où j'ai réalisé mon alternance pendant 2 ans à Bordeaux. Désormais basée à Marseille, l'entreprise existe toujours avec un important portefeuille de clients du BTP.

Nous nous sommes recontactés car ils ont besoin d'une autre paire de bras pour aider à la réalisation d'un démonstrateur sur Sharepoint, à partir d'une application .NET existante. Il s'agissait de prouver la capacité d'un projet standalone à devenir un SaaS dont la sécurité et les données seraient respectivement gérées par Sharepoint et Azure.

Actuellement : Prototype livre, en prospection afin de trouver des clients et de lancer le développement du produit.

🔗
Reputatio - Janvier 2022 - Paris

Conseil en stratégie IT pour une petite agence de réputation spécialiste de Wikipédia. Ont été abordés les outils permettant d'assurer leur visibilité, ainsi que la gestion des connaissances et la veille autour de leurs clients.

🔗
Méritis/Mindquest - Septembre 2021 - Mars 2022 - Paris

Audit, développement et refactoring stratégique d’une API de gestion des données RH sous ASP.NET Core. Mise en place de nouvelles pratiques de développement et d’outillage CI. Réduction de la dette technique en parallèle d’échéances de livraison.
Mission suivie d'une prestation de développement d'un middleware de gestion des logs ASP.NET Core en TDD.

Mon arrivée sur le projet SIRH devait être celle d'un renfort, pour aider une équipe en difficulté à sortir à nouveau des fonctionnalité. Il s'est rapidement avéré que le problème n'était ni l'héroïsme des équipes, ni l'environnement humain, mais bien un code lordement endetté par des pratiques inadaptées.

Refaire le projet n'était comme souvent pas une option. Un audit a été conduit afin d'identifier les noeuds de complexité les plus problématiques. Un report des échéances a été négocié afin d'en résoudre le plus possible par ordre de priorité. Manque d'architecture, tests bâtard (ni d'intégration, ni vraiment fonctionnels) et code peu lisible ont été les principaux noeuds de complexité adressés.

Lorsque les reports sont devenus intenables, l'équipe a mis le projet en convalescence. Les livraisons de fonctionnalités prioritaires ont repris, plus lentement qu'auparavant cependant, afin de dégager du temps pour poursuivre l'assainissement.

Ma mission s'est terminée à cette période. J'ai ensuite été sollicité pour réaliser un middleware générique de gestion de logs pour ASP.NET Core. L'outil était intégralement réalisé en TDD et fut aussi un bon amusement vu le niveau en C# requis (réflexion, Expressions, tests récursifs, etc.)

🔗
SNAL/CBC Consult - Janvier 2021 - Mai 2021 - Région de Mulhouse

Développement au forfait d’un automate de traitement des débits et rejets entre le logiciel de facturation Chargebee et le format XML SEPA DirectDebit.

L'intérêt de ce projet, somme toute assez routinier, est d'être une démonstration achevée des bonnes pratiques que je prêche. Le besoin ne présente aucune difficulté particulière : il s'agit d'un pont très classique entre un logiciel de facturation (Chargebee) et le format d'échange interbancaire SEPA. Le pont fonctionne dans les deux sens : émission des ordres de débit et lecture des rejets.

Quelques détails sont inconnus au début du projet, certaines dépendances obligatoires sont intestables ou peu sûres, des couches anticorruption ont du être mises en place afin de rendre l'intestable plus prédictible et le peu sûr facilement remplaçable. Les détails d'implémentation dépendent du métier et non l'inverse (DI) et chaque composant, en plus d'être testé individuellement (tests fonctionnels), est mis en mouvement dans un tout plus grand (tests système), avant d'être relié au monde extérieur pour les tests les plus aboutis (tests d'intégration).

Le projet est réalisé en C# avec une architecture hexagonale. Cette architecture offre une grande surface d'accroche à d'autres bonnes pratiques, comme TDD, DDD, l'utilisation d'un framework d'IoC ou l'usage de tests de recette pour les démonstrations. La conjonction de ces techniques représente le sommet de la qualité dont j'étais capable lors de la sortie du projet.

Nous nous attendons à ce que ce projet soit détrôné par un autre, nos connaissances progressant sans cesse.

🔗
Groupe Atlantic/Younup - Août 2020 - La Roche sur Yon

Développement C#/.NET en contexte industriel et domotique au sein d'une équipe de 12 (développeurs et testeurs).

🔗
SNAL/CBC Consult - Juillet 2020 - Région de Mulhouse

Audit des performances d’une application. Approche orientée code : profilage, tests unitaires puis réalisation de POC présentant les améliorations possibles de l’existant.

🔗
EPSI Bordeaux, Nantes, Arras, Montpellier, Toulouse, Rennes - Janvier 2020 - Présent - France entière

Formation d’étudiants niveau Bac+2 à Bac+5 en vue du titre Niveau 7 « Expert en informatique et systèmes d’information » en présentiel majoritaire. Entre 10h et 80h par module pour ~400hr/an

  • Maintenance applicative (Gestion de la dette technique, Refactoring, Anticorruption Layers)
  • Intégration continue (Teamcity, git, DIY CI)
  • Architectures matérielles et logicielles (Architecture, Design (anti)-Patterns)
  • Tests (fondamentaux, approfondissement, industrialisation)
  • Cahier des charges et expression du besoin (méthode EATDD/BDD)
  • Agilité et Lois du Développement (Extreme Programming, Textes fondamentaux de notre métier)
  • Web&API (HTTP, REST, APIs)
  • C#/.NET (initiation au langage et à TDD)

Pédagogie orientée pratique (4/5 du temps en atelier). Coding dojos, cas réels, exercices. Positionnement exploratoire : pratiques validées par la science, mais pas toujours répandues en entreprise.
Suivi technique pour la rédaction des mémoires de fin d’études. Participation aux jurys.

En dehors des cours spécifiquement dédiés à un langage, les étudiants sont libres de prendre le langage de leur choix, tant qu'il est orienté-objet : C#, PHP, Java, TypeScript, Python, etc.

Spotlights Et si l'Atelier participait à une startup ?

🔗
Spotlights SAS - Mai 2018 - Novembre 2019 - Paris

Spotlights est un journal innovant, participatif et géolocalisé qui s’adapte à l’usage du lecteur. Son fonctionnement est transparent et décentralisé grâce à l’usage de la blockchain.
J’ai réalisé l’intégralité du code en binôme avec un développeur junior. C#/ .NET fullstack. Blockchain et Event Sourcing sur toute la partie Data. CI/CD handmade (scripts Bash).

Spotlights est un média participatif décentralisé. Le site n'est hélas plus en ligne.

C'est autour d'une bande d'amis qu'a démarré le projet Spotlights en Mai 2018. De fil en aiguille, l'Atelier a été associé au projet et chargé d'en superviser le développement. Le projet était à la pointe des technologies du moment : blockchain, smart-maps, .NET Core. Le code était envisagé comme un squelette (ou tracer bullet en anglais), à savoir un code prévu pour avancer dans un environnement fonctionnel changeant ou incertain, permettant de lever itérativement les voiles de brouillard.

Le projet n'a pas trouvé son financement, le développement n'est pas arrivé à son terme, mais la méthode de développement utilisée a permis d'obtenir un code assez indépendant du monde extérieur, vieillissant très peu. La logique métier est découplée de l'infrastructure grâce à la Clean Architecture. Ainsi le projet peut rester en sommeil sans s'abîmer et ressortir un beau jour si des investisseurs se présentent.
Les principes du Clean Code, de DDD et TDD garantissent qu'un développeur reprennant le code pourra facilement se l'approprier, sans avoir besoin d'effectuer une obscure et coûteuse rétro-ingénierie.

Si Spotlights reprenait demain, l'Atelier serait bien évidemment de la partie.