Practice makes perfect. I repeat it in a lot of my blog posts because of how important it is and is key to learning any programming language effectively. I think the best way to practice is by making personal projects, because they are long exercises rather than just a few functions, and they can also be a great contribution to your resume!
There are plenty of lists of projects to do to improve, but one thing that I never liked about them is that they always propose some generic, uninteresting and useless project that you will throw away once you are done with it. It’s already very hard to complete personal projects, so it’s a recipe for failure if you start with a personal project that you don’t care about deeply.
In this article I will present a list of 7 (and a half) personal projects that can help you improve at programming, or to learn a new language, but that you can also keep and develop after, because they actually bring you value outside of just programming skills.
Make a personal resume website
I think making a website to present your profile to potential employers is a great way to start out with personal projects. It’s a project that is easy to accomplish because theoretically it only requires HTML & CSS skills. At the same time you can add a lot of technologies on top, depending on what you want to present.
The content to put in your website is pretty much the same as you resume: work and school experiences, a list of your skills, and a presentation of your personal projects. The advantage is that you have much more space on your website than on a one-page resume, and you can use more medium like pictures. I would also recommend adding a contact form, so that people can reach out directly.
Your resume website can also be the opportunity to spend some time on the graphic design aspect of it. It’s important down the line, because even if we are writing code, we are building software for people, and user experience matters. Great code that nobody uses because of a bad UI is useless.
You will practice HTML, CSS, UI / UX design, and potentially JavaScript and the backend programming language of your choice. You will also learn how to host a website and things related to that. Software engineering isn’t limited to coding, and you will need at least basic skills in system administration and networking in your career.
Add a blog to your resume website
Once your resume website is ready, or even during its development, you can go further and start building a blog. You could use WordPress, like I do for MindFlash, but if the goal is to improve your skills, a custom-made one will be better. You will also be able to integrate it better with the design of your CV website.
A blog is a good idea for multiple reasons:
- You will learn how to structure your thoughts when explaining technical aspects, which will be invaluable later for your job, when you have to write design documents, tutorials for your team, and technical documentation for your code.
- You can build your “personal brand”. Especially if you don’t have a common name, it’s easy to rank on Google and it’ll be the first thing that people can see when they search your name,
- You can share your knowledge. It’s a rewarding experience to know that some people enjoyed your teachings. I wrote a tutorial on Medium about some topic on Angular and I was ecstatic to see that someone linked it to solve a problem in a Github issue!
For technical aspects, you will again have to deal with HTML & CSS, but this time a backend programming language will be mandatory. On top of that, you will see new concepts, since you will need to use a database, and you will also have to manage permissions, with a “writer” account that is the only one allowed to post articles.
You could even separate the frontend and the backend, and start building a microservices infrastructure. It is overkill for a basic project, but if it fits the technologies you want to learn, it’s a good choice. For example, you can use Angular for your frontend, and it will call a backend API written in PHP with a framework.
A script using the Spotify API to detect new albums of your favorite artists
Back when I was around 15 years old, I made a script that called the Deezer and Spotify APIs to check all the new releases from my artists. Spotify sends emails for the major releases from artists you follow, but they don’t do it for all releases, and it’s easy to miss news albums.
Both platforms provide an easy to use and very complete API that you can call to get a large number of information about the data they have. You can access the documentation for the Spotify API, which will guide you through the different endpoints that you can use.
An example workflow for your application would be to authenticate your account, then retrieve the list of artists you follow, and finally run queries to get the list of albums they have released. The next step would be to compare this list to a database, or even just a file, to check which are the releases you haven’t heard of yet.
This project can take many forms, it could be a website, or just a script ran by a scheduled task, and you will have a wide range of available technologies to use.
Beside the programming language that you will use to make this, you will learn how to call a public API. You can explore different ways to notify you of the new albums, by sending a notification to your desktop, an email, or maybe even a text message to your phone!
A custom homepage aggregating news from your favorite sources
For this one, you will be able to leverage other personal projects that you might do, or have done already, such as the Spotify “new albums notifier”. The goal is to gather all the news sources that you like in a single homepage, for your desktop, or your web browser.
To do that, you will have to create multiple separate modules that will handle different types of data sources, and aggregate them in a database:
- RSS feeds. They are XML “files” that are used a lot by blogs and other news sources, and you can subscribe to get to get notifications when a new story is published. There are plenty of open source XML parsing libraries online, so it will be the occasion to learn how to use 3rd party libraries. Actually, this blog offers an RSS feed with the latest articles!
- HTML pages. For those, you will need to manually parse (well, using a library) HTML tags to extract the information you need from the website, which means that you will need one specific module for each website to parse.
- APIs. Again, if you want to get your latest albums from Spotify, you would use a public API offered by the service, but many other big websites offer similar services, like Instagram or Facebook.
Think about any of the websites you consult daily, and how you could extract those information to then feed them in your database and display them on your custom homepage.
This project can really be an opportunity to put in place multiple microservices, each responsible to extract one type of information and then inject it in a central database. This is a good use case for AWS Lambdas for example.
A platform to track your job applications, cover letters and resumes
If you are looking for a job, you will have to apply to many places. When I was looking for my end-of-studies internship 2 years ago, I applied to over 60 job offers, and that’s really not that many.
It can get pretty tricky to track all of those applications, and also time consuming to maintain an excel sheet, write the potential cover letters for each company, adapt your resume in some cases, and update the status of all those. For this, I suggest you create a website or a software where you can submit the companies that you applied to, a link to the job posting, and the status of those applications.
Then, you can go a lot further and build on top of that, a system to automatically generate for you, based on a template, a cover letter and a resume adapted to the company that you are applying for. Most of the parts of those documents will be common, but you can have a text box where you input specific details and it gets integrated into your template automatically. You could even email the recruiter automatically.
I think this project is a good opportunity to follow a real development process, where you will define the functionalities you want to integrate, make diagrams for the different features (you can use PlantUML to easily make UML diagrams) and make sure you have an idea of what the application will look like before starting to build it.
Scripts to automatize repetitive tasks
A few years ago there was a story that got heavily shared in the news where a programmer made a bunch of scripts to automatize a few repetitive and annoying tasks. He automatized the coffee machine of his office to pour it exactly over the time he took him to reach the machine from his desk, he made a script that automatically restored a database backup when he was receiving an email from a specific customer with the word “problem” in the title, etc. You can see those scripts, amongst others, on a Github repository called hacker-scripts.
I won’t say that I totally believe that this story is true, but you get the idea. You can automatize tasks to run them automatically on a schedule you decide, or on demand. Those scripts will depend heavily on what you need, but here are a few ideas:
- Bulk renaming of your pictures. If you are taking a lot of photos, it’s to rename them by date instead of using the default IMG_2042.jpg.
- Automatically backup your files. Make a script that listens to a local folder and automatically uploads to Dropbox any file that you put in the folder.
- Your “custom homepage” that I mentioned earlier could also be a collection of various scripts.
The possibilities are endless, and they really depend on your use cases. Scripts like that are also an opportunity to learn different technologies or programming langues. Python is particularly adapted to this situation, and bash can be a good option for small scripts if you are on a UNIX based system.
Something linked to one of your other hobbies
I love programming, but I also have other hobbies, like drawing, or a more unusual one: magic. I like to perform magic tricks with cards and coins, and I collect a lot of playing cards (too many, some would say). One of my own personal projects is a website where you can generate a random deck of playing cards, for any purpose, and I built it with magic tricks that could leverage the platform in mind!
It’s easy, if you like the subject that you are using for your personal project, you will be more willing to keep working on it and finish it. If you ever had an idea about something related to one of your hobbies, this will be the best personal project to work on. You are probably highly skilled in this hobby, and you know what are some tools that would be useful.
Making a side project related to that can be useful for you, but also the whole community, and can maybe turn into a real application that you end up monetizing!
Deploy those projects in production
This will be the 0.5 personal project that I mentioned in the introduction. By deploying your project to production, you will not only learn new skills about server administration, you will also expose your work for critics of other people. This means that you will have to think differently about your approach to those personal projects: testing, UI, UX (user experience), scalability (how many people can use your tool at the same time), and support.
All of those are the “not so fun” part of programming, but they are primordial to your success as a software engineer. We build tools for people, not for ourselves, and keeping this in mind will constraint your work in a good way.
It is the end of this article, the longest on my blog so far! I hope it will be useful and give you valuable ideas on projects that can help you improve in programming, but also bring you the satisfaction of actually using a tool you built from the ground up!
Something important that I didn’t mention before is that I highly encourage you to use Git during the development of those projects. GitHub offers free public and private Git repositories, which you should really take advantage of. This is one of the tools that I mentioned in my article about the top things to learn for a beginner programmer!