Andreessen Horowitz · Software Engineer
Updated · 2026-10-02

Andreessen Horowitz Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Andreessen Horowitz is a venture capital firm, and the Software Engineer role candidates describe sits on its technology side. The listed scope covers front-end engineering, backend systems, developer experience and IT infrastructure, in support of investment teams, portfolio companies and internal operations. The stack named for the role is React, JavaScript and TypeScript, with AWS, GCP, Docker, Kubernetes and internal developer tooling listed as nice-to-have experience. Reported scenarios include tracking incidents in real time, handling spikes in internal event volume and securing internal developer tools, so expect the role to mix web UI work with service and tooling work.

This guide is for engineers interviewing for a Software Engineer position at Andreessen Horowitz, whether the team leans front-end (React, TypeScript) or backend and tooling. It covers the two reported rounds, the reported technical, algorithm, behavioral and situational questions, how to build specific stories for the behavioral ones, and a seven-day plan that points at the technical questions by subject.

Candidates report two rounds over roughly 2-4 weeks: a Recruiter Screening Call, then Technical Recruiter Rounds that combine a data structures and algorithms session with a deep-dive technical discussion.

Data Structures & Algorithms (DSA)Algorithmic Problem SolvingJavaScript

37 min read

Browse Software Engineer questions

See the practice prompts

22Practice promptsAcross five skill areas

The reported role description spans several kinds of engineering: web interfaces in React and TypeScript, backend services, developer workflows and infrastructure. That breadth shows in the reported questions. One group asks about your familiarity with React, JavaScript and TypeScript, modular front-end components, performance debugging and secure coding. Another asks you to design a backend service for high concurrency and data integrity. Preparing for only one side leaves a gap, so decide early which side your own experience covers and build a concrete example for the other.

The loop is short, two rounds reported over about 2-4 weeks, so each stage carries a lot. The recruiter call is reported to cover your past work, specific projects and stack familiarity. The technical stage is reported as a data structures and algorithms session plus a deep-dive discussion, with a walkthrough of a complex problem you have solved before. Reports do not say which individual question comes in which round, so prepare every reported question type rather than guessing.

Algorithm questions reported here are practical rather than exotic: an array problem with a target condition, recursive versus iterative complexity, how you test edge cases on array manipulation, which data structures suit a real-time incident tracker, and how you break one large function into testable utilities. In every one of them, state the brute-force version, name its cost, then show what removes the repeated work. Pair that with two or three polished project stories, because the same material feeds the deep-dive discussion and the behavioral and situational questions.

01

Recruiter Screening Call

reported

Candidates report a Recruiter Screening Call of about 40 minutes that covers your past work experience, specific projects and familiarity with the tech stack, which reports list as JavaScript, TypeScript and React. Behavioral questions of the situational and experience-based kind are also reported at this stage. Treat it as your first technical story, not a formality: be ready to describe two projects in terms of problem, your role, stack, decision and result, and to say honestly how deep your React, JavaScript and TypeScript experience goes.

What to demonstrate

  • Past work experience and the specific projects you can describe
  • Familiarity with the tech stack, named in reports as JavaScript, TypeScript and React
  • Situational and experience-based answers, such as strengths and areas you are improving

How to prepare

  • Write a two-minute walk through your career and a project sheet for two projects: context, your role, design, trade-off, result.
  • Rate yourself honestly on React, JavaScript and TypeScript and prepare one example from your own work for each, such as typed props, hooks or an async bug.
  • Rehearse the experience prompts out loud: a recent complex problem, your strengths, and an area you are working on.
Andreessen Horowitz Software Engineer candidate reports ↗
02

Technical Recruiter Rounds

reported

Candidates report Technical Recruiter Rounds as structured sessions on practical engineering skills, including a session split for data structures and algorithms and a deep-dive technical discussion. The coding part is reported as writing clean, optimized code while explaining your choices, and the discussion part as a walkthrough of a complex technical problem you have solved before. Prepare both modes: coding with spoken reasoning, and a project story you can take down several levels of detail.

What to demonstrate

  • Working, readable code for an algorithm problem, with complexity stated
  • Explaining implementation choices while you code
  • A walkthrough of a complex technical problem from your own experience
  • Practical engineering skills such as testing, refactoring and edge cases

