<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Issa Sanogo</title><link>https://ngsanogo.github.io/</link><description>Recent content on Issa Sanogo</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Sun, 15 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://ngsanogo.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Monitoring des pipelines data en production</title><link>https://ngsanogo.github.io/posts/monitoring-data-pipelines/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/monitoring-data-pipelines/</guid><description>&lt;h2 id="pourquoi-monitorer"&gt;Pourquoi monitorer&lt;/h2&gt;
&lt;p&gt;Un pipeline qui tourne ne veut pas dire un pipeline qui fonctionne. Les données peuvent arriver en retard, être incomplètes ou corrompues — et personne ne s&amp;rsquo;en aperçoit si le monitoring est absent.&lt;/p&gt;
&lt;p&gt;Le monitoring data, c&amp;rsquo;est répondre à 3 questions en permanence :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Est-ce que ça tourne ?&lt;/strong&gt; (orchestration)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Est-ce que les données arrivent ?&lt;/strong&gt; (freshness)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Est-ce que les données sont correctes ?&lt;/strong&gt; (qualité)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="quick-start-docker"&gt;Quick Start (Docker)&lt;/h2&gt;
&lt;p&gt;Pour tester les checks SQL de cet article :&lt;/p&gt;</description></item><item><title>MinIO et Airflow : construire un data lake local</title><link>https://ngsanogo.github.io/posts/minio-airflow-data-lake/</link><pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/minio-airflow-data-lake/</guid><description>&lt;h2 id="pourquoi-un-data-lake-local"&gt;Pourquoi un data lake local&lt;/h2&gt;
&lt;p&gt;Travailler avec S3 en production, c&amp;rsquo;est standard. Mais développer directement sur AWS coûte cher et ralentit les itérations. MinIO résout ça : un stockage objet S3-compatible qui tourne en local.&lt;/p&gt;
&lt;p&gt;Combiné à Airflow, on obtient un environnement de développement complet :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stockage objet (landing, staging, curated)&lt;/li&gt;
&lt;li&gt;Orchestration des pipelines&lt;/li&gt;
&lt;li&gt;Tests reproductibles sans accès cloud&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="larchitecture"&gt;L&amp;rsquo;architecture&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[Sources]
 ↓
[Airflow DAGs]
 ↓
[MinIO buckets]
 ├── landing/ (données brutes)
 ├── staging/ (données nettoyées)
 └── curated/ (données prêtes à consommer)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Airflow orchestre les DAGs qui lisent et écrivent dans MinIO via le protocole S3. Le code est identique à celui qu&amp;rsquo;on déploiera en production sur AWS.&lt;/p&gt;</description></item><item><title>Qualité des données en santé : pourquoi c'est plus difficile qu'ailleurs</title><link>https://ngsanogo.github.io/posts/data-quality-healthcare-why-harder/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/data-quality-healthcare-why-harder/</guid><description>&lt;h2 id="pourquoi-cet-article-"&gt;Pourquoi cet article ?&lt;/h2&gt;
