Disponible — Île-de-France / remote

Là où les SLA et la qualité des données ne se négocient pas.

Vous êtes

Chafiq Madkour, Tech Lead et Senior Data Engineer photo / portrait
📍 Île-de-France — sur site ou remote
🗣️ Français · Anglais (TOEIC 950) · Arabe · Espagnol
Projet phare · NOVAPAY

L'architecture que je peux ouvrir en entier

Dix ans en banque et en assurance, ce sont dix ans de travail derrière une clause de confidentialité. NOVAPAY est à moi : un lakehouse paiements et lutte anti-fraude que j'ai construit de bout en bout, sur Databricks et GCP. Chaque couche est ouverte. Cliquez un nœud.

novapay · lakehouse paiements Databricks sur GCP · Delta Lake · Unity Catalog · architecture médaillon cliquez un nœud ↓
lignes écartées après correction Sources 70 000 tx / jour Ingestion incrémentale Bronze brut, tracé Qualité 5 règles Silver SCD 2 · devises Gold → BigQuery scoring · alertes Quarantaine réconciliable ACQUISITION LAKEHOUSE — UNITY CATALOG RESTITUTION
Bronze — brut

Ingestion incrémentale, tolérante à l'évolution de schéma. La donnée reçue est conservée sans modification, avec ses colonnes de traçabilité : fichier d'origine, horodatage d'ingestion.

Argent — nettoyé

Typage, normalisation, contrôles qualité et quarantaine. Historisation SCD 2 du référentiel client, conversion des devises au taux du jour. Aucune ligne écartée ne disparaît.

Or — métier

Indicateurs consolidés, scoring, files d'alerte, tables de supervision. Exposés par BigQuery, documentés et gouvernés par groupe dans Unity Catalog.

novapay · run quotidien d'ingestionstructure d'un run
[02:00:04] INFO  autoloader   → 70 000 transactions détectées · schéma inchangé
[02:00:31] INFO  bronze       → Delta, append seul · traçabilité fichier + horodatage
[02:01:12] INFO  dq.engine    → 5 règles évaluées, aux comportements distincts
[02:01:12] WARN  dq.devise    → devise inconnue                    → quarantaine
[02:01:12] WARN  dq.marchand  → absent du référentiel              → quarantaine
[02:01:13] OK    dq.balance   → reçu = traité + quarantaine       
[02:02:47] INFO  silver.scd2  → référentiel client historisé · devises au taux du jour
[02:03:20] INFO  risk.scoring → seuils paramétrables · file d'alerte alimentée
[02:04:02] INFO  gold→bq      → tables publiées · gouvernance par groupe Unity Catalog
[02:04:09] DONE  pipeline     → détection disponible en moins de 15 min · avant : 26 h
Quatre chiffres

Ce que dix ans laissent derrière

Chaque chiffre a été mesuré sur une mission, avant et après.

10
Ans sur des plateformes data critiques — banque, assurance, finance de marché
2016 → 2026
×30
Gain sur les traitements Spark, de plusieurs heures à quelques minutes, sur des pipelines réglementaires et de contrôle de marché
Assurance · banque de financement
0 → 95 %
Couverture de tests, en introduisant le TDD dans une équipe qui n'en avait jamais fait
Banque de financement · 2019–2021
5
Data engineers encadrés comme Tech Lead, plus une équipe répartie Paris, Londres, Bangalore
Assurance · banque de financement
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.
Titres

Certifications, formation, stack

Deux certifications Databricks portent une URL publique de vérification. Vérifiez-les.

GCP
Professional Data Engineer
Google Cloud · en préparation
2026
DBX
Certified Data Engineer Professional
Databricks
2026
DBX
Certified Data Engineer Associate
Databricks
2026
DBX
Certified Associate Developer for Apache Spark 3.0
Databricks
2023

Formation

M2 MIAGE — Informatique pour la Finance
Université Paris-Dauphine · 2015–2016

Diplôme d'ingénieur — Génie informatique
ENSEIRB-MATMECA, Bordeaux · 2013–2016

CPGE MP — Mathématiques & Physique · 2011–2013

Un diplôme d'ingénieur et un diplôme de finance. C'est ce qui fait qu'une conversation avec une direction des Risques n'a pas besoin de traducteur.

Compétences

Data engineeringDatabricks (Lakehouse, Delta Lake, Unity Catalog) · Apache Spark 2.x, 3.x, 4.x — batch et streaming, optimisation avancée · Kafka · SQL · Airflow
CloudGCP — BigQuery, DataProc, Dataflow, Composer, Bigtable, GCS, Pub/Sub · Azure — HDInsight, Databricks
PlateformeCI/CD (GitLab, Jenkins, SonarQube) · Kubernetes · Docker · observabilité (Prometheus, Grafana) · TDD · gestion des releases
ArchitectureLakehouse · event-driven · Lambda / Kappa · ETL / ELT · gouvernance et qualité des données
IA & GenAILLM (Claude, ChatGPT, Gemini, Kimi) · LangChain · RAG · bases vectorielles · architectures multi-agents
LangagesPython · Java 8 / 17 · Scala
Ce qui reste lisible

Ce sur quoi vous pouvez me juger

Presque tout ce que j'ai construit est derrière une clause de confidentialité. Trois choses n'y sont pas.

Écrits techniques
8 publications

Écrits depuis les missions, pas depuis la documentation. Jugez le raisonnement avant le CV — c'est la partie que vous pouvez lire tout de suite.

Lire les écrits ↗
Parcours
10 ans, 4 institutions

BNP Paribas, Natixis, Société Générale, Crédit Agricole Assurances. Dates, rôles et périmètres détaillés.

Profil LinkedIn ↗
Certifications
Databricks, trois fois

Data Engineer Professional et Associate, plus Associate Developer for Spark 3.0. Certificats communiqués sur demande.

Voir la liste ↑

« Emplacement — une recommandation LinkedIn réelle vient ici. »

Prénom Nom
Responsable Data

« Emplacement — une recommandation LinkedIn réelle vient ici. »

Prénom Nom
Engineering Manager

« Emplacement — une recommandation LinkedIn réelle vient ici. »

Prénom Nom
Directeur des Risques
Écrits

Ce que je n'ai trouvé écrit nulle part

Des essais et des notes plus courtes, tous issus d'une question qu'une mission a forcé à trancher. Rien ici n'est une page de documentation réécrite.

Essai · le plus lu

Une ligne écartée dans un déclaratif, c'est une sous-déclaration

Dans une chaîne réglementaire, une jointure interne ne nettoie pas la donnée. Elle retire des lignes qu'on avait l'obligation de déclarer, et aucun tableau de bord ne vous le dira, parce qu'une ligne supprimée ne peut pas signaler sa propre absence.

14.07.20269 min de lectureRéglementaire · Spark

Un essai par mois, rien d'autre

Aucune promotion. Désinscription en un clic, et l'archive reste ouverte sans adresse.

RSS

Une chaîne qui doit arriver à l'heure ?

Trente minutes suffisent en général pour situer où est la vraie contrainte. Sans pitch, sans slides.