How to prepare

  • Practise array problems where you say the brute-force approach and its complexity first, then improve it with a hash map, two pointers, prefix sums or sorting.
  • Write the time and space cost of a recursive solution, including call-stack space, then rewrite it iteratively with an explicit stack.
  • Prepare one deep-dive project with a simple diagram, the alternatives you rejected, the measured outcome and what you would change.
  • Practise building a short edge-case list (empty, single element, duplicates, negatives) and tracing your code through it before saying you are done.
Andreessen Horowitz Software Engineer candidate reports ↗

PracHub editorial advice for the preparation topics above.

01

Jumping to an optimized array solution without stating the brute-force version

Say the brute-force approach and its complexity first. Then name the repeated work you are removing, whether with a hash map, two pointers, prefix sums or sorting, and give the new time and space cost.

02

Declaring the code finished without testing it against edge cases

Keep a standard list: empty input, a single element, duplicates, negative values, very large values and already-sorted input. Trace your code through two of them out loud, and mention any assumption about the input you are relying on.

03

Comparing recursion and iteration by time alone and ignoring the call stack

State the stack space of the recursive version, mention that deep recursion can overflow in JavaScript, and show the iterative version with an explicit stack or a memoized approach. Explain when each one is the right choice.

04

Answering the stack-familiarity question with a list of tools instead of examples

For React, JavaScript and TypeScript, give one specific thing you built or fixed for each, such as typed component props, a stale-closure bug or a re-render you removed. Be honest about the parts you have not used.

05

Telling the deep-dive or leadership story in 'we' language with no decisions of your own

Prepare a one-page sheet per project: context, your role, the decision you made, the options you rejected, the result and what you would change. Practise answering a follow-up question at each point.

Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.

17 technical prompts0 include a worked solution

Given an array of integers, write an optimized solution to find a specific target condition and explain your t

medium
Data Structures and Algorithms

Given an array of integers, write an optimized solution to find a specific target condition and explain your trade-offs against a brute-force approach.

Approach
  1. Pin down the condition and the constraints before coding: array size, whether it is sorted, negatives, duplicates, whether to return indices or values, and whether one answer or all are needed. The usual instances are a pair summing to a target, or a subarray summing to k.
  2. State the brute force and its cost: checking every pair (or every subarray using running sums) is O(n^2) time and O(1) extra space. It is fine for small n and useful later as a test oracle.
  3. Optimise from the access pattern. For a pair sum, a hash map from value to index answers the question in one pass, O(n) time and O(n) space. On sorted input, two pointers need O(n) time and O(1) space, and sorting first costs O(n log n) and loses the original indices. For a subarray sum with negative numbers, use prefix sums with a hash map counting each prefix (O(n)); a sliding window works only when every value is non-negative.
  4. Explain the trade-off out loud: the hash map spends memory to save time, sorting saves memory but changes the indices, and for tiny inputs the simple version can be the better engineering choice.
  5. Cover the edge cases: empty or single-element arrays, duplicates such as [3,3] with target 6 (look up the complement before inserting the current value), no valid answer, and overflow in languages with fixed-width integers.
Follow-up
  • The array contains negative numbers and you used a sliding window. What breaks, and what replaces it?
  • Return every unique pair instead of one. How do you avoid duplicate pairs?
  • The sorted array lives on disk and does not fit in memory. How does your approach change?

How do you evaluate the time and space complexity of a recursive algorithm versus an iterative approach?

medium
Data Structures and Algorithms

How do you evaluate the time and space complexity of a recursive algorithm versus an iterative approach?

