loading...

How to properly practice what you learn

lavie_encode profile image Nicole Archambault ・6 min read

Hey everyone! First post on dev.to, even though I've been lurking and sharing stuff from here foreverrrr. I've told Ben for two years now that I'll post something when I see him at Codeland. But better late than never!

So, I want to let you guys in on some really critical skills I picked up early on in my self-teaching. I'll go through them one by one over time, but in this post, I want to highlight one that literally changed the way I learned.

A lot of us learn via videos, books, podcasts, blog posts. But what do we do with that information after we encounter it?

Using what we learn is both a skill AND a habit that we can build. If you don't build that habit early, you'll start spinning your wheels like I did. People kept asking what I was "working on", and I thought they meant what videos I had watched, or what lessons I had finished on Treehouse.

And yes, you can tell them you're watching videos and working through freeCodeCamp, which is a perfectly acceptable response. But what they're really looking for is to find out how you're applying the skills you're learning.

Adding to my anxiety while I was learning was the feeling that I was never quite "doing enough", or at least not The Right Thing™️. And maybe I wasn't, but I never quite gave myself a chance because I wasn't actively, regularly making a point to apply what I was learning—in the form of projects... or, more importantly, "deliberate practice".

Characteristics of deliberate practice

So, what the heck is deliberate practice?

I mean, you just sitting down practicing is deliberate, right? You made the deliberate choice to sit down and practice.

Well, that's a part of it, but deliberate practice has some set characteristics.
Deliberate practice, generally speaking, is like regular practice, but with a specific goal of improvement.

When you do something with a specific goal, it makes sense that your approach would change.

If you want to prepare for a marathon, you'll train and practice differently than you would if you were training for a 100m dash. Similarly, if you're practicing with a goal of learning JavaScript in order to be a front-end developer, you'll need to focus in solely on JavaScript, and break your goals down even further than that.

Also, working on anything that isn't a particular area of JavaScript that you need more comfort with is a waste of your time. Perhaps not a complete waste of your time, as it would be to study Spanish instead of FE dev. But still a waste, nonetheless. You'll never reach your goals that way.