&lt;p&gt;Pendant mes quatre ans à l’AP-HP puis à l’Institut Jérôme Lejeune, j’ai appris que la qualité des données en santé est un problème à part. Un identifiant patient mal rattaché ne se corrige pas comme une erreur de montant. Les systèmes sont fragmentés, la réglementation interdit l’improvisation, et la tolérance à l’erreur est proche de zéro sur certains flux. Cet article pose le cadre que j’applique depuis, et que j’aurais aimé trouver documenté quand j’ai commencé.&lt;/p&gt;</description></item><item><title>Tester ses pipelines data : ce qui compte vraiment</title><link>https://ngsanogo.github.io/posts/testing-data-pipelines/</link><pubDate>Sun, 01 Mar 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/testing-data-pipelines/</guid><description>&lt;h2 id="pourquoi-tester-ses-pipelines"&gt;Pourquoi tester ses pipelines&lt;/h2&gt;
&lt;p&gt;Un pipeline sans tests, c&amp;rsquo;est un pipeline qui casse en silence. Les données arrivent mal formatées, un schéma change, une colonne disparaît — et personne ne s&amp;rsquo;en aperçoit avant qu&amp;rsquo;un dashboard affiche n&amp;rsquo;importe quoi.&lt;/p&gt;
&lt;p&gt;Les tests ne sont pas un luxe. C&amp;rsquo;est ce qui permet de refactorer, de déployer et de dormir tranquille.&lt;/p&gt;
&lt;h2 id="quick-start-docker"&gt;Quick Start (Docker)&lt;/h2&gt;
&lt;p&gt;Pour exécuter les tests Python de cet article :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --rm -it python:3.12-slim bash -c &lt;span style="color:#a5d6ff"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a5d6ff"&gt; pip install -q pandas pytest &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a5d6ff"&gt; python
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Collez les fonctions de test et lancez-les avec &lt;code&gt;pytest&lt;/code&gt;. Pour les tests SQL, lancez un PostgreSQL : &lt;code&gt;docker run --name pg-test -e POSTGRES_PASSWORD=secret -d postgres:16&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Construire un pipeline production-grade : idempotence, erreurs et traitement incrémental</title><link>https://ngsanogo.github.io/posts/pipeline-production-grade/</link><pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/pipeline-production-grade/</guid><description>&lt;h2 id="pourquoi-cet-article"&gt;Pourquoi cet article&lt;/h2&gt;
&lt;p&gt;J&amp;rsquo;ai eu deux incidents marquants en production. Le premier : un pipeline relancé après un bug avait doublé toutes les données de la table — personne ne s&amp;rsquo;en était rendu compte pendant 3 jours. Le deuxième : un pipeline critique avait planté un vendredi soir sans alerte, et l&amp;rsquo;équipe métier a signalé des données manquantes le lundi matin.&lt;/p&gt;
&lt;p&gt;Ces deux incidents ont la même cause profonde : des pipelines qui n&amp;rsquo;étaient pas pensés pour la production. Pas idempotents. Sans gestion d&amp;rsquo;erreurs. Pas incrémentaux. Ce sont les trois propriétés que j&amp;rsquo;exige maintenant systématiquement avant de mettre un pipeline en prod.&lt;/p&gt;</description></item><item><title>Modélisation dimensionnelle : structurer un data warehouse</title><link>https://ngsanogo.github.io/posts/dimensional-modeling-basics/</link><pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/dimensional-modeling-basics/</guid><description>&lt;h2 id="le-problème"&gt;Le problème&lt;/h2&gt;
&lt;p&gt;Les données brutes sont chargées dans le warehouse. Des tables partout. Des jointures complexes. Les analystes passent plus de temps à comprendre le modèle qu&amp;rsquo;à produire des insights.&lt;/p&gt;
&lt;p&gt;La modélisation dimensionnelle résout ce problème en organisant les données pour la consommation, pas pour le stockage.&lt;/p&gt;
&lt;h2 id="quick-start-docker"&gt;Quick Start (Docker)&lt;/h2&gt;
&lt;p&gt;Pour tester les exemples SQL de cet article :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --name pg-dim -e &lt;span style="color:#79c0ff"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt;secret -d postgres:16
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it pg-dim psql -U postgres
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Copiez les &lt;code&gt;CREATE TABLE&lt;/code&gt; et requêtes directement dans &lt;code&gt;psql&lt;/code&gt;. Pour nettoyer : &lt;code&gt;docker rm -f pg-dim&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>PostgreSQL en production : ce que j'ai appris en optimisant des requêtes sur de vraies données</title><link>https://ngsanogo.github.io/posts/postgresql-en-production/</link><pubDate>Sun, 08 Feb 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/postgresql-en-production/</guid><description>&lt;h2 id="pourquoi-cet-article"&gt;Pourquoi cet article&lt;/h2&gt;
&lt;p&gt;Beaucoup de data engineers traitent PostgreSQL comme une boîte noire : ils savent écrire du SQL, mais ignorent pourquoi une requête est lente, pourquoi un pipeline crée des doublons à la relance, ou pourquoi un chargement plante à mi-chemin.&lt;/p&gt;
&lt;p&gt;Cet article couvre les deux côtés : d&amp;rsquo;abord les fondamentaux théoriques qu&amp;rsquo;il faut comprendre pour ne pas travailler à l&amp;rsquo;aveugle, puis les techniques d&amp;rsquo;optimisation concrètes. Pas un cours académique — ce que j&amp;rsquo;aurais voulu avoir quand j&amp;rsquo;ai commencé à débugger des requêtes sur des tables de 200 millions de lignes.&lt;/p&gt;</description></item><item><title>Les 6 dimensions de la qualité des données — et celles qu'on oublie toujours</title><link>https://ngsanogo.github.io/posts/data-quality-fundamentals/</link><pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/data-quality-fundamentals/</guid><description>&lt;h2 id="pourquoi-cest-le-sujet-n1"&gt;Pourquoi c&amp;rsquo;est le sujet n°1&lt;/h2&gt;
&lt;p&gt;Une donnée de mauvaise qualité coûte cher. Pas seulement en argent : en confiance. Quand un dashboard affiche des chiffres incohérents, personne ne le regarde plus. Et quand personne ne regarde, les décisions se prennent au doigt mouillé.&lt;/p&gt;
&lt;p&gt;Le vrai coût de la mauvaise qualité, c&amp;rsquo;est l&amp;rsquo;érosion de la confiance dans la plateforme data.&lt;/p&gt;
&lt;h2 id="les-6-dimensions-de-la-qualité"&gt;Les 6 dimensions de la qualité&lt;/h2&gt;
&lt;h3 id="1-complétude"&gt;1. Complétude&lt;/h3&gt;
&lt;p&gt;Les données attendues sont-elles présentes ? Des colonnes &lt;code&gt;NULL&lt;/code&gt; partout, des lignes manquantes, des fichiers vides — c&amp;rsquo;est le symptôme le plus fréquent.&lt;/p&gt;</description></item><item><title>Le Zen du data engineering</title><link>https://ngsanogo.github.io/posts/zen-of-data-engineering/</link><pubDate>Mon, 02 Feb 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/zen-of-data-engineering/</guid><description>&lt;h2 id="pourquoi-cet-article-"&gt;Pourquoi cet article ?&lt;/h2&gt;
&lt;p&gt;J’ai passé deux jours à traquer une duplication silencieuse en production. Le pipeline tournait, les logs étaient verts, les chiffres étaient faux. Quand j’ai fini par trouver la cause — une absence de contrôle d’unicité à l’insertion — je me suis demandé combien de mes pipelines avaient le même défaut. C’est ce genre de moment qui m’a poussé à formaliser les principes que j’applique maintenant systématiquement. Ils sont largement inspirés du Zen of Python.&lt;/p&gt;</description></item><item><title>Batch, micro-batch, streaming : quel pattern pour quel besoin</title><link>https://ngsanogo.github.io/posts/data-pipeline-architecture-patterns/</link><pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/data-pipeline-architecture-patterns/</guid><description>&lt;h2 id="le-choix-qui-structure-tout"&gt;Le choix qui structure tout&lt;/h2&gt;
&lt;p&gt;Le premier choix d&amp;rsquo;architecture d&amp;rsquo;une plateforme data est : comment la donnée circule de la source à la destination ? Ce choix impacte le tooling, les coûts, les compétences nécessaires et les délais de livraison.&lt;/p&gt;
&lt;p&gt;Il existe 3 patterns. Chacun a ses cas d&amp;rsquo;usage légitimes.&lt;/p&gt;
&lt;h2 id="pattern-1--batch"&gt;Pattern 1 : Batch&lt;/h2&gt;
&lt;p&gt;La donnée s&amp;rsquo;accumule, puis est traitée en bloc à intervalles réguliers (toutes les nuits, toutes les heures).&lt;/p&gt;</description></item><item><title>Structurer un projet Python pour les pipelines data</title><link>https://ngsanogo.github.io/posts/python-project-structure-data/</link><pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/python-project-structure-data/</guid><description>&lt;h2 id="le-problème"&gt;Le problème&lt;/h2&gt;
&lt;p&gt;La plupart des projets data démarrent avec un seul script. Puis deux. Puis dix fichiers éparpillés dans un dossier sans structure.&lt;/p&gt;
&lt;p&gt;Résultat : personne ne sait où est quoi, les imports cassent, et le déploiement est un cauchemar.&lt;/p&gt;
&lt;p&gt;Structurer son projet dès le départ coûte 10 minutes. Ne pas le faire coûte des heures de dette technique.&lt;/p&gt;
&lt;h2 id="quick-start-docker"&gt;Quick Start (Docker)&lt;/h2&gt;
&lt;p&gt;Pour reproduire la structure et les tests de cet article :&lt;/p&gt;</description></item><item><title>Data products : penser produit quand on est data engineer</title><link>https://ngsanogo.github.io/posts/building-data-products/</link><pubDate>Sat, 31 Jan 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/building-data-products/</guid><description>&lt;h2 id="pourquoi-cet-article-"&gt;Pourquoi cet article ?&lt;/h2&gt;
&lt;p&gt;J’ai livré un pipeline dont personne ne s’est servi. Trois jours de développement, une architecture propre, zéro utilisateur. Le problème n’était pas technique. Je n’avais pas posé la bonne question au départ. C’est ce raté qui m’a fait basculer vers une approche produit : commencer par le problème métier, pas par la donnée disponible. Cet article retrace ce changement de perspective.&lt;/p&gt;
&lt;h2 id="quest-ce-quun-data-product-"&gt;Qu’est-ce qu’un data product ?&lt;/h2&gt;
&lt;p&gt;Un data product est un livrable basé sur la donnée qui résout un problème précis pour un utilisateur défini. Ce n&amp;rsquo;est pas juste une table ou un dashboard.&lt;/p&gt;</description></item><item><title>Modern data stack : ce qui compte vraiment</title><link>https://ngsanogo.github.io/posts/modern-data-stack-architecture/</link><pubDate>Fri, 30 Jan 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/modern-data-stack-architecture/</guid><description>&lt;h2 id="ce-qui-a-changé"&gt;Ce qui a changé&lt;/h2&gt;
&lt;p&gt;Il y a 10 ans, une plateforme data coûtait des millions et prenait des mois à déployer. Aujourd&amp;rsquo;hui, une startup peut avoir une stack data solide pour quelques centaines d&amp;rsquo;euros par mois.&lt;/p&gt;
&lt;p&gt;La raison : le cloud, le pay-per-use, et des outils composables qui font chacun une seule chose bien.&lt;/p&gt;
&lt;h2 id="les-5-couches-dune-stack-moderne"&gt;Les 5 couches d&amp;rsquo;une stack moderne&lt;/h2&gt;
&lt;h3 id="1-sources"&gt;1. Sources&lt;/h3&gt;
&lt;p&gt;Tout ce qu&amp;rsquo;on veut analyser : bases applicatives (PostgreSQL, MySQL), outils SaaS (Salesforce, Stripe, HubSpot), fichiers, flux d&amp;rsquo;événements.&lt;/p&gt;</description></item><item><title>ETL vs ELT : comment choisir</title><link>https://ngsanogo.github.io/posts/etl-vs-elt-when-to-choose/</link><pubDate>Mon, 26 Jan 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/etl-vs-elt-when-to-choose/</guid><description>&lt;h2 id="rappel--quest-ce-que-letl-"&gt;Rappel : qu&amp;rsquo;est-ce que l&amp;rsquo;ETL ?&lt;/h2&gt;
&lt;p&gt;ETL signifie &lt;strong&gt;Extract, Transform, Load&lt;/strong&gt;. C&amp;rsquo;est le processus fondamental du data engineering : extraire des données de systèmes sources, les transformer, puis les charger dans un système cible (warehouse, base analytique).&lt;/p&gt;
&lt;p&gt;ELT inverse les deux dernières étapes : on charge d&amp;rsquo;abord la donnée brute dans le warehouse, puis on la transforme sur place en SQL.&lt;/p&gt;
&lt;p&gt;La différence n&amp;rsquo;est pas cosmétique. Elle impacte l&amp;rsquo;architecture, les coûts, la sécurité et la maintenabilité.&lt;/p&gt;</description></item><item><title>dbt en production : au-delà du getting started</title><link>https://ngsanogo.github.io/posts/dbt-en-production/</link><pubDate>Mon, 05 Jan 2026 00:00:00 +0000</pubDate><guid>https://ngsanogo.github.io/posts/dbt-en-production/</guid><description>&lt;h2 id="dbt-cest-quoi-en-une-phrase"&gt;dbt, c&amp;rsquo;est quoi en une phrase&lt;/h2&gt;
&lt;p&gt;dbt te permet d&amp;rsquo;écrire des transformations SQL comme du code versionné, testé, documenté et déployé proprement.&lt;/p&gt;
&lt;h2 id="quick-start-docker"&gt;Quick Start (Docker)&lt;/h2&gt;
&lt;p&gt;Pour tester dbt sans rien installer, avec PostgreSQL :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --name pg-dbt -e &lt;span style="color:#79c0ff"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt;secret -p 5432:5432 -d postgres:16
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --rm -it python:3.12-slim bash -c &lt;span style="color:#a5d6ff"&gt;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a5d6ff"&gt; pip install -q dbt-postgres &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a5d6ff"&gt; dbt init my_project --skip-profile-setup &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a5d6ff"&gt; cd my_project &amp;amp;&amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a5d6ff"&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a5d6ff"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--skip-profile-setup&lt;/code&gt; crée le projet sans prompts interactifs. Configurez ensuite la connexion vers &lt;code&gt;host.docker.internal:5432&lt;/code&gt; dans &lt;code&gt;~/.dbt/profiles.yml&lt;/code&gt; et lancez &lt;code&gt;dbt debug&lt;/code&gt;.&lt;/p&gt;</description></item></channel></rss>