AccueilBlogTest technique dbt
Guide recrutement data

Test technique dbt : ce qu'on évalue vraiment en entretien

dbt est devenu le standard de la couche de transformation dans la stack data moderne. Mais « faire du dbt » va de lancer dbt run sur des modèles copiés-collés à concevoir un projet modulaire, testé, documenté et gouverné. L'écart de niveau est immense — voici comment le mesurer.

Data Builder·Juillet 2025·9 min de lecture·Analytics Engineer

dbt (data build tool) a industrialisé la transformation de la donnée : versionnée, testée, documentée, exécutée dans un DAG. Sur le papier, tout le monde « connaît dbt ». En entretien, l'écart se creuse vite entre celui qui empile des modèles et celui qui conçoit une couche analytique maintenable. Voici les cinq dimensions que nous évaluons, et les signaux qui trient les profils.

1Modélisation et matérialisations

Question discriminante

Comment choisissez-vous entre une vue, une table et un modèle incrémental — et pourquoi ?

C'est la première ligne de partage. Un profil solide justifie chaque choix par le coût de reconstruction, la fréquence de lecture et la volumétrie, pas par habitude.

  • view — recalculée à chaque requête, zéro stockage : idéale pour la couche de staging.
  • table — matérialisée, rapide à lire mais coûteuse à reconstruire : pour les marts souvent consommés.
  • incremental — ne traite que les nouvelles lignes : indispensable dès que la reconstruction complète devient prohibitive.
  • ephemeral — jamais matérialisée, inlinée en CTE dans les modèles qui l'utilisent.

Bon réflexe : vue par défaut, table pour les marts très lus, incrémental seulement quand le coût le justifie. Matérialiser tout en table « pour aller vite » est un signal de méconnaissance des coûts.

2ref() et sources

Question discriminante

Pourquoi ne faut-il jamais écrire un nom de table en dur dans un modèle ?

  • ref() — référence un autre modèle et construit automatiquement le graphe de dépendances (DAG).
  • source() — déclare et documente les tables brutes en entrée du projet.
  • Lineage — dbt sait dans quel ordre construire, et ce qui casse en aval quand un modèle change.
  • source freshness — détecte une source qui n'est plus alimentée avant que le rapport ne soit faux.

Signal d'alerte : un candidat qui code un nom de table en dur (from analytics.orders) casse le lineage et l'ordonnancement. C'est le premier réflexe qui distingue un utilisateur de dbt d'un simple exécutant de SQL.

3Tests et qualité

Question discriminante

Comment garantissez-vous la fiabilité de ce que consomment les analystes en aval ?

  • Tests génériques : unique, not_null, accepted_values, relationships — déclaratifs, dans le YAML.
  • Tests singuliers : une requête SQL qui doit renvoyer zéro ligne pour passer.
  • Paquets : dbt-utils, dbt-expectations pour des assertions avancées (unicité composite, distribution, fraîcheur).
  • Contrats et versions de modèles (dbt 1.5+) — figer le schéma d'un modèle consommé par d'autres équipes.

Signal d'alerte : un projet sans tests est un projet dont personne ne connaît la fiabilité. En production, c'est un drapeau rouge — surtout si le candidat n'a pas de réponse à « comment sauriez-vous qu'une clé est dupliquée ? ».

4Incrémental et snapshots

Question discriminante

Comment gérez-vous une table de faits volumineuse, et l'historisation d'une dimension qui change ?

{{ config(materialized='incremental', unique_key='order_id') }} select * from {{ ref('stg_orders') }} {% if is_incremental() %} where updated_at > (select max(updated_at) from {{ this }}) {% endif %}
  • is_incremental() + unique_key — ne traiter que le delta, en re-fusionnant proprement les lignes modifiées.
  • Stratégies : append, merge, delete+insert, insert_overwrite — le bon choix dépend du moteur et de la donnée.
  • Le piège des late-arriving data — prévoir une fenêtre de rattrapage plutôt qu'un simple max().
  • snapshots — capturer l'historique d'une dimension (SCD type 2) sans réécrire la logique à la main.

5Structure, conventions et documentation

Question discriminante

Comment organisez-vous un projet dbt destiné à durer et à être repris par une équipe ?

  • Couches : staging (1:1 avec les sources, renommage et typage), intermediate (logique réutilisable), marts (modèles métier).
  • Conventions de nommage : stg_, int_, fct_, dim_ — la cohérence prime sur le goût personnel.
  • Macros et packages pour factoriser la logique répétée.
  • Documentation et exposures — un projet qui se documente lui-même et déclare ses usages en aval.
  • CI/CD : slim CI avec state:modified pour ne (re)construire et tester que ce qui change.

Bon réflexe : un senior parle de conventions d'équipe et de CI avant de parler de syntaxe. La maintenabilité, pas la virtuosité, fait la différence à l'échelle.

6Grille par niveau

NiveauMaîtrise attendueSignal GONO-GO
JuniorMatérialisations de base, ref/source, tests génériquesÉcrit un modèle propre, ajoute unique/not_nullCode un nom de table en dur
ConfirméIncrémental, macros, packages, structure en couchesA construit une couche marts testée et documentéeNe sait pas quand utiliser incremental
SeniorSnapshots (SCD2), contrats, CI slim, performance et coûtsA mis en place l'historisation et la CI state:modifiedNe teste pas ses modèles
LeadGouvernance, mesh / multi-projets, standards d'équipeA défini les conventions et le lineage cross-équipesNe peut pas expliquer view vs table vs incremental

Vous recrutez un profil data ?

Data Builder mène l'entretien technique et vous livre un rapport clair et détaillé sous 24h. Premier entretien offert.

Tester gratuitementRéserver un appel