At Codegram we have 5 hours per week dedicated to learning time. It's completely self-directed, so everyone needs to plan their own time and decide what to focus on, which resources to use, etc. We also have the freedom to buy the courses and books we need.
This probably sounds fantastic to you if your company doesn't have learning time. And it is, of course, but it's also quite difficult to manage your time and feel like you are actually learning something.
The first way to spend 5 hours a week learning that comes to mind is probably doing tutorials and courses. Someone else has already planned a clear, structured path, and you only need to follow it. And then, a couple of weeks later, ta-da! You already know Ruby/Node/Elixir/Whatever. Except, you don't. Ever been in that situation? You finish a tutorial on something, then you try to do a project on your own, you don't succeed so you think you need a new, more advanced tutorial? And when you finish that one you are exactly in the same situation, so you start yet another tutorial. This is known as tutorial hell.
Do something!
I think the best way to actually learn something is to do something. But of course, it's not always easy to come up with ideas to build something that is not a to-do app, so here are some tips:
It doesn't have to be something useful
I personally like to build games. When people think about videogames the first thing that comes to mind is beautiful 3d graphics, but games can be very simple. I recently wanted to learn Svelte, Rust, and WASM so I created a small game, just with text and emojis, about planting trees, collecting leaves and fruits. It doesn't make much sense to use Rust and WASM for something like that, it could have been done purely with JavaScript, but it was something simple that allowed me to take some baby steps into new technologies.
Sara Vieira did a great talk at Nordic.js about Building dumb sh*t, which I recommend a lot. She talked about how she learned about WebSockets, Chrome extensions, etc by building some of the craziest and silliest things I've seen. I'm not able to come up with this kind of ideas so I'll probably stick to simple games, but maybe you do! Anyway it's a really inspiring (and fun) talk. Sara also gave the closing talk at our Full Stack Fest, and talked about impostor syndrome and all the cool stuff we feel bad for not knowing, which might help if you get overwhelmed while trying to learn all the shiny new things.
Rewrite something you've done before
If you can't come up with an idea, you can always rewrite an old project in a different language or framework. You already have the business logic clear, so you can focus on the particularities of the new language. I did this a few months ago, I had a web-based game made with Vue.js and I rewrote it as a CLI game with Rust (I wrote a couple of blog posts about that if you want to know more). Doing this not only helps to learn a new language, but it also helps you realize how the original project could be improved!
Improve some other product
There are tons of services out there that are less than ideal. Why not copy that site that people use to create groups and organize events around a certain topic, that has weird pricing and doesn't work very well? (Not thinking about any site in particular 🙄). Maybe copying all the features is too much, but think what needs you have that are not covered by that service and focus on those. But remember that your goal is to learn, not to launch a product (more on that later!).
Get ideas from others
You've probably heard someone saying "I wish there was an app for ____". If not, you can check twitter, and Reddit is full of threads about app ideas too! Sure, a lot of them don't make much sense but remember, it doesn't have to be something useful. Of course, be nice and don't try to steal someone else's idea in order to make money, we are here to learn!
Open Source
A lot of people suggest contributing to open source projects as a way of learning. For me, it adds pressure since you will need to match those project requirements, but it's true that when you are learning something you are in the best position to notice if some documentation is missing, outdated or unclear, so take that opportunity to help others who will come after you.
But remember your goal
Keep in mind that your main goal is to learn, not to build and launch a product.
Don't burn out!
Learning can be very draining and frustrating sometimes, so you shouldn't put any more pressure than necessary on yourself. If you don't understand something, skip it and come back at it some other time (or don't!).
It's ok if it's not perfect
When we are building a real project, we know the code should meet certain requirements. Clean, good architecture, tests, documentation… I'm not saying that while you are learning you should forget about all good practices, but it's totally ok for this not to be your main focus.
It's ok if you don't finish it
Maybe you realize that the thing you are learning is not gonna work out for you anymore, or that it's too hard at the moment and you should learn something else first. Or maybe you feel like you've learned enough! Either way, it's ok to not finish the project. It's just a tool to help you learn.
This should always be your mood
Share your results
I just said that you don't need to finish the project if you don't feel like it, but that doesn't mean you don't have anything valuable to share! You can write about the process on a blog post (we do this often at Codegram) or even prepare a talk. It might feel daunting speaking or writing about something you just learned, but you are in a very good place to do that, as you have everything fresh and you will be able to help others learn too.
So, what are you gonna learn next? 🚀