← Nordstrom Interview Insights

Nordstrom·Software Engineer·Technical Phone Screen·Intermediate

IntermediatePrefer not to say
Jun 2026Remote

Summary

Nordstrom frontend interview that was basically a React/TypeScript coding session with a lot of follow-up questions layered on top. More conceptual depth than I expected for what sounded like a straightforward UI task.

Questions Asked (5)

Q1

Using React and TypeScript, build a small UI that supports adding, editing, removing, and filtering a list. Use useState, useCallback, onChange, onClick, and useRef where appropriate, and make sure list items have stable keys.

Technical Trade-offsAPI & IntegrationsSystem Design
Author's notes

The scope sounds manageable until you realize they want you to justify every hook choice as you go.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and edge cases, then outline a component structure with a parent managing state and child components for form and list. Implement CRUD operations with useState and useCallback, using useRef for input focus, and ensure stable keys by using unique IDs. Discuss trade-offs like controlled vs uncontrolled inputs and performance optimizations.

Pro tip: Demonstrate awareness of accessibility and user experience by mentioning ARIA labels and keyboard navigation, and discuss how you would test the component with React Testing Library.

1. Clarify Requirements and Edge Cases

Ask clarifying questions about filtering behavior (e.g., case sensitivity, partial matches), editing UX (inline vs modal), and data persistence. Identify edge cases like empty list, duplicate items, and validation.

2. Design Component Architecture

Propose a component hierarchy: a parent component holding state (items, filter text, editing state) and child components for the form, list, and list item. Explain how props and callbacks flow between them.

3. Implement State and Handlers

Use useState for items array, filter string, and editing ID. Use useCallback for event handlers (add, edit, remove, filter) to prevent unnecessary re-renders. Use useRef to focus the input after adding or editing.

4. Ensure Stable Keys and Performance

Generate unique IDs for each item (e.g., using crypto.randomUUID or a counter) to use as keys. Discuss how stable keys help React reconciliation and avoid bugs when filtering or reordering.

5. Discuss Trade-offs and Extensions

Talk about controlled vs uncontrolled components, using useReducer for complex state, and potential optimizations like memoization. Mention how you would test the component and handle accessibility.

Key Points to Mention

  • Use of useState for managing list items, filter text, and editing state.
  • Use of useCallback to memoize event handlers and prevent unnecessary re-renders.
  • Use of useRef to manage focus on input fields for better UX.
  • Importance of stable keys (unique IDs) for list items to ensure correct React reconciliation.
  • Handling of controlled inputs with onChange and onClick events.
  • Trade-offs between different state management approaches (e.g., useState vs useReducer) and performance considerations.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q2

Explain the difference between controlled and uncontrolled inputs in React, and describe how asynchronous state updates affect your component logic.

Technical Trade-offsSystem Design
Author's notes

I fumbled the async state part more than I'd like to admit.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clearly defining controlled and uncontrolled inputs, highlighting the role of React state versus the DOM. Then explain how asynchronous state updates can lead to stale state and race conditions, and describe strategies to handle them. Finally, connect this to trade-offs in real-world scenarios, such as performance and simplicity.

Pro tip: Emphasize that controlled inputs enable predictable state management and are essential for complex forms, but uncontrolled inputs can be more performant for simple cases. Mention that understanding async updates is crucial for avoiding bugs in event handlers and effects.

1. Define controlled inputs

Explain that controlled inputs have their value driven by React state, with onChange handlers updating state. This makes React the single source of truth.

2. Define uncontrolled inputs

Explain that uncontrolled inputs store their value in the DOM, accessed via refs. React does not manage their state, making them simpler but less predictable.

3. Compare trade-offs

Discuss when to use each: controlled for validation, dynamic inputs, and complex forms; uncontrolled for simple forms, file inputs, and performance-sensitive cases.

4. Explain asynchronous state updates

Describe how setState is asynchronous and batched, which can cause stale state if you rely on the current state value immediately after calling setState.

5. Mitigate async issues

Mention using functional updates (e.g., setState(prev => ...)), useEffect with dependencies, and refs to access latest values. Also discuss race conditions in async operations.

Key Points to Mention

  • Controlled inputs: value prop + onChange handler, state-driven
  • Uncontrolled inputs: defaultValue + ref, DOM-driven
  • Asynchronous setState and batching in React
  • Stale state closures in event handlers and effects
  • Functional updates to avoid stale state
  • Race conditions in async operations and cleanup in useEffect

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q3

How do you properly type event handler parameters in TypeScript when passing them as props in React?

Technical Trade-offs
Author's notes

Pretty standard but I initially typed an onClick as just Function and they flagged it immediately.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the scenario: typing event handlers passed as props in React with TypeScript. Then explain the common patterns, such as using React's built-in event types (e.g., React.MouseEvent<HTMLButtonElement>) and defining prop types with function signatures. Emphasize the importance of specificity to avoid using 'any' and to ensure type safety.

Pro tip: Mention that you can use generics to create reusable event handler types, and that you should avoid over-typing by leveraging TypeScript's inference where possible. Also, note that React's type definitions have evolved, so staying updated with the latest @types/react is crucial.

1. Identify the event type

Determine the specific React event type based on the element and event, such as React.ChangeEvent<HTMLInputElement> for input changes or React.MouseEvent<HTMLButtonElement> for clicks.

2. Define the handler function

Write the event handler function with the appropriate event parameter type, ensuring it matches the event type identified.

3. Type the component props

In the child component's props interface, define the handler prop as a function type that accepts the event and returns void (or appropriate return type).

4. Pass the handler as a prop

In the parent component, pass the handler function to the child, ensuring the types align. Use TypeScript to catch any mismatches.

5. Handle optional and generic cases

For reusable components, consider using generics to type event handlers flexibly, and mark props as optional if the handler might not always be provided.

Key Points to Mention

  • Use React's synthetic event types like React.MouseEvent, React.ChangeEvent, etc., instead of native DOM events.
  • Specify the element type in the generic, e.g., React.MouseEvent<HTMLButtonElement>, to get accurate target typing.
  • Define prop types using function signatures, e.g., onClick: (event: React.MouseEvent<HTMLButtonElement>) => void.
  • Avoid using 'any' for event types; leverage TypeScript's type inference and React's type definitions.
  • Consider using generics for reusable components to accept different event types.
  • Ensure consistency between parent and child components by sharing types or using utility types like React.ComponentProps.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q4

What security concerns are relevant to a UI like this, and how would you address them?

System DesignTechnical Trade-offs
Author's notes

Did not see this coming in a frontend coding round.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the UI's context and data sensitivity, then systematically cover the main security concerns: authentication, authorization, input validation, data protection, and secure communication. For each concern, propose concrete mitigations and tie them to Nordstrom's e-commerce environment, emphasizing a defense-in-depth strategy.

Pro tip: Demonstrate awareness of both client-side and server-side security, and mention how you'd balance security with user experience—showing you understand real-world trade-offs in a retail setting.

1. Clarify the UI and its data

Ask questions to understand what the UI does, what data it handles (e.g., PII, payment info), and who the users are. This ensures your security analysis is relevant and targeted.

2. Identify potential threats

Enumerate common web security risks such as XSS, CSRF, injection attacks, session hijacking, and insecure direct object references. Consider threats specific to e-commerce like payment fraud and data breaches.

3. Propose mitigations

For each threat, suggest practical countermeasures: input sanitization, output encoding, CSRF tokens, secure cookies, HTTPS, Content Security Policy, and proper access controls.

4. Address authentication and authorization

Explain how to implement robust user authentication (e.g., MFA) and fine-grained authorization to ensure users can only access their own data and permitted actions.

5. Discuss monitoring and trade-offs

Mention the importance of logging, monitoring, and regular security audits. Also, discuss trade-offs between security measures and usability, and how to prioritize based on risk.

Key Points to Mention

  • Cross-Site Scripting (XSS) prevention via input validation and output encoding
  • Cross-Site Request Forgery (CSRF) protection using anti-CSRF tokens
  • Secure session management with HttpOnly, Secure, and SameSite cookies
  • Content Security Policy (CSP) to mitigate XSS and data injection
  • Role-Based Access Control (RBAC) and least privilege principle
  • Data encryption in transit (HTTPS/TLS) and at rest

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q5

If you had more time, how would you extend this solution and how would you test it?

System DesignTechnical Trade-offs
Author's notes

Talked about adding pagination, optimistic updates, and maybe a context layer if the list needed to be shared across the app.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Acknowledge the current solution's scope and trade-offs, then propose extensions that align with Nordstrom's business goals like scalability and customer experience. Structure your answer by prioritizing extensions based on impact and effort, and describe a testing strategy that covers unit, integration, and performance tests.

Pro tip: Tie your extensions to measurable business outcomes (e.g., conversion rate, latency) and mention how you'd validate them with A/B tests or canary releases to show product thinking.

1. Summarize current solution and constraints

Briefly recap what was built, the trade-offs made due to time, and any known limitations. This sets the stage for why extensions are needed.

2. Propose high-impact extensions

Suggest 2-3 extensions that address scalability, reliability, or user experience, and explain how each aligns with Nordstrom's priorities. Prioritize based on impact vs. effort.

3. Outline testing strategy

Describe how you would test each extension: unit tests for logic, integration tests for interactions, load tests for performance, and monitoring in production. Mention test data and environments.

4. Discuss trade-offs and metrics

Explain the trade-offs of each extension (e.g., complexity vs. benefit) and define success metrics (e.g., latency reduction, error rate). Mention how you'd iterate based on feedback.

Key Points to Mention

  • Scalability improvements (e.g., caching, horizontal scaling, database sharding)
  • Observability (logging, metrics, tracing) to diagnose issues
  • Automated testing pyramid (unit, integration, end-to-end)
  • Performance testing (load, stress, soak) and tools (JMeter, Locust)
  • CI/CD integration for fast feedback
  • Business impact (e.g., faster checkout, personalized recommendations)

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.