Approach
  1. Time for recursion is the number of calls multiplied by the work per call, which you get from a recurrence. With the Master theorem, merge sort's T(n) = 2T(n/2) + O(n) gives O(n log n). Naive Fibonacci, T(n) = T(n-1) + T(n-2) + O(1), grows exponentially (about 1.618^n, usually bounded as O(2^n)).
  2. Space for recursion follows the maximum call depth, not the total number of calls. Naive Fibonacci uses O(n) stack despite exponential time. DFS on a balanced tree needs O(log n) stack but O(n) on a skewed one, and recursive binary search uses O(log n) where the iterative loop uses O(1).
  3. An iterative version usually has the same time complexity. With an explicit stack it moves the memory from the call stack to the heap, which avoids stack overflow but not the memory cost.
  4. Account for the runtime: Python's default recursion limit is 1000 and it has no tail-call optimisation, and most JavaScript engines (V8 included) do not perform proper tail calls, so deep recursion throws 'Maximum call stack size exceeded'.
  5. Memoisation turns naive Fibonacci into O(n) time and O(n) space. Bottom-up iteration with two variables gives O(n) time and O(1) space. Choose recursion when the problem is naturally recursive and shallow, such as trees or divide and conquer, and iteration when the depth can grow with the input.
Follow-up
  • What are the time and space complexity of recursive versus iterative binary search?
  • Convert a recursive in-order traversal to an iterative one. What does your explicit stack hold at each step?
  • When does memoisation fail to improve a recursive solution?

Can you walk through your process for testing edge cases in an array manipulation problem?

medium
Data Structures and Algorithms

Can you walk through your process for testing edge cases in an array manipulation problem?

Approach
  1. List the edge-case categories before writing code: empty array, one element, two elements, all values equal, duplicates, already sorted and reverse sorted, negatives and zero, extreme values (overflow), the answer at the first or last index, no valid answer, and very large n.
  2. Check loop boundaries explicitly: off-by-one at index 0 and n-1, half-open versus closed intervals, a window size equal to or larger than n, and k = 0.
  3. Settle mutation semantics: does the function modify in place or return a new array, does the caller expect the input untouched, and is anything modifying the array while iterating over it?
  4. Then test in order: hand-trace one small ordinary example, then each edge case, then a randomised comparison against a brute-force oracle (property-based tools such as fast-check for JavaScript or Hypothesis for Python).
  5. State the invariant each loop maintains (for example, 'everything left of i is already partitioned') and confirm it holds at the start, at each step and at exit.
Follow-up
  • Which of these cases is most likely to break a two-pointer solution?
  • How would you write a randomised test that compares your solution with a brute-force version?
  • Your function passes every test you wrote but fails in production on one input. How do you find that input?

What data structures would you select for a real-time incident response tracking system and why?

medium
Data Structures and Algorithms

What data structures would you select for a real-time incident response tracking system and why?

Approach
  1. Start from the operations: create an incident, update its status and severity, assign a responder, list open incidents by priority, escalate anything left unacknowledged past a deadline, keep a timeline, and deduplicate repeated alerts.
  2. Use a hash map from incident id to record for O(1) lookup and update, plus secondary indexes (hash map from status or responder to a set of ids) for the common filtered views.
  3. Use a priority queue (binary min-heap) keyed on (severity, created time) to pick the next incident, at O(log n) per push and pop. A plain heap cannot efficiently update or remove an arbitrary entry, so either keep an index map (an indexed heap) or use lazy deletion that skips stale entries when they are popped.
  4. Run escalation timers from a min-heap ordered by deadline, or a timing wheel when there are many timers. An acknowledgement cancels lazily: when a timer fires, check the incident's current state first.
  5. Keep each incident's timeline as an append-only event list and deduplicate alerts with a set of fingerprints that expire after a TTL. Then name the trade-off: in-memory structures are fast but are lost on restart, so with several responders or processes the state moves to a shared store (for example Redis hashes and sorted sets) with version checks on updates.
Follow-up
  • How do you change an incident's severity without scanning the whole heap?
  • Ten thousand alerts arrive from one root cause within a minute. How do you collapse them?
  • What state survives if the tracking process restarts, and how do you rebuild the rest?

How do you refactor monolithic algorithmic logic into clean, testable utility functions?

medium
Data Structures and Algorithms

How do you refactor monolithic algorithmic logic into clean, testable utility functions?

