One finalized side project is better than three abandoned ones.
This is the premise of the article you are about to read. A finalized, working project can be placed on your resume, be showcased to other people, offer you more learning opportunities, and potentially become your income source in the future.
An abandoned project is a little bit of learning and a plus one to the number of your abandoned projects.
If you disagree with the above, then you can simply close this article and move on.
If you agree, here’s a related comic.
I think we’ve all been in those shoes and have our own skeletons in the closet.
I have been programming for over 11 years and have started many pet projects, but only a few of them saw the light of the day (or rather the eyes of the users).
Choosing a project idea is a task that depends on many factors like your level of experience, domain of activity, tech stack, your interests, your goals, etc., so do not expect to learn the best idea ever for your next project in this article.
What you can expect is to learn some generally applicable principles that will help you make a better choice.
How Do People Learn?
Let’s briefly discuss about how people learn first. Whenever you read a book, watch a tutorial, or practice a skill, neurons in our brain fire together, forming complex neural circuits. It is these circuits that store the knowledge and skills we possess.
Moreover, our memory is associative, meaning that subsets of neural patterns are parts of many circuits. That explains how you can end up thinking about totally unrelated things to what you are currently doing. Some words might trigger a memory, which triggers another memory, and so on.
For instance, think of the last time you went to the seaside. Then think about what was the most memorable moment during that trip. Finally, think about something related to that unforgettable moment. This is how you hop around memories.
This also hints toward a more efficient approach toward learning new things: it is easier to “reuse” existing circuits rather than create new ones.
Consider these two explanations of what a computer program is:
A computer program is a collection of instructions organized in functions, classes, modules, and libraries that perform a specific task.1
A computer program consists of code that is grouped into entities called functions, classes, modules, and libraries. Like a lego, you can build a program to perform a specific task by combining various pieces together.
The first is generic and very abstract, and it doesn’t consider any pre-existing knowledge in the listener’s mind. The second one makes an analogy and is easier to process since you can tap into your existing knowledge about what lego is and how it works.
Another crucial thing to learning is pre-requisite knowledge. You cannot build a roof without building the walls of a house. Although this sounds obvious, sometimes you might get too enthusiastic about a potential project, but because you don’t understand the fundamentals, you won’t be able to realize your idea.
Build On The Current State Of Your Knowledge
Your next project should be based on some of your existing knowledge upon which you can learn new things. This might sound self-evident, but sometimes we simply skip the analysis phase and jump right into the development phase.
The amount of all knowledge required to build a project should overlap with your existing experience. Otherwise, learning will be inefficient.
You might want to take on a project that will teach you lots of new concepts, but bear in mind that creating new neural pathways takes time and energy. Keep in mind that there is no fast way to do that, so if you want to be efficient at it, you have to take the slow route.
There is a blurry line between efficient and inefficient projects from a learning standpoint:
- Choose a project that is too easy for you, and your learning will be minimal. Also, you might become bored along the way, not even finalizing it.
- Choose a project that is too complex, and you will become frustrated and overwhelmed with the amount of information you need to learn and apply, which will increase the chances that you might as well abandon it.
Finally, to shape up and structure the knowledge you already have, it helps to think about it through the prism of the Pyramid of Mastery.
The Pyramid of Mastery allows you to define a domain in terms of four layers: Elements (main concepts and building blocks), Rules (both how Elements operate and general Rules within the domain), Tools, and Frameworks.
With this in mind, let’s discuss some strategies that can help you choose your next pet project are.
3 Aspects To Help You Choose Your Next Side Project
Below you can find general guidelines that will help you make the right decision regarding your next project.
1. Focus On A Single Layer From The Pyramid Of Mastery
This is a guiding principle I follow whenever I choose to do a personal project: narrow down the scope of the type of knowledge you want to gain.
Do not mix up new Elements, Rules, Tools, and Frameworks together. Ideally, focus on a single layer and choose a project that will help you gain expertise in that specific area. If that is not possible, do not go more than two layers.
This is a common mistake that beginners make. They want to learn as much as possible from a single project. But quite often, those expectations are unrealistic. If you want to learn a framework, in a new programming language, using principles that you haven’t used before (e.g., asynchronous programming, design patterns, etc.), you are going to be overwhelmed with so much new information, that you won’t be able to process it and learn anything at all.
On many occasions, I made this mistake myself, and each time I had to review my project choice and start over with more realistic expectations and a narrower learning scope.
Therefore, if you want to start a project to learn new programming concepts, make it in the language you know best. If you’re going to build a project to learn a new programming language, do not throw in new Elements and Rules — focus on what you already know. Likewise, if you want to learn a new framework, make sure you are familiar with most of the Elements, Rules, and Tools it consists of.
This is also why it is not advisable to start learning programming with a Framework — you will get overwhelmed very fast by the vast amount of information on different Elements, programming Rules, programming language Rules, framework Rules, various Tools, etc. if you do not already know them.
2. Choose A Project Of An Appropriate Size
You might want to build the next Facebook, but sometimes you should focus on building a simple function or class first. This is a bit exaggerated, but as a general rule, your projects' scope should increase once you get more experience in your field.
Initially, focus on smaller projects with limited scope. When you start learning something, the amount of information you have to process is enormous. Since our working memory has a very limited capacity, keep the tasks small to not overwhelm it.
Once you have a solid foundation and understanding of the essential Elements and Rules, you can start working on slightly bigger projects. It is very similar to construction.
In construction, you cannot raise the walls of a brick house in a day. There is a certain recommended height to which you can grow the walls — around 4–5 feet2. Once you reach that, you have to let the cement solidify, as otherwise, the wall can tilt and collapse.
Pro Tip: the scope size is also a better indicator than years of experience of a software engineer’s seniority level. You can have 5 years of experience, but if you work on individual modules and do not participate in bigger architectural decisions, you are a mid-level developer.
3. Choose Something That Will Motivate You
Another aspect of project selection is the motivation you have to build it. If you are working on something you are excited about, chances are higher that you will actually finalize it and learn from it.
Even small projects can be challenging and exciting to build — you just need to put some thought into what you would like to create, depending on what you would like to learn.
There are several approaches to it that I find helpful:
1. Think about what actions you are repeatedly performing that you could automate. It can be a small thing, like writing a function that would erase the contents of your computer’s Trash Bin and then automate it to execute once a week.
2. Think about what would be useful to you once in a while. Even if there might be dozens of existing services out there that offer it. For instance, write a command-line interface (cli) to which you are providing a path, and it doubles down the sizes of all the images it finds in that path, thus saving disk space.
3. Think about what features you like in some products/services, and build them from scratch. Here, the options are countless. Just pick your favorite service and try to reproduce a small part of it.
4. Think about a problem you have that you would like to resolve. This resonates with point 1 from above, but on a bigger scale. And this is also the entry point to the realm of entrepreneurs and doers. Many people have started their companies simply because they didn’t like the current state of the services and products they have used.
And then there’s always the option to google a list of project ideas and pick one, but you can do better than that.
Remember that the goal to follow when selecting a project is to learn something new while also improving your work/life/leisure/etc. This will keep fueling your motivation and help you go through it till the end.
Conclusion
Successful learning projects are much more than just an idea. However, a good idea is the first step that you need to have to build a project.
To wrap up this guide, here are the strategies to keep in mind when choosing your next project:
- Decide on what you want to learn. The Pyramid of Mastery can help you categorize the knowledge you have and the one you want to get.
- Focus on a few things rather than trying to cover a vast amount of new information.
- Think of something you will be excited to learn.
- Keep the project size appropriate to the goals you follow.
I have slightly altered the Wikipedia definition of a computer program. ↩︎