
Most frontend coding interviews ask you to write code. A code review interview turns that around: you're given code someone else wrote and asked to evaluate it.
You might receive a React component, a JavaScript function, or a small pull request. Your job is to understand the implementation, identify meaningful problems, and explain what you would change.
But finding bugs is only part of the exercise. Interviewers may also evaluate how you approach unfamiliar code, prioritize issues, recognize good engineering decisions, and communicate feedback.
This guide explains what to expect, how to approach a code review interview, and how to prepare using a practical frontend example.
A frontend code review interview is a technical assessment in which you're asked to evaluate existing code rather than build a solution from scratch.
You may be asked to identify correctness issues, accessibility problems, security risks, or maintainability concerns. Depending on the format, you'll either discuss your findings with the interviewer, write review comments, or implement selected changes.
For example, a pull request might add a search component that works under normal conditions but crashes when an API request fails. You'd be expected to identify the problem, explain its impact, and suggest a reasonable fix.
Unlike a debugging exercise, a code review also involves evaluating implementation decisions, tests, and whether a change is ready to merge.
Yes, although they aren't standard across every frontend hiring process.
Frontend candidates have reported reviewing React and TypeScript snippets during interviews, while others have described discussing improvements to existing implementations.
NICE Digital has also published an interview code review exercise in which lead developer candidates review a prepared solution and present feedback to a panel.
The format varies by company and role, so confirm with your recruiter what your interview involves.
Code review assessments generally take one of three forms.
Reviewing unfamiliar code: You're given a component or function and asked to identify problems, explain its behavior, and suggest improvements. You might discuss findings aloud or write comments in a shared editor.
Reviewing a prepared pull request: You're provided with a change and its requirements. Your task is to evaluate whether it meets those requirements, identify important issues, and decide whether you'd approve it or request changes.
Discussing an earlier coding exercise: You review code you previously submitted and explain your decisions, limitations, and potential improvements. The interviewer may also ask you to make a small change.
Regardless of format, the goal is to demonstrate how you evaluate existing code and make engineering decisions.
A strong code review demonstrates more than bug-finding ability.
| Skill | What it means |
|---|---|
| Correctness | Identifying bugs, edge cases, and incorrect assumptions |
| Prioritization | Distinguishing critical issues from minor improvements |
| Code quality | Evaluating readability, complexity, and maintainability |
| Testing judgment | Recognizing missing tests and untested behavior |
| Frontend knowledge | Considering accessibility, security, performance, and user experience |
| Communication | Explaining issues clearly and suggesting actionable improvements |
The goal isn't to produce as many comments as possible. It's to identify the issues that matter and explain why they deserve attention.
When you're given unfamiliar code, don't immediately start looking for mistakes. First understand what the implementation is supposed to do.
Read the pull request description or ask the interviewer for context.
Establish what the feature does, where its data comes from, and what behavior is expected.
Consider:
If the behavior depends on information you don't have, ask before making assumptions.
For example, rendering HTML from an API might be a security concern, but the actual risk depends on whether the content is trusted and sanitized.
Walk through how the code behaves beyond the successful case.
For a component that fetches data, check what happens when a request fails, returns unexpected data, or completes after a newer request.
For interactive components, consider empty inputs, repeated actions, prop changes, and unusual user behavior.
Focus on problems that could produce incorrect results or broken functionality.
Once you've checked correctness, review the areas that affect user experience and code quality.
Accessibility: Can the interface be used with a keyboard? Are controls properly labeled? Are semantic HTML elements used?
Security: Is untrusted content handled safely? Are secrets exposed in client-side code?
Performance: Is expensive work repeated unnecessarily? Are there avoidable network requests or rendering problems?
Maintainability: Is the code understandable? Are responsibilities clearly separated? Does the implementation introduce unnecessary complexity?
You don't need to find a problem in every category. Only raise issues that are relevant to the code.
Look at whether the tests cover important behavior and failure cases.
For example, a test that verifies one successful API response won't detect a race condition between two requests.
A stronger test would resolve an older request after a newer one and confirm that outdated results don't replace the current ones.
Ask yourself: Would these tests fail if the behavior they're supposed to protect were broken?
Not every issue deserves equal attention.
| Priority | When to use it | Example |
|---|---|---|
| Must fix | Bugs, security vulnerabilities, inaccessible functionality, or broken requirements | A form submits incorrect data |
| Should fix | Meaningful maintainability problems or important missing coverage | Duplicated logic that can get out of sync |
| Optional | Minor improvements or preferences | Renaming an understandable variable |
Severity depends on the impact and context. When you can't confirm whether something is a problem, explain the potential risk and ask for clarification.
Don't treat every comment as a blocker.
A useful review comment explains the problem, its impact, and a possible direction for fixing it.
Weak feedback:
> This API handling is wrong.
Better feedback:
> The component doesn't check whether the request succeeded before reading the response. If the server returns an error object instead of a user array, the component could crash. Could we check *response.ok* and handle the error state?
You don't need to rewrite the implementation unless the interviewer asks.
Also acknowledge good decisions. A useful review identifies what should remain unchanged, not only what needs fixing.
Let's apply this approach to a fictional pull request. This is a practice exercise, not a question attributed to any company.
A developer submits the following change:
> Adds a team directory that loads team members, displays their names and biographies, and lets users select a member.
You have 15 minutes to review the implementation. Identify the most important concerns, decide what should block the merge, and prepare feedback.
Before reading the findings, consider what the component does correctly, what assumptions it makes, and what you'd raise first.
1. API failures aren't handled
Priority: Must fix
The component doesn't check HTTP status codes or handle request failures. If the API returns an error object instead of an array, rendering may crash.
Review comment:
> The fetch handler doesn't check whether the request succeeded. Could we handle unsuccessful responses and show an error state? Otherwise, an API error response could cause the component to crash.
2. The selection control isn't keyboard accessible
Priority: Must fix
The user's name is inside a clickable *div*, which isn't keyboard-focusable or keyboard-operable by default.
Review comment:
> The user name is clickable, but keyboard users can't reach or activate it. Could we use a native button here? That would provide keyboard interaction and the correct semantics.
3. The biography may introduce an XSS vulnerability
Priority: Must investigate; blocking if the HTML is untrusted and unsanitized
The component inserts the biography using *dangerouslySetInnerHTML*. This can introduce an XSS vulnerability if the value contains untrusted HTML.
Review comment:
> Is *bio* user-generated content, and is it sanitized? If it's plain text, we can render it directly in JSX. If HTML formatting is required, we need to ensure it's sanitized before rendering.
4. Older requests can overwrite newer results
Priority: Must fix if *teamId* can change while requests are pending
When *teamId* changes, a new request starts without invalidating the previous one. An older response could arrive last and display users from the wrong team.
Review comment:
> If *teamId* changes while a request is pending, the older response can overwrite the newer team's results. Could we cancel the previous request or ignore its result during effect cleanup?
Once you've identified the issues, present your most important findings rather than reading every comment separately.
For example:
> The component is small and easy to follow, and it correctly uses stable user IDs as keys. Before merging, I'd address the missing API error handling and keyboard accessibility, check whether the biography HTML is safe, and protect against outdated requests. I'd also want tests covering failures and team changes. I wouldn't suggest a larger refactor because the component is otherwise straightforward.
This demonstrates prioritization, technical judgment, and the ability to communicate without proposing unnecessary changes.
Treating every issue as a blocker. A potential security vulnerability and a naming preference shouldn't carry the same severity. Prioritize based on impact.
Suggesting changes without explaining why. "Use memoization" or "split this component" isn't useful unless you explain what problem it solves.
Rewriting instead of reviewing. Unless implementation is required, focus on identifying problems and explaining improvements.
Making assumptions without context. Ask questions when missing information affects whether something is actually a bug.
Spending too much time on one issue. In a time-limited review, move through the code systematically and return to lower-priority details if time remains.
Find small pull requests in open-source frontend projects.
Read the requirements, review the implementation, and write down your findings before looking at the actual review comments.
Compare your feedback with what experienced reviewers discussed.
Give yourself 15 to 20 minutes to review a component or small pull request.
Spend the first few minutes understanding the requirements, most of the time examining correctness and important risks, and the final minutes prioritizing your findings.
For each issue, practice answering:
Keep your explanations concise and specific.
Ask the recruiter whether you'll review unfamiliar code, discuss your own implementation, or make changes during the session.
Also clarify whether feedback should be written or explained verbally.
No. In a time-limited exercise, identifying and explaining important problems is more useful than listing every minor improvement.
Be clear about which parts of the code you've reviewed and what you haven't checked.
It depends on the format. Some interviews focus on written or verbal feedback, while others ask you to implement selected improvements.
Confirm the expectations before the interview.
Explain what you've understood and ask for missing context.
You can also describe how you'd investigate the behavior using documentation, tests, or a running application. Don't make claims you can't support.
A frontend code review interview tests how you understand unfamiliar code, identify risks, prioritize improvements, and communicate feedback.
The most effective preparation is to practice reviewing real code rather than memorizing hypothetical interview questions.
Start with the intended behavior, check correctness and important edge cases, consider accessibility and security, and review whether the tests provide meaningful confidence.
A short review with clear reasoning and actionable feedback is more valuable than a long list of unnecessary changes.
Frontend debugging interview questions with answers: dead clicks, breakpoints, source maps, overflow, the CSS cascade, CORS, jank, memory leaks, Safari and races.
A frontend-focused guide to machine coding round questions, including what is machine coding round, how to prepare for machine coding round interviews, and how to practice in React.
Accessibility interview questions for 3 years experience: native elements, labels, alt text, contrast, focus, landmarks, zoom, tables and carousels, mapped to WCAG.
Prepare for frontend web security interview questions with scenario-based answers on XSS, CSRF, CORS, cookies, CSP, token storage, browser boundaries, and secure UI habits.