Approach
  1. Pin the current behaviour before changing anything: write characterisation tests with recorded inputs and outputs, including the edge cases, so every later step can be checked.
  2. Find the seams. Separate pure computation from side effects (input parsing, database calls, logging, the clock, random numbers), and pass those effects in as parameters or dependencies so the core logic is deterministic.
  3. Extract in small steps, such as validation, the core algorithm and output formatting, each as a small pure function named for what it returns, with no shared mutable state. Keep the original signature as a thin wrapper so callers do not change.
  4. Run the tests after every extraction and commit each step separately. Use the IDE's extract-function refactoring to reduce manual mistakes.
  5. Avoid over-fragmenting: extract pieces that have their own invariants and tests, and measure afterwards if the split adds extra passes over the data or extra allocations on a hot path.
Follow-up
  • The function reads the current time and calls a database. How do you unit test it?
  • How do you gain confidence that the refactor did not change behaviour on inputs you never thought of?
  • When would you deliberately leave a long function as it is?

Each day targets one reported area, from the recruiter call through array problems, front-end topics, backend design and behavioral stories, and ends with a deliverable you can review. If your loop is weeks away, repeat days 2 to 4 with new problems.

Small steps. Visible outcomes.0 / 7 completed
ONE WEEK · YOUR PACE

Prepare, practise & reflect

One practical outcome each day. Spend longer where you need it.

0 / 7 done
01Map the loop and write your project sheets
  • Write the two reported rounds, the Recruiter Screening Call and the Technical Recruiter Rounds, with what each is reported to cover.
  • Write a two-minute spoken walkthrough of your career and read it aloud once.
  • Rate yourself on React, JavaScript and TypeScript and write one example from your own work for each, marking the gaps.
  • Build a one-page sheet for two projects: context, your role, design, trade-off, result.

Deliverable: A two-minute career script, a stack self-rating with an example per technology, and two project sheets.

Practice prompt ↗
02Array problems from brute force to optimal
  • Solve four array problems that search for a target condition: pair sum with a hash map, pair sum on sorted input with two pointers, subarray sum with prefix sums, and a sliding window.
  • Before coding each, say the brute-force approach and its complexity, then the optimized time and space.
  • After each, write an edge-case list (empty, one element, duplicates, negatives, large values) and trace the code through two entries.

Deliverable: Four working solutions, each with its stated brute-force and optimized complexity and a written edge-case list.

Practice prompt ↗Practice prompt ↗
03Complexity, data structures and refactoring
  • Take a recursive solution such as a tree traversal or a memoized recursion and write its time and space cost, including the call stack. Rewrite it iteratively with an explicit stack.
  • Design the data structures for a real-time incident tracker: a map by incident id, a heap ordered by severity and a time-ordered structure for recent events. List each operation with its cost.
  • Refactor one long function into small, named, pure helper functions and add a unit test for each.

Deliverable: A recursive and an iterative version with a complexity table, an operations table for the incident tracker, and a refactored function with tests.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
04React, JavaScript and TypeScript depth
  • Build a small filterable table as a set of typed components with consistent naming, separate presentational and data-fetching parts, and a test for each.
  • Profile it with the browser performance panel and the React profiler, remove one unnecessary re-render, and write down the before and after.
  • Write a secure-coding checklist for front-end and internal tools: output escaping, risks of raw HTML injection, token storage, server-side input validation and a dependency audit.

Deliverable: A typed component set with tests, a before-and-after profiling note and a one-page secure-coding checklist.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
05Backend design and production judgment
  • Design a backend service for high concurrency and data integrity. Write the API, the data model, an idempotency key for retries, a unique constraint or transaction for integrity, a queue and a cache, and say what breaks at ten times the traffic.
  • Write a triage sequence for a production outage: what changed recently, which signals to check, how to mitigate or roll back first, and how to find the root cause afterwards.
  • Write a checklist for entering an unfamiliar codebase with little documentation: run the tests, trace one request end to end, read recent history and write down open questions.

Deliverable: A one-page service design with failure handling, an outage triage script and a codebase-onboarding checklist.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
06The deep-dive and project stories
  • Rehearse your strongest project aloud with a simple diagram: context, constraints, the options you rejected, the result and what you would change. Record it and cut anything that rambles.
  • Write the architecture trade-off answer for your latest project, naming at least two alternatives and what each would have cost.
  • Outline the story of a project you led from inception to deployment, including scope cuts, risks, rollout and what slipped.

Deliverable: A recorded deep-dive walkthrough, a written trade-off answer and a project-lead story outline.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Behavioral and judgment answers, then a mock
  • Write structured outlines for three stories: a cross-functional conflict, a mid-sprint requirement change, and your strengths and improvement area.
  • Write short decision checklists for prioritizing a backlog across competing stakeholders and for evaluating a third-party library (maintenance, license, security record, size, API fit, cost of removing it).
  • Run a mock: one array problem aloud with edge cases, then your deep-dive project, and record both.

Deliverable: Three story outlines, two decision checklists and one recorded mock session.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗

Expand any day for tasks and deliverables. Your progress is saved on this device.

Reported behavioral and situational questions cover a recent complex problem, architecture trade-offs, team conflict, leading a project, strengths and weaknesses, and changing requirements. For a Software Engineer role, build four or five stories from your own work that each show a decision you made, the trade-off, the measured result and what you learned. Then reuse them across prompts.

Can you describe in detail a recent complex technical problem you worked on, including the context and solutio

medium
Behavioral and Experience Discussions

Can you describe in detail a recent complex technical problem you worked on, including the context and solution design?

Approach
  1. Choose a problem you owned whose design you can sketch in a minute. Reports describe a deep-dive discussion of a complex problem you solved, so the story has to hold up when someone asks why at each step.
  2. Give the context in two sentences: the system, the constraint and why the obvious fix did not work. Spend most of the time on the solution design: components, data flow, the options you weighed and the reason you picked one.
  3. Say what you personally did versus what the team did. Replace a vague 'we built it' with the specific decision, code or investigation that was yours.
  4. Close with a result you actually measured (latency, error rate, deploy time, tickets) and one thing you would change now. A story with no outcome or no reflection sounds unfinished.
Follow-up
  • Why did you not take the other option you considered?
  • What would break first if the load or the data grew ten times?
  • If you rebuilt it today, what would you do differently?

How do you handle disagreements or conflicts within a cross-functional engineering team?

medium
Behavioral and Experience Discussions

How do you handle disagreements or conflicts within a cross-functional engineering team?

Approach
  1. Pick a real disagreement about a concrete technical or scope decision with a product manager, designer or another engineer, not a personality clash. Name what the other function was trying to protect, such as a deadline, a user experience or a maintenance cost.
  2. Show how you moved it from opinion to evidence: a prototype, a benchmark, an error count or a written comparison of options with their costs. Describe how you agreed on the deciding rule before looking at the numbers.
  3. State the outcome plainly, including when the decision went against you. Disagreeing and then committing to the decision, and helping it succeed, is a strong ending.
  4. Finish with the working relationship afterward. A story where you were right and the other person was unreasonable shows little about how you work with people.
Follow-up
  • What would you have done if the evidence had not settled it?
  • How did the other person feel about the result, and how do you know?
  • Has a similar disagreement come up again, and what did you change?

Can you share an example of a time you successfully led a project from inception to deployment?

medium
Behavioral and Experience Discussions

Can you share an example of a time you successfully led a project from inception to deployment?

Approach
  1. Choose a project where you made the scope and sequencing decisions, from the first problem statement through production release. Open with what the project was for and who depended on it.
  2. Walk through the stages: how you cut the scope, the milestones, the dependencies on other teams, the top two or three risks and what you did about each one early.
  3. Cover the release itself: tests, a feature flag or staged rollout, monitoring after launch and the rollback plan. This is the 'deployment' half of the question and is often skipped.
  4. Include something that slipped or went wrong and how you re-planned. Finish with a measured result and a lesson. Listing tasks without any decisions sounds like participation, not leadership.
Follow-up
  • What was the riskiest assumption at the start, and how did you test it?
  • How did you split the work among the people on the project?
  • What would you cut if the deadline had been moved up by a week?

What are your primary professional strengths, and what specific areas are you actively working to improve?

medium
Behavioral and Experience Discussions

What are your primary professional strengths, and what specific areas are you actively working to improve?

Approach
  1. Name two strengths that matter for this role, such as debugging production problems, designing maintainable React components or writing tests, and attach one short piece of evidence to each. A claim without an example is easy to forget.
  2. Pick a genuine area to improve, not a strength in disguise like working too hard. Choose something you can explain, such as delegating, writing a design note before coding or going deeper on TypeScript typing.
  3. Say the concrete mechanism you are using to improve (a habit, a reviewer, a course, a practice project) and one sign that it is working.
  4. Keep the whole answer short and balanced, and tie it back to the work. A long defensive explanation of the weakness undoes the honesty.
Follow-up
  • When did that weakness last cost you something on a project?
  • How would a former teammate describe your strengths and your growth area?
  • What are you working on right now to improve it?

How do you handle requirements that change mid-sprint during an active development cycle?

medium
Situational and Problem-Solving Scenario

How do you handle requirements that change mid-sprint during an active development cycle?

Approach
  1. Tell a story with a real change: what changed, who raised it, when you learned of it and how much work was already done or in progress.
  2. Show how you assessed the impact before reacting: what could be kept, what must be redone, what the change costs in time and risk, and whether it can be isolated behind an interface or a feature flag.
  3. Describe the conversation with the stakeholder as a set of options, such as swap scope, move a date or split the work, and how the team agreed on what left the sprint. Silently absorbing the change and flatly refusing it are the two common mistakes.
  4. Close with what you changed afterward, such as confirming requirements earlier, shorter feedback loops or smaller increments, and how the tickets and tests were updated.
Follow-up
  • What if the request came from a senior stakeholder and nothing could be dropped?
  • What happened to the code you had already written?
  • How do you reduce the chance of mid-sprint surprises on the next project?
  • 01

    Can you describe in detail a recent complex technical problem you worked on, including the context and solution design?

  • 02

    What were the primary trade-offs in your chosen architecture for your most recent project, and what did you learn from the outcome?

  • 03

    How do you handle disagreements or conflicts within a cross-functional engineering team?

  • 04

    Can you share an example of a time you successfully led a project from inception to deployment?

  • 05

    What are your primary professional strengths, and what specific areas are you actively working to improve?

  • 06

    How do you handle requirements that change mid-sprint during an active development cycle?

PracHub preparation framework ↗
How many rounds are there and how long does the process take?

Candidates report two rounds over about 2-4 weeks: a Recruiter Screening Call, then Technical Recruiter Rounds. Team and seniority can change the details, so ask the recruiter for the exact format in writing.

Andreessen Horowitz Software Engineer candidate reports ↗
What happens on the recruiter call?

Candidates report a call of about 40 minutes about your past work, specific projects and familiarity with the tech stack, with situational and experience-based questions. Prepare a two-minute career story, two project sheets and an honest self-rating on React, JavaScript and TypeScript.

PracHub Software Engineer practice ↗
What does the technical stage involve?

Reports describe structured sessions on practical engineering skills, including a data structures and algorithms session and a deep-dive technical discussion of a complex problem you solved. For the coding part, practise array problems, complexity analysis, edge-case testing and clean, modular code, and be ready to explain choices as you write.

PracHub Software Engineer practice ↗
Which technologies should I refresh?

The reported topics are JavaScript, TypeScript and React, and the role description lists AWS, GCP, Docker and Kubernetes as nice-to-have. For front-end work, revisit component structure, typing, performance profiling and secure coding. For backend work, revisit concurrency, data integrity, caching and failure handling.

PracHub Software Engineer practice ↗
Are system design questions reported?

Reported questions include designing a scalable backend service for high concurrency and data integrity, and discussing the architecture trade-offs of a recent project. Reports do not say which round they fall in, so prepare a short design framework: requirements, API, data model, failure handling and trade-offs.

Andreessen Horowitz Software Engineer candidate reports ↗
How should I split my preparation time?

Spread it across three areas: coding practice on arrays, complexity and testing; front-end or backend depth on the stack you will be judged on; and project and behavioral stories. If you have more than a week, repeat days 2 to 4 of the plan with new problems and re-record your deep-dive until it is short and clear.

PracHub Software Engineer practice ↗
Sources & methodology 3 sources ↗

No official company page is cited. Rounds and questions come from candidate reports and PracHub editorial material; each source shows the date it was read.