Introduction
Personal projects matter quite a lot when you want to get your foot in the door. But don’t put it off until you graduate or are otherwise ready to apply for an internship or software development job. The sooner you start, the better! It will take some time to build up a decent portfolio, so don’t wait until the last minute. Whether you’re a traditional college student or an independent learner, a portfolio of projects you developed outside of a classroom will matter. Whether you make apps, websites, do bug bounties, or anything else, you need to do something. The goal of personal projects is to give you real-world experience before you enter the workforce, or even continue your education even when you’ve already established yourself as a professional software developer. It shows that you are passionate about your craft and can do things instead of merely saying you can do them. A degree alone isn’t very valuable, but it’s useful when combined with networking, a portfolio website, and several software projects under your belt that showcase your variety of tech skills. Coding doesn’t have to be your raison d’être per se, but it does need to be something you enjoy enough to do outside of what is required for college.
You don’t need to be an expert to start working on personal projects. You can start with really simple things and then work your way up to more ambitious projects later on. Don’t start with unrealistic expectations about what you’re going to make. Start simple so that you can give yourself easy opportunities to succeed and build off of, which will not only make you a more skilled developer, but it will build up your confidence, which can go a long way in job interviews. If you try to take on a task that’s too daunting, you’re setting yourself up for failure, which will demotivate you and might even cause you to abandon software development entirely.
This chapter hopes to shed light on the importance of personal projects, how you can make a website to show off your projects, and lists various examples of projects you can do if you’re unable to think of ideas on your own. Remember – it’s not going to be finished overnight, but even so, you need to stick with it. Little by little, you can chip away at big problems and then there will be an eventual payoff when you have a relatively complete product. I can’t emphasize this enough: don’t hem and haw, just start. The sooner, the better. It doesn’t have to be perfect, and it doesn’t have to be finished all in one go. Just start something!
I had many roommates throughout my time in college, and one time I had a study group with my roommate and another CS student. We were working on a C++ project. My new acquaintance admitted that he never coded outside of homework assignments or tests. How can you expect to get good at something you don’t practice? If you dislike coding that much, maybe you should consider a different field. I’m not saying that in a mean way, either. But many people want to study CS and become software developers based on the assumption that it’ll make them a considerable amount of money. But here’s the thing – if you hate coding, you’re not going to succeed in college studying computer science. You have to genuinely enjoy what you’re studying. Sure, it can be difficult and stressful sometimes, but if you can’t go and make an app or website in your free time because it’s something you enjoy, this is going to be a challenging industry for you to break into. Sure, work-life balance is important. But being right for this industry also matters. On an information security podcast I listen to, Security Weekly, they recommended to have at least one non-tech hobby, and I think that’s good. Tech can be a hobby, but taking a little break every now and then can help. But I’d say not to do too much non-tech stuff, because then you’re not really into tech that much to begin with.
But don’t let that get you down. When you’re first starting out, it can be reasonable not to be sure of whether you want to do this for the rest of your life or not. But once you have a few cool projects completed, you’ll feel more accomplished. When you don’t know anything about coding at all, it’s hard to find enjoyment in it, because you’re learning lots of dry material. But trust me – once you get to the point where you can make cool things, it feels incredible. You’ll love it.
The first projects you write will in all likelihood be maladroit and prosaic, but that’s okay. Nobody starts out being adept. But the more you practice, the better you get. If your first app is your magnum opus, that means you’re not growing over time. It’s even okay for your first apps to pastiche more well-known ones, just as long as you’re only copying features and big picture concepts rather than copying source code. Odds are, if you can think of an idea for an app, someone else has already thought of it. But don’t let that stop you from creating your own learning experience.
Additionally, people are accustomed to the quality of software from multibillion-dollar companies, but you can’t hold an individual’s personal projects to the same standards. Microsoft has over 100,000 employees, but you’re just one person. Don’t make unfair comparisons that make you feel worse about your software.
Coding exercises
Apps can be very complicated and time-consuming. Not only that, but sometimes, if you pick what you want to make, you might not learn anything new or challenge yourself in areas that you’re lacking. Coding exercises, also called katas, are an excellent way to learn about problem-solving and coding. Instead of having a couple of huge projects, doing coding exercises regularly will let you build up a list of seemingly inconsequential yet challenging projects. You can put them all under the umbrella category of coding exercises, which should only be a single bullet point on a resume or website.
The following links are useful resources for routine programming exercises:
Personal project ideas
Let’s say you’ve already learned at least one programming language, have done some simple katas, and now you’re ready to move on. What else can you do?
Katas aren’t the only projects you can work on. Eventually, you will want to make some personal projects. They should be self-directed: it’s not a homework assignment, nor is it part of a tutorial. It’s an app or website that you make on your own. But sometimes it can be challenging to come up with ideas for a project. Some people understandably struggle with the carte blanche nature of personal projects. Boredom can be sublimated into personal projects so long as you can find a niche that piques your interest. Here are a few of my suggestions – some are projects I’ve done, and others are things I’d like to do. I also list some projects other people might be interested in even if they’re not for me. There’s a wide variety of software that you can create, and no two people will have the same preferences for what to get into.
For starters, you will need a website. This is important because you will want to showcase your projects, and perhaps list contact info or have a contact form so people can get in touch with you. Every developer needs to have a website. You should also have your own email server. You don’t need to be an expert on IT or email to have your own server, domain name, and email. There are shared/managed hosting options that can do a lot of the software setup for you so you can concentrate more on content and your software. It can be as simple as clicking a button and paying a couple dollars a month to get your own [email protected] email address, where example.com is your own domain name that your website uses.
Everyone needs to have a GitHub account. You will want to list your website and your email address (that has your own domain name) on your site. For example, [email protected]. It looks much better than having a Gmail account listed, even though that’s what I use most of the time.
Your site needs to look stellar on desktops and mobile devices, and it will also need SSL, which is critical for security and SEO too.
Your website will need a home/landing page, a projects page, an about page, and a contact page. An optional blog can be helpful, though you should only blog about your education or coding journey and not much personal stuff. If you want a personal blog, it should be a separate site, though be mindful that your employer (or company you’re applying to) might see it, so don’t put anything bad on it. You should also link to your social media accounts, maybe either in the page footer or on the contact page.
Your website doesn’t need to be complicated. Even if you’re a beginner to web development, learn beginner frontend development and make something simple. Just learn HTML, CSS, JS, and Bootstrap. It doesn’t need to be an elaborate full-stack web app, especially if you’re starting out. You can also opt for a content management system instead.
I recommend using Jekyll, WordPress, or making a simple frontend/static site from the template site mentioned in chapter 6. You might eventually want to add Bootstrap to the template site to make it fancier, but only once you’ve mastered the basics and customized the basic site to your liking.
Don’t overcomplicate things at first. You will want your site to have a favicon, navbar, body, main, and footer. Use an external stylesheet that you link to in all your pages. If you do inline or internal CSS, then you’d need to modify each and every page on your site to change what it looks like. But by having them all use the same CSS file, a single change will update your whole site. If you want to use images, you can look into lightboxes or image carousels. Responsive columns are also relevant. You should test your site on your phone and computer, and view it in multiple browsers. Also, try resizing the window to make sure it responds well to being resized. If the site looks broken, that will leave an awful first impression.
The point of your website is to make you, as a job applicant, look good. You can link to your website on LinkedIn, Twitter, and GitHub. You absolutely need a website. And not just some free hosting site without your own domain, like your_username.github.io or your_username.wordpress.com. You need your own domain name to look professional.
Keep your site simple to start and then add more to it later. Maybe start by making your website have a single page that says who you are, what your skills are, and how to contact you via email and social media. That’s all it needs to be at first. Project granularity is important. Your website is really comprised of many small things that work together in tandem and you don’t have to make them all at once. You should strive for an amiable tone, and your projects should make you sound erudite and articulate without being pretentious.
These days, people are less likely to visit a random website and more likely to stick on one of the few major social media platforms. But sometimes, these accounts will only let you have a couple of links or a short bio. Take Twitter for example – you can only have one link in your profile. But if you link to your site which links to all of your other social media accounts, then it can be easier for people on one platform to find you on other ones. You want to be visible and easy to find.
If you use some service like Squarespace that lets you make a website with no knowledge of coding or web hosting at all, it might look okay from a design standpoint, but it will also look very cookie cutter. A website made in such a way communicates that you don’t know how to make your own site. I can’t recommend using something like that. If you’re majoring in something completely unrelated to tech, like biology, then perhaps you can get away with a Squarespace site. But for computer science majors, you really ought to make your own site. I’d be more impressed with a slightly mediocre-looking self-made site than a Squarespace site that the person didn’t make themselves. It’s very easy to tell the difference between a self-made site and a Squarespace/Weebly/Wix site if you right click and hit “view page source.”
But aside from a website, you will also need some software projects to put on your website to show what you can do. Eventually, you might want to make mobile apps, full stack web apps, or even things related to sub-fields, like doing bug bounties when you want to get into information security rather than general app development. Everyone will go down a different path. There are numerous specializations in software development, but you should start off writing command line programs for computer operating systems like macOS, Windows, and Linux distros. The best way to start is with Java or Python because software written in these languages will generally run on all three of the operating systems I mentioned. Don’t start out making really elaborate programs. Start small, then work your way up to bigger projects. Don’t start out with things that are way too complicated because that could set you up for failure.
Your personal project descriptions should delineate the skills and tools required to make them possible, outlining what kinds of software development you’d be good at in the future. Which programming language did you use? Which GUI framework? Which editor and compiler? Which version control system? Which license? Which algorithms? It’s okay for your descriptions to be slightly technical because you’re thinking of your audience as being people who might want to hire you, so they need the nitty-gritty details.
When you make a program, you are trying to solve a problem. The problem might be that someone is bored and wants to be entertained by a game, might want a calculator to quickly solve math problems, convert files from one format to another, encrypt a file, and any number of other things. So when you’re thinking of ideas for programs, consider how complicated it will be, but also think about problems you’ve encountered with computers and things you can solve – whether it’s something that adds convenience, automation, or something else entirely.
- If you would like to make your own website based on the simple template I made and referenced in the explanations about HTML, CSS, and JS, then use my repository here:
- https://github.com/0x416c616e/book_website
- You can make your own copy of it that you can customize without messing with the original, called a fork, so that you have your own website. Click the “fork” button in the upper righthand part of the page. From there, go to your forked repo and then do this in a terminal:
git clone https://github.com/your_username_goes_here/book_website
- Alternatively, you can make your own git repo called your_name_goes_here.github.io and then download the files from my book_website repo and then add them to your your_name_goes_here.github.io repo. Then you will be able to go to https://your_name_goes_here.github.io in a browser, and that will be your new website. This is called GitHub Pages. For more information, go to https://pages.github.com
- If you want your own domain name, I suggest using namecheap.com. You can use a custom domain name even if you use Github Pages instead of your own server. That way, your site will be example.com instead of example.github.io. If you want hosting, a2hosting.com is good. Or you can stick with Github Pages for free, though that only works with static sites.
- One way to add comments to a static site is with Disqus. Just sign up, and then they will give you code that you can copy and then paste into your web pages to add the ability for people to leave comments.
Aside from websites, another relatively painless project is creating a repository of notes (such as in Markdown) to list core concepts and definitions relating to something you’re learning. If you put a learning repository on GitHub, it shows that you’re learning something and know the most important facets of it. This isn’t really software per se, but it can still be useful. Just keep in mind that Disqus comments are hosted on Disqus servers, not yours. You are embedding their stuff into your site.
Another easily-doable project is a daily log of what you’re doing. It’s not a personal or fun blog, just showing what you’re doing as far as education, work, studying, and miscellaneous programming goes. It can be motivating for you because it’s like a public method of accountability for productivity. One example of a daily progress log I’ve done is my alans100daysofcode.com website. I made it to have a place where I could post daily updates about my coding and learning for the #100daysofcode challenge. I think you will find that having a project where you write about what you’re doing can be really helpful for motivation. This kind of project can help you complete subsequent projects.
A calculator is another example of something beginner-friendly. Start with a command line calculator. You can either make it take command line arguments, or even have text menus and prompts for user input.
Here are two examples of different ways you can make a text-based calculator:
python3 calc.py add 5 2
Alternatively:
python3 calc.py
(the following is text output from the running program)
Welcome to my calculator!
What kind of operation would you like to perform?
1. addition
2. subtraction
3. multiplication
4. division
Press a number and hit enter to continue or hit q to quit:
The first example takes command line arguments, but the second one lists numbered menu options that the user can select if they enter the corresponding number for it. Any invalid input will result in a message telling the user that their choice was invalid. And when the user enters a number, like 1 for addition, then they go to a submenu that asks them how many numbers they want to add, and then the program gets the numbers from the user.
You can go as basic or as complicated as you want for a calculator. Maybe you only want to demonstrate the basic concepts of a programming language, or maybe you’re also taking a math class at the same time that you’re working on this project, in which case you might want to make a calculator that pertains to the formulas you’re learning. Making an advanced formula calculator app can be a decent way to study for math exams. Some math-related classes a computer science major might have to take include calculus, statistics, and differential equations.
If you’re not so keen on math, there are plenty of other projects you can do. One personal project I made was a file encryption/decryption program in Java. It’s actually got a GUI, using JavaFX, but you can do the same stuff with command line only, though it might be a little more cumbersome to use. You can either come up with your own encryption cipher, or you can use a language’s standard library/API to use encryption-related methods and classes. It will help you learn a little bit more about encryption. But this might not be a great first project.
That being said, writing your own cipher isn’t a good idea, unless you’re only doing it for fun. It’s not likely to be very secure, even if you yourself can’t figure out how to break it. But someone else can. So it’s better to use tried-and-true industry-standard ciphers that have been vetted much more thoroughly than something you can come up with in a short amount of time. Not knowing how to hack something isn’t the same as it being hack-proof.
I created something called AMP, or Alan’s Maintenance Program, that automates a lot of routine tasks, such as installing software updates, testing network connectivity to find any issues, testing network speed, or running a malware scan. You can also make a shell script to back up files. You can do task scheduling with something like cron or systemd timers in Linux. Doing shell scripting can help you automate certain tasks, though it’s more of a Unix thing than for Windows, but you can do a lot of Unix-like things if you use GitBash and MinGW on Windows. Or you might want to run your automation/maintenance shell scripts on a server, if you have one. Shell scripting will not only teach you about basic programming stuff, but you will also learn your OS more.
Another repository I have on GitHub is a collection of very simple programs for educational purposes. They are not really fully-featured apps, but by combining them all into a single repo, instead of having them be separate, it adds up to be a lot of little projects that make up one decent-sized project. Some of the small programs include a program for reversing a string, rolling random dice, demonstrating language features such as classes, mad libs using words from user input, a program for adding a song to a playlist, and figuring out the highest command line argument value. Other examples include finding the grade average for multiple assignments, figuring out if a number is even or odd, converting dollars to pennies and vice versa, converting one currency to another, making a user-defined book class with chapters and a table of contents including the page numbers (by adding the pages in each chapter), and calculating a piecewise math function. You will notice that each of these small program projects I listed are not very interesting or useful. They are more for learning purposes. Start with one of these. Quite often, job interviews will ask you to solve a simple programming problem, which can be similar to the things I just mentioned.
Fizzbuzz is a classic example of a simple program you should know how to make. For 1 through 100, if a number is a multiple of three, print fizz. If a number is a multiple of 5, print buzz. If a number is a multiple of both 3 and 5, print fizzbuzz. If it’s neither a multiple of three or five, print the number itself.
Here is the first portion of the output:
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
Another personal project I made was with another person at a hackathon. It’s called Road Warrior, and it’s a game where there are randomly-generated levels, and you need to build a road around obstacles to get a road from one side of the screen to the other. It’s a graphical program, and it’s actually a little more advanced than many beginner projects, but it’s still doable. It involves creating a 2 dimensional array of buttons that have graphics. When you click the button, assuming it doesn’t have an obstacle on it, it will add a piece of road if there isn’t one already, and if there is a piece of road, clicking on it again will change its orientation. There are up and down and side to side pieces, as well as L pieces for allowing the road to go from left to down, down to right, right to top, and so on. It involves a pathfinding algorithm to figure out if the path connects the starting and ending points.
It’s probably not the best beginner project, but I’m just listing stuff so you understand beginner projects better. They aren’t always advanced or useful. Sometimes they are just simple little things that are fun and demonstrate different things that you’ve learned. That’s the real point. If you’re thinking in terms of features, users, or money, you’re thinking too far ahead. Beginner personal projects are about giving yourself experience with programming and giving you a finished product you can show off to people. It’s not about making a successful business or something advanced from the get-go.
You might have some very advanced app ideas in your head already, but I’m going to have to tell you to get rid of them for now and concentrate on simpler things that you will actually be able to complete. Sometimes, non-developers (or new developers) underestimate how difficult and time-consuming it is to make software, so they have incredibly outlandish ideas for things that would be hard to code, take forever, or cost too much (in the case of things that requires servers to handle users).
Another project I made is researching information security and then writing about it. It might not sound like it’s about coding, but it actually is. If you ever want to get into software development that involves doing something over a network, such as business logic software that interacts with a database, then you need to know about security. Want to write a CMS, or make interactive pages with logins? You will also need to know security. So writing about it can also help. You can list a bunch of concepts, and then maybe explain them. Eventually, you can move on to doing virtual machine labs, though that’s not really coding-related, but it is related to security. I know some people who have written some simple Python scripts to help them with pen testing during security labs. I recommend Virtual Hacking Labs or HackTheBox if you want to do hands-on labs, though you need a computer that is fast enough to run a Kali Linux virtual machine in addition to the underlying OS. If you find yourself doing certain commands repetitiously, you can write scripts to do things automatically.
Although I’ve used static website generators and also made sites from scratch, another type of project could be WordPress-based websites. You not only set up WordPress, but then customize it and maintain it over time, perhaps using Wordfence to keep it secure. WordPress is used a lot, even if there are some downsides to it. And you might even want to learn PHP so that you can write WordPress plugins.
Another program you can make is one that will display a random quote from a text file containing many different quotes. I made one that’s web-based and uses JavaScript, but you can also easily make a Python or Java command line version that runs locally on your computer. Look up important people in a field you like, such as music or computer science, and then put their names and quotes in a file. It can be XML, JSON, CSV, or something else. Maybe even have the quotes on separate lines and then choose a random line to display. You will learn about random numbers and file IO this way.
Moving on, another project I made is a shell script for bulk downloading Youtube videos. I used to use this when I would download podcasts from Youtube to put on my mp3 player, or also video tutorials when I had a slow internet connection. Neither of these things are useful to me anymore because there are podcasting apps you can use with a phone and a data plan, and my internet connection is fast enough that I don’t need to download things ahead of time instead of streaming. But I made it so that you could put Youtube video URLs into an array and then the program would iterate through the array and use a command line program called youtube-dl to download the videos. You could set it to either download audio only or the video with audio.
Don’t get too caught up in the details about Youtube though. The point of that project was that I had issues that I wanted to solve – the first example being wanting to listen to podcasts offline. I came up with this solution to do that. I initially used youtube-dl, but I noticed that, if there were many podcast episodes or many parts of a video tutorial series, I would be running youtube-dl manually many times back to back. So basically, I found a problem in my software usage and realized that there is probably a way to automate it and make it better/less time-consuming, and that’s precisely what I did. If you’re ever doing something on a computer and notice that you’re repeating the same action again and again, you can probably write software to do it for you.
It’s not just about command line automation or running scripts to install updates though. Another thing you can do is use AutoHotKey to move the mouse and press keys for you. But you can also use Java’s Robot class or PyAutoGUI for Python. I first started making AutoHotKey scripts before really knowing anything about programming, and it feels great to make a program that does things for you that you used to spend a lot of time doing manually. You should complete at least one automation-related project, no matter what it is. Automation doesn’t need to involve keyboard/mouse macros though.
One thing I’d like to point out about initial personal projects is that it’s okay for them to be relatively mundane. You’re not being judged on the banality of your project. Don’t worry about a “perfect” or even necessarily exciting app idea. Just complete something. There is more value in making and presenting it than actually using it, at least in most cases for beginners. That might seem counterintuitive at first, but allow me to elaborate. Your first apps aren’t going to be the best things you ever make, but they do serve as an opportunity for you to work on an entire project from start to finish, possibly by yourself or maybe with some peers. When you put projects on your portfolio section of your website, and on your resume, people will be looking to see that you made something. Complexity matters, because something like a static front-end web project isn’t as impressive as a full-stack web app, for example. But aside from that, nobody is really going to care. Your first apps aren’t going to get critical acclaim and millions of downloads. Some people have delusions of grandeur and look to examples like Bill Gates or Mark Zuckerberg. But I guarantee you that even they started with simpler and perhaps more boring projects. In the case of education-driven personal projects, the journey is more important than the destination.
Think of personal projects like weight lifting: you don’t start out with the heaviest weights you’ll ever lift in your entire life. You start small, then work your way up gradually over time. You are continually building off of your previous success, so don’t be dismissive of small projects. Your harder projects would not be possible without the easier ones. Think about farther-off goals. Trying to make an extraordinarily complicated and overly-ambitious app for your very first project is like trying to squat 345 pounds when you’ve never even done just the bar before. Your first app certainly won’t be your magnum opus, and sometimes people eventually hide their first projects because of how low quality they are compared to their later work. For every entrepreneur who makes it big with an app or game, they probably made dozens if not hundreds of low-quality pieces of software that they never shared with the world before making their really impressive one that you’ve heard of.
Some books will have exercises for you to follow along with, or some online self-paced courses will tell you to make software and follow along as they type. But these kinds of projects seem kind of cheap, at least if it gives you the solution. What’s more important is being able to think critically and problem-solve on your own.
One project that I didn’t end up finishing was a group ray tracer project in Java with JSON and ImageMagick. A lot of people all got together to decide to work on a group programming project, but people had disagreements about how to do the project – some people wanted to use C++, others wanted to use Java. Some people wanted us to communicate via IRC, while others preferred Slack, and other people preferred our in-person meetings. There were lots of people in the group, not all of whom had the same proficiency or skill sets, so it was very difficult to coordinate. One person semi-leading the group made it sound like ray tracer math was easy, but didn’t really explain it very well. I took on the role of taking notes and posting them online after every meeting. All in all, the group project failed because people couldn’t stick with it. This is an example of how not every project you attempt will be successful.
It’s not that ray tracers are complicated. Individual people make ray tracers all the time. The hard part here was working in a big group, and this particular group just kind of fell apart over time, being that it was an unpaid open source group project not for an assignment for anything.
You need to do some personal projects in a group. My Road Warrior group project went well, but this ray tracer did not. There are other group projects I’ve done that were moderately successful, such as making a website with my friends called Hello Life Skills. You will find that projects in a group are sometimes less about technical things and more about people skills and project management. But these are still fundamental skills to have as a software developer. If your friends code, that’s great! Make something with them, no matter what it is. But if you’re like many people who don’t have software developer friends, you can either teach your non-coder friends to code, or you can use social media to find events for meeting up with people and writing software together.
Some group programming projects can be online-only. I prefer in-person stuff, though there are plenty of open source projects that are done entirely on GitHub, from people in different countries and time zones, who will most likely never meet face-to-face due to the cost of travel. Whatever you do, try something with other people. Steve Jobs once said this about group projects:
“Great things in business are never done by one person. They’re done by a team of people.”
If ray tracers and group projects sound too daunting for you, try something like a shopping list app. It can be text-only. It will need the ability to add things to a list, sort the list, search for items in the list, change quantities, and remove items from the list. You can use your programming language’s built-in sorting methods, or you can write your own sorting algorithm to get experience with it. You will seldom need to write your own sorting algorithms from scratch, but they are often assigned in undergrad CS courses.
Another program I’ve made is a static site generator. It’s kind of like Jekyll in the sense that it’s a text-based program that lets you make articles and an about page for a website. It then puts the user input into JSON files and then can generate the site by finding placeholders in the HTML template pages and replacing them with the contents of the article JSON.
There are many other personal projects that I haven’t done. I do have a backlog of things I want to make but haven’t gotten around to doing just yet.
There are tons of projects that you can make, and it can seem overwhelming to try and pick one of the seemingly endless possibilities for a project to make. But remember: above all else, these projects are for you to get more experience with programming, and also to show to other people that you know how to code. With those things in mind, you can ignore monetization or being feature-rich. Those are more far-off goals.
So now you’ve chosen a project to start with. But there’s still more stuff you need to do. First, you should brainstorm. What does the program entail? What are the required features? What are the optional features? What is the minimum viable product?
Make a GitHub repo. Add some stuff to a to-do list. Figure out which classes you’ll have to make. Figure out which dependencies your project will use. Optionally figure out what you’ll need to make unit tests for (if you’re a beginner, skip this step for now).
Instead of getting right into coding, you need to brainstorm and plan. You can start by just writing down random, unsorted ideas into a word document, such as in LibreOffice or Microsoft Word. Don’t worry about it being perfect at first. Just throw a bunch of related ideas into a document to get a feel for what your project will involve. Then you can go back through it after you’re done and you can prioritize what you need to do. You can also make UML diagrams.
Something I like to do when writing software is to come up with a basic driver class and stub features. The driver class is the main entry point into the program. The driver class might be called Main and the program entry point within that driver class might be called main. When I say stubs, I mean you make an appropriately-named function for something, but put print(“not finished yet”) or print(“this will eventually do XYZ”) in it so you can come back to it later and won’t forget that you’re planning on making it. Maybe you’ll make a class, but it won’t contain much just yet. You can put to-do comments in your code, or add issues on GitHub so you can keep track of what to do that way instead of in your code itself.
Write, save, run, test, and debug often. Don’t write 100+ lines of code and then compile for the first time. Make small changes, then make sure everything works as intended, then make more small changes. It’s not like an exam where you can only give your answer once. If you try and get an error, no big deal. Fix it. But never try to write your entire program all in one go. Take baby steps. And be sure to commit your changes and push them to your repository; otherwise, you can introduce a change that breaks your code, and it can be hard to recover a previously-working version of your code. Version control is essential, even for starting out. Once you start using version control, you won’t have to worry about making a change to your code that messes everything up, because you will easily be able to revert back to a working commit.
Put your projects on GitHub!
I can’t stress this enough. Use GitHub! Your projects don’t have to be finished — quite the contrary. You start with a blank repo, then add more to it over time. Maybe you’ll want to keep a repo private until you’ve made significant progress on it, but you can make things public even if they’re not 100% perfect.
Personal projects coincide with school and work. Everyone has obligations, but not everyone makes personal projects. If two people apply for the same software development job, and one has a panoply of personal projects on GitHub but the other doesn’t, who do you think will get hired?
Make projects relevant to the kind of job you want
It’s okay to do a fun project here and there, but your personal projects should be mostly based around the kind of job you want to get. For a list of software development job titles and their descriptions, see Appendix H at the end of the book.