Projects are a big deal. They can add value to your CV. They can help see potential employers what kind of code you write, if you decide to share them on Github. They can be a good learning opportunity given you get a good chance to learn and think about potential problems. Thing is, projects are fun and exciting.
If you're like me, you often, or even daily, come across hyped articles and flashy posts about new and upcoming technologies, ideas, frameworks, research papers, and Github repositories that truly seem remarkable with an amazing amount of effort put into it.
So here is what you decide to do, "I'm going to make the absolute best thing using this new technology!". But as reality hits, that is very often far away from the actual practical implementation of ideas.
Problems For Me, Personally
Coming from a time back when technology was still very fresh for me, and I was still very confused about what I wanted out of my career and academics, it was obvious, and eventual, that I was to run into some problems.
Some of the problems that I usually came across when trying to think of ideas was,
- I was unsure how to differentiate between 'bad' and 'good' ideas
- I was unsure of the technological requirements and the skills needed to implement that idea
- I was unfamiliar with basically anything other than the language that I was using and the main Operating System, i.e., Windows at that time
- I was only somewhat familiar with 'buzz words', such as 'graphics engines', 'data science', 'web development', 'compilers'.
- I was unsure about where to begin, because I didn't have anyone but the Internet to help me, about 90%+ of the time and since computer science and programming was still all very new to me
- I was unsure how to plan things out. Good projects need more than a week's proper time to have anything substantial to begin with
The Flow I Went With In The End
However, I was hell bent on exploring the field and getting myself introduced to all the different things that I could find via the web. So here is the broken approach that I took...
- Spent 2-3 days learning a specific technology
- Spent some time trying to find leaders for that technology and following them on Facebook, Twitter, or LinkedIn
- Trying to find ways to grow your skills in that specific domain by finding more technological techniques and whatnot
- Getting stuck
- Rinse and repeat
Why it doesn't work
The problem really starts at the 3rd point, as many students, as like me in the initial beginning, kept thinking about how they knew little to nothing, and that there was something that they still needed to grow or learn to actually make something useful.
To solve this, the only way sometimes seemed to keep learning a technology to get good at it, but honestly, this doesn't help you understand how to approach problems in an healthy fashion, and doesn't really allow you to think creatively and what all of this learning means in the longer run. Or perhaps focusing on the bigger picture,
Why This Problems Even Arises In The First Place
During a semester, there can be little to no time to actually think through the requirement phase for an actually good project.
Just to clarify, I am not talking about your average,
- XYZ management project
- ABC data structure implementation
As those are very simple and don't need much innovation to think about.
I'm really just talking about taking some sort of simple problems and approaching them from a software design perspective, that is,
- Learning to use a library to implement some basic functionality in your desired language
- Learning to research and coming up with a method for implementation in your language
- Learning to research and implement a simple program. It doesn't have to be a complete application, just something that takes you down a learning path and gives you a chance to work with something new, for example, if you're interested in Computer Vision, implement something related to that. Doesn't have to be huge or very complex, just something simple that you can incrementally use to learn something new
- Or just implementing a simple idea. Ask around from seniors and your instructors about project planning, team leading ( if you are a team), organizing, pre-planning with wireframe models and UML, and what the technology stack should be, what limitations are possible, where might one get stuck, and how to get a very quick prototype up and running
- Try to find a niche area to get your work out there. That's very hard for beginners since everyone is still exploring the basics, but still, if you have a good idea and you think you know enough, go for it!
What Needs To Be Fixed
There needs to be a focus on,
Realizing Everything Is Iterative In Nature
Try to find and understand on how to research and how to list down ideas. Questioning things critically can help, but having a solid goal or some sort of vague notion of something, and using that to solidify an idea to work on is actually a very incremental step. The bottom line is, ideas grow from vague thoughts, to conceptual figures, to easily understandable frameworks for contributing, to good prototypes, to great products with a potential market value.
Ideas Over Technology
A reduced focus on the technologies used, and more on how to use what you have to get good to better results. Good projects / products try to limit the dependencies, not grow them
Team Leading ( Yes, Absolutely )
There should be a focus on managing teams. Contrary to the popular programmer myth of a guy / girl sitting continuously for hours on end typing away at the keyboard, a good team knows how to divide the work up.
So, for example, instead of just getting a baseline idea across the table early on, and then working on that idea for the next 2-3 months, you can also just think about the end goal that you are trying to achieve, and split up your work such that you can actually divide it into pieces easier for you or your team to consume. First prioritize what features or modules matter to you the most. Then, just take a small part of your project and have you or yourself focus on that for the next 2-3 days. After that, you can just switch to another feature, or if possible, have your team split up even further by having some people work on something in particular, or some other section of your team works on something else in a way that doesn't bother the two teams.
Understanding Your Limitations And Setting Boundaries
It's okay to fail and have projects not really live up to you expectations.
It's okay to fail as well, but it is even more better that you learn from those mistakes and have obstacles and challenges as something fun, interesting, and where you can turn your weakness into a strength.
Remember, that's why you started a project in the first place - to expand beyond what you already knew, and to face those challenges.
How To Explore, An Attempted Discussion
Personally, I have been reading "CUDA For Engineers, An Introduction to High-Performance Parallel Computing", by Duane Storti, and Mete Yurtoglu. They gave some pretty solid advice, which I really wanted to add here. The points below have been modified in some way from the original content in the book,
- Identifying a library, language, or API related to the tools you already know with features/functions that look useful and apply them to a problem of personal interest.
- If you have a certain technology in mind, you can always look up interesting projects or code samples about it, try to understand what it does or what it is supposed to do, and how it accomplished that goal.
- Sit down with your tech savvy friends and talk about that technology about what they think can be easily done. Show them the code samples you find. If people find it interesting and something that can be done, you have the start of an idea!
- If you're doing something related to a specific technology, you can always find talks related to that. There are plenty of podcasts, talks on YT, implementation worthy ideas out there. There are for Data Science, for Python, for C/C++
- Go to https://stackoverflow.com and enter [tech-you-want-to-work-with] in the search box. Click on the votes tab and go through the top rated questions, answers, and threads
- Check out some of the content from an online programming / development / tech-you-want-to-work-with class, maybe?
- Locate a copy of a book and see if you can find some content relevant to your purposes.
Personally, I have been using,
- notion.so, for keeping track of notes, idea pitching, designing and storing UML diagrams, wireframe models, database schemas etc. Basically what I tried with Notion was to keep everything in one place, and so far, it's been working fine for me
- trello.com, a great tool for keeping track of your project ideas and backlogs in a kanban style fashion
- Github, obviously with the way that code contribution is done, Github provides an easy way for teams to collab and work on code together via Pull Requests, an Issues
Ways To Find Ideas, A Summary
Projects are amazing and quite fun, to be honest, but finding a proper direction, aim, and desire with what you want to make is something else entirely and that deserves praise on its own.
I would say, make mistakes, learn from them, and just keep improving. There is literally no other way than through trial and error itself.
Some Tips To Help Along The Way
Some tips from me,
- Do not pick ideas that are interesting in nature, they might even help you grow, but really just consider the time constraint. Getting a finished product should be the highest priority.
- There is nothing wrong with picking ideas that have been done and dusted ( management systems ). For tried and tested ideas, I think the focus should be more on what you could add to an already made idea such that it has its own value, or something that could prove to be challenging, but worth it. It's really your call
- Be sure to ask for help. Stack Overflow, Reddit, examples from Github etc. It could be that the problems that you can run into have already been solved by someone else. The chances are usually high
Before You Go!
That's all! Thank you for reading through this article. Really hoped you liked it. Do let me know if you would like to see a different kind of structure than the one I went with here, or is there some idea that I should expanded on more. That's pretty much it.