Deliberate practice also requires focus and attention, as well as sustained effort and energy. Focus... attention... energy... these are all limited resources that we possess as human beings. (Buuuuut I really can't think of a better way to use your energy than on improving yourself, right?)

Deliberate practice favors quality over quantity

First, deliberate practice focuses on the quality of the practice, not the quantity.

If you look at most resources and writings out there about practice, they encourage consistency—showing up every day, ready to learn. Showing up is indeed half the battle. And you can't get better without practicing the information you encounter, which is why you stress when the training wheels are taken off.

But just showing up and doing "some stuff to get better at coding" isn't going to cut it, because it isn't sustainable.

I've been hearing the "10,000 hours" quote popularized by Malcolm Gladwell for years now, and I honestly think it's a load of crap. What happens when you practice for 10,000 hours?

What if you focus on the wrong things, or find that you still can't recall related or prerequisite information between sessions? 10,000 hours of unfocused work is meaningless, which is why I also have strong feelings about established industry folks touting their years of programming experience.

Often, they're looking things basic things up and referencing them as often as newbies are, because they never took the time to really master their work.

Mastery is rare, folks. It's not as common as we're led to think it is, since a lot of the noise comes from the folks who claim to know what they're doing.
Just remember that low-quality practice sessions are poorly structured, and lack clear goals or desired outcomes.

High-quality practice sessions, on the other hand, have a greater chance of the student emerging with understanding that sticks.

Deliberate practice is highly structured

You can't just kind of wander into a practice session with a loose goal to get better.

Get better at what?
How much better?

Once you get to that goal, what's your next small step to reaching the bigger goal?

Without structure, you're not likely to stick with it, either.

Deliberate practice gives immediate feedback on your progress

Fortunately, for web development, errors serve as excellent learning tools.
Also, a lot of e-learning platforms like Treehouse and freeCodeCamp that integrate practice on their sites with test-driven development environments provide instant feedback to satisfy this criteria.

But even with feedback like errors and TDD, there are other considerations. Is that everything involved in meeting your goal of being a really good developer in this particular area?

What about things like technique, style, and approach to problem-solving? We still mostly need humans for that, since it's humans and not machines that ultimately use our code.

We also need that feedback to be super-informative, with specific information regarding how and why you were right or wrong, and guidance to learn more as needed.

So, human and computer feedback is a critical part of deliberate practice as we're learning to code.

Deliberate practice requires repetition

The best practice involves doing the same task or related tasks repeatedly. Practice is not watching videos or reading tutorials. Those are learning activities.

And even simply repeating the same actions over and over won't produce improvement.
Think of it this way: if you show up to deliberately practice a specific action like writing a function from scratch, because you're not comfortable doing it on your own yet, you'd set up multiple challenges to write a function from scratch.

If you know your weak area is writing functions, but you decide to write things that aren't functions... you're not practicing deliberately, because deliberate practice requires exposing yourself to the same challenges, in order to bring you comfort and familiarity with solving them.

A lot of new developers think that all expert developers program from what's commonly called a "flow state". They think the developer just naturally knows how to overcome obstacles. In reality, they practiced that task frequently enough that they recognize all the obstacles on their path to their goal.

And, deliberate practice can lead to more relaxed, natural programming and problem-solving ability.

But you cannot achieve expertise without deliberate practice. It's just not possible. You'll sustain in mediocrity, at best. And that's ok for a lot of folks, but I want to help people become the best developers they can be, so if I have anything to say about it—you're adding deliberate practice to your toolbox today!

To recap:

Deliberate practice is different than what's commonly referred to as "practice", because it focuses on the quality of the practice over the quantity.

In order for practice to be deliberate, it also needs to be highly structured, provide detailed feedback and guidance for improvement, and involve completing the same or similar tasks repeatedly.

That's it! Now you know that there's basically a practice++ available for you to take your learning to the next level.

Learn more helpful skills like this! 😊

If you'd like to learn more about learning, as well as other often-overlooked but critical skills in tech, join the Life in Code newsletter! ❤️

Discussion

pic
Editor guide
Collapse
tvanantwerp profile image
Tom VanAntwerp

An important part of my deliberate practice is using spaced repetition to memorize things. Whenever I encounter something new that I might need to know later, I add it to my deck of flashcards in Anki. This has been especially useful for learning less-used methods in a language or library, or for learning arcane bash commands. I find the more things I've memorized in this way, the faster I can code in generally because I'm not interrupting my flow with as may trips to Google for information. I don't think you can learn to code just by studying flashcards, but it has helped me a lot.

Collapse
beernutz profile image
beernutz

I think this quote might benefit from a little bit of context:

"Often, they're looking things basic things up and referencing them as often as newbies are, because they never took the time to really master their work."

In my experience, looking up basic things is not really a sign of lack of mastery, it seems to me, the the thing you gain with years of programming experience is a sense of "what to do" and not necessarily "what is the exact command in this language to do it".

There might also be something to be said around general mastery vs. specific mastery.

All this said, I am in complete agreement with the idea of "directed or correct practice". Practicing bad habits does not "make perfect" in any sense but being really good at doing the thing you were practicing badly.

Please know that I write this not to be critical of your article, rather I wanted to add some of my perspective.

Thanks for your thoughts!

Collapse
db325 profile image
db325

I agree. But on interviews I get asked questions like what's the difference between let and var? And I'm like really? Or what does a for each loop do. As opposed to presenting me with a problem where using said loop is the best or most efficient way to do it. Programming of about problem solving, not knowing every language or framework. Because after you've used a few, you realize they all do the same things. Just some better than others. And no matter the framework or library, the underlying technology and protocols and the same.

Collapse
matthew_collison profile image
Matthew Collison

So many incredible sentiments here. The quality vs quantity practice really resonates with us here.

A big reason for this is that we've noticed, particularly among Instagram #100daystocode crowd, that people feel bad if they've missed a day or two out of their journey.

And people are trying to pick up multiple frameworks at once because there's just so many tutorials to try your hand in. Some people can do this but for most it's a dirt path to burnout!

Thanks for this awesome post. We love what you're doing!

Collapse
lavie_encode profile image
Nicole Archambault Author

Thanks! I just gave y'all a shout out in the today's edition of my Life in Code newsletter, check it out! You can subscribe here, too.

Collapse
ssimontis profile image
Scott Simontis

At the same time, sometimes it's really nice just to do things for fun. Hack something together quickly in assembly for a microcontroller, decide to perform a task in a random language I know nothing about, abuse functional programming method chains, etc. I have honestly learned the most off some of those projects. One summer, I tried to reverse engineer a pager protocol off of patent applications. I knew nothing about DSP going into it, but it was a lot of fun learning it and realizing that sometimes the documentation is total BS!

Collapse
lavie_encode profile image
Nicole Archambault Author

Totally. Breaking things for fun is a blast. I work with folks who are on their path to their first dev jobs though, and meandering isn't really conducive to their goals, so I'm sharing all the hacks I had to create/learn (esp having a non-verbal learning disability... learning, let alone learning to code, was a real bitch) to help them avoid the pitfalls!

Collapse
ssimontis profile image
Scott Simontis

I can definitely see how discipline would be crucial! I have ADD and I really struggle to learn anything that doesn't immediately seem fun/interesting to me. Sometimes I can use it to my advantage and specialize in things most people don't care too much for, and sometimes I get to be very grateful that I have generally dealt with kind and patient supervisors when my time management skills fly right out the window.

Collapse
db325 profile image
db325

Wow! This is one of the best articles I've read in a while. You're absolutely right. I suffered from non-deliberate studying for a long time. I understood the concepts and if I was asked to write a function or s for loop etc, I could. My issue was when I got my ide up and running, I'd go completely blank. If just stare at my screen until I gave up. I think my issue was also the fact that some of the languages it frameworks I was learning, I was learning because that's what the job market reflected at the time. Over time I've learned to think through what I'm trying to do. I know the best data structures to use for a given set of data. But all that can't with trail and error. I spent most of my early coding days just trying to remember what I'd learned because I would read books and code for a few weeks to a month then stop for three months. I also totally underestimated the value in reading documentation!! So I thank sites like FCC for making me read the docs. Because that was something I didn't like to do.

Collapse
lavie_encode profile image
Nicole Archambault Author

Thank you! :) I'm glad you found it helpful.

