Practice projects aren't like regular projects. Regular projects are meant to be useful and solve some kind of problem. Practice projects are only there to help you learn, so you can't treat them the same way.
- They should have one clear goal
- They should be small
- You should throw it out at the end
This can seem weird. What's wrong with working on a larger project when you're learning? Why do you have to throw it out? So you don't get distracted.
By keeping the project small, and resolving to throw it away when you're done, it stops you from worrying about details that don't matter. Instead of worrying about how to configure build tools, whether to use a framework or if your code is pretty enough, you can focus on the task that you set out to achieve.
The first step to finding an idea for a practice project is to choose what it is you want to learn. The most important thing here is that the more specific you are, the easier it is going to be.
Consider "I want to learn to write a web app" versus "I want to learn how to get data from a server". The latter provides direction and will make it a whole lot easier to choose a project idea.
Occasionally, there is a simple way to approach things. Sorting algorithms sort things. A good project for learning sorting algorithms, therefore, is to write an app that sorts a list.
When you're reading it here, it seems obvious to the point of stupid, but in practice, it's surprisingly easy to overlook the straightforward ideas.
If you pick absolutely any application, chances are it's built up of multiple smaller pieces that can be used as great practice projects.
The trick here is to pick one tiny part of the application. Rather than trying to recreate all of Twitter, take your learning goal and look around Twitter to find pieces that fit.
In our example of learning how to fetch data from a server, you might decide that you want to build a rudimentary tweet stream. If you're practising your CSS styling, you might replicate the look of a single tweet.
The real world is full of ideas that can be translated into code. Board games and other technology around you can make great projects.
In general, these projects will often be more complicated than I would suggest, so I don't recommend them for beginners. Real life ideas can be the best way to practice high-level concepts, like Object Oriented design.
The thing to remember here is that there are plenty of opportunities for project ideas outside of building Chess, you just have to look for them - Kate Beard built a morse code chat, and a hello kitty calculator.
Running with this idea, you could build a website that is a working version of your bedside clock or a wall clock. Seriously. Just look around. Potential projects are everywhere.
Truth be told, this is my favourite way of thinking up practice projects: when you can't think up a serious project, the best thing to do is to get stupid. The goal here is to take your learning goal and be as ridiculous, annoying, or deliberately bad as you be - with bonus points for creativity.
If you're learning to use event listeners have content that fades out as soon as it scrolls into view, make an image chase the mouse or play a fart sound any time the user clicks. I once built a Java app that would play a song and open two more windows each time you tried to close it.
Building deliberately bad examples can be an excellent (and enjoyable) way of exploring a technology - and the results are fun.
You know how I said you had to throw these away? That doesn't mean you have to forget about it. Similarly, just because you've made it before doesn't mean you don't have anything to learn by making it again.
When looking at old ideas, you want to ask two questions:
- Can you improve it by doing things differently?
- Can you extend it by adding new features?
Repeating a project, and improving it can be an excellent way to practice the same skills you were trying to learn the first time - this is useful with high-level concepts that are never really 'done', like Object-Oriented designs.
Extending an old project can be a great way to practice different skills than the original project. For instance, if I built a chess game, I could make a load/save feature or create a prettier board.
Once you have an idea, the next step is to remove as many details as possible and try to build the smallest possible version of your idea - kind of like an MVP.
The primary purpose of a practice project is to help you learn. If you're spending 2 hours tweaking CSS so that everything looks nice, you are wasting a lot of energy that isn't going to help you on your quest to get data from a server.
Every time you set out to work on something that isn't your primary learning goal, you need to be asking yourself a question: Is there a simpler way to do this?
- Do you need a server?
- Is there already an off-the-shelf solution?
- Instead of creating an interface, can you run it in the web console?
The truth of these extra details is that you probably don't need them - so you shouldn't build them. Once you have the original project done, there will be a time in the future to come back and add these extra details (see Method 5).
When choosing a project idea, don't take the decision too seriously. Your number one goal is to keep these projects small - they don't take much time. You can afford to choose an idea that seems stupid or over-simple.
Rather than trying to choose the best project, choose whatever idea you have right now. There'll be plenty of time for other projects in the future, so you don't need to be selective.
Above all, get out there and build. 😀