Field card · Data & analytics
alextouvras.com
When the number is real enough

Analytics is a stack, not a dashboard

Ask → name → define → consume

Question, grain, truth layer, and consume path are layers. Tools are lanes. Most teams need fewer products than the roadmap implies — add complexity only when the decision actually requires it.

ASKQuestion — what decision does this number serve?
GRAINUnit — customer, account, day, claim… named once
TRUTHDefinitions — where the number becomes official
USEConsume — notebook, model, scorecard, or API

Problem → use → example

If the real problem is… Use Example case
Nobody agrees what “active customer” means Metrics / semantic layer One definition of active_30d owned upstream; every BI tool and notebook reads it — no local COUNT DISTINCT remixes
Raw dumps keep breaking Monday reports Curated / gold tables SQL or Python builds a typed fact table with tests; dashboards read gold, not the landing zone
Shape of the question is still fuzzy Notebook + SQL Spike in churn last week — slice in a notebook first; graduate joins and metrics only after the grain holds
Leadership needs a cold-open decision pack Scorecard / KPI pack Five measures, one page, named owner; exploration dashboards stay off this path
Self-serve without rewriting business rules in every report Governed semantic model Star schema + measures in the model; pages compose, they don’t redefine PD or ECL
Heavy joins or volume that local SQL can’t finish Warehouse / lakehouse Multi-year transaction history for RFM; compute close to storage, publish a narrow gold table out
Fast local analysis that still needs to share DuckDB / MotherDuck Parquet on disk for a credit cohort study; push the reproducible query, not a mystery workbook
Regulated / risk number must be auditable Versioned inputs + assumptions PD scorecard run: freeze feature store cut, document exclusions, store the model ID next to the ECL output
One-off exec ask by Friday Spreadsheet (then graduate) Board slide number from a controlled extract; if it recurs twice, promote grain + definition to gold
Don’t know if the number moved for the right reason Reconciliation / lineage Compare source counts vs gold vs semantic measure; block publish when the gap has no named cause
Ops needs near-now status, not last night’s batch Near-real-time path Queue depth and fail rate on a 5-minute lag; keep strategic KPIs on the batch truth layer

Default build order: name the question and grain → curated tables with tests → shared definitions → consume surface → lineage/reconcile before you scale tools.

Tool picker

dbtVersioned transforms + tests as code
DuckDB / MotherDuckLocal-to-cloud speed for analytics SQL
DatabricksVolume, lakehouse, shared compute
Python / JupyterExploration, features, one-off science
Power BI / LookerGoverned consume + scorecards
Semantic layerShared metrics across tools
OpenLineageWhere did this number come from?

Definition vs report

Definitions · travel Grain, keys, and measures that other systems can reuse. Own them upstream of any single dashboard.
Reports · compose Layout and audience. A page should not invent PD, ECL, or “active” — it should bind to named definitions.
Memory check ASK = decision. GRAIN = unit. TRUTH = official number. USE = how humans see it.

Ladder + gates

  1. Named question + grain
  2. Trusted extract / spreadsheet (time-boxed)
  3. Curated tables + tests
  4. Shared definitions / semantic model
  5. Scorecard or governed self-serve
  6. Lineage + reconcile before scale
Kill switch If you can’t name the grain, the owner, and how to stop a bad publish, you don’t ship the number.

Anti-patterns

Always on

SecurityWho can see and change the number
GovernanceNamed owner of grain and definitions
ObservabilityLineage from source to published measure
EvalsTests on gold before a number ships
Human ApproveStop a bad publish; unexplained gaps stay dark