Interview Insights · Full Stack Developer
Why Good Full Stack Developer Candidates Still Get Rejected
Quick summary — Good but rejected
Being good is not the same as being the best match for this role, this week. Most rejections of good full stack candidates come from a few patterns. The candidate is strong on one layer and thin on another, often frontend-heavy with weak SQL. The team needs a different stack emphasis. The resume claims more than the interview shows, which creates doubt. Or another candidate was simply a closer fit. Some of these you can fix, some you cannot. This page helps you tell which is which and shows two technical gaps that often decide close calls: N+1 queries and React effect bugs.
In this guide you will learn:
- The common patterns behind rejecting good full stack candidates
- Why uneven depth across layers hurts so much
- How the N+1 query problem exposes backend gaps
- A React effect bug that separates confident juniors
- What you can and cannot control after a rejection
SECTION 01The patterns behind rejecting good candidates
When a good candidate is rejected, the debrief discussion is rarely about one bad answer. It is usually about a pattern. The hiring panel compares notes and asks: is there any layer of the stack where this person would need a lot of support? Does what we saw match what the resume promised? How does this candidate compare with the others for the same opening?
The frustrating part is that several of these reasons have nothing to do with your skill in isolation. A frontend-strong candidate can be a great hire for one team and a weak fit for a team that mostly builds APIs. Understanding the patterns helps you focus on the ones you can actually change.
| Pattern | How it shows up | Can you fix it? | Best response |
|---|---|---|---|
| Uneven depth | Strong React, shaky SQL or API design | Yes | Deepen your weakest layer with one focused project |
| Stack mismatch | Team needs Java or Python backend, you know Node | Partly | Target roles that match, show transferable basics |
| Overclaiming | Resume says expert, answers show beginner | Yes | Rewrite the resume to match real depth |
| Close second | Another candidate fitted slightly better | Not directly | Keep applying, ask for feedback, refine |
EXAMPLE PANEL NOTES (illustrative)
Candidate A
+ React components clean, good state handling
+ Explained project UI flow clearly
- Could not write a LEFT JOIN without help
- API returned 200 for errors
- Resume lists 'expert in Node.js'
Concern: backend tasks would need heavy support.
Candidate B
+ Solid in React, comfortable in SQL
+ Explained API errors and status codes
- UI less polished than A
Decision: B is the closer fit for this team.AFTER A REJECTION, ASK YOURSELF
1. Which question made me least comfortable?
______________________________________
2. Which layer was it in?
frontend / backend / database / devops
3. Did my resume promise more than I showed?
Y / N Which line? ____________________
4. Did the role description stress a skill
I barely discussed? ____________________
5. What one thing would most likely have
changed the result? ___________________
Candidate A in the example is genuinely good. The rejection is not a judgement that they cannot code. It is a judgement about this team's needs and the alternatives available.
SECTION 02The backend gap that decides close calls: N+1 queries
Many frontend-strong candidates have built backends that work but have never looked at how many database queries they run. A classic follow-up is: 'Your orders page shows each order with its customer name. How many queries does that make?' If the answer is one query for orders plus one query per order for the customer, that is the N+1 problem.
It works fine with ten rows in development and becomes slow with real data. Spotting it, explaining it and fixing it with a join or a batched query is one of the clearest signals that a candidate understands the backend, not just the frontend.
| Approach | Queries for 50 orders | Problem | When to use |
|---|---|---|---|
| Loop and query each customer | 1 + 50 | Many round trips, slow as data grows | Avoid |
| Single JOIN query | 1 | Slightly more complex SQL | Most list pages in SQL databases |
| Batch with WHERE id = ANY(...) | 2 | Need to stitch results in code | When a join is awkward or across services |
| ORM eager loading | 1 or 2 | Must remember to enable it | When using Sequelize, Prisma or similar |
// Works, but runs one query per order
router.get('/api/orders', async (req, res, next) => {
try {
const { rows: orders } = await pool.query(
'SELECT id, customer_id, total FROM orders ORDER BY id DESC LIMIT 50'
);
for (const order of orders) {
const { rows } = await pool.query(
'SELECT name FROM customers WHERE id = $1',
[order.customer_id]
);
order.customerName = rows[0] ? rows[0].name : null;
}
res.json(orders);
} catch (err) {
next(err);
}
});// One round trip to the database
router.get('/api/orders', async (req, res, next) => {
try {
const { rows } = await pool.query(
`SELECT o.id, o.total, c.name AS "customerName"
FROM orders o
LEFT JOIN customers c ON c.id = o.customer_id
ORDER BY o.id DESC
LIMIT 50`
);
res.json(rows);
} catch (err) {
next(err);
}
});
// LEFT JOIN keeps an order even if its customer
// row is missing, matching the first version.
When you explain the fix, mention why you chose LEFT JOIN rather than INNER JOIN: it keeps behaviour identical to the original code. Preserving behaviour while improving performance is exactly what a careful developer does.
SECTION 03The frontend gap: effects that fetch the wrong data
Backend-strong candidates have the mirror problem on the frontend. A typical question shows a React component that fetches data in useEffect and asks what is wrong. The usual issues are a missing dependency, so the effect does not rerun when an ID changes, and a race condition, where an older slow response arrives after a newer one and overwrites it.
These bugs are common in real apps. A candidate who explains them clearly and fixes them properly shows that they understand React's rendering model rather than copying patterns.
| Bug | Symptom | Cause | Fix |
|---|---|---|---|
| Missing dependency | Changing the user does not reload the profile | userId not in the dependency array | Add userId to the dependency array |
| Race condition | Fast clicking shows the wrong user's data | Old response resolves after the new one | Ignore stale responses in cleanup |
| Infinite loop | Effect runs again and again | Setting state that is also a dependency | Rethink dependencies or derive the value |
| State update after unmount | Warnings or wasted work in older React | Request finishes after the component left | Cleanup flag or AbortController |
function Profile({ userId }) {
const [user, setUser] = useState(null);
useEffect(() => {
fetch(`/api/users/${userId}`)
.then(res => res.json())
.then(data => setUser(data));
}, []); // bug 1: userId missing from dependencies
// bug 2: even with [userId], switching users fast
// can let an older response overwrite the newer one.
return user ? user.name : 'Loading...';
}function Profile({ userId }) {
const [user, setUser] = useState(null);
useEffect(() => {
let ignore = false;
setUser(null);
fetch(`/api/users/${userId}`)
.then(res => res.json())
.then(data => {
if (!ignore) setUser(data);
});
return () => {
ignore = true; // runs before the next effect
};
}, [userId]);
return user ? user.name : 'Loading...';
}
// Each effect run has its own 'ignore' variable.
// When userId changes, cleanup marks the previous
// request as stale, so its late response is dropped.
The component returns plain text to keep the example short. In a real app you would render markup, but the fix is the same. Explaining the closure over ignore, one per effect run, is the part that impresses.
SECTION 04Plan to fix the gaps you control
You cannot control who else applied. You can control your weakest layer and how honestly your resume represents you. Use these three sheets after any close rejection.
RATE YOURSELF 1-5 HONESTLY
Frontend
Components and state ___
Effects and data fetching ___
Backend
Route design and status codes ___
Validation and error handling ___
Database
Joins and aggregates ___
Indexes and N+1 awareness ___
Delivery
Git workflow ___
Deploying the app ___
Lowest two scores = your next focus.FOR EACH SKILL ON YOUR RESUME
Skill: ______________
What level does the wording suggest?
beginner / working / strong / expert
What level would an interview show?
beginner / working / strong / expert
If they differ, rewrite. Examples:
"Expert in Node.js"
-> "Built REST APIs in Node and Express
with validation and JWT auth"
"Proficient in SQL"
-> "Write joins and aggregate queries;
added indexes for slow list endpoints"IF DATABASE IS YOUR WEAK LAYER
- Rewrite one list endpoint with a JOIN
- Log query count per request
- Add one index and check EXPLAIN
IF FRONTEND EFFECTS ARE WEAK
- Build a profile switcher with fast clicks
- Reproduce the race, then fix it
- Explain the cleanup function aloud
IF API DESIGN IS WEAK
- Design CRUD routes for a new resource
- Return correct codes for each error
- Write one API test per error case
SECTION 05Tips to turn close calls into offers
When you are already good, small improvements decide the result. These are the ones that tend to matter most.
- Read the job description closely — If it stresses backend or a specific database, prepare examples from that layer. Show the panel the skills they most need.
- Match your resume to reality — Every line should be something you can discuss confidently for several minutes. Overclaiming turns a good interview into a doubtful one.
- Strengthen your weakest layer — One focused week on SQL or React effects often fixes the gap that keeps causing close rejections.
- Ask for feedback politely — Some companies share a little feedback if asked respectfully. Even one sentence can confirm which layer to work on.
- Keep the pipeline full — Close seconds are normal. Applying steadily means one close call does not stop your momentum.
SECTION 06Interview Q&A — Good but rejected
Q1What is the N+1 query problem?
It happens when code runs one query to load a list, then one extra query for each item to load related data. For 50 orders that is 51 queries. It is fast with small data but slows down as data grows. I fix it with a JOIN, a batched query using the list of IDs, or the ORM's eager-loading feature.
Q2Why does a missing dependency in useEffect cause bugs?
The effect captures the values from the render in which it ran. If a value like userId is not in the dependency array, React does not rerun the effect when it changes, so the component keeps showing data for the old value. The lint rule for hooks warns about this.
Q3How do you prevent a race condition when fetching in useEffect?
I use the cleanup function. Each effect run declares a local ignore flag set to false, and the cleanup sets it to true. When the dependency changes, the old effect's cleanup runs, so its late response is ignored. An AbortController can also cancel the request itself.
Q4When would you choose LEFT JOIN over INNER JOIN in an API query?
When I want to keep rows from the main table even if the related row is missing. For example, listing orders should still show an order if the customer record was removed. INNER JOIN would silently drop that order, which changes behaviour.
Q5How do you see how many queries an endpoint makes?
I turn on query logging in the ORM or database driver, or add a small counter around the query function in development. Then I call the endpoint once and count the logged queries. Many ORMs have a logging option that prints each SQL statement.
SECTION 07Test yourself — Good but rejected 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 even after a good interview?
Often because another candidate matched the role slightly better, or the panel found one layer of your skills weaker than the team needs. It does not necessarily mean the interview went badly.
What are common reasons full stack developers fail interviews?
Uneven depth across frontend, backend and database, weak SQL, unclear API design, resumes that claim more than the candidate can explain, and difficulty explaining their own project in detail.
Should a full stack developer be equally strong in frontend and backend?
Not equally, but no layer should be a serious gap. Many developers lean one way. Interviewers want to see that you can work independently on routine tasks in every layer.
How do I ask for feedback after an interview rejection?
Send a short, polite email thanking them and asking if there is one area they would suggest you improve. Some companies cannot share feedback, so accept a no gracefully.
How do I fix weak SQL as a full stack developer?
Practise joins, GROUP BY and subqueries on a sample database, then rewrite one of your project endpoints to use a proper join. Check query plans with EXPLAIN to understand indexes.
Is there a course that covers Full Stack Developer interview answers?
Yes. Uncodemy's Full Stack Development Training Course in Noida (classroom and online) includes live projects, one-to-one mock interviews and resume reviews, so you practise Full Stack Developer 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 gap that costs you offers
Our Full Stack Development Training Course covers every layer of the stack in depth, from React effects to SQL joins and API design, so no single layer holds you back.
Talk to a counsellor for current fees- Frontend and backend depth
- SQL and query tuning
- Mock interview rounds
- Weekday & weekend batches