This post is an emotional melange of rants, reflections and personal opinions - just to make things clear and start with the right foot.
Like many other fellow programmers out there I'm tempted, every now and then, by starting a "side-project" in some new area or in a new language. Out of curiosity or desire to learn I start wandering around into that realm in which you can be considered a beginner or a novice, no matter the years of training behind you.
This task is often frustrating and difficult.
When you are a real beginner, usually still young and fresh, you're full of energy and passion - you carelessy dive into anything you can find, drinking every ounce of knowledge, teaching to someone else the second after you learnt something.
But when you have a full-time job, a family, and just a handful of hours in the whole week to dedicate to a project? That's when things start getting though.
I've spent hours looking for side project ideas, reading blog posts written by and for programmers, lurking forum threads and many other resources; regularly, the same old ready-made suggestions kept popping up, with their annoying sure-footedness.
Here's what I think about some of them:
Look for an open source project and start contributing
Ok this is quite widespread actually. If you are new to something and decide to follow this suggestion it's a race on who arrives first: tiredness or frustration.
Jumping into an open source project and contributing means you need
a) to understand enough of the language to move around,
b) to grok the workflow and the architectural structure and, more important,
c) to do those things well enough to be able to actually create something or, God bless, even fix a bug.
Heck, sometimes it's difficult to do that even in code you wrote a year before, let alone in code written by someone else (and maybe in another language). I'll probably give up or just fix a typo in the README and call it a day.
Find a problem and solve it
This is actually a good starting point, but usually this piece of advice is never expanded and remains too vague and simplicistic. Where do I find a problem to solve? I need to find a problem and solve it? Did someone already solve it? Why not / how? It's like asking for directions and being told to look at the map - it might solve the issue, but it might be something I already tried without success or something I couldn't even try.
The advice is potentially sound, but it needs a little more context to be useful.
Choose something from this list I give you...
...and build X, where X usually is either one of the five "tutorialized" basic projects (a todo list (1), a blog, a weather API, a calculator, a survey) or something huge that takes months to complete. Examples of the latter, taken from real such lists out there: build a simple operating system, create a Natural Language Processor parser, build a mobile app and sell it on every store.
I'm not against these projects, mind you, I'm just saying they're a bit out of scope and/or lacking the necessary appeal.
Clone something existing
Well, not the top player in the motivation area, what do you think? Assumed the given constraints of time and energy I don't really like the idea of spending hours and hours of precious free time just to (badly) copy something. Maybe it's just me being too picky, but I don't want to build another pong clone or a twitter-like app.
One thing I realized lately, though, is that when free time for projects is really scarce, and you have a few years of work under the belt, the perspective changes a bit and you become much more focused on small things and more practical ideas - which rarely make the cut and become real side projects but you start seeing a pattern heare and there; you realize that maybe the secret of success (where "success" means "I manage to make a scrawny working prototype in a decent time") is concentrating on something you deal with everyday.
Well, this looks pretty similar to the "find a problem" piece of advice actually, but I realized that I progressed much more on things I've started building as extensions or corollary to something I was already doing: prototype applications to speed up some task at work, tiny systems to help organize my daily life and so on. That is, anything that starts small, always unplanned and with little expectations.
It's not a matter of passion or motivation : if you sum up the time spent, in a single day, on sleeping, commuting, eating or working you remain with very, very little time not only for your family, but even for yourself; and that's not quality time either, since you're likely tired or distracted. Expanding on something you already do has the double advantage of focusing your attention to a task you're already dedicating time to and gives you a stronger feeling of purpose since you're changing, for the better, something that already works.
I know that the whole topic is highly subjective, and many people follow the exact opposite reasoning, but I just wanted to share my point of view on something that keeps crossing my mind every other day.
But this could be the subject for another post.
(1) There are probably more todo tutorials in any programming language out there than bugs in all the code I wrote so far. Just saying.
Post cover by José Alejandro Cuffia on Unsplash
Post cover by José Alejandro Cuffia on Unsplash