I did a Q&A a few days ago, and one of the ques­tions was "How does one break the toy project / codecade­my cy­cle?" ... I am not sure what that mean­s, but I will take this as an op­por­tu­ni­ty to rant about some­thing I care about that seems (to me) vague­ly re­lat­ed.

You may be feel­ing like you are trapped in a cy­cle of just learn­ing things, us­ing them in a toy project and then... what? You learn some­thing else? And do an­oth­er toy pro­jec­t? And so on?

And you feel like that is to­tal­ly mean­ing­less and gives you no feel­ing of achieve­men­t, no mo­ti­va­tion, and end up feel­ing like you are go­ing to be a new­bie forever?

Well, if that's the case ... lis­ten to me.

Your toy projects feel mean­ing­less be­cause they are not re­al.

That feel­ing you have? It's just your in­ner pro­gram­mer telling you to stop play­ing around and start proogram­ming for re­al. And I am here to tell you how to do that.

STEP 1: Find something you need your computer to do that it doesn't do

You want your Youtube videos to ap­pear in your blog?

You want to be know how many peo­ple called Rober­to were born in 1934 in Ar­genti­na?

Well, imag­i­nary per­son, af­ter you found some­thing like that, you can move to step 2.

Let's say you have de­cid­ed to im­ple­ment a gad­get that drives away the birds that wake you up ev­ery morn­ing in this end­less night­mare we cur­rent­ly live in.

STEP 2: Decide some basic details about your goal

This is what is called a projec­t. Im­ple­ment­ing sort­ing al­go­rithms is not a pro­jec­t, that's an ex­er­cise. Im­ple­ment­ing the 200th ver­sion of a chat us­ing web­sock­ets for your "port­fo­lio" is not a pro­jec­t, it's, I don't know, a bor­ing ad­den­dum to your re­sumé or some­thing.

A project is a goal. A project is "I want my com­put­er to do THIS and in the holy name of Bil­ly Wilder, I in­tend to spend the ef­fort to make it do it!"

So: I want some­thing that when it de­tects bird sound­s, makes noise to drive them away.

Lis­tens for nois­es De­cides whether they are bird nois­es An­swers with a noise that is un­pleas­ant to birds

STEP 3: Convince yourself that's a possible thing computers can do

Be­cause, you know, com­put­ers can do a lot of things, but com­put­ers can't do ev­ery­thing. So, you need a quick re­al­i­ty check. Make it very quick, you don't want to spend more than, like, half an hour on it.

Can com­put­ers lis­ten for sound­s? Yeah.

Can com­put­ers make sound­s? Yep.

Can sounds drive away bird­s? Yes sir!

Can a com­put­er de­cide whether the noise it hears is a bird or not? Well, may­be? I have seen stranger things!

STEP 4: Come up with a semi-rational mechanism to implement it

This has to be very vague. Like "yeah, I can do that us­ing this Google API and this piece of lint I found in my so­fa". A vague idea.

Im­ple­ment some­thing that lis­tens for noise.

Add some­thing in the mid­dle that de­cides if noise is bird-­like

Make noise de­tec­tion trig­ger code

Im­ple­ment some­thing that makes noise

STEP 5: Come up with the most stupid version of the goal you can imagine

So, you want to write a bird-de­tec­tor? Try writ­ing a noise-de­tec­tor, first. Or rather, try to find some­thing that can re­act when your mi­cro­phone de­tects noise. Or even, find a li­brary that gives you ac­cess to your mi­cro­phone.

So:

Find a li­brary to read sound from mi­cro­phone

De­tect noise

Find li­brary to make noise

Make noise

Con­nect both pieces

STEP 6: sit the fuck down and implement the stupid version

This should be done FAST. If you plan too much you are not go­ing to do any­thing oth­er than plan a lot. You want to be­come a pro­gram­mer, not a PM. I won­der what the PM ver­sion of this rant would look like.

STEP 7: Show the stupid version to someone you respect, and listen

Yes, this part is scary, but pro­gram­ming is, in large part, about peo­ple. Show­ing things to peo­ple, lis­ten­ing to peo­ple, find­ing out what peo­ple re­al­ly mean, and so on.

So: show it to some­one. Lis­ten. Make de­ci­sions about whether you were right in steps 3 and 4. Maybe ad­just a lit­tle what yoour goal is.

STEP 8: repeat step 5 to 7 with a slightly less stupid version

Do this un­til you run in­to some­thing you have no idea how to do. In this case that's prob­a­bly go­ing to be "de­cide if that's a bird's sound"

STEP 9: get help

Ask around. Again, pro­gram­ming is most­ly about peo­ple. In this case, you will prac­tice "get­ting help". You don't want some­one to just tell you how (or maybe yes?) but this is the crit­i­cal point.

You can run in­to a few sce­nar­ios.

You fig­ure it out. You fig­ure out that it can't be done. You find out that it's doable but you just have no idea how.

If you fig­ure it out, then there is no prob­lem! Go back to step 5 and con­tin­ue un­til you are hap­py with the pro­jec­t, and you have learned some­thing new! Con­grat­u­la­tion­s!

The oth­er two out­comes lead to ...

STEP 10: get stuck

If you fig­ured out that it can't be done, then you have learned about one type of prob­lem that is cur­rent­ly in­tractable. Con­sid­er­ing you are new to this sort of thing, that is prob­a­bly not some­thing you are go­ing to solve, but ... if you re­al­ly were in­ter­est­ed in this pro­jec­t, it may point you to a whole kind of thing you want to learn about.

So, you can't de­cide if a giv­en noise is a bird ... why? Is there re­search be­ing done in that area? Would that in­volve ma­chine learn­ing? Hey, that sounds in­ter­est­ing. Usu­al­ly the ex­am­ples are about im­ages... is there any in­ter­est­ing work be­ing done about ap­ply­ing it to au­dio? Are there li­braries? Are there dataset­s? Are there tu­to­ri­al­s? Hm­mm ... and now you know some­thing you want to learn about. Have fun.

The third out­come is the com­pli­cat­ed one. Let's say it can be done by cre­at­ing a mod­el with ML and a dataset of ur­ban nois­es and a dataset of bird nois­es and both things ex­ist, and it has been done, and you know about it (a lit­tle) but you have no idea how to do it.

Well, in that case ... con­grat­u­la­tion­s, you have found the cur­rent lim­it of your com­pe­tence. You just need to ex­pand it. And that's what pro­gram­ming is like.

So, how does this whole convoluted process help you?

You are learn­ing dif­fer­ent things you won't learn do­ing ex­er­cis­es.

You learn to de­cide what to do.

You learn to ask for help.

You learn to present your work to oth­er­s.

You learn to process feed­back.

You learn to re­search your prob­lem space.

You learn to break down tasks.

You learn to make de­ci­sion­s.

And yes, you may learn a pro­gram­ming skill or two.

And, maybe (but it's un­like­ly) you will get rid of those pesky morn­ing bird­s.

PS: http­s://github.­com/karolpicza­k/BAD­C-2017

If you are in­ter­est­ed in a long com­ment thread about this, of which rough­ly 30% missed the point of this not be­ing some sort of uni­ver­sal ad­vice and there­fore tak­ing per­son­al of­fense at it, and 50% is me re­spond­ing to each and ev­ery com­men­t, see red­dit.