Study plan and flashcards
Two things: a schedule that fits around a full-time job, and a set of retrieval drills. The drills matter more than the schedule — fluency comes from recall, not from reading, and the specific failure mode you are trying to fix (fundamentals eroded by AI-assisted coding) is a retrieval failure, not a knowledge failure. You have not forgotten what a heap is; you have lost the ability to produce one without help.
That distinction drives the whole design below: every session ends with something written from a blank file.
Table of contents
- 1. The principle: retrieval over review
- 2. Pick a track
- 3. The 8-week plan
- 4. The maintenance loop
- 5. Spaced repetition schedule
- 6. Self-assessment tracker
- 7. Flashcards
- 8. Blank-file drills
- 9. Using the Anki deck
1. The principle: retrieval over review
Four findings from the learning-science literature that actually change how you should spend an hour:
| Principle | What it means here |
|---|---|
| Testing effect | Recalling something strengthens it far more than re-reading it. So: close the file and write the heap, then diff against the reference. |
| Spacing | Reviewing at expanding intervals beats massing. So: 1 day, 3 days, 1 week, 3 weeks, 2 months. |
| Interleaving | Mixing problem types beats blocking by type, because the hard part in an interview is choosing the technique, and blocked practice never trains choosing. So: after week 3, mixed sets only. |
| Desirable difficulty | If it feels easy, it is not building anything. Struggling for 10 minutes before looking is the productive state; struggling for 40 is not. |
The practical rule: 10-minute rule. Stuck for 10 minutes with no new idea? Look at the reference, then close it and rewrite from scratch immediately. Do not read the solution and move on — that produces recognition, not recall, and recognition is worthless in an interview.
2. Pick a track
| Track | Time | Use when |
|---|---|---|
| Sprint | 2 weeks, ~10 h/week | You have interviews booked. Weeks 1-2 of the plan below, compressed, plus the starred drills daily |
| Standard | 8 weeks, ~7 h/week | Interviewing in a couple of months. The full plan below |
| Maintenance | ongoing, ~2 h/week | Not interviewing; want to stop getting rusty. Skip to section 4 |
| Deep | 12+ weeks | Career pivot or targeting a company with hard rounds. The 8-week plan, then NeetCode 250 by pattern |
Everything below assumes the Standard track and 7 hours a week: five weekday sessions of ~45 minutes plus one longer weekend session of ~2.5 hours. Adjust proportionally.
3. The 8-week plan
graph LR
W1["Week 1<br/>Complexity and<br/>the two runtimes"] --> W2["Week 2<br/>Arrays, hashing,<br/>two pointers, windows"]
W2 --> W3["Week 3<br/>Stacks and heaps"]
W3 --> W4["Week 4<br/>Trees and tries"]
W4 --> W5["Week 5<br/>Graphs"]
W5 --> W6["Week 6<br/>Dynamic programming"]
W6 --> W7["Week 7<br/>Language depth<br/>and design"]
W7 --> W8["Week 8<br/>Integration<br/>and mocks"]
Each week: a rebuild focus (write it from a blank file), a read focus (the chapter that explains it), and a drill focus (problems). The weekend session is a timed mock.
Week 1 — Complexity and the two runtimes
| Session | Do |
|---|---|
| Mon | Read Complexity §1-5. Run the doubling harness on three of your own functions |
| Tue | Read Complexity §7-9. Reproduce two of the measured traps yourself |
| Wed | Drill 1 + Drill 3 (dynamic array, ring-buffer queue) in both languages |
| Thu | Read JS core §1-2 or Python core §1-2 — whichever is your primary language |
| Fri | Flashcards: complexity tag, all of them, out loud |
| Weekend | Drill 13 (three sorts) + Drill 14 (binary search templates). Time yourself; target under 60 min total |
Milestone: you can state the complexity of any built-in in either language without looking, and you can write all three binary-search templates from memory.
Week 2 — Arrays, hashing, two pointers, sliding window
| Session | Do |
|---|---|
| Mon | Read Patterns §2-4. Write the sliding-window template from memory |
| Tue | Core-80 drills: arrays/hashing rows (8 problems, target 20 min each) |
| Wed | Core-80 drills: two pointers (7 problems) |
| Thu | Core-80 drills: sliding window (7 problems) — including Minimum Window Substring |
| Fri | Rewrite Wednesday’s and Thursday’s hardest problem from a blank file |
| Weekend | Mixed set: 6 problems drawn randomly from the three patterns, 25 min each, no hints |
Milestone: given a problem statement, you can say “sliding window” or “two pointers” and justify it in one sentence before writing anything.
Week 3 — Stacks, heaps, and the structures JS lacks
| Session | Do |
|---|---|
| Mon | Drill 5 + Drill 6 (heap, median finder) in both languages |
| Tue | Read Patterns §6. Core-80 stack rows |
| Wed | Core-80 heap rows. Then implement heapq’s (priority, counter, item) idiom from memory |
| Thu | Drill 4 (hash table, both collision strategies) |
| Fri | Flashcards dsa tag + rewrite the heap blind |
| Weekend | Timed mock: 2 problems in 45 min each, narrated out loud, from the stack/heap/window mix |
Milestone: you can write a heap and a monotonic-stack loop without thinking, and you know which one a problem wants.
Week 4 — Trees and tries
| Session | Do |
|---|---|
| Mon | Drill 7 (BST with all three delete cases + iterative in-order) |
| Tue | Read Graphs §10-11. Core-80 tree rows, first half |
| Wed | Core-80 tree rows, second half — including serialize/deserialize and max path sum |
| Thu | Drill 9 (trie) + the two trie problems |
| Fri | Drill 8 (AVL insert) — this one is allowed to take 40 minutes |
| Weekend | Mixed set including trees. Then explain “return the height, accumulate the answer” out loud |
Milestone: every tree problem starts with “is this top-down or bottom-up, and what does the recursion return?”
Week 5 — Graphs
| Session | Do |
|---|---|
| Mon | Drill 16 (BFS, iterative DFS, topological sort both ways) |
| Tue | Read Graphs §1-5. Core-80 graph rows, first half |
| Wed | Drill 10 (union-find) + the DSU problems |
| Thu | Drill 17 (Dijkstra both ways). Core-80 shortest-path rows |
| Fri | Drill 18 (Kruskal + Prim). Flashcards on the algorithm chooser |
| Weekend | Timed mock: one graph problem and one from an earlier week, 45 min each |
Milestone: you reach for BFS on unweighted graphs without thinking, and you can say why Dijkstra breaks on negative edges.
Week 6 — Dynamic programming
| Session | Do |
|---|---|
| Mon | Read DP §1-4. Write the two knapsack loops from memory and explain the direction |
| Tue | Core-80 1D DP rows |
| Wed | Read DP §5-6. LCS, edit distance, LIS both ways |
| Thu | Core-80 2D DP rows |
| Fri | Interval DP: burst balloons, and say the “think about the last operation” reframing out loud |
| Weekend | Mixed set of 5 DP problems. For each, write the state definition as an English sentence first |
Milestone: you define the state in words before writing code, and you can state complexity as “states x transitions”.
Week 7 — Language depth and design
If you own Effective Python or Effective TypeScript, this is the week to fold them in. Do not read them cover to cover — use the coverage matrices in chapter 20 §3 and chapter 21 §2 to skip the ~35% of each book already covered here at equal or greater depth, and spend the time on the gap lists instead (20 §5, 21 §4). Those are trap-shaped and therefore interview-shaped.
| Session | Do |
|---|---|
| Mon | Drill 20 (Promise from scratch, or a decorator with arguments). Read the corresponding core chapter section |
| Tue | The language-specific drill table in Problem sets §5 — pick 4 |
| Wed | Read TS types §1-6 or Python core §3, §11 |
| Thu | Read one design-patterns chapter’s SOLID section, then Testing strategy §2-3 and §9 — the doubles and the mutation-testing table |
| Fri | Flashcards python/javascript/typescript/patterns tags + the testing cards. Then testing drills 3, 5, 6 from chapter 19 |
| Weekend | Design a small system out loud for 45 min (rate limiter, URL shortener, chat), then testing drills 9, 10, 14 (real HTTP server, SQLite constraints, pure core) |
Milestone: you can answer “why this data structure” and “which patterns does your language make unnecessary” fluently.
Week 8 — Integration and mocks
| Session | Do |
|---|---|
| Mon | Full mixed set: 4 problems, 25 min each, random patterns |
| Tue | All 20 blank-file drills, starred ones only, timed |
| Wed | Debug-and-fix: the trap table in Problem sets §7 — write 5 bugs, fix them tomorrow |
| Thu | Fix yesterday’s bugs. Then behavioural: write out 6 STAR stories with measurable outcomes |
| Fri | Weak-spot day: whatever your tracker says is below 3 |
| Weekend | Two full mock interviews, 45 min each, with a human or a model playing interviewer. Narrate everything |
Milestone: you can be interrupted mid-solution with a changed requirement and adapt out loud.
4. The maintenance loop
The version that stops the rust coming back, at about two hours a week. This is the one to keep doing indefinitely.
Weekly (90 minutes)
- One blank-file drill (15 min) — rotate through the 20 in Problem sets §6 and the 20 in Testing §8, alternating. One per week means the whole set every nine months, which is enough to keep it warm.
- Two mixed problems (50 min) — random pattern, no hints, narrate the choice out loud.
- One flashcard pass (15 min) — whatever the spaced schedule says is due.
- One trap (10 min) — pick a row from the trap list in Cheat sheets §7 and reproduce the failure in a scratch file.
Monthly (30 minutes extra)
- Re-read one chapter’s interview-questions section and answer out loud before reading the answers.
- Update the tracker in section 6.
- One trap from a gap list (20 §5 or 21 §4) — predict the behaviour, then run it. These are the cheapest single item in the loop and the ones most likely to come up unprompted.
The anti-rust habit, applied to daily work. The reason fundamentals erode under AI-assisted coding is that the choosing and the justifying get delegated along with the typing. Two cheap counters:
- When you accept a generated data structure or algorithm, say (or write in the commit message) why it is the right one and what its complexity is. Thirty seconds, and it keeps the muscle attached.
- Once a week, implement something small yourself first, then compare with what the model would have written. The comparison is where the learning is; the order matters.
5. Spaced repetition schedule
For any single item — a flashcard, a drill, a problem — review at expanding intervals, and reset to the start whenever you fail it.
| Review | When | Action on success | Action on failure |
|---|---|---|---|
| 1 | same day | move to +1 day | repeat same day |
| 2 | +1 day | move to +3 days | back to +1 day |
| 3 | +3 days | move to +1 week | back to +1 day |
| 4 | +1 week | move to +3 weeks | back to +3 days |
| 5 | +3 weeks | move to +2 months | back to +1 week |
| 6 | +2 months | retired, revisit before interviews | back to +1 week |
“Failure” for a drill means: you could not produce a working implementation in the target time without looking. “Failure” for a flashcard means: you could not say the answer out loud, completely, within about ten seconds. Silent “yeah I know that” does not count — say it.
A paper log with six columns works fine. If you want it automated, use the Anki deck in section 9; Anki’s scheduler implements exactly this.
6. Self-assessment tracker
Score 1-5 weekly. 1 = could not start. 2 = need the reference. 3 = can do it with hints. 4 = can do it clean, first try. 5 = can do it and teach it, including the trade-offs.
Practise whatever is lowest, not whatever is most fun. The whole point of the table is to stop you re-solving two-pointer problems because they feel good.
| Area | Wk1 | Wk2 | Wk3 | Wk4 | Wk5 | Wk6 | Wk7 | Wk8 |
|---|---|---|---|---|---|---|---|---|
| Complexity analysis and defending a bound | ||||||||
| Arrays, hashing, prefix sums | ||||||||
| Two pointers | ||||||||
| Sliding window | ||||||||
| Monotonic stack / deque | ||||||||
| Binary search (all three templates) | ||||||||
| Binary search on the answer | ||||||||
| Sorting: implement and choose | ||||||||
| Heaps and top-k | ||||||||
| Linked lists | ||||||||
| Trees (traversal, recursion shape) | ||||||||
| Tries | ||||||||
| Graphs: BFS/DFS/topo | ||||||||
| Graphs: shortest paths, MST | ||||||||
| Union-Find | ||||||||
| DP: 1D and knapsack | ||||||||
| DP: two-sequence and grid | ||||||||
| DP: interval, bitmask, tree | ||||||||
| Backtracking | ||||||||
| Greedy (and knowing when it fails) | ||||||||
| Bit manipulation | ||||||||
| Python internals (GIL, model, perf) | ||||||||
| JS internals (event loop, V8) | ||||||||
| TypeScript type system | ||||||||
| Design patterns and SOLID | ||||||||
| System design (basic) | ||||||||
| Narrating while coding | ||||||||
| Debug-and-fix on unfamiliar code | ||||||||
Testing: node:test / unittest fluency | ||||||||
| Testing: choosing a double, and mocking traps | ||||||||
| Testing: integration tests with built-ins | ||||||||
| Language traps (the Effective gap lists) | ||||||||
| Reading a type error out loud and naming the rule |
7. Flashcards
The deck moved off this page and into an interactive study tool: /flashcards.
Same 154 cards, same flashcards.tsv source (parsed at build time, no client-side parsing) — now with
tag filtering (complexity, python, javascript, typescript, dsa, patterns, testing,
effective-python, effective-ts), shuffle, and one-card-at-a-time study mode instead of a wall of text.
Say the answer out loud before revealing it. If it takes more than ten seconds, it is a failure — reset the interval.
8. Blank-file drills
The core of the whole plan. Close every reference, open an empty file, and produce a working implementation with a small test. Then run it, then diff against the reference in this guide.
The 20 drills are listed with target times in Problem sets §6. The starred ones — dynamic array, linked list operations, heap, BST, trie, DSU, LRU, three sorts, binary search templates, BFS/DFS/topo, Promise-or-decorator — are the ones to rotate through weekly forever.
Rules that make the drill work:
- No reference open. Not the guide, not documentation, not an assistant. If you look, you restart the interval for that drill.
- Write a test. Three asserts minimum, including an edge case. A drill you did not run does not count.
- Time it. Beat the target time, or note the gap. The gap is your progress metric.
- Say the complexity out loud when you finish, including the space and the amortization story.
- Diff afterwards. Not to feel bad — to find the specific thing you forgot. “I forgot to update the position map in the heap swap” is actionable; “I sort of got it” is not.
A drill log is worth keeping, because the pattern in the failures tells you what to study:
date drill target actual outcome what I forgot
2026-08-20 heap (TS) 25m 31m pass O(n) heapify order (last internal node)
2026-08-21 BST delete (Py) 30m 30m fail the two-children case: successor, not swap
2026-08-22 binary search x3 20m 14m pass -
9. Using the Anki deck
flashcards.tsv (the same file behind /flashcards, section 7) is every card
from the old complexity/Python/JS-TS/DSA/patterns sections plus the 32 testing cards from
chapter 19 — 154 in total, tab-separated, with a tag column.
The effective-python and effective-ts tags (27 cards) come from the book crosswalks in
chapter 20 and chapter 21;
they are almost all trap-shaped, so they are the highest-yield subset to drill cold.
Import into Anki
- Tools -> Manage Note Types -> Add -> Basic. (The default “Basic” is fine.)
- File -> Import -> choose
flashcards.tsv. - Field separator: Tab. Allow HTML in fields: off.
- Map field 1 -> Front, field 2 -> Back, field 3 -> Tags.
- Deck: create one called “Interview refresher”.
Settings that match the schedule in section 5
- New cards/day: 10 during the 8-week plan, 3 in maintenance.
- Maximum reviews/day: 60.
- Learning steps:
10m 1d. - Graduating interval: 3 days. Easy interval: 7 days.
- Leave FSRS on if your Anki version offers it — it implements expanding intervals better than the legacy SM-2 defaults.
Tags let you drill one area: complexity, python, javascript, typescript, dsa, patterns,
testing.
Use tag:dsa is:due in the browser to review just one bucket.
Say the answers out loud. Silent recognition (“yeah, I know that one”) is the failure mode that makes flashcards feel productive while teaching nothing. If you cannot say it in a sentence, press Again.
Back to the index.