DEV Community

Cover image for The 90 Day FAANG Prep Plan That Actually Works
Prakhar Srivastava for codeintuition

Posted on • Originally published at codeintuition.io

The 90 Day FAANG Prep Plan That Actually Works

You count the weeks between today and your on site. Twelve. You pull up a 90 day FAANG prep plan and the structure looks reasonable: easy problems for two weeks, mediums for six, hards for the rest. Six weeks in, you hit binary trees and realise your recursion is shaky. Two weeks later you try a DP problem and can't formulate the recurrence. Suddenly the 12 week plan is a 6 week plan with 6 weeks of rework.

Difficulty isn’t the problem. Order is.

TL;DR: A 90 day FAANG plan works when topics are ordered by dependency, not by difficulty or popularity. The typical "easy then medium then hard" plan ignores that DP needs recursion, recursion needs the call stack, and the call stack needs array fundamentals. Sequence by what each topic requires, not by how hard it feels.

What "wrong order" actually looks like

The failure mode in most 90 day plans is the same shape every time. The plan groups topics by surface difficulty: arrays first because they are easy, DP last because it is hard. Or the plan groups by frequency: arrays first because they appear most, then strings, then trees, then DP. Both shapes ignore that DSA topics have hard prerequisites.

You can't reason about binary tree traversal without recursion. You can't build recursive intuition without the call stack. You can't pattern-match on hash table problems until you have internalised what O(1) amortised lookup actually buys you. These gaps don't show up in Week 2. They show up around Week 5 or Week 7, deep enough into the plan that you've already built a lot on top of unstable ground.

When that happens, the plan quietly stops working. You either skip the prerequisite to "stay on schedule," which compounds the gap into every later topic, or you stop and rebuild, which eats two of the remaining weeks. Either way, the timeline collapses.

The order that actually works

Here's the dependency order that emerges after watching dozens of engineers prep:

  • Weeks 1 to 2: Arrays and linked lists. Two pointers, sliding window, interval merging on arrays. Reversal, fast and slow pointers, merge patterns on linked lists. About fifteen patterns. Everything else builds on these.
  • Weeks 3 to 4: Hash tables and stacks. Hash tables unlock counting, prefix sum, and the harder variants of sliding window. Stacks unlock monotonic stack, sequence validation, expression evaluation. Both are prerequisites for tree traversal.
  • Weeks 5 to 6: Queues, binary trees, BSTs. Queues for level order BFS. Trees for preorder, postorder, root to leaf paths. BSTs for sorted traversal and range operations. Pattern density picks up fast here.
  • Weeks 7 to 8: Heaps, recursion, backtracking. Heaps for top K and comparator patterns. Recursion formalises head recursion, tail recursion, and multiple recursion. Backtracking introduces enumeration and constraint search.
  • Weeks 9 to 10: Graphs, sorting, searching. DFS, BFS, Dijkstra, topological sort. Quickselect and custom compare. Binary search variants including predicate search on the answer space.
  • Weeks 11 to 12: Dynamic programming and review. DP last, because DP is what every previous topic was preparing you for.

The Wikipedia article on the spacing effect summarises why this order also helps retention: practice distributed across weeks, with each week building on the last, produces stronger durable recall than the same volume crammed late. The dependency order isn't only logical, it's also how you keep the early weeks from fading by Week 12.

Why DP belongs at Week 11, not Week 3

Take Coin Change, a standard DP interview problem. To derive the solution rather than memorise it, you need three things lined up:

  1. A recurrence relation. Built on top of recursion fluency.
  2. Recognition of overlapping subproblems. Built on top of seeing how multiple recursive calls share state.
  3. Memoization. Built on top of understanding how cached results map to subproblem states.

Now imagine an engineer who reaches DP in Week 3. They've covered arrays, maybe linked lists. They have not internalised the call stack, they have not seen recursion expressed as a recurrence, they have not seen overlapping subproblems show up anywhere. The Coin Change solution they study isn't reasoning, it's a string of four lines they're supposed to remember:

def coinChange(coins, amount):
    dp = [float('inf')] * (amount + 1)
    dp[0] = 0
    for a in range(1, amount + 1):
        for c in coins:
            if c <= a:
                dp[a] = min(dp[a], dp[a - c] + 1)
    return dp[amount] if dp[amount] != float('inf') else -1
Enter fullscreen mode Exit fullscreen mode

The engineer who reaches the same problem in Week 11 sees this differently. They've spent four weeks with recursion. They've built backtracking on top of multiple-call recursion. They've seen the same dp[i] shape applied to climbing stairs, then to longest increasing subsequence, then to Coin Change. The recurrence dp[a] = min(dp[a], dp[a - c] + 1) doesn't have to be remembered, because they can re-derive it from the invariant: dp[a] is the minimum number of coins to make amount a, and the only way to make a is to make a - c for some coin c and add one.

That's the difference dependency order produces. Not more knowledge. Knowledge that holds together under interview pressure because every piece supports the one above it.

When to add timed pressure (load-bearing)

