The problem with side projects
There is no denying that side projects are important, especially if you don’t have a a lot of experience in software engineering. However, I’ve been noticing a worrying trend in the resumes I look at with regards to side projects. I see a lot of young software engineers work on side projects just for the sake of having one on their resume. I suppose that is better than not having any at all, but the problem is that just having generic side projects that every other software engineer has on their resume defies the purpose. When I see side projects on a resume, I want to have a conversation about them, understand why you worked on that, how you came up with the idea, what you learned along the way and what challenges you faced. But if the side project is a TODO list, it is kind of hard to get excited about it.
So in this post, I will give you pointers on how you should approach side projects in a way that not only helps you accelerate your learning and make the whole process fun and exciting, but also boost your chances of getting hired.
Let’s start by talk about the problem with randomly picking generic side projects.
First, you don't really factor in your interest when picking random projects that others have worked on as well, and as a result, it does not reflect your passions.
Second, you focus on the end instead of having something for your resume, instead of the your learning goals.
Third, and especially if you follow tutorials, you don’t factor in progressive learning, without which, your learning model is ineffective and gives you a false sense of competence.
Fourth, in most cases, you end up building an overly simplified clone of something else, which does not really force you to think creatively or outside the box.
Fifth, random side projects encourage bouncing around trivial projects without paying attention to gaining meaningful end results.
And finally, you focus too much on languages and frameworks, instead of the actual project itself.
With that said, here is how I think you should approach side projects. This will not only help you replicate how software is built in the real world, but the learning is based on progression, so you start off basic and make your way through more complex features focusing on well laid-out learning objectives instead of the end goal of decorating your resume. I am going to pick an example side project, but instead of just suggesting it as an example, I will list out all the areas that I think are critical for every software engineer to know in 2022 that you should factor in when choosing your side projects. We will start off simple and build on top of it so that you can see how to pick a side project and progress it with learning as your main focus.
So for today’s example side-project, let’s say that we want to build a task management system, like Trello. Let’s see how we can take that simple idea and work on it in a way where we hit all the major areas that are important to learn in 2022.
Find an idea you are passionate about and built it to the MVP
The key term here is MVP, which stands for a Minimum Viable Product, basically means the minimum set of features you need to validate the usefulness of a project. This is something you will do all the time in the real world. You have a set of ideas for your project, but you build an MVP to validate those hypothesis. Then you add more feature to build on top of the MVP. So in case of a task management system, we want something very simple. Let’s say users can log in, and create a project. Each project can have tasks, which is made up of a title and a status. Title can be simple text, and status can be TODO, DOING AND DONE. This is our MVP. Basically, don’t over-commit until you validate that it is the project you want to work on and are passionate about.
Use version control
Now that you have the MVP, set up your version control. Don’t keep all your code locally. You can use something like git. Regardless of where you work, you will be using version control. So it is a great skill to learn early on. Not only that, as you work on different projects, you will also start building your code portfolio online.
Cover breath first, then focus on depth
In 2022, as a software engineer you should be well-versed in the entire development stack. So whatever side project you pick, try to work on the entire stack. This includes the front end, authentication, APIs, backend and data stores. You will naturally lean towards certain layers, say front end or UX if you are creative, or backend logic if you like problem solving, data structures and algorithms. That’s okay, but you should at least be exposed to the entire set of component that makes a modern web application. So factor that in when picking a side project. For the task management system, you want to build a UX, it can be a simple web-based responsive layout that can also work on mobile devices. Since the projects are based on individual users, you’d want to add authentication. Your front end will also likely communicate to your back end via APIs. The benefit of having web APIs as your backend entry points is that if you decide to build a different front end, say a mobile app, you can simply reuse those same APIs. Then there is the actual logic of how to manage tasks. And finally the persistent store that maintains the project state.
Algorithms and Data Structures
As you are working on the backend code or front end code, you will use a bunch of data structures. Data structures are unavoidable. You will regularly use simple data structures like lists and maps in your day-to-day work. But, if you side project can also utilize some more complex data structures like linked lists, trees and graphs, along with some effective algorithms, they will stand out more. For example, maybe you want to cache the tasks in memory until they change, so that you don’t have to hit the database all the time. You could write your own LRU cache for that. Maybe you introduce priority to your tasks. How do you sort them? Perhaps you want to consider heaps. Thinking about these will not only polish your data structures and algorithms, but also expose you to infrastructural components like caching.
Using existing libraries and public APIs
While writing your own implementations is a great way to learn, most of the time, you will integrate existing libraries and APIs into your projects. Being able to take something some else has written and effectively use that to solve your own problem by reading documentation and seeing examples is an important skill. So it’s a great idea to get used to that. For example, let’s say you want to add some collaborative features to your task management app. Maybe you want to add video conferencing functionality to your application so that users can easily hop on a call while they are managing or discussing the tasks for their project. You obviously don’t want to deal with implementing the whole thing yourself, you’d probably utilize an existing platform.
DevOps
Ok, the next thing you need to consider is DevOps. I’ve made an entire video on why DevOps is important to learn in 2022. Incorporating that into your side project by setting it up in a version controlled manner with continuous integration and deployment, is a great way to get started with it. Not only that, if you end up collaborating with friends on your side project, a robust CI/CD will really improve your collaboration experience. Not only that, when potential employers peek at your project in Github or something like that, a healthy code base that is regularly deployed and tested really looks good.
Machine learning, data engineering & experimentation
While machine learning isn’t critical, since most companies have dedicated engineers for data science, I still encourage you to incorporate some machine learning into your project, even if it’s a simple learning model like a decision tree. This also goes hand-in-hand with data engineering and experimentation. Any feature you add needs to be validated with data. So instrumentation and telemetry becomes critical. Even if you application itself does not involve machine learning, you can collect instrumentation data from your app that can run through learning models providing you intelligent insights into the usage of your application. Not only that, instrumentation data can be high volume depending on how you design it, so you will get exposed to things like message queues and data pipelines, which are critical components of modern-day applications. For the task management app, you can collect data when tasks are created, when they move, when statuses change, log errors when something does not work, you get the idea. This data can provide rich analytics that you can use to make feature decisions in the future.
Scalability, availability and disaster recovery
Scalability, availability and disaster recovery is difficult to fully test on a side project. But the concepts are important, and there are ways you can get started with those. These do tend to be advanced topics, so consider them optional. However, if you have made your way to learning about cloud services and containers, you can set your project up with these things in mind. A lot of cloud services come with ready-made solutions for back ups, failovers and disaster recovery. Even if you are going through, reading up on then, and checking boxes to enable them, you will learn a lot. In terms of scaling, there are those simple slider-based pooling solutions or you can configure scale out based on your container pods if you want to go advanced. Like I said before, these are advanced topics and hard to emulate for a small side project, but like I said, just keeping them in mind will give you a big leg up as a beginner software engineer.
Ok, so that takes care of the final area on my list. If you noticed, I didn’t mention any programming language or framework in this list. That was intentional because they don’t matter as much as the actual concepts and how your progress through them — from simple to implement areas, to advanced concepts. If you cover most of these in your learning model and your side project, what specific programming language or framework you use does not really matter. I hope I have made that clear.