Guide · Career

The schedule is the skill, not the problem count

Most people preparing for technical interviews have a list of problems and no system for retaining them. Three months later the early problems are gone, the count looks impressive, and the interview goes badly for reasons that feel mysterious and are not.


Two different guides, on purpose

The interview patterns guide covers what to study: the ten recurring problem shapes, the recognition cues, and why tagging failures by pattern beats counting solves. This guide covers how to study, which is a separate problem with separate failure modes. If you have never seen the pattern taxonomy, start there and come back.

Why volume without review reliably fails

The default plan is a list and a streak: solve a problem a day, keep going, feel prepared. It fails for a reason that has nothing to do with effort. Memory for a solved problem decays on a curve, and the curve is steeper than anyone expects. A problem you solved cleanly in March, with no intervening contact, is frequently a blank page in June. Not "a bit rusty." Blank.

So the person who solved 300 problems over four months and never revisited one has not banked 300 problems. They have banked whatever survives from the last few weeks, plus a general sense of familiarity that evaporates the moment a whiteboard is involved. The count is real and the retention is not.

The second failure is subtler and worse, because it feels like studying. Reading a solution and thinking "yes, that makes sense" produces a strong feeling of understanding and almost no retrievable memory. This is the fluency illusion: comprehension while reading is not the same operation as generation from a blank page, and only the second one is what an interview tests. If you did not produce it yourself, you did not learn it, no matter how clearly you followed it.

Both failures have the same fix, which is uncomfortable and cheap: spend a substantial fraction of your study time re-solving things you have already solved, from memory, on a schedule.

The Leitner system, operationally

Leitner is the simplest workable implementation of spaced repetition. Items live in numbered boxes; each box has a review interval; a clean recall promotes an item one box, a failure sends it back to box one. That is the whole algorithm and it needs no software.

BoxReview intervalMeaningOn success / on failure
11 dayFailed recently, or never solved unaided→ box 2 / stays in box 1
23 daysSolved with a hint→ box 3 / back to box 1
31 weekSolved unaided but slowly→ box 4 / back to box 1
43 weeksSolved unaided and fluently→ box 5 / back to box 2
58 weeksRetired to maintenancestays in box 5 / back to box 2

Two details do most of the work and both get skipped.

A failure demotes hard, not gently. From boxes 1 through 3, a failure goes all the way back to box one. That is the mechanism that concentrates your time on exactly the material you cannot do, which is the only material worth studying. A system that demotes by one box lets weak items drift forever.

Box one has a size limit. If box one holds forty items, you are not studying, you are drowning, and you will start skipping reviews, which breaks the whole system. Cap it at around ten. When it is full, you do not add new problems that day. New material waits until the backlog clears. This rule feels like it slows you down and it is the single highest-leverage constraint in the system.

What is actually on a card

This is where most people implement it wrong. The card is not the problem statement, because re-solving a full problem takes 30 minutes and you cannot review 15 of those in a session. The card is the retrievable unit.

Front: the recognition cue "Contiguous subarray, longest satisfying a condition" Back: 1. pattern name sliding window 2. the template, written from memory, not pasted 3. the complexity target O(n) 4. the pitfall that got you "shrink condition ran before the update, off-by-one on the answer" Review = write 2 from a blank page in under 5 minutes, then diff.

With cards shaped like that, a review is five minutes and a session can clear ten to fifteen of them. You periodically re-solve a full problem end to end, but that is a different activity with a different budget, not your review mechanism.

Implementing it without buying anything

  • Index cards and five physical boxes. Genuinely fine, and the tactile version has a compliance advantage most people underrate.
  • A spreadsheet. Columns: cue, pattern, box, last reviewed, next due. Sort by due date. That is the entire application.
  • Anki. Free on desktop and Android, uses a more sophisticated scheduler than Leitner, and works well if you already use it. It is not required.
  • A script and a text file. I ended up writing a small drill runner for my own prep with problems tagged by pattern and Leitner boxes over a plain file, mostly because the review step needed to be one command with no friction. The tooling matters far less than doing the reviews.

How to review a solved problem

"Review" usually means re-reading an old solution, nodding, and closing the tab. That produces the fluency illusion described above and close to zero retention. Here is a protocol that takes ten minutes and actually works.

  1. Read only the cue, then look away. Name the pattern and the complexity target out loud before anything else. If you cannot, that is the failure and the card goes to box one. Stop here and re-learn it rather than pushing through.
  2. Write the template from a blank page. Not the full problem solution, the canonical implementation of the pattern. Handwritten or in an editor with autocomplete off. This is the actual retrieval event, and everything else in this list is support for it.
  3. Diff it against your previous solution. Not to see if it looks similar, but to find every place they differ. Differences are where your memory is reconstructing rather than recalling, and that is exactly what will break under pressure.
  4. Say the invariant out loud. One sentence: what is true at every step of the loop. "The window always contains at most k distinct characters." If you cannot state the invariant, you have memorised syntax rather than the idea, and syntax does not transfer to a variant.
  5. Name the edge case that would break it. Empty input, a single element, all duplicates, integer overflow, a cycle. One is enough. This is the step that separates people who pass from people who nearly pass.
  6. Write one line in the log. What broke, and where — recognition, approach, implementation, or edge cases. Those four locations need four different fixes, and by the end of a month the log tells you what to work on without any guessing.

