Personalised home feed inspired by YouTube and Netflix: engagement events on a stream into a data lake, daily training that precomputes candidates, two-stage retrieve-then-rank with nearest-neighbour search and a ranking model, an online feature store updated in seconds, filters, variety and cold-start feeds, impression logging, and experiment groups. A teaching design.
See why one popularity list wastes most of the home page.
What was missing: Nothing yet.
Why that's risky: A cooking fan and a gamer see the same 30 videos, so most of the page is wasted. Every watch is a database write, and sorting the videos table runs on every home page view.
What gets added: One server that shows everyone the week's most-watched videos and records each watch in the database.
Trade-offs: No models and no pipelines, but no personalisation either.
Collect training data cheaply, and personalise the feed from a daily batch.
What was missing: No per-user data to learn from, and one list for everyone.
Why that's risky: Recommendations are a day old: a video uploaded this morning can't appear, and what the user watched five minutes ago is ignored.
What gets added: An event service that puts every watch, like and skip onto a stream, an archiver that writes them to a data lake, and a daily training pipeline that learns from them and writes each user's candidate videos to a key-value store the home page reads.
Trade-offs: Batch work is cheap and simple, but personalisation lags by a day.
Score a manageable set of candidates with a strong model, using what the user did seconds ago.
What was missing: Candidates were a day old and nothing scored them against what the user was doing now.
Why that's risky: The feed repeats videos already watched, can fill up with one topic, and new viewers with no history get nothing useful.
What gets added: Two stages. Retrieval cheaply gathers about 500 candidates from the precomputed list and a nearest-neighbour search over video embeddings. Ranking scores each by predicted watch time with a heavier model, using online features (recent watches, freshness, popularity) that feature workers update from the event stream within seconds.
Trade-offs: Ranking only 500 videos means a great video that retrieval misses is never shown. The cheap first stage is what makes a strong second stage affordable.
Make the feed feel fresh and varied, work for new viewers, and train on what users actually saw.
What was missing: Watched videos reappeared, one topic could take over, new viewers got nothing, and training data didn't record what had been shown.
Why that's risky: No way to test a new model safely, nothing stops fake engagement, and one load balancer.
What gets added: The feed drops videos already watched or blocked and mixes topics for variety. New and signed-out viewers get a ready-made regional feed. Every feed shown is logged as impressions, so the model learns from what was skipped as well as what was clicked.
Trade-offs: Variety lowers the predicted score of some slots, but keeps sessions going longer.
Ship model changes safely, keep fake engagement out, and survive prime time.
What was missing: No safe way to try a new model, nothing filtering fake engagement, and one load balancer.
Why that's risky: Remaining risk is feedback loops: a model that only learns from what it showed can narrow what people see. A small share of exploratory recommendations counters that.
What gets added: Experiment groups so each model change runs on a small share of viewers first, a rate limiter against scrapers and fake engagement, a second load balancer, replicas for every serving component, and monitoring of watch time, click-through per experiment, feature freshness and model age.
Trade-offs: Experiments need enough viewers and days to be trustworthy, which slows how fast models ship.
You're in the middle of an interview session. Leaving now will end your current attempt.
Explore concept overviews, real-system examples, key tradeoffs, and interview talking points for each roadmap section.
You've conquered this phase. These are the skills you now own: