← AT&T Interview Insights

AT&T·Software Engineer·Technical Phone Screen·Senior

SeniorPending
May 2026Remote

Summary

Thirty-minute technical screen for a senior full stack role that went really well until the last question blindsided me completely. Fifteen years of React and framework-based frontend work, and I got tripped up by vanilla JS state management with no libraries allowed.

Questions Asked (2)

Q1

How would you manage state across components in React?

Technical Trade-offsSystem Design
Author's notes

This was the easy warmup and I actually nailed it.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by acknowledging that state management in React depends on the scope and complexity of the application, then walk through the spectrum from local state to global solutions. Emphasize trade-offs like performance, scalability, and team familiarity, and tie your answer to AT&T's need for maintainable, large-scale systems.

Pro tip: Mention that overusing global state can lead to unnecessary re-renders and complexity; instead, advocate for colocating state and lifting only when necessary. Also, highlight that the right choice depends on factors like team size, app scale, and long-term maintenance.

1. Clarify scope and requirements

Ask about the application size, team structure, and performance needs to tailor your answer. This shows you consider context before prescribing solutions.

2. Start with local state

Explain that for component-specific state, useState or useReducer is sufficient. Emphasize keeping state as close to where it's used as possible.

3. Lift state when shared

Describe lifting state up to a common ancestor when multiple components need it. Mention prop drilling and its limitations.

4. Introduce context for cross-cutting concerns

Discuss React Context for avoiding prop drilling with global-ish data like theme or auth, but note performance caveats and the need for memoization.

5. Evaluate external libraries for complex global state

Compare Redux, Zustand, Recoil, or MobX for large-scale apps, highlighting trade-offs in boilerplate, learning curve, and dev tools.

Key Points to Mention

  • Local state (useState, useReducer) vs. global state
  • Prop drilling and lifting state up
  • React Context API and its performance implications
  • Redux (and Redux Toolkit) for predictable, centralized state
  • Lightweight alternatives like Zustand or Recoil
  • Server state management with React Query or SWR

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

Q2

How would you handle state management if you had no framework and no third-party libraries available?

Technical Trade-offsSystem DesignAdaptability & Ambiguity
Author's notes

This is where it fell apart.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the constraints and requirements, then propose a simple, event-driven state management pattern using plain JavaScript. Emphasize separation of concerns, immutability, and testability while acknowledging trade-offs like scalability and performance.

Pro tip: Mention that you would document the pattern and provide utilities to enforce it, preventing ad-hoc state mutations as the codebase grows. This shows foresight and maintainability thinking.

1. Clarify Requirements

Ask about the application's scale, state complexity, and performance needs to tailor your solution. This demonstrates you don't over-engineer and can adapt to ambiguity.

2. Design a Central Store

Propose a single source of truth: a plain object holding application state, with a clear API for reading and updating it. Use closures or modules to encapsulate state and prevent direct mutation.

3. Implement Event-Driven Updates

Use the observer pattern: components subscribe to state changes and re-render when notified. Implement a simple pub/sub system with functions like `subscribe`, `unsubscribe`, and `notify`.

4. Enforce Immutability and Pure Updates

Require state updates to go through pure functions (reducers) that return new state objects. This makes changes predictable and enables time-travel debugging.

5. Address Trade-offs and Scalability

Discuss limitations: performance with deep object trees, need for manual optimization (e.g., memoization), and potential for memory leaks if subscriptions aren't cleaned up. Mention how you'd mitigate these.

Key Points to Mention

  • Single source of truth to avoid inconsistent state across components
  • Observer pattern (pub/sub) for decoupling state updates from UI
  • Immutability and pure functions for predictable state transitions
  • Encapsulation via closures or modules to prevent direct state mutation
  • Performance considerations: batching updates, memoization, and avoiding unnecessary re-renders
  • Testability: pure functions and isolated state logic are easy to unit test

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