It is easy to practise in comfort conditions for eleven weeks and then panic in your first mock interview. The gap between "I solved this at my desk with no timer" and "I solved this in 20 minutes with no hints" is wider than most engineers expect. The right time to introduce timed practice is after the foundations are solid but before the advanced topics start. Around Week 6.

By Week 6, you've covered arrays, linked lists, hash tables, stacks, queues, and started binary trees. That's enough pattern coverage to attempt timed problems honestly. You won't know every pattern yet, but you know enough to practise the skill of solving under pressure separately from the skill of learning new patterns.

From Week 6 to Week 8, attempt previously completed problems under a timer. Twenty minutes for mediums, thirty for hards. No hints, no notes. The goal isn't a clean pass rate, it's training the feeling of working without the safety of references while the material is still fresh in your mind.

From Week 9 to Week 12, switch to multi problem assessments under a 50 minute timer, the way actual rounds work. You'll have covered enough of the patterns by then to simulate realistic interview coverage.

Productive struggle vs spinning

Plans break. You'll have a week where work blows up, or you'll hit a topic that takes longer than expected. The better question isn't "how do I avoid falling behind," it's "how do I tell whether I'm stuck productively or just spinning."

The two look similar from the inside but feel different in one specific way:

  • Productive struggle. You can name what you don't understand. "Merge sort is O(n log n), but the reason the divide step doesn't add extra cost isn't clicking." That's a specific gap you can target with a specific lesson, problem, or question.
  • Spinning. You're re-reading the same material without forming new questions. You've watched the same walkthrough three times and still can't reproduce the logic from a blank screen.

If you're spinning, change the input. Try solving a strictly simpler variant. Try writing the solution from memory without any reference, even if you produce something wrong. Try explaining the concept out loud as if to a junior. The act of generating an attempt, even a broken one, surfaces the missing piece more clearly than another round of passive review. This is the generation effect doing real work for you.

Concrete checkpoints (because vague progress isn't progress)

Vague progress signals like "things are starting to click" don't survive interview-week stress. Use concrete checkpoints at each month boundary. If three or more items at any checkpoint don't describe you, don't move to the next month. Spend an extra week on the weak areas. A 13 week plan that's solid beats a 12 week plan with holes.

By Week 4, you should be able to:

  • Solve array two pointer and sliding window problems without looking up the pattern.
  • Trace linked list reversal mentally, tracking pointer state at each step.
  • Explain why a hash table lookup is O(1) amortised, not just that it is.
  • Identify which stack pattern applies from the problem statement alone.

By Week 8:

  • Trace a binary tree postorder traversal on paper, tracking state at each node.
  • Reason about BST problems through the sorted traversal invariant.
  • Write a recursive solution and walk through how the call stack unwinds.
  • Have attempted ten or more problems under timed conditions, with a pass rate above 50%.

By Week 12:

  • Identify DP subproblems and formulate recurrences for problems you haven't seen.
  • Choose between BFS and DFS for a graph problem and explain why.
  • Complete a 50 minute multi problem assessment with at least one correct solution.
  • Hit the timer without reaching for the solution tab first.

If you can't honestly check most of these, your plan needs an extra week, not a heroic weekend.

Your final week

Week 12 isn't for new material. If you're still covering fresh topics with seven days to go, something earlier broke. The final week is for consolidation under realistic conditions.

Days 1 to 3 are targeted weak spot practice. Look back at the timed results from Weeks 9 to 11. Which topics had the lowest pass rate? Which patterns did you fail to identify within the first five minutes? Spend three days isolating those specific patterns and attempting two or three problems that test exactly that pattern. Don't re-study the entire topic. Isolate the gap.

Days 4 to 5 are full simulation rounds. Two complete mock interview simulations. Forty five to fifty minutes, two problems, no IDE autocompletion, talk out loud as you write. If you don't have a partner, record yourself. The recording forces the same "someone is watching" pressure that slows people down in real interviews. Pay attention to time allocation. The most common failure pattern is spending thirty minutes on the first problem and having fifteen for the second. Practise the discipline of checking your progress at the 20 minute mark and making a deliberate decision about whether to keep debugging or move on.

Days 6 to 7 are rest and review. Stop solving new problems. Review your notes on the three or four patterns you found hardest. Get enough sleep. The difference between a well rested engineer who's covered 90% of the material and an exhausted engineer who's crammed 100% is measurable in interview performance. Fatigue degrades pattern recognition speed before it degrades anything else, and recognition speed is exactly what interviews test.

The order is the advantage

Compressing the whole roadmap into one rule: study what each topic requires, not what feels hardest. The Coin Change recurrence at Week 11 holds together because every layer below it (recursion in Week 7, stack mechanics in Week 4, array fundamentals in Week 1) was built before it was needed. An engineer who jumps to DP in Week 3 isn't ahead, they're standing on nothing.


If you want the full version of this roadmap with exact problem lists, pattern breakdowns, and weekly schedules I’ve written it here


This post gives you the structure.

The full guide gives you the execution.


What’s the topic in your prep where the dependency chain finally clicked—and which week did it happen?

Top comments (0)