Code typing practice
Six languages, three levels of symbol density. Practise the syntax you write, and work from the keys you actually miss.
Language-specific practice
Each page is written about that language specifically: which characters dominate it, which reaches are awkward, and what is worth drilling.
Practise the language you actually ship
The gain from this kind of practice transfers through specific character sequences, not through general dexterity. Drilling Rust will not noticeably help your TypeScript, because what you are building is muscle memory for particular shapes — the turbofish, the arrow, the closing tail of a callback — and those shapes differ per language.
So pick the language you write most this month, and stay with it long enough for the awkward sequences to stop being awkward. Rotating through six languages feels productive and mostly rehearses the state of being slightly uncomfortable.
Retaking a test is not practice
A test measures. Repeating it mostly rehearses what you can already do, since the bulk of any passage is characters you type fine, and the handful you keep missing go past too quickly to work on.
The per-key heatmap exists to break that loop. It names the characters actually costing you errors, weighted by how often you press them, so a moderate miss rate on a bracket you type constantly ranks above a terrible rate on something rare. Feed those characters into the drill generator and you get a passage dense in exactly them — which is unpleasant to type and worth far more per minute than another clean run.
A reasonable loop: one measured test to see where you are, drills on whatever it exposed, and another test a few days later to check the drill moved anything. Testing daily and practising nothing produces a graph and no improvement.
Difficulty here means symbol density, not length
The three levels differ in how much punctuation they put in your way rather than how much code there is. Beginner snippets are readable, mostly alphabetic and lightly nested. Advanced ones are generic-heavy and deeply nested, with long runs of consecutive symbols and very few plain words to recover on.
Work at the level where you are making a few errors and not many. No errors means you are rehearsing; constant errors mean you are practising stopping and restarting, which is its own bad habit. Move up when the current level starts feeling mechanical.
Frequently asked questions
How often should I practise?
Ten focused minutes several times a week beats an hour once. This is motor learning, and it consolidates between sessions rather than during them.
Should I practise all six languages?
No. Pick the one you write most. The benefit comes from specific character sequences becoming automatic, and those barely transfer between languages.
Should I look at the keyboard for symbols?
Try not to. Looking down is the habit that caps speed, and symbols are exactly where it is most tempting. Slow down enough to find them by feel and the reach becomes automatic within a few sessions.
Will this make me a faster programmer?
It removes typing as a friction, which is worth having, but be honest about the size of it. Most of a working day is reading and deciding. Symbol accuracy is where the real return is, because a mistyped brace costs far more than the keystroke did.
When you want a measurement rather than practice, take the code typing test. For the characters that trip up most people, mastering special characters goes through them one at a time.