Interview Insights · ML Engineer
Why Good ML Engineer Candidates Still Get Rejected
Quick summary — ML rejections
Good ML candidates are usually rejected for the work around the model, not the model itself. An ML engineer job covers more than training. Panels reject strong modellers when they cannot write the SQL that builds a training set, cannot explain how predictions reach users, reach for a complex model when a simple one would do, or present themselves as researchers for an applied role. Each of these gaps is fixable with focused practice, and none needs more modelling skill.
In this guide you will learn:
- The four gaps that sink otherwise strong ML candidates
- The SQL you need to build a correct training dataset
- How to explain serving and training-serving skew simply
- How to show trade-off judgement instead of over-engineering
- How to read the job description so you pitch the right strengths
SECTION 01Where strong ML candidates actually lose the offer
After a hiring panel, each interviewer writes a short note. For strong candidates who still do not get an offer, the notes rarely say 'weak ML knowledge'. They say things like 'needed help to write the query for the labels', 'no idea how the model would be called', or 'proposed a transformer for a problem where rules already work'.
These notes come from rounds that many candidates do not prepare for, because those rounds do not feel like machine learning. But in a working team, an ML engineer who needs a data engineer for every dataset and a backend engineer for every deployment creates more work than they save. The table below maps the common gaps to the rounds where they show up.
| Gap | Round where it shows | Typical panel note | Fix to practise |
|---|---|---|---|
| Cannot build training data | SQL or data round | Struggled with joins and time windows | Write label and feature queries by hand |
| No serving story | ML system design | Unclear how predictions reach users | Sketch batch and online serving for your project |
| Over-engineering | Design or project deep dive | Jumped to deep learning without a baseline | Always propose the simplest working option first |
| Wrong pitch for the role | Hiring manager round | More research than product focus | Map your stories to the job description |
CANDIDATE A (illustrative example)
Modelling: strong, explained boosting and tuning well
SQL: needed hints for a LEFT JOIN with a date window
Design: could not say where features come from at
prediction time
Manager: wants to work on 'cutting-edge research'
Decision: no hire for this applied role
Nothing here says the candidate is weak. Every line says
the candidate is not ready for THIS job yet.CANDIDATE A, after focused practice (illustrative)
Modelling: strong
SQL: wrote the label query with a point-in-time
join on their own
Design: proposed nightly batch scores in a table,
same feature code for training and serving
Manager: 'I enjoy shipping models people use, and I
want to learn your deployment stack'
Decision: hire
The modelling line did not change at all. The decision changed because the gaps around the model were closed. That is where your preparation time often gives the best return.
SECTION 02The SQL gap: building a training set without leaking the future
Real training data does not arrive as a clean CSV. Someone has to write a query that picks the right customers, computes features only from data before a cut-off date, and attaches a label from a window after it. This is called a point-in-time correct dataset, and it is one of the most common SQL tasks in ML interviews.
Candidates who are used to Kaggle data often join every table on customer ID and compute features over all history. That quietly includes events from after the prediction date. The query below shows the correct shape: a snapshot date, features from before it, and a label from the following window.
| Part of the query | Rule | Common mistake | Effect of the mistake |
|---|---|---|---|
| Snapshot date | One fixed date per training example | No date at all | Features and label overlap in time |
| Feature window | Only events before the snapshot | Aggregating all history | Future behaviour leaks into features |
| Label window | Events in a fixed period after the snapshot | Using the current status column | Label definition drifts over time |
| Join type | LEFT JOIN from the customer list | INNER JOIN on activity | Inactive customers silently disappear |
-- Churn training set, PostgreSQL syntax
-- snapshot: 2026-01-01, features from 60 days before,
-- label = no order in the 30 days after
WITH base AS (
SELECT customer_id, DATE '2026-01-01' AS snapshot_date
FROM customers
WHERE signup_date < DATE '2026-01-01'
),
features AS (
SELECT b.customer_id,
COUNT(o.order_id) AS orders_60d,
COALESCE(SUM(o.amount), 0) AS spend_60d,
MAX(o.order_date) AS last_order_date
FROM base b
LEFT JOIN orders o
ON o.customer_id = b.customer_id
AND o.order_date >= b.snapshot_date - INTERVAL '60 days'
AND o.order_date < b.snapshot_date
GROUP BY b.customer_id
),
labels AS (
SELECT b.customer_id,
CASE WHEN COUNT(o.order_id) = 0 THEN 1 ELSE 0 END AS churned
FROM base b
LEFT JOIN orders o
ON o.customer_id = b.customer_id
AND o.order_date >= b.snapshot_date
AND o.order_date < b.snapshot_date + INTERVAL '30 days'
GROUP BY b.customer_id
)
SELECT f.*, l.churned
FROM features f
JOIN labels l USING (customer_id);"I fix a snapshot date. Everything the model may know comes
from before that date, here the last 60 days of orders.
The label comes only from the 30 days after it.
I start from the full customer list with LEFT JOINs, so
customers with zero orders stay in the data. Those are often
exactly the churners.
To get more examples, I repeat this for several snapshot
dates and stack the results, then split by snapshot date."
If you can write and explain this query, you have closed the most common gap I see in strong modelling candidates. Practise it on any public sales or orders dataset loaded into SQLite or PostgreSQL.
SECTION 03Serving and trade-offs: where judgement is tested
The other two gaps are about judgement. The first is serving. When I ask 'how would your model be used?', I want a concrete picture. Does it score all customers every night and write results to a table, or answer a request in milliseconds? Where do the features come from at that moment, and are they computed by the same code as in training? If not, the model sees different inputs in production, which is called training-serving skew.
The second is over-engineering. A strong candidate who proposes a large neural network for a small tabular problem, with no baseline and no thought for latency or maintenance, worries me. The best answers start simple, say what would justify more complexity, and mention the cost of running it.
| Question | Over-engineered answer | Judgement answer | Why the second wins |
|---|---|---|---|
| Score customers for a weekly email | Real-time model API with streaming features | Nightly batch job writing scores to a table | Matches the need at a fraction of the effort |
| Classify support tickets into five queues | Fine-tune a large language model first | TF-IDF with logistic regression as a baseline | Fast, cheap, explainable, sets the bar |
| Detect card fraud at checkout | Batch scoring overnight | Online model with precomputed features | Here the need really is real time |
| Add a new feature to the model | Rewrite it separately in the API | Shared feature function for training and serving | Avoids training-serving skew |
# One function used by BOTH the training job and the API.
from datetime import date
def build_features(orders_60d: int, spend_60d: float,
last_order: date, today: date) -> dict:
days_since = (today - last_order).days if last_order else 999
return {
"orders_60d": orders_60d,
"avg_order_value": spend_60d / orders_60d if orders_60d else 0.0,
"days_since_last_order": days_since,
}
# Training job: build_features(...) for each row of the SQL output
# API: build_features(...) from the live database values
print(build_features(3, 1500.0, date(2025, 12, 20), date(2026, 1, 1)))Q: Classify incoming support tickets into five teams.
"I would start with TF-IDF features and logistic regression.
It trains in seconds, is easy to explain, and gives a baseline.
If accuracy on the hard classes is not good enough, I would
try a small pretrained text model and compare on the same
validation set. I would only move up if the gain justifies
the extra latency, cost and maintenance.
For tickets the model is unsure about, I would route them to
a human queue instead of guessing."
Role fit is the last piece. Read the job description and count how often it mentions deployment, pipelines, APIs or monitoring versus research and papers. Then choose the project stories that match. A candidate pitching research for an applied role is not weak, just misaligned, and panels reject misalignment quickly.
SECTION 04Close your gaps before the next interview
Use these three worksheets to find and close the gaps around your model. They take an evening each and target exactly the rounds where strong candidates lose offers.
Rate yourself 1 (weak) to 5 (strong):
__ I can write a point-in-time training query in SQL
__ I can explain LEFT JOIN vs INNER JOIN effects on rows
__ I can describe batch vs online serving for my project
__ I can explain training-serving skew with an example
__ I always propose a baseline before a complex model
__ I can state the running cost or latency of my design
__ I know whether the role is applied or research
Anything below 4: that is your practice for this week.Use any orders/customers dataset in SQLite or PostgreSQL.
1. Count orders per customer in the 60 days before a date.
2. Same, but keep customers with zero orders.
3. Label customers with no order in the next 30 days.
4. Build features + label for three snapshot dates
and UNION ALL them.
5. Find the share of churners per signup month.
6. Explain out loud why each date filter sits in the ON clause.JOB DESCRIPTION KEYWORDS MY MATCHING STORY
------------------------------ ---------------------------
Deploy / productionise ____________________________
Data pipelines / SQL ____________________________
Monitoring / retraining ____________________________
Stakeholders / business ____________________________
Research / experiments ____________________________
Lead with the stories that match the top two rows of
the job description, not the ones you like most.
SECTION 05Habits that keep strong candidates from slipping
These habits protect your modelling strength from being overshadowed by gaps elsewhere.
- Write SQL every week — Even thirty minutes of joins, window functions and date filters keeps the skill fresh for data rounds that many ML candidates neglect.
- Draw the serving path — For each project, sketch where the request comes from, where features are read and where the prediction goes. Practise explaining that sketch.
- Lead with the simplest option — Start every design with a baseline you could build in a day. Then explain what would justify something bigger.
- Mention cost and maintenance — A sentence about latency, compute cost or who maintains the model shows you think like an engineer, not only a modeller.
- Tailor the pitch to the role — Reorder your stories for each company so the first one matches the main need in their job description.
SECTION 06Interview Q&A — ML rejections
Q1How would you build the training dataset for a churn model in SQL?
I would pick a snapshot date, start from the full customer list, and LEFT JOIN orders from a window before the snapshot to compute features. The label comes from a separate window after the snapshot. I would repeat for several snapshot dates and split by snapshot date to avoid leakage.
Q2What is training-serving skew and how do you prevent it?
It is when the features a model sees in production differ from the ones it was trained on, for example because the API computes them with different code or different data. I prevent it by sharing one feature function or feature store between training and serving, and by logging live features to compare with training distributions.
Q3Would you serve this model in batch or in real time?
It depends on when the decision is made. For a weekly marketing email, nightly batch scores in a table are enough and much simpler. For fraud at checkout, the decision happens during the request, so I need an online model with precomputed features and a strict latency budget.
Q4Why not use a deep learning model for this tabular problem?
I would start with a strong simple baseline like gradient boosting or logistic regression, because they are fast, cheap and easy to explain on tabular data. I would try deep learning only if the baseline falls short of the target and the gain justifies extra cost and maintenance.
Q5Why do you want an applied ML role rather than research?
I enjoy seeing a model used by real people and improving it based on how it behaves in production. In my projects, the most satisfying part was building the pipeline and finding errors after deployment, not only the modelling.
SECTION 07Test yourself — ML rejections quiz
Five questions. No sign-up.
0 / 5Pick an answer to see why it is right or wrong.
SECTION 08Frequently asked questions
Why do I get rejected in ML engineer interviews even with good skills?
Often the gap is around the model rather than in it: weak SQL for building training data, no clear serving plan, over-complex designs, or a pitch that does not match the role. Each can be fixed with targeted practice.
Is SQL important for machine learning engineer interviews?
Yes. Many ML interviews include a SQL round because building a correct training set needs joins, aggregations and date windows. Point-in-time queries are especially common.
What is asked in an ML system design interview?
You are usually asked to design a full ML solution: defining the problem and metric, getting data and labels, choosing a baseline and model, deciding batch or online serving, and planning monitoring and retraining.
How do I show I am not over-engineering in an ML interview?
Start with the simplest model and serving approach that meets the need, explain its limits, and say what result would justify adding complexity. Mention latency and running cost.
What is the difference between an applied ML and a research ML role?
Applied roles focus on shipping and maintaining models that solve product problems, with heavy data and engineering work. Research roles focus on new methods and experiments. Pitch your experience to match the role.
Does Uncodemy help with ML Engineer interview answers?
Yes. Uncodemy's Machine Learning Training Course in Noida (classroom and online) includes live projects, one-to-one mock interviews and resume reviews, so you practise ML Engineer interview answers with trainer feedback before the real interview. You can book a free demo class from this page to see how the sessions work.
SECTION 09Related reads
Classroom & online · Noida
Close the gaps around your ML skills
Our Machine Learning Training Course covers SQL for training data, model serving basics and design trade-offs alongside modelling, so strong skills turn into offers.
Talk to a counsellor for current fees- SQL for ML datasets
- Model deployment basics
- ML system design mocks
- Weekday & weekend batches