This article was made to help those, like myself, that have trouble finding the time, or the patience to practice skills related to WebDev. Time spent on anything is precious and I despise needing to go back to re-learn something over and over again.
Also, if you don't want to spend the time reading through this article you can find a TLDR at the end
Repetition is probably one of the best methods I've used to solidify knowledge. This is done by initially practicing a problem over the course of a week. For example, if you started on a Monday you would practice again on Wednesday, Friday, and Sunday. Practicing every other day helps to train your brain to recall the information better and better each time.
After the first week, you should come back to it over increasingly extended amounts of time. Something like a full week, to a few weeks, to a full month. That is assuming you aren't using the new concept in any of your projects or work.
Coming back can really help you to see if you've actually solidified the knowledge. You might even find something that was overlooked in previous practices. Just be sure you come back to it before it's fully forgotten!
I've used these methods to practice concepts like Recursion, Async/Await, Redux, and State Machines.
Everyone has a preferred/best method to learn new things. This includes methods like reading, watching videos, or actively practicing, or a combination of these. At this point, you should know the best methods that help you to solidify knowledge.
Personally, I prefer the hands-on approach where I'll try to implement a new concept on my own, then when I get stuck, or if I succeed I'll go over an article/tutorial on the topic. I find that this gives me a better perspective on why/how a thing is done the way it is.
There are many, many, many websites dedicated to providing coding challenges for a wide assortment of languages! These sites are perfect for practicing/perfecting your knowledge of a language. There is, however, a right way and a wrong way to do these challenges.
These challenges should only be used to practice your knowledge of a language and nothing more. Not only that but you should only focus on problems that test concepts you are either uncomfortable with or if you want to try solving a problem in a unique, not straight-forward way. You won't get better if you only solve challenges you already know how to solve.
If you're just starting out with a new language I recommend just doing the basics as your main objective. You should be comfortable with concepts like string manipulation, arrays, classes, hashes(objects), if statements, and loops.
Once you are comfortable with the basics you should spend time using language-specific concepts, or try solving problems with a unique solution than you would have used. For example, try using recursion instead of if-statements, or try using a Hash instead of an Array to hold data, etc.
I do need to state using unique solutions to challenges can be great practice but you shouldn't use complex solutions unless it makes sense. You can solve a problem in a unique way but will you understand that one-liner a year from now? Documentation can really help explain your thought patterns.
Locating a site for coding challenges shouldn't be too difficult, and there are so many out there that you should be able to find one you like. I used to use codeWars and hackerRank for a while. I will say that I was able to find a challenge site that I fell in love with, codingame. Its challenges are all themed around videogames. They've even gamified challenges by having a match-made game where you try to solve problems alongside others. It can be pretty fun!
While Coding Challenges are a great way to get better at a language, projects are how you get better at development. Projects challenge you to not only build something but to build something documented, tested, maintainable, etc. Manipulating an Object can only get you so far when you need to build a website or an API.
In my opinion, most of your time practicing should be spent building projects. This is where you can really put all of your knowledge together and develop marketable skills for your career. Topics that you should be familiar with in any project would be testing, state management, file structure, documentation, and architecture.
Having trouble figuring out what you want to build? Try rebuilding your version of an App, or website that you use frequently. Wish something existed that doesn't currently, build it yourself! My largest pet project is a collection manager for my constantly growing Magic: The Gathering collection.
This is probably the largest point I want to make. If you are frequently building projects or solving problems the same way you always have then you aren't learning anything new. Have you used Redux for state management? Why not try State Machines, or Context if your using React.
It doesn't take long to realize there is no single solution for every problem you come across. Every tool/framework has advantages and disadvantages. Knowing multiple ways to solve a problem can really make your life easier when you're using a tool the right way.
For example, it'd be overkill to use Rails to build an API for basic CRUD functionality with few customizations. Choosing something like Node + Express would be better?
Don't just maintain knowledge, actively work to better it.
You don't have to be perfect. (But that doesn't mean you can write crappy code either.)
Work on something you are unfamiliar with.
Solve a problem with an unfamiliar solution. (Using a loop? Why not recursion?)
Would you understand this code if you just had a memory wipe? (Comment Everything)