Parcours
Dix ans, quatre institutions, un même métier
Moteur de pricing, puis calcul de risque, puis contrôle de marché, puis déclaratif réglementaire. Toujours la même question : faire arriver un calcul lourd à l'heure, et pouvoir prouver qu'il est juste. Chaque carte s'ouvre sur le détail technique.
Projet personnel · construit de bout en bout
NOVAPAY — Lakehouse paiements & lutte anti-fraude
Une chaîne complète sur Databricks et GCP : ingestion incrémentale de 70 000 transactions par jour, tolérante à l'évolution de schéma ; cinq règles de contrôle aux comportements distincts et une quarantaine réconciliable à la ligne près ; historisation SCD 2 du référentiel client et conversion des devises au taux du jour ; scoring de risque à seuils paramétrables ; indicateurs consolidés, files d'alerte et tables de supervision exposés par BigQuery, gouvernés par groupe dans Unity Catalog.
26 h → 15 min
Délai de détection de fraude
70 000 / jour
Transactions ingérées en incrémental
Exacte
Réconciliation reçu = traité + quarantaine, à la ligne
DatabricksDelta LakeUnity CatalogGCPBigQueryPythonTerraformGitLab CI
Les trois décisions qui tiennent la chaîne
- Aucune ligne écartée ne disparaît. Une règle route vers la quarantaine, elle ne filtre jamais. La ligne écartée garde son code de règle, et l'égalité reçu = traité + quarantaine est vérifiée à chaque run. C'est ce contrôle qui rend la chaîne auditable, pas seulement juste.
- Le bronze garde le brut, intact. Ingéré tel que reçu, avec ses colonnes de traçabilité — fichier d'origine, horodatage d'ingestion — et tolérant à l'évolution de schéma, parce qu'un fournisseur de paiement ajoute un champ sans prévenir. Si une règle métier change, l'histoire se rejoue depuis là.
- Les seuils sont des paramètres, pas des constantes. Le scoring de risque s'ajuste sans déploiement, et la conversion de devises utilise le taux du jour plutôt qu'un instantané — deux détails qui décident si la plateforme reste utilisable un an plus tard.
Crédit Agricole Assurances · Tech Lead / Senior Data Engineer · 11/2022 → aujourd'hui
Refonte des déclaratifs réglementaires
FICOVIE, FATCA, échange automatique d'informations, sur une plateforme Big Data fortement contrainte : volumétrie, conformité, échéances fermes. J'ai piloté la migration de la plateforme — Oozie vers Airflow, Spark 2.4 vers 3.5, Java 8 vers 17 — et la direction technique d'une équipe de cinq data engineers.
Temps de traitement ramenés de plusieurs heures à quelques minutes (×30) · migration livrée sans régression majeure sur les jobs critiques · couverture de tests portée à 90 % par le TDD.
Spark 3.5AirflowJava 17Scala 2.12GCPKubernetesMapRKafka
Migrer une orchestration sans rater une échéance
contrats ─┐
personnes ─┼→ normalisation → contrôles → déclaratif → dépôt → accusés
mouvements ─┘ │ format fenêtre │
▼ imposé légale │
anomalies ←──── rejets de l'administration
(reprise métier, IHM Spring Boot + Angular)
- Oozie ne se traduit pas en Airflow. Un coordinator Oozie attend la disponibilité d'un jeu de données ; un DAG Airflow se déclenche sur un calendrier. Réécrire l'un dans l'autre, c'est ré-exprimer chaque dépendance implicite en capteur explicite. C'est là que les échéances se tiennent ou se perdent.
- Le parseur de dates de Spark 3 est le piège d'une migration réglementaire. Spark 3 est passé au calendrier grégorien proleptique et à un parseur plus strict. Sur des fichiers portant des dates de contrat anciennes, le même job renvoie silencieusement des valeurs différentes de Spark 2.4. La migration a été verrouillée en comparant les sorties date par date avant de toucher au paramétrage.
- Java 8 vers 17 n'est pas un drapeau de compilation. Le système de modules ferme les accès par réflexion sur lesquels Spark et ses bibliothèques de sérialisation s'appuyaient. Chaque job a demandé une revue de ses options JVM, et le ramasse-miettes par défaut a changé le profil mémoire des exécuteurs longs.
- Les deux chaînes tournent en parallèle. L'ancienne et la nouvelle produisent chacune leur fichier ; une comparaison automatisée bloque la bascule tant qu'une ligne diffère. C'est ce qui transforme un pari en mesure.
Société Générale · Tech Lead / Senior Data Engineer · 07/2021 – 11/2022
Contrôle de marché & détection de fraude
Une plateforme de contrôle de marché sur des volumétries massives, en pleine migration cloud. J'ai piloté le passage de l'on-premise vers Azure (HDInsight, Azure Storage), la montée de Spark 2 vers Spark 3, et une équipe Data Engineering répartie entre Paris, Londres et Bangalore.
Traitements ramenés de plusieurs heures à quelques minutes (×30) · analyses de fraude accélérées · stabilité et coûts opérationnels des calculs de risque améliorés.
Azure HDInsightDatabricksSpark 3Scala 2.11KerberosHDP 2.6
Ce qu'AQE règle, et ce qu'il ne règle pas
- AQE rattrape de mauvaises estimations, pas une mauvaise modélisation. Il fusionne les partitions de shuffle surdimensionnées, bascule une jointure sort-merge en broadcast à l'exécution, découpe les partitions déséquilibrées. Il ne sauvera pas une jointure dont la clé a une valeur dominante couvrant un tiers des lignes : celle-là, il faut la réécrire.
- Le pruning dynamique de partitions a des conditions. Il ne se déclenche que si la table de faits est partitionnée sur la colonne de jointure et si la dimension porte un filtre sélectif. La moitié des gains attendus d'un passage à Spark 3 vient de la vérification de ces deux conditions, requête par requête.
- Kerberos est l'endroit où une migration hybride s'enlise. Les jetons de délégation expirent ; un job qui vit plus longtemps que son jeton meurt à la fin, après la partie coûteuse. La fenêtre de renouvellement se dimensionne avant le calcul, pas après.
- Trois fuseaux imposent des décisions écrites. Avec Paris, Londres et Bangalore sur le même dépôt, ce qui se décide à l'oral se re-décide autrement une semaine plus tard. Un journal des décisions d'architecture coûte dix minutes et supprime ça.
Natixis · Tech Lead / Senior Data Engineer · 01/2019 – 06/2021
Moteur de calcul de risque de marché
Un moteur de calcul et de restitution d'indicateurs de risque de marché — VaR, CVaR — et de P&L (sensibilités × chocs, valeur présente) pour les activités de marché. J'ai optimisé les jobs Spark, tenu le rôle de Release Manager, et introduit le TDD dans une équipe qui n'avait jamais écrit un test.
Temps de traitement de 8 minutes à 1 minute (×8) · couverture de tests de 0 % à 95 % · consommation mémoire réduite dans le même mouvement.
Spark 2Scala 2.11KafkaNiFiHBaseMongoDBELKSolR
La forme du calcul passe avant l'optimisation
- Une VaR est un produit, pas un pipeline. Des positions croisées avec des scénarios : le volume n'est pas ce qu'on lit, c'est ce qu'on engendre. Optimiser d'abord la lecture est la semaine perdue classique — le coût est dans le produit croisé et dans la façon dont la matrice de chocs est distribuée.
- Les sensibilités se calculent une fois et se réutilisent. Les recalculer par scénario, c'est ce qui transforme une minute en huit. Les diffuser en broadcast, et garder un partitionnement stable sur toute la chaîne, supprime un shuffle par scénario.
- On n'introduit pas le TDD en demandant des tests. On commence par figer le moteur existant : capturer ses sorties sur une journée de référence, en faire des fichiers témoins, et refactorer seulement ensuite. L'équipe écrit des tests à partir du moment où les tests ont déjà attrapé quelque chose.
BNP Paribas · Data Engineer · 10/2016 – 12/2018
Iprice / Delta One — pricing de dérivés
Un outil de pricing de produits dérivés et structurés, utilisé quotidiennement par les desks de trading. J'ai développé les microservices autour du moteur de pricing — Java, Spring Boot, CQRS, event sourcing —, contribué à l'architecture orientée événements, et tenu les mises en production.
Stabilité et performances du moteur de pricing améliorées · meilleure réactivité pour les desks · TDD et CI/CD adoptés sur le périmètre.
Java 8Spring Boot 2CQRSEvent SourcingKafkagRPCElasticSearch
Pourquoi de l'event sourcing sous un moteur de pricing
- Un prix est une décision, pas une valeur. Ce qui compte ensuite n'est pas le nombre : c'est l'état de marché et les paramètres qui l'ont produit. Stocker les événements plutôt que le résultat, c'est ce qui rend une journée rejouable — et ce qui rend possible la réponse à « pourquoi ce prix à 14 h 32 ».
- CQRS sépare deux charges qui n'ont rien à voir. Les commandes de pricing arrivent par rafales ; les desks lisent en continu. Séparer le modèle d'écriture du modèle de lecture permet de dimensionner chaque côté pour son propre trafic, au lieu de moyenner les deux dans un compromis.
- C'est de là que vient le réflexe data. Deux ans d'event sourcing sur un système de trading, c'est là que l'habitude se prend : ne jamais écraser, toujours ajouter et dériver. C'est le principe d'une couche bronze, dix ans avant que je l'appelle comme ça.
Projets personnels · hors mission
FMS & Nawba — deux produits, de bout en bout
Deux autres produits construits sur mon temps, à côté de NOVAPAY. FMS est une plateforme agricole multi-tenant (Spring Boot, React Native, RBAC par ferme, internationalisation AR/FR). Nawba est une gestion de file d'attente temps réel (Fastify, WebSocket, React). Ce sont eux qui servent de terrain d'essai avant qu'un outil arrive en mission.
Le seul projet dont je peux détailler l'architecture complète, puisque rien n'y est couvert par une clause.
DatabricksDelta LakeUnity CatalogBigQuerySpring BootTypeScriptPostgreSQL
Ce qu'ils ont à voir avec la data
- Le multi-tenant est un problème de données. Le RBAC par ferme, c'est de l'isolation au niveau ligne : la même question que résout un modèle de gouvernance Unity Catalog, à plus petite échelle et code ouvert.
- Le temps réel est une discipline, pas une bibliothèque. Nawba maintient un état de file partagé cohérent entre clients — ordre, reconnexion, conflits. Les mêmes modes de défaillance qu'un pipeline streaming, assez petits pour être tenus en entier dans la tête.