Computer science is a vast field, and there are tons of different ways that people can learn and get involved with it. One of the best ways to do so is by doing computer science projects. There are many different ways to go about doing so: tinkering around with tools and tutorials freely available on the internet, attempting a longer project of some kind involving dedicated research and looking into things, and working on group projects in different settings. All of these are great ways to complement classroom learning, provide interesting directions for career directions, and help with internships and future employment. However, people sometimes have difficulty finding projects and continuing with projects they have already started. This is a natural phenomenon, and there are ways to avoid this.
One thing to note when looking for programming project ideas is that anyone can learn all the computer science that a 4-year degree can get you entirely from online sources if they have a decent computer with access to the internet, some of these being entirely on YouTube, so you should keep in mind that you can do great things from the knowledge that accumulates on the internet. Additionally there is material way beyond what you might learn in a traditional computer science classroom, with people willing to explain it to you, regardless of whether you are a Machine learning person, a Computer Graphics person, a Systems person, a Computer Engineer, a beginner who wants to follow tutorials, or someone else entirely. (This paragraph is about interesting resources I found online while looking for projects to get involved in)
If you want to explore project ideas or you just want to improve your computer science skills, there is an overwhelming amount of educational material online for you to dig through. I am consistently amazed by the quality of computer science content that exists online, and I am sure that you will be too.
There are generally two groups of projects that I have done: one with projects people attempt for learning new concepts and experimenting with new tools and environments, and one with serious projects people attempt with the express goal of creating a finished product. Viewing projects just as medals to be earned and placed on your resume prevents you from exploring, dabbling and experiencing more of what computer science has to offer. However, there are times when you want to have a serious completed project of some kind to your name, whether you are extremely passionate in a subject or whether you want the recognition of peers, professors, organizations or companies.
It took me a while to be able to internalize this distinction of projects. Initially, I was going into different projects without a clear goal of what I wanted to do with the code or with the learning I would gain from it. I would attempt to do a few projects to try and scope out different areas of computer science, with the hope that I could put them on my resume, but after some time I would eventually find another shiny new project to work on and abandon my existing commitment due to compounding factors of decreasing motivation to work, decreasing interest in the goal, and various difficult roadblocks. However, the distinction allowed me to free up space and figure out how to dedicate myself to a project better.
Suppose that you view projects not as individual, discrete things but as collections of asking and answering questions and as a process of learning skills and how to use certain tools. Maybe part of the allure of projects isn’t that there is so much out there for you to do but so much for you to learn. If you want to create a fully working package of functionality like a game or an application, then maybe actually completing and finishing projects would be beneficial for you. However, it isn’t necessary if your view is not to complete a project but to learn how to use a language or a set of tools. Just foraying into a field, following random tutorials, and experimenting with different tools and environments be meaningful on it’s own, even if you have a project in mind and don’t end up completing it.
Since I graduated high school, I have done a number of solo projects and some group projects. These solo projects have been forays into different programming languages and topics, some of them being computer vision with Python, reinforcement learning in Python, socket programming in C, graphical applications with Rust for Linux, and tinkering with different Linux distributions. When starting these projects, I let go of any intention of creating a finished project. I pursued these purely because I thought they were interesting and I also thought they might be useful to explore for finding serious projects to implement in the future. I ended up going pretty far with the computer vision and reinforcement learning projects because I felt compelled to look into them and I found great resources on that material. I didn’t end up doing much with the socket programming, Rust, and Linux development projects because they had a steep learning curve and required time and effort that I didn’t want to spend on it.
Overall, just attempting these projects and putting at least a few hours into them benefited me in ways that I didn’t expect. I learned how to set up different programming environments, as well as how to google well and identify useful information online. I learned a lot from those experiences, and I ended up putting some of them on my resume because I believed I had put enough effort into them to warrant it.
There are a lot of projects I started as serious long-term projects that I ended up scrapping without learning much from them. I wanted to create Unity games, because I wanted to create games I myself would play after I got bored of all the games I used to play, and I had a detailed vision for how the games were supposed to turn out. However, I tried to build 3 different games and I ended up abandoning all of them. This was very disappointing to me for several reasons. I had difficulty getting used to Unity environment, even though I had done these projects over the span of almost 2 years and spent lots of time trying to understand the environment. All 3 of them had tutorials on YouTube that were easy to follow and that laid out detailed instructions for how to use Unity. Even with all of the vast amount of resources online for Unity development, I ended up losing the motivation to continue with these projects and just stopped working on them. This was especially disappointing for me because I was extremely excited about exploring this field of programming, but eventually I stopped working on the projects because of reasons I couldn’t fully understand.
This blog post describes the journey of learning to code from a more pessimistic view, but I think it’s generally correct. Unfortunately, programming is more than just following tutorials, and that fact hit me like a freight train. Many of the tutorials online include large amounts of hand-holding which will did not help me because I didn’t try to understand the concepts beneath them, and adding custom code to my projects was significantly harder than I was expecting. After some time, I found myself in a limbo state where the tutorials I were following were not personalized to satisfy my needs and didn’t fit my goals for the projects. More advanced resources became harder to find and harder to understand. At times trying to navigate a maze of complex topics and seemingly indecipherable documentation felt like a daunting task. Motivation to complete any particular project waxes and wanes, and multiple compounding factors like bugs, frustration at roadblocks and hard-to-understand concepts, a lack of progress and loss of motivation can lead to people axing a project, even if it is a project they started enthusiastically looking to build something they were passionate about.
It took me a while to find a serious project initially, and I didn’t have long-term project for most of my freshman year. However, I did take part in some interesting experiences that definitely helped me develop professionally.
I had participated in a 48-hour hackathon and I built a working website with AWS Beanstalk and Django. Those 48 hours were an extreme flurry of frantic activity and I don’t remember how I built the website or what resources I used, but by the end of the 48 hours, I had a working minimum viable product that I was able to showcase at the end of the hackathon. I didn’t win any awards or get any honorable mentions because I had done the project solo and my project was extremely bare-bones. However, just attempting it and creating a working demo was a success for me, because I hadn’t done any web development before and I gained a lot of project development experience. I also completed an 11-week-long Coursera course in 4 weeks with two of my friends. This isn’t really a project in the typical sense, but it was an intense endeavor that I believed was useful for demonstrating the possibilities of self-learning and the benefits of working in group projects. I have also completed a research project for class credit under a professor here for creating a program extracting a floorplan from a 3D mesh rendering a from by a HoloLens in real-time. Since I worked with a graduate student as a mentor to the project, this experience gave me a great understanding of how to use mentors as a resource.
Coming out of these projects changed my perception of myself and what I was capable of. What really helped me was having high stakes, clear goals and deadlines, working with mentors and in a group. By taking part in these projects, I had locked myself into commitments with other people and specific deadlines. The hackathon had an especially intense deadline and forced me to consider time-efficient options at every step of the engineering process. I needed to break down the entire project into individual pieces that I could learn how to build on my own, and consider the way that AWS and Django interacted together. I was also forced to make the most of the materials I could find online for setting up the website and integrating it with AWS Beanstalk because I couldn’t afford to sit by and wait for things to happen. Completing the coursera course in a group with my friends was incredibly helpful because they supported me and helped share my frustration during the hardest parts. This wasn’t something that I could have done on my own. And even though taking part in a research project has barriers to entry of it’s own, I was amazed by how much it was like any other project, because I was left almost entirely on my own and given project specifications that I had to build my project around. My mentor wasn’t familiar with the tools that I was using but was still able to help me with my approach when I needed, and it made me realize that almost anyone with programming experience can act as a mentor to anyone else.
Computer science is hard, but pursuing projects with others makes it incredibly rewarding. Part of the benefit of projects is the experience of participating in them and even if you experience failures with programming or quit your projects, just know that talking to others about this can be incredibly rewarding. I have spoken to many different types of computer science students from inexperienced freshman to experienced seniors, and while many of them have expressed frustration with their classes, most of them have mentioned their appreciation for the ways that projects help them learn and great projects can help them grow.
I have listed many different resources in this post, but feel free to look around the internet for more or ask us for more if you have questions about anything.
If you want to create a good project to build your resume or if you want to dive deep into a subject, then dedicating significant time and effort to reaching a goal and completing a project will be necessary. This blog post describes an approach someone took to help them focus on a project they were working on amidst tons of distracting thoughts and cool ideas.
This blog post poses a direction for starting from scratch. While it is specifically featuring front-end development, it’s advice seems pretty fundamental: freely build upon small applications or programs that you have already built, create your own small projects from scratch, and show your work off to others.
Remzi’s OS class website is not only listed above (alongside his personal website containing information/material from all the classes he has taught including Grad-level OS and Grad-level distributed systems), his website is listed in the Open Source Society University link above as the recommended resource on learning about operating systems, which I think is pretty neat.
Also, the hackathon I took part in was definitely one of the most exciting programming experiences I have had in the past two years, and I would definitely recommend anyone who hasn’t participated in a hackathon to do so (we have one coming up soon so look out for that).