"Over time I've learned to think through what I'm trying to do"—this is a powerful statement. For literally the first 6 months I was learning, I never really truly stopped to map out my approach and determine what skills were in line with what I wanted to do with my career. Once I learned how to not only identify but then hone in and deliberately practice the appropriate skills, I was off to the races!

Collapse
hashimwarren profile image
Hashim Warren

how does a self--learner get feedback from a human?

Collapse
db325 profile image
db325

Places like stack overflow, slack, gitter etc. Also I'm sure there are some nice ppl here that wouldn't mind taking s look at your code.

Collapse
lavie_encode profile image
Nicole Archambault Author

Slack channels and Gitter are definitely my top recs, besides just posting on the Twitters and asking politely if someone wouldn't mind taking a look at your code. Sometimes you need to sweeten the deal and offer something in exchange (like taking a look at theirs, or helping them find someone, if you're lower-level), since everyone's time is valuable—not just professionals or industry leaders.

But there are a TON of helpful people in this industry. Don't be afraid to ask, I promise you won't invite ridicule! And if you do get ridiculed, they suck and you're great because you have humility and willingness to learn. 😊

Thread Thread
db325 profile image
db325

Thank you 😊😊

Collapse
dsaseymour profile image
Danny Seymour

exercismio is good for this as well. You can complete exercises and get feedback from mentors on your solution I started it a few weeks ago.

Collapse
thejoezack profile image
Joe Zack

Great post! It's really important that we practice doing the right things the right way or else we are just strengthening bad habits!

Collapse
lavie_encode profile image
Nicole Archambault Author

Thanks Joe! :) And I totally agree.

Collapse
voidjuneau profile image
Juneau Lim

Even Malcolm himself said that the whole fame of Outlier's "10,000 hours" rule comes from a misunderstanding.

I originally disliked that guy, but after listening to this episode of Freakonomics, I came to pity him a bit.

Collapse
kamilliano profile image
kamilliano

I would add my personal book recommendation: "Pragmatic Thinking and Learning: Refactor your Wetware" by Andy Hunt.

Collapse
lavie_encode profile image
Nicole Archambault Author

Seconding this book! It's an excellent resource. :)

Collapse
sfwritermdk profile image
Marvin Kirkland

Yes! It's not about how much we try to learn, but making what we do learn - count!