The diff step is the one to protect when time is short. A template you can nearly write is worth much less than one you can write exactly, and "nearly" is invisible until you compare the two side by side. Most people who feel prepared and then blank in an interview were living in the gap between nearly and exactly.

Timeboxing, and what to do when the box expires

Unbounded struggle is the most common way study time gets wasted. Ninety minutes on one problem feels like commitment and mostly produces frustration plus one data point. A timebox converts the same ninety minutes into three problems and three diagnoses.

PhaseBudgetWhat must exist when the timer ends
Understand0–5 minThe input shape, the output, and two examples worked by hand
Approach5–15 minA named pattern and a complexity target, said out loud
Implement15–35 minWorking code, or a specific known blocker
Verify35–45 minEdge cases walked manually, complexity stated
Hard stop45 minEscalate to the hint ladder — do not extend the timer

The approach phase is the one to enforce ruthlessly. Fifteen minutes with no named pattern means the problem is currently above your level, and the useful move is to get a hint and turn it into a study item, not to spend another forty minutes rediscovering the pattern by brute force. An interview gives you about 35 minutes. Practising in unbounded time trains a skill you will not be allowed to use.

The stuck ladder

When the timer expires, escalate in the smallest possible steps. The goal is to take the least amount of help that unblocks you, because every rung you climb without help is a rung you can climb alone next time.

  1. Re-read the constraints. If n is up to 10^5, an O(n²) approach is not intended, and that observation alone identifies the pattern surprisingly often.
  2. Say the brute force out loud, then ask what it repeats. Nearly every optimisation is the elimination of repeated work. Naming the repetition names the data structure.
  3. Do a small case entirely by hand. Four or five elements, on paper. The mechanism you use by hand is usually the algorithm, and people skip this step because it feels beneath them.
  4. Ask what has to stay true. The invariant question again. Being unable to answer it usually means the state you are tracking is wrong, not that the code is wrong.
  5. Look at the tags only. Not the editorial, the tags. Knowing it is a heap problem and finishing it yourself is worth vastly more than reading the solution.
  6. Read only the first sentence of the editorial. Then close it and try again. This is the highest-value rung on the ladder and almost nobody stops there.
  7. Read the full approach, close it, implement from memory. Never copy code. If you cannot implement it after reading the approach, you did not understand it, and copying it will hide that fact from you.
  8. Write the card. Mandatory. A problem you needed help on and did not turn into a card is a problem you will need help on again in six weeks.

A session template

Ninety minutes, in this order, every time. The order matters more than the durations.

  1. 0–20 min, due reviews. Clear whatever the box schedule says is due. Reviews come first because if they come last they do not happen.
  2. 20–35 min, recognition drills. Read problem statements, name the pattern and the complexity, do not implement. Ten to fifteen of these in fifteen minutes. This trains the step interviews test first and it is absurdly cheap.
  3. 35–80 min, one or two timed solves. Full timebox, out loud, from a blank page.
  4. 80–90 min, write the cards and the log lines. Non-negotiable. This is the step that makes today's work exist next month.

If you only have thirty minutes, do the first block and stop. Twenty minutes of reviews with no new problem beats a new problem with no reviews, every single time, and the fact that it feels like less progress is exactly why people get this backwards.

A schedule that fits a semester

PhaseWeeksFocusThe honest signal you are ready to move on
Foundations1–2Complexity analysis, the language's data structures cold, two or three patternsYou can state the complexity of any built-in operation you use without checking
Pattern acquisition3–6One new pattern per week; template written from memory; deck fills upBox one clears most days without a backlog
Mixed practice7–9Random problems across all patterns, no advance warning of the patternUnaided first-attempt rate above roughly two thirds on mixed sets
Interview simulation10–12Timed, verbal, with another person, plus behavioural answersYou can talk continuously through a solve without losing the thread

The transition from phase two to phase three is where most preparation quietly breaks. Studying one pattern per week means every problem that week arrives pre-labelled, and pattern recognition is never tested. Mixed practice removes the label, performance drops sharply, and that drop is the honest measurement. It is supposed to be uncomfortable. It is also the closest thing to the real conditions you will get before the real conditions.

Talking while you think

