← retour

méthodologie

> Comment on calcule ce que le marché tech demande vraiment — et où sont les angles morts.

> Source des données

Une seule source en MVP : France Travail (l'API publique « Offres d'emploi v2 »). On filtre par codes ROME M1801 à M1810 — la famille « Études et développement informatique » du Répertoire Opérationnel des Métiers. C'est le filtre officiel qu'utilise FT pour classer les métiers IT, donc pas de bruit type « développeur RH ».

Pourquoi pas un filtre mots-clés ? Parce qu'il ramasse trop de faux positifs (« développement commercial », « tableau de bord ») et qu'il rate des offres dont le titre ne contient pas de mot tech (« administrateur systèmes »).

Ingestion via OAuth client_credentials, throttle volontaire à 5 req/s (50 % du quota FT), backoff exponentiel sur les 429/5xx. Cron quotidien à 02:00 UTC + backfill 30 jours au premier boot si la table est vide.

La réponse JSON brute de FT est préservée intégralement en JSONB côté Postgres. Si on change l'extraction demain, on ne re-fetch pas — on re-parse.

> Extraction des technologies

Approche MVP : regex compilés depuis un catalogue YAML versionné en code. Pour chaque techno on définit un nom canonique (« React »), ses aliases (« reactjs », « react.js »), sa catégorie (« frontend_framework »), et un flag ambiguous.

Subtilité technique : on utilise des lookbehind/lookahead (?<!\w)/(?!\w) à la place de \b pour que les noms à ponctuation finale (C#, C++, Node.js) matchent correctement. Les aliases sont triés par longueur DESC pour que next.js matche avant qu'un éventuel next tout seul s'y attaque. Matching insensible à la casse.

Le scan tourne sur title + description de chaque offre. Batch toutes les 10 minutes pour les nouvelles offres. Idempotent : on peut tout reset et rejouer sans rien casser.

Passe LLM complémentaire. Un second passage via Claude (lancé en CLI sur le serveur, pas l'API facturée) repasse sur les offres tech : il rattrape les technos que le regex rate, désambiguïse les noms ambigus, et juge la force d'exigence de chaque techno (required / nice_to_have / mentioned). Idempotent, et il fait autorité sur la force.

> Limites connues

Technos ambiguës. Dix noms collisionnent avec des mots courants — Go (verbe), C/R (lettres), Tableau (le mot français), etc. — et sont volontairement ignorés par le regex (pas de contexte pour désambiguïser sans bourde). C'est la passe LLM qui les rattrape, en s'appuyant sur le contexte de l'offre.

Source unique. France Travail seul aujourd'hui. FT couvre une grande partie du marché tech français — mais sa distribution n'est pas neutre : très ESN, secteur public, grandes entreprises Microsoft/SAP. Le marché startup/scale-up est sous-représenté. On ne fait pas de scraping LinkedIn / Welcome to the Jungle / Indeed (zone juridique grise). Adzuna prévu en Phase 2 comme 2ᵉ source.

Catalogue manuel. Une techno absente du YAML ne sera jamais détectée, même si elle apparaît dans 100 % des offres. Le catalogue grandit au fur et à mesure des audits. Si une techno te manque, ouvre une issue.

Force d'exigence partielle. Le regex pose toutes les co-occurrences au même niveau (« mentionnée quelque part dans l'offre »). La passe LLM affine en « exigé » (required) vs « serait un plus » (nice_to_have), mais seulement sur les offres tech qu'elle a déjà traitées — la nuance n'est donc pas encore disponible sur tout le corpus.

Volume modeste en MVP. ~30 j de backfill au lancement. Les co-occurrences sur les technos rares (moins de 20 offres) sont statistiquement bruitées. Prends-les avec des pincettes.

> Classification des rôles

Chaque offre est classifiée dans l'une de ces 11 catégories à partir du titre, via une heuristique regex. L'ordre de test donne la priorité à la catégorie la plus spécifique : un titre « Data Scientist » ou « AI Engineer » est classé ai (pas data), « Lead Data Engineer » est data, « DevOps Engineer » est devops (pas dev), « Mobile Developer » ou « Architecte iOS » est mobile.

dev · Développeur, Programmeur, Lead Dev, Tech Lead, Architecte logiciel, Backend/Frontend/Fullstack, Software Engineer, Ingénieur logiciel/études, Webmaster.
data · Data Engineer/Analyst, Data Architect, Ingénieur Data/Données, BI Developer/Engineer/Analyst (hors ML, désormais en ai).
ia · AI Engineer, ML / Machine Learning Engineer, Data Scientist, GenAI / LLM Engineer, MLOps, Prompt Engineer, Computer Vision / NLP, Ingénieur IA — marché distinct, testé avant data.
devops · DevOps, SRE (Site Reliability), Cloud Engineer, Platform Engineer, Ingénieur DevOps/Cloud/Plateforme, SecOps.
adminsys· Administrateur systèmes/réseau/BDD/Cloud, Sysadmin, DBA, Technicien systèmes/réseau/informatique/support/exploitation/sécurité, Ingénieur réseau/infrastructure, Support technique, Agent ou Analyste d'exploitation.
mobile · Développeur / Ingénieur / Architecte mobile, iOS, Android, applications mobiles, React Native, Flutter — marché distinct du dev web/backend.
qa · QA Engineer, Testeur, Ingénieur de test / validation, Test Automation, SDET, Quality Assurance, Assurance qualité, Automaticien de tests — marché distinct du dev.
sécu· Cybersécurité, Security / SOC Engineer / Analyst, Ingénieur / Consultant / Architecte sécurité, Pentester, Test d'intrusion, RSSI, Responsable sécurité. (« DevSecOps » / « SecOps » restent devops.)
pm · Chef de projet, Project Manager, Product Owner, Product Manager, Scrum Master, Delivery Manager.
manager· Manager, Directeur/Directrice, DSI, Responsable, AMOA, MOA, Maître d'ouvrage, Consultant fonctionnel, Business Analyst, Analyste fonctionnel, Chargé(e) de, Coordinateur, Auditeur — management ou conseil non hands-on.
other · Tout le reste (Consultant ambigu, Formateur, Opérateur, etc.) — titres trop génériques pour être classés.

Le classifieur tourne à l'ingestion de chaque offre et au boot du worker (re-classification idempotente). Si tu identifies un titre mal classé, c'est probablement un pattern à ajouter dans core/src/core/role_classifier.py.

> Roadmap (résumé)

  • Phase 2 — extraction Claude Haiku : rattrape les ambiguës + affine la mention_strength
  • Phase 2 — Adzuna en 2ᵉ source, déduplication inter-source via content_hash
  • Phase 3 — tendances temporelles (techno qui monte/descend mois sur mois)
  • Phase 3 — recommandeur « apprends X ensuite » basé sur les co-occurrences

> En chiffres aujourd'hui

offres ingérées (cumulé)46 636
offres extraites46 636 (100 %)
technos au catalogue207 (dont 10 ambiguës : skippées par le regex, rattrapées par le LLM)
technos détectées ≥ 1 fois198
dernière ingestion2026-07-10 02:00 UTC
dernière extraction2026-07-10 02:02 UTC

> Aller voir