Do you want to program fast? Then you need to program quickly. Deliberate practice with slowly written / slowly designed code won't make you any faster.
Do you want to program difficult problems? Then you need to solve difficult problems. Writing fast "code jams" won't help you train vs difficult academic, theoretical problems.
Do you want to program Cryptography? Then you need to write correct cryptography code. Practice by writing incorrect / breakable cryptography code (ie: side-channel attacks, timing attacks, etc. etc.) does you no good. You need to actually write the proper cryptocode.
-------
Doing any of these things imperfectly is sadly, less than useful. You end up practicing "bad habits" and making yourself worse as a programmer.
Fortunately, we programmers don't need perfection in most cases. But always remember that while "normal practice" gains a decent level of competence, you don't actually reach the levels of elite skill (in any task, programming included) unless you can execute "perfectly" at least once.
Setting yourself up for perfect execution needs to be a goal in of itself. For students of language, this means practicing the native tongue's accent. For sports, it means practicing the perfect golf swing form, or the perfect strikes in martial arts.
It also means that people of elite skill can "retain" those skills easier than beginners. If you want to practice "10 perfect golf swings", a beginner may have to swing 100 times to do it. But a pro-golfer would execute in just 10 swings (since almost all of their swings are perfect already).
Do you want to program difficult problems? Then you need to solve difficult problems. Writing fast "code jams" won't help you train vs difficult academic, theoretical problems.
Do you want to program Cryptography? Then you need to write correct cryptography code. Practice by writing incorrect / breakable cryptography code (ie: side-channel attacks, timing attacks, etc. etc.) does you no good. You need to actually write the proper cryptocode.
-------
Doing any of these things imperfectly is sadly, less than useful. You end up practicing "bad habits" and making yourself worse as a programmer.
Fortunately, we programmers don't need perfection in most cases. But always remember that while "normal practice" gains a decent level of competence, you don't actually reach the levels of elite skill (in any task, programming included) unless you can execute "perfectly" at least once.
Setting yourself up for perfect execution needs to be a goal in of itself. For students of language, this means practicing the native tongue's accent. For sports, it means practicing the perfect golf swing form, or the perfect strikes in martial arts.
It also means that people of elite skill can "retain" those skills easier than beginners. If you want to practice "10 perfect golf swings", a beginner may have to swing 100 times to do it. But a pro-golfer would execute in just 10 swings (since almost all of their swings are perfect already).