Interviews are verbal, and silence reads as being stuck even when it is not. This is a separate skill from solving and it degrades solving performance the first several times you attempt both at once, which is precisely why it needs its own practice.

  • Solve out loud, alone, from the beginning. Narrate the four approach questions every time until it is automatic.
  • Record one solve a week and watch it back. Uncomfortable and unreasonably effective. You will find long silent stretches you had no idea were there.
  • Do real mocks with a person. Peers are free; interviewing another student is as instructive as being interviewed. The pressure of another human being present is the variable that no amount of solo practice reproduces.
  • Practise the recovery script. "Let me restate what I have, then try a different angle" is a sentence worth having ready, because the moment you need it is the moment you are least able to compose it.

What to measure

Total problems solved is the metric that feels like progress and measures almost nothing. Three alternatives that actually track readiness:

  • Due-card clear rate. The share of scheduled reviews you actually complete. Below about 80 percent, the schedule is too aggressive and everything downstream is unreliable.
  • Unaided first-attempt rate, by pattern. Computed per pattern, not overall, because the overall number hides the one pattern that will end the interview.
  • Median time to a correct named approach. Under five minutes is a strong signal. This is the number that most directly predicts interview performance, and it is the one nobody tracks.

The week before

  1. Stop adding new material. Nothing learned in the final week will be retrievable under pressure anyway, and the attempt costs you review time.
  2. Clear the deck. Every box, once, even the eight-week ones.
  3. Re-write every template once from memory, in one sitting. It takes about an hour and it is the highest-value hour of the whole final week.
  4. Two full mocks, with a person, at the actual interview time of day.
  5. Prepare the non-algorithmic half: the project walkthrough, the behavioural answers, the questions you ask them. A strong solve with a vague project story is still a mixed signal, and the portfolio guide covers how to make that half land.
  6. Sleep. Genuinely load-bearing, and the first thing people trade away in the final 48 hours.

The uncomfortable summary

The system is not clever. Review before new material, cap the backlog, write templates from a blank page instead of reading them, timebox everything, escalate in the smallest steps when stuck, and measure per-pattern rather than in total. None of that is a secret and almost nobody does it, because every part of it feels slower than grinding through a fresh problem list.

It is slower per week and much faster per month. That trade is the entire point, and it is the same trade in every skill worth having. Getting to the interview in the first place is a separate pipeline problem, handled in the resume guide and tracked in Apply OS; the international-student timing and sponsorship layer is in the internship guide.

Tools referenced in this guide

  • Interview patterns — the companion guide: what to study, and the ten recurring problem shapes.
  • Apply OS — application pipeline and deadline tracking, free and browser-only.
  • Portfolio guide — the non-algorithmic half of the loop: projects that survive a walkthrough.

FAQ

Quick answers

Why does solving lots of problems not work?

Because memory for a solved problem decays steeply without review, so a large solved count mostly measures what you did in the last few weeks. The second reason is the fluency illusion: reading a solution and understanding it feels like learning but produces almost no retrievable memory, since comprehension while reading is a different operation from generating a solution from a blank page.

What is the Leitner system and how do you use it for coding?

Items live in numbered boxes with review intervals of roughly 1 day, 3 days, 1 week, 3 weeks, and 8 weeks. A clean recall promotes an item one box and a failure sends it back to box one. For coding, the card is not the whole problem but the recognition cue on the front and the pattern name, template, complexity target, and your specific pitfall on the back.

How do you review a coding problem you already solved?

Read only the cue and name the pattern and complexity from memory, write the template from a blank page with autocomplete off, then diff it against your previous solution and investigate every difference. Then state the loop invariant out loud, name one edge case that would break it, and log where the attempt broke. About ten minutes per problem.

How long should you spend on a problem before looking at the solution?

Around 45 minutes total, split as five minutes to understand, ten to name an approach, twenty to implement, and ten to verify. If fifteen minutes pass with no named pattern, the problem is above your current level and the useful move is to take a hint and turn it into a study item rather than rediscovering the pattern by brute force.

What should you do when you are stuck on a problem?

Escalate in the smallest steps: re-read the constraints, say the brute force out loud and ask what it repeats, work a five-element case by hand, ask what invariant must hold, then look at the tags only, then read one sentence of the editorial and close it. Never copy code, and always turn the problem into a card afterwards.

How much of a study session should be review versus new problems?

Review first, always, taking roughly the first 20 minutes of a 90-minute session, followed by recognition drills and one or two timed solves. If you only have 30 minutes, do the reviews and skip the new problem. Reviews scheduled last do not happen, which is the most common way a spaced repetition system quietly dies.

How long does it take to prepare for technical interviews?

A workable structure is 10 to 12 weeks: two weeks on complexity and data structures, four on acquiring patterns one per week, three on mixed practice with no advance label, and two to three on timed verbal mocks. The phase-two to phase-three transition is where performance visibly drops, and that drop is the honest measurement of pattern recognition.

What should you measure instead of problems solved?

Due-card clear rate, which should stay above roughly 80 percent or the schedule is too aggressive; unaided first-attempt rate computed per pattern rather than overall; and median time to a correct named approach, where under five minutes is a strong signal. That last number predicts interview performance better than any total does.