The Two-Minute Project Story
35 min · Intermediate
Need help? Ask a tutor on WhatsApp (opens in a new tab)Most interviews start with "Tell me about your project." Your first two minutes set the whole conversation. The interviewer checks three things: do you know what you built, which part is yours, and can you prove it?
The five parts of the story
A project story is a spoken answer of about 250 words in five parts: the problem, what you built, your part, one hard problem and the result.
Each part answers one question, so the listener always knows where you are. Spend about 20 seconds on the first two parts, 30 on your part, 30 on the hard problem, and 20 on the result.
story = { "problem": "Two people could book the same seat.", "solution": "Ticket Booking Service in FastAPI and PostgreSQL.", "my_part": "I wrote the booking endpoint and its tests.", "hard_problem": "Stopping double booking under load.", "result": "A test with 50 threads books each seat once.",}for part, line in story.items(): print(f"{part}: {line}")Example 1 · A story as a checked dictionary
story = { "problem": "Shop owners lose track of stock.", "solution": "Online Store API with FastAPI and SQLAlchemy.", "my_part": "I built the order and stock rules.", "hard_problem": "Two orders must not take the last item.", "result": "12 endpoints and tests for the stock rule.",}needed = ["problem", "solution", "my_part", "hard_problem", "result"]missing = [p for p in needed if p not in story]print("Missing parts:", missing)words = sum(len(line.split()) for line in story.values())print("Words:", words)Missing parts: [] Words: 36
What this code does
- A story is five short lines, kept as data so a program can check it.
missinglists the parts that are not there yet. An empty list means all five are present.- Counting words shows the story is far below the 250-word limit, so it leaves room to add detail.
Learn the five headings, not a script. If you memorise every word, one interruption can make you lose your place.
Your part: say "I" for what you did
Ownership means saying exactly which parts of a project you wrote, designed or fixed yourself, and being able to open that code and explain it line by line.
Interviewers ask "who did what?" because many projects come from tutorials or teams. A course project is fine. Claiming it as all your own idea is not.
tasks = { "login and roles": "me", "product endpoints": "me", "payment mock": "provided in the course",}mine = [t for t, who in tasks.items() if who == "me"]print("I built:", ", ".join(mine))Example 2 · How long does it take to say?
story = ( "Fest tickets sold on a form let two students book one seat. " "I built the Ticket Booking Service in FastAPI and PostgreSQL. " "I wrote the booking endpoint and its tests. " "The hard part was double booking, so I added a unique constraint. " "A test with 50 threads shows each seat is booked once.")words = len(story.split())seconds = round(words / 130 * 60)print(f"{words} words, about {seconds} seconds")53 words, about 24 seconds
What this code does
- People speak about 130 words a minute in an interview.
words / 130 * 60turns the word count into seconds.- A story this short takes under 40 seconds, so there is room to add more detail.
Example 3 · Spotting empty adjectives
story = "A robust and scalable enterprise system with seamless booking."vague = {"robust", "scalable", "enterprise", "seamless", "powerful"}words = story.lower().replace(".", "").split()found = [w for w in words if w in vague]print("Replace with facts:", found)Replace with facts: ['robust', 'scalable', 'enterprise', 'seamless']
What this code does
- Words such as "robust" cannot be checked, so they sound like filler.
- A set makes the membership test quick and the list reads naturally.
- Replace each flagged word with a count, such as "14 endpoints" or "a test with 50 threads".
Use "I" for what you did and "the course gave us" for what you did not. Interviewers trust a candidate who draws that line.
One hard problem is your hook
A hook is one interesting detail in your story, such as a lock, a constraint or a test, that invites the follow-up question you are best prepared to answer.
Pick the part where you had to think. For the Ticket Booking Service it is double booking. For the Online Store API it is stock going below zero. For Course Enrollment it is a full course.
End the hard-problem part with a fact, such as "so I added a unique constraint and a test for it." Then the next question is about your constraint, which you know well.
Next step
Check your understanding
9 quick questions