Skip to content

AI Engineer Interview Daily — 2026-10-28: ML System Design

Oct 28, 20261 min
TL;DRToday's core idea is a feature store's two-layer design — an offline store that's the training source of truth, built around point-in-time correctness, and an online store that serves inference with low latency — plus how materialization, the sync step that bridges them, caps how fresh the online data can be. The practice question is a real Spector AI MLE prompt: design a feature store from scratch and decide how to trade freshness against infrastructure cost. The point isn't naming the offline/online split — it's showing a tiering logic: look at how fast each feature actually changes, then decide whether it needs batch, streaming, or request-time compute.

Look up & save

Loading dictionary…

🌏 中文版

Today's Focus

Today's practice continues with ML System Design, but from a different angle: instead of designing a whole prediction system from scratch, we go deep on a piece of infrastructure that's easy to wave at and hardest to defend under follow-up questions — the feature store. Interviewers like this question because it tests data engineering and online serving at once, and the answer hides a classic trade-off: freshness and infrastructure cost always pull against each other.

This round shows up most in ML Engineer onsites, especially at companies whose products lean heavily on real-time features — recommendations, fraud detection, personalization. What the interviewer is actually listening for usually isn't whether you remember the name "Feast" or a specific vector database — it's whether you first work out how fast a given batch of features actually changes before deciding how expensive an architecture to build for it.

Core Concepts

A feature store's offline/online two-layer architecture
A feature store's offline/online two-layer architectureFeature sources write into the offline store, and can sometimes skip the sync and write straight into the online store; the offline store materializes into the online store on a schedule, and that cadence caps how fresh the online side can be — fast-changing features use a streaming write path that bypasses it. Feature Sources behavior, transactions Offline Store warehouse / DuckDB Online Store low-latency memory Model Training point-in-time Online Inference millisecond lookups stream write batch sync as-of join fast lookup Legend data store async / streaming freshness ceiling

Simplified: schema registry and the shared feature-transform layer are omitted.

1. Offline store and online store serve two completely different purposes

The offline store is the training source of truth — it's built to scan historical data at scale, usually sitting on a data warehouse or lake (BigQuery, Snowflake, or an embedded engine like DuckDB once data sizes run from a few hundred GB to a few TB). The online store is the low-latency query layer inference depends on, built to handle thousands to millions of random reads per second at single-digit-millisecond latency, usually on Redis or a Redis-compatible in-memory store (like Dragonfly). These aren't two modes of the same infrastructure — they're entirely different performance profiles, and laying out that split clearly is what makes an interviewer trust the rest of your design.

2. Point-in-time correctness: an event_timestamp blocks training-data leakage

Pairing a user's current feature values with their past labels leaks the future into training — the model effectively gets to peek ahead. A feature store fixes this by tagging every feature record with an event_timestamp and doing an as-of join at training time: for a given point in time, you only pull the feature values that existed as of that moment, never the latest ones. This is the single biggest difference between a feature store and an ordinary cache, and it's one of interviewers' favorite things to dig into.

3. Materialization is the bridge between the two layers — and the source of the freshness gap

Materialization is the process of periodically syncing the latest computed feature values from the offline store into the online store. That sync cadence is itself the ceiling on freshness: if materialization runs once an hour, the online store's values can always be up to an hour stale. Many candidates skip this step and jump straight to "the online query is fast" — but what the interviewer wants to hear is that "fast to query" and "fresh data" are two separate properties.

4. Freshness tiers: not every feature needs to be seconds-fresh

Streaming every feature pushes infrastructure cost higher than it needs to be. The right move is to tier by how fast each feature changes: slow-changing features (user age, product category) only need daily batch materialization; medium-speed features (views over the last seven days) fit hourly batch or a simple streaming aggregation; only features that genuinely need second-level freshness (this session's latest click, a transaction's device fingerprint right now) are worth a CDC or streaming pipeline, or even computing them at request time. Walking through that tiering logic lands much better with interviewers than just saying "I'd use Kafka for real-time features."

Feature freshness tiers: three levels, three architectures
Feature freshness tiers: three levels, three architecturesFeatures split into three tiers by how fast they change — slow-changing features use daily batch materialization, medium-speed ones use hourly batch, and only fast-changing features justify streaming or request-time compute. Freshness and infrastructure cost rise together as you move up a tier. Cost & freshness: high Cost & freshness: low L3 Fast-changing features session clicks, device info stream / request-time compute L2 Medium-speed features 7-day view count hourly batch materialize L1 Slow-changing features user age, product category daily batch materialize

