Mini Project vs Major Project: How to Scope a Final Year Build
A mini project is one hard thing done properly in four weeks. A major project is a system. Here is how to scope either one so you can actually finish it — and defend it.
Most final year projects do not fail in the last week. They fail in the first week, in the ten minutes where a team picks something that sounds impressive and writes it on a form. Everything after that is a slow discovery of how big the thing actually was. The mini project vs major project question is not really a question about size. It is a question about what you can finish, understand completely, and still defend when someone pushes on it.
The examiner in your viva has twenty minutes and has already sat through several projects that day. The thing being tested is not whether your idea was ambitious. It is whether you understand the system in front of you: where it breaks, why you chose this over that, and what happens when the input is bad. An unscoped project makes those questions unanswerable, because you never had time to understand any single part of it.
This post covers the real difference between a mini project and a major project, how to turn a vague department brief into a scoped one, a worked example of narrowing a bad problem statement into a defensible one, a week-by-week skeleton for a 12-week capstone, and the order in which to cut scope when you are behind. You will be behind.
What actually separates a mini project from a major project
It is not size, and it is definitely not screen count. The difference is structural.
- A mini project is 3 to 4 weeks. It is one hard thing, done properly. It does not need architecture. It needs a correct implementation of a single non-trivial idea, and you need to be able to explain why it works.
- A major project is 10 to 12 weeks. It is a system: two or more components with contracts between them, real data flowing through, state that persists, and something deployed. The hard thing is still there, but now it has to survive contact with the rest of the system.
The defense differs the same way. For a mini project, the question is whether it works and whether you know why. For a major project, the question is why it is built this way: why a queue and not a cron job, why Postgres and not a JSON file, why this model and not the simpler one that would have been almost as good.
The scoping trap: you picked a topic, not a problem
This is the most common mistake, and it stays invisible until about week six. Students pick topics. Topics are areas: blockchain in supply chain, AI in agriculture, IoT for smart cities. A topic has no failure condition, which means it has no finish line, which means you can work on it forever and never be done.
A problem has four things. If you cannot fill in all four, what you have is still a topic:
- A user. Someone specific who has this problem. Not "farmers" — a farmer standing in a field holding a phone.
- A decision. What does this person do differently because your system exists? If nothing changes, the system is decoration.
- A cost of being wrong. What does a false positive cost? A false negative? These are not the same, and pretending they are is why so many students end up reporting accuracy on imbalanced data.
- A way to check. How do you know it worked, on data the system has never seen, measured the way the real world would measure it?
"AI in agriculture" fails all four. "Detect leaf blight from a phone photo taken in field lighting, so a farmer decides whether to spray this week, where a missed infection costs a crop and a false alarm costs one spray" passes all four — and now you know exactly what to build and exactly what to measure.
How do I turn a vague department brief into a scoped one?
Departments hand you one line. "Machine learning for healthcare." "Web application for campus management." Your job is not to complain about it. Your job is to convert it into a contract with yourself, in writing, before you open an editor. Answer these five, in this order:
- Who is the user and what decision are they making?
- What data actually exists, today, that I can get my hands on this week?
- What is the one hard thing here — the part that could genuinely fail?
- What is the dumbest possible version that still does the hard thing? That is v1.
- What am I explicitly not doing? Write the list. It is the most useful part.
Then commit it to the repo as scope.yml and update it whenever reality changes. It is worth more than a Gantt chart: half the viva questions are answered directly out of it, and in week nine, when you are behind and tempted to invent new work, the not_doing list is the thing that stops you.
Worked example: narrowing "AI for healthcare" into something defensible
Start with the brief as given: AI for healthcare. Useless. Pass one, pick a user and a decision: a discharge planner deciding whether to book a follow-up call. The output is no longer "insight", it is a yes or no about a specific patient at a specific moment.
Pass two, data reality. There is a well-known public dataset of roughly a hundred thousand diabetic hospital encounters. Two facts about it matter more than anything you will read in a paper. First, it has two ID columns: encounter_id identifies a visit, patient_nbr identifies a person, and the same person appears across many rows. Second, missing values are written as the literal string "?", so if you read the CSV naively, "missing" quietly becomes a first-class category in every column. Run df.isna().mean().sort_values() before you trust anything — you will find that weight is empty for roughly 97 percent of rows, which is why nobody serious uses it as a feature.
Pass three, find the one hard thing. It is not the model; any gradient-boosting library fits this in three lines. The hard thing is evaluating it honestly, because the obvious split puts the same patient on both sides. Here is the wrong version, which is what a lot of submissions contain:
The model gets to see a patient's earlier admissions while training and is then scored on their later ones, so it can memorise the person instead of learning the pattern. Your reported score is then partly a measure of memorisation, and you should expect it to be optimistic — how optimistic depends on how many of your encounters are repeat patients, so measure it rather than guessing. Either way you cannot defend the number, and "did you split by patient or by row?" is a very easy question for an examiner or an interviewer to ask.
The fix is two changes, and together they are the spine of the project. Split on people, using GroupShuffleSplit with patient_nbr as the group. And put the preprocessing inside the pipeline, so that the exact transformer fitted on the training data is the object that later runs at inference — otherwise your deployed API and your trained model disagree about what a feature even is, and you will not find out until something returns nonsense.
Three things just happened. Your reported score is now honest. You stopped shipping a probability and started shipping a decision, with the threshold derived from which mistake hurts more. And the feature list is now a real, named, frozen thing — eight columns, not whatever get_dummies happened to produce — which means the API you deploy in a moment can actually be built against it.
One more move, and it is the one people skip. Do not put the no-leakage assertion next to the splitter, where it checks a property GroupShuffleSplit already guarantees and can never fail. Put it in the eval script, where it reads the split back out of the saved artifact. There it can fail, because a future refactor of train.py can quietly reintroduce the leak, and this is the thing that catches it.
An examiner cannot break a project that has already told them where it breaks.
The final scoped statement now fits in one sentence: "A readmission-risk service for diabetic inpatients, evaluated with a patient-grouped split so that no patient appears in both train and test, with a decision threshold tuned to a 60 percent recall target, served from a deployed API whose request schema is the model's feature schema." That is a defensible major project. "AI for healthcare" was not.
The one hard thing rule
Every good project has exactly one part that could genuinely fail — where you do not know the answer on day one and have to go find out. Everything else exists to hold that part up.
- ML: honest evaluation under leakage, class imbalance, or distribution shift. Rarely the model itself.
- Systems: making something correct under concurrency, or fast when it has no right to be.
- Embedded: doing real work inside a power, memory, or latency budget you cannot exceed.
- Web and product: a genuinely hard piece of state — offline sync, conflict resolution, real-time collaboration.
- Security: a threat model you can articulate, and a mitigation you can demonstrate breaking and then holding.
Everything around the one hard thing should be boring on purpose. Postgres. A single server. Server-rendered pages. A managed host. Boring infrastructure is not a lack of ambition; it is what buys you the weeks you need for the part that is actually hard. Two hard things in a 12-week project usually means you do neither of them well, and the seam between them is exactly where the viva goes.
A week-by-week skeleton for a 12-week capstone
The ordering matters more than the content. Note where deployment sits — week three, not week eleven.
- Week 1: Write scope.yml. Get the data or the API keys in hand. If the data does not exist, the project does not exist — find that out now, not in week seven.
- Week 2: Build the ugliest end-to-end path. Input goes in one end, a garbage answer comes out the other. Hardcode everything. It must run.
- Week 3: Deploy that garbage version to a real URL. Yes, now. This is the cheapest week you will ever have to fight config, secrets, ports, and build tooling.
- Week 4: Set up the evaluation or the test harness — the thing that tells you whether you are getting better. Before you try to get better.
- Weeks 5-7: The one hard thing. This is the project. Protect these three weeks like rent.
- Week 8: Freeze the core. No new capability after this point. Write down the honest numbers, including the disappointing ones.
- Week 9: The system around it — persistence, auth if you truly need it, error handling, the interface a human touches.
- Week 10: Break it on purpose. Empty input, huge input, malformed input, the network dying mid-request. Fix what you can, document what you cannot.
- Week 11: The report and the README. Diagrams of the real architecture, not the one you imagined in week one.
- Week 12: Rehearse the defense out loud, in front of someone who will interrupt you. Leave buffer for the thing that will go wrong.
What do I cut when I am behind?
You will probably be behind by week eight. That is normal and survivable, as long as you cut in the right order. Cut from the top of this list first:
- Breadth of data. One disease, one crop, one city, one language. Not five.
- Feature count. The three features nobody asked for, including the admin panel.
- UI polish. A plain, fast, working interface is far easier to defend than a beautiful broken one.
- Extra models and extra comparisons. Two baselines you understand beat six you cannot explain.
- Real-time anything. Batch is fine. Say it is batch and say why.
Never cut these three: the evaluation, the deployment, and the honest write-up of what does not work. And when you cut, cut loudly — put it in the report as a named limitation with a reason. "We did not audit fairness across demographic subgroups: splitting the held-out set by subgroup left too few positive readmissions in several groups to report a rate we could stand behind, so we report none and name it here." A limitation you declared reads very differently from one that gets discovered.
Why "deployed to a real URL" changes how the project is read
A local demo asks the viewer to trust you. A URL does not ask for anything; it either loads or it does not. But the real value is not the impression. Deployment forces you to confront what a laptop demo lets you avoid: config that is not hardcoded, secrets that are not in the repo, a model small enough to load, latency you can measure, cold starts, CORS — and above all the feature contract, because the moment a request arrives as JSON you have to say exactly which columns your model expects and in what form. That is precisely why the fitted pipeline gets persisted and reused rather than rebuilt at inference.
Those last two tests are what separate a project from an exercise, and note carefully what makes them work. They send a complete, valid payload and corrupt exactly one field. That only returns 422 because the request model constrains the value — age is a Literal of the dataset's ten bucket strings, not a free string. If you type age as a plain str, then "banana" is a perfectly good string, your service accepts it, the one-hot encoder shrugs at an unknown category, and you cheerfully score a patient who does not exist. Returning a clean 422 instead of a stack trace, or worse a confident number, is the difference between something that was built and something that was submitted.
The questions you will actually be asked
Scope your project so that you can answer all of these in one breath:
- What is the input, and what is the output? Say it in one sentence.
- How did you split the data, and why that way?
- What is your baseline, and by how much do you beat it?
- Show me where it fails. What input breaks it?
- Why this technology and not the simpler one?
- What did you cut, and why?
- What would you do with four more weeks?
None of them are about how ambitious your idea was. Every one of them is about whether you understand the thing you made. A tightly scoped project can answer all seven. A sprawling one struggles with every single one, which is exactly why it is so uncomfortable to stand next to.
This is how we scope work at Tenzok: one hard thing, boring infrastructure around it, deployed early, and an honest number rather than an impressive one. It is not a trick. It is what shipping software looks like when somebody has to maintain it afterwards.
So pick the smallest problem you would still be proud to defend, and then defend it properly. That is worth more than an ambitious project you have to apologise for.
Frequently asked