What should I learn next as a programmer?

This is a question I pose to myself often and it’s a frustrating one to try solve. I’m going to go through the rational path I try to take when deciding what to learn next. Before I go into that I will explain how I see the current learning culture in programming.

I think that continual learning is a key part to programming as a whole. I’m fairly new to the industry (having taken a shine to JavaScript around a year and a half ago) so I feel that I have a very fresh pair of eyes on how the industry is working. To me it seems really slow to adopt new concepts. I’ve experienced a strange culture of the better a programmer becomes at a subject the less they feel the need to learn. There is that sense of “I already know the answer, stop coming at me with your hipster crap, this problem has already been solved!”. (I’m painting with a wide brush and there are plenty of great programmers who don’t suffer a single ounce of these issues)

This type of attitude is one of the reasons I feel programming is slow to move, it takes a whole generation of programmers who hold onto their beliefs to finish their careers before things can move forward. Programmers should really take a leaf from the Mathematics & Sciences. In those subjects they are endlessly looking for new solutions and then crediting or discrediting each other, in a logical manner with the use of facts, calculations, proofs and actual data. Not gut feelings, random beliefs and twitter debates!

Let’s for a moment imagine if it was left to the programming industry to find a cure for a new life threatening disease. Right now we’d still be trying to find Penicillin!! Alexander Fleming would be turning in his grave giving us the proverbial facepalm.

So the programming industry is a little slow to adopt (watch this superb talk by Bret Victor for a deeper understanding as to why this may be). I think that exploration and innovation should take greater precedence than it currently does.

The business side of the industry is what pays all of our wages and some of business’ greatest concerns are money, time and stability of the product/code base. Which are perfectly fine requirements but referring back to my curing diseases example, if pharmaceutical companies didn’t take risks in discovering/experimentation and paying for them, then I’m sure the image below would still be standard practice!

Imagine if there was a little more experimentation and discovery paid for in the industry? We could already have so many problems solved, problems that we face on a daily basis. It would shift the culture and more companies would feel safe to take a similar stance. Let me be clear that I’m not implying there are no companies paying for this type of work but the primary source of new ideas is in the open source communities. This being done by people in their spare time and usually after coding for the whole day for the company they work for. No wonder you hear of people burning out from running OSS projects!!

Then these free open source projects are being used by so many companies with them reaping the rewards.

You’ll notice that the companies taking the stance of allowing programmers to carry out experimentation and discovery (or as Erik Meijer would call this type of programmer “hacker”) will also have OSS projects.

This in my eyes is a positive move. Firstly the company is working on creating new solutions and staying at the top of their game. Then secondly the OSS projects will attract some of the best programmers to the company because these OSS can be seen as a company’s CV to a developer. You can have a workforce with plenty of average programmers or one with some of the best in the world, which do you think is going to be more successful?

Now we have the preface in hand you should be raring to go on your journey to learning new things! So what do I do when searching for what to learn next?

I’ll show you how I reasoned about wanting to properly start learning RxJS (originally created by Matthew Podwysocki) and the whole concept of Functional Programming, Observables and streaming libraries.

1.

On twitter I follow people who I think are great forward thinking programmers and every now and then, they put up nice little gems of either things they are creating or using. I saw the mention and debates in regards to functional programming so I wanted to learn more about it so, I could make my own mind up.

2.

I started to investigate and research, I came across this exercise by Jafar Hussain. The beginning was about simple functional programming techniques such as map, filter, concatMap et cetera. However then it lead into dealing with asynchronous code. This was the catalyst that really started to get me thinking on how this could solve problems I was facing. Because right now Asynchronous code handling in JavaScript, even with the addition of Promises is not exactly fun. (Think about testing!!) So there it was, my reasoning as to why this could be of interest to me. Notice that it took some actual coding to realise this could be of any help. How many things might we be missing out on by not actually trying them out?

experiment try things out!

3.

So now I had a source of interest on the subject. This is key, if you are going to be learning and experimenting on something it helps to have enthusiasm on that subject. I took a look at the RxJS repo to see how active the PR’s are, were there links to community channels or are there questions being answered in StackOverflow. Stars can be another factor but I try not to let that be my only sway.

4.

Luckily for RxJS the questions in the above step were of positive results. If that wasn’t the case and the answers weren’t entirely fruitful I would have still taken a look for tutorials. As mentioned before, to help me make an educated decision on something you really need to try it out. I found that Jafar Hussain was holding a workshop on FrontEndMasters.com called “Asynchronous Programming in JavaScript”. I thought great, because I’d already had some good experiences with FrontEndMasters. I much prefer when people talk about a subject, you get so much more content packed into a conversation.

5.

The course was outstanding but not a necessity, because not all new code bases are going to have videos or courses. You can still play around, try coding an issue you have and replacing it with this new found solution.

6.

At this point you should have a very strong feeling if this is worth continuing with. Now, I normally recap on these following questions (I tend to ask myself these throughout the process as well). Is it an improvement to the current solution? Does the project look like it will have longevity? Will the techniques you are learning be useful in other areas? Are you able to find solutions to your questions from people who have been using it? Is the community interactive or growing?

7.

Once I’ve got here, I’m usually quite passionate and intrigued on learning more and with a view of maybe being able to get good enough to even help out with the core team! I tend to start with building little tools or boilerplates.

How much more fun is your coding experience going to be now? You’ve done a fair amount of research, tried new things out, made fixes to issues/problems you’re currently having to deal with and it might also be teaching you techniques you can take into other situations!

This is slightly off topic and a point I wonder about. When learning new skills these can sometimes be more complicated with a harder learning curve. But for some reason there is this belief that everything has to be simple from the get go! So the whole team can understand it. In my eyes if something is hard, you learn it, get better at it then it becomes easier. Then you reap the rewards of solving problems more elegantly and with less effort than if you stayed with the entry level solution the whole team can understand. Why not take the opportunity to teach others so you all reach a similar level of understanding?

The users expect a lot more from our applications so we need to know harder concepts to build programs that can handle these requirement but if we’re all busy making entry level libraries/tools I wonder if that can also slow down evolution? I’m not saying this is right or wrong but I do wonder.

So back on track, you might be thinking that it’s all well and good but what about the time and effort wasted if the library turns out to not be what you original thought. It’s a risk you have to take when discovering new things, because either way if it fails you’ve learnt what doesn’t work and sometimes that’s just as important. Ultimately, the more you learn you’re likely to reach a point where you can start creating your own solutions using all of the positive solutions you’ve discovered!

Or the alternative is to be a programmer that sits waiting for the mass approval of big companies like Facebook, Google, Apple et cetera, and only following the rest of the flock, once they all move. Just because something is popular does not mean it is the best solution.

There is so much to still be achieved in programming and for me experimentation and discovery are what I want to strive to being involved with and how I see myself enjoying my coding career.

Thank you for taking the time to read my article and if you want to read more about what I’ve been experimenting with, then have a read of my CycleJS (created by André Staltz) article and why not come join our active community on Cycle-Core gitter channel.

Happy learning and HACKING! :)