Simplified: real tier boundaries shift with how freshness-sensitive the business actually is — it isn't a fixed three-way split.

Today's Practice Question

The Question

Your company wants to build a feature store from scratch, shared by several model teams (recommendations, risk, personalization). Explain how you'd design the offline/online two-layer architecture, and what specific trade-offs you'd make between freshness and infrastructure cost.

Source: Real Spector AI MLE interview question (collected in knok.work's interview guide, updated 2026-10-27) Difficulty: Advanced Round: Onsite ML system design

Breaking It Down

  1. Clarify the problem first: ask which models this feature store needs to serve and each one's serving-latency budget; then ask about existing infrastructure — does the company already have a data warehouse? A streaming pipeline (something Kafka-like)? Is the team big enough to run an extra real-time system? These answers directly decide whether you can even talk about streaming features later.
  2. Build the framework: sketch the two-layer skeleton first — an offline store (for training, built around point-in-time correctness) and an online store (for serving, built around low latency), bridged by materialization. Then layer "feature tiering" on top: split features into slow / medium / fast by how quickly they change, and map each tier to batch, streaming, or request-time compute.
  3. Go deep on the core trade-offs: the key trade-off is that the marginal cost of chasing freshness isn't linear — going from daily to hourly batch costs relatively little, but going from hourly batch to second-level streaming means standing up and running an entire CDC or streaming stack, plus handling that stack's own fault tolerance and backfill problems. The second trade-off is the engineering cost of point-in-time correctness itself: an as-of join gets expensive at scale and needs proper indexing and partitioning in the offline batch system — it's not something a casual SQL JOIN solves.
  4. Close it out: give a concrete tiering decision instead of one architecture for every feature. For example: "slow-changing user-profile features run through daily batch into a Redis-compatible in-memory store; seven-day behavior aggregates run hourly batch; but the risk model's 'this transaction's device fingerprint right now' feature, I'd compute at request time and skip materialization entirely, because that kind of feature only exists for this one request." Close with that kind of concrete, tiered answer with real numbers — it tells the interviewer you've actually thought through the cost curve, not just memorized the words "offline" and "online."

Sample Answer (How You'd Actually Say This in an Interview)

I'd start by asking which models need this feature store, what their latency budgets are, and what infrastructure the company already has — if there's already a warehouse and a scheduler, the offline layer doesn't need reinventing. Architecturally I'd split it into two layers: an offline store sitting on the data warehouse — if the data's under a few TB, an embedded engine like DuckDB is actually enough, no need to stand up a large distributed query engine on day one — acting as the training source of truth, with every feature carrying an event_timestamp so training uses an as-of join and never peeks at the future. The online store would be a Redis-compatible in-memory database, handling random reads for inference at single-digit-millisecond latency.

Freshness is really the heart of this question: I wouldn't turn every feature into a real-time stream, because that jumps operational and fault-tolerance complexity up a whole level at once. I'd tier by how fast each feature changes instead — static user profiles run daily batch materialization; medium-speed behavior aggregates run hourly batch; and only features that genuinely need second-level freshness and whose business value justifies that operational cost — like a risk model's real-time device features — get a streaming pipeline, or even get computed at request time with no materialization at all. To close, I'd point out that the materialization schedule itself is the hard ceiling on freshness, and if the business later finds a feature isn't fresh enough, the first question is always "does this feature actually need to be this fresh" — not defaulting to upgrading the whole system to streaming.

Self-Check

Use this table to check whether your answer hit the key points:

Checklist itemCovered?
Distinguished the offline store's purpose (training, point-in-time correctness) from the online store's (serving, low latency)
Explained that materialization is the bridge between the two, and the source of the freshness ceiling
Explained point-in-time correctness / event_timestamp and how it blocks training-data leakage
Tiered features by how fast they change, instead of one freshness strategy for everything
Gave concrete infrastructure choices (batch warehouse, streaming pipeline, in-memory store) with their rough cost levels
Bonus: mentioned reusing an existing Redis-compatible in-memory store for both feature serving and general caching, to cut operational overhead

Further Reading

References