My side project turns one this month. It has been a real learning roller coaster.
Basically, a side project is something you do on the side — or so I thought. It’s a project that you are self-motivated, rather than contracted, to work on.
Although side projects can come in all sorts of flavors, in this article, I’ll be talking about a software development side project of mine. So let’s get started.
Some background
A side project should be your hobby, something you enjoy.
It certainly became mine.
My side project started it during my last months at university and continued through for another five months while I was traveling around southeast Asia. Now that I’ve landed a job, I hope to keep it going while in active employment.
Over the last year, I have seen my initial idea blossom into something that was beginning to resemble a fully functioning web application.
Looking back I never would have guessed that I could take it so far.
I started my project with a year’s worth of Java development experience and a smatteringof vanilla JavaScript behind me. My goal was to become competent in React, a new fancy library everyone was always talking about. I am now one of these people. React is super cool!
I not only achieved my goal, but through my project I’ve learned so much more:
- Node.js: For developing my back-end.
- Redux: A state management library that combines perfectly with React.
- GraphQL: A data query language billed as the new REST.
- ApolloClient: A GraphQL client that makes it easy to build UI components that fetch data using GraphQL. Again, this goes really well with React.
- Authentication/Authorization: One of my biggest hurdles.
- Database Design: Learning how to design my schema
- Deploying a live web application: Another nightmarish challenge.
- Invaluable project experience, including organizing my time and planning development.
- Use of Git.
- UI/UX design: Definitely not my strong side.
What started as an attempt to learn a single library spiralled into all these other fields of software development.
Why?
Because it was required to progress further with my project. In order to realise my initial idea, I had to learn how to identify the best technologies to solve my problems. Then go out and actually learn them.
The more I learnt, the more progress I made. The more progress I made, the more inspired I became and the more I wanted to learn.
My side project created a powerful, positive feedback loop. This helped drive my learning and kept me motivated through the challenges.
Seeing something you have made develop and evolve in front of your eyes is really something that needs to be experienced first hand. It happens slowly and then all at once.
Suddenly you realise you have made something that you are proud of.
In this article, I’d like to share some tips I learned along the way.
Learn by creating, don’t learn to create
You don’t learn to create something, but instead learn by actually creating something. It may sound similar but they’re worlds apart. In order to really learn something, I’d recommend the following high level steps:
- Pick a project.
- Think of an idea — something that will inspire you and that you actually want to make.
- Then go out and try to make it.
It doesn’t matter that you have no idea how you are going to get to the end. It only matters that you have taken the first step.
Learn new knowledge as and when you require it to progress your project.
The biggest benefit of this is, you are applying your learning to a real live project rather than just coding along while following someone else’s tutorial.
I am not saying don’t follow along with tutorials. Tutorials are great to learn the fundamentals, but make sure you are applying what you’ve learned on your own. This helps you solidify your understanding and consolidate your knowledge.
A side project gives you the perfect opportunity for this.
It also gives you a great way to channel your learning. It’s your project, and you can use whatever libraries, frameworks, and technologies you choose.
For example, I chose to use GraphQL after a friend from work recommended I check it out. This naturally lead to learning ApolloClient. They go hand in hand, especially when using React. I thoroughly enjoyed using and learning about both in my project.
Let your side project be a platform for learning, experimentation and enjoyment.
Learn by creating. Trust me, it’s far more rewarding.
Challenge yourself
The best side project ideas, I believe, are ones where your dream end project seems completely unattainable at the start of the project.
Something that is complex and challenging.
You want to push the boundaries of your knowledge, the best way you can do that is to live on the edge of impossible.
Having a project that is challenging works far better if it’s a project you believe in. A strong idea will keep you motivated when most people would give up. It will keep you going through the toughest challenges. And it is also that much more rewarding seeing your idea come to life.
Even though your end goal might seem impossible, you only need to take the next step towards it. Making sure your project is challenging enough will ensure you are still taking steps towards finalizing and improving it a year down the line. It worked for me.
Everyone has ideas. Software developers are lucky enough to have the tools to try and make their ideas a reality!
Be determined, and be consistent
Software development is hard. There will be days, weeks, and sometimes even months where you struggle to find the solution you are looking for.
That is just the way it goes sometimes.
It can be frustrating.
You will probably feel like giving up.
Everyone has been there but …
Don’t give up!
These challenges are where you learn the most. You stretch yourself to the edge of your learning ability. Learn to love the challenge. To thrive off it.
Every time you solve one of these complex problems, it builds up your confidence for next time.
I have learned that consistently while working on a problem will eventually yield a solution.
Nothing is unlearnable. Nothing is impossible.
This is a great mindset that every developer should try to get into.
If you find yourself up against a wall, here’s a few ways forward that work for me:
- **Take a break: **A break can do wonders for how you perceive a problem.
- **Reflect: **Think about what you’ve already achieved. It will most likely be more than you realise. This often helps re-motivate me.
- **Do something else: **Work on a different problem if possible. I find that sometimes the answer can unwittingly reveal itself when youshift focus to a new problem. At the very least, progress in another area of your project can build up your morale for another crack at the challenge.
Just never ever give up.
Document as much as you can
Whether it is writing a blog post, keeping notes on what you’ve learned, or maintaining a development diary. It doesn’t have to be much, but it should be something.
This is really important. It’s something I am only now starting to appreciate and apply myself.
Having a document of your progress highlights how far you have come. Which will, undoubtedly, be further than you think.
Furthermore, written notes remind you of your thought process last time you worked on your project.
I recommend whenever you finish development for the day, write a little note to yourself. What did you do today, what did you get stuck on, and what do you hope to do next time.
Then, next time you come back to your project, you will be able to easily refresh your memory. This will enable more actual development, and you’ll spend less time figuring out what the heck you were doing.
Finding time for your side projects can be hard. You want to make it as easy as possible to pick up where you left off, whether it’s been a month or a day. Writing is a great solution.
I also started documenting problems. Anytime I came across something I didn’t know, something that got me googling or learning, I would write down a brief description of the problem. This on its own often helped clarify what the problem actually was. Then, once I found the solution, I noted that down as well along with any useful links that I used.
This created a sort of problem-solution diary and ensured I had something to jog my memory whenever I encountered the same or a similar problem. No one wants to be solving the same problem twice.
Writing helps me solidify my learning. By writing you have to understand. So writing is a good test of your understanding as well as a quick recap of what you learned.
Everyone will have different approaches that work best for them. But consider including writing as part of your side project, even if it’s just for your benefit. You will come to appreciate it, I promise.
One step at a time
Preferably as small as possible.
Think of your project as a series of iterations. You might be on iteration 10, so don’t bother thinking about iteration 100. Concentrate on number 11.
If you need to learn some new knowledge to advance, then this is where you do that. Complete a tutorial, read a blog, and so on. Then apply this back to the context of your project. Learn only what you need to move forward. Try to only learn one new technology at a time.
If you get stuck, try to break down your iteration. I found I often got stuck when attempting too big of a problem.
Over time, I have gradually learned to ask myself, what’s the smallest part of the problem that I could try to solve? Often completing the small step unlocks the next step, or at least gives me a better idea of what the next step might be.
Remember, solving lots of small problems is far easier than one large one.
This last year has been a challenging learning adventure, but one that I have thoroughly enjoyed and learned so much from.
I am a recently graduated software developer, and I attribute a lot of what I now know to my side project.
A side project gives you confidence solving real problems and building real applications.That is invaluable!
I cannot recommend having a side project enough.
I love software development. It’s all about building ideas. I encourage you to go out and start building yours.
You can view my recently deployed side project here and view its source code in GitHub. It still has a long way to go and I welcome advice, comments or contributions.