How to effectively learn new things and enjoy doing it
Tags: learning, tips, productivity, selfimprovement
Published: 2019-09-02 16:31:20

_cover image by [Patrick Tomasso](https://unsplash.com/@impatrickt?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) on [Unsplash](https://unsplash.com/?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)_

Working in software engineering means always learn new things. We need to keep up to date with new technologies, tools, paradigms. This is one of the most beautiful aspects of the job, but also one of the most difficult. We are always busy, we have little free time, and learn something new in the workplace may be hard. 

I like to study and research, but for this very reason I struggled to complete anything I started. There are always too many things I desire to learn, so I moved from one to another too often. 

Once I realised I was wasting time and energy, I created some simple rules to effectively learn new things in my free time. In this story I want to share them, hoping to help anyone in my situation! :smile:

## Chose something you _want_ to learn, not something you _must_ learn

The first step is to decide what to learn.My rule: **chose what you would like to learn in this moment.** This means that it should not be related to your work. If it is, that's good. But don't push yourself: anything you learn will improve you as a professional, in a way or another. 

If you are like me, there are at least ten new things you would like to start learning. That is a problem: what to chose first? There is not an easy answer, my friend... But to simplify the game a little bit, I usually divide the topics in three categories.

### Applicative knowledge

Applicative knowledge refers to tools/frameworks/libraries. It needs less time to learn, and you can apply it immediately. Think of applicative knowledge as a "greedy approach": it provides high value now, and a small value later.

Suppose you decide to learn Apache Kafka. It is used broadly in the industry, and you are planning to integrate it in your project at work. It is a good idea, and you will benefit from learning it immediately. But if you think about the years to come, there will be a new version of it, or even a better tool.

### Foundational knowledge

Foundational knowledge relates to the foundations of computer science. It can be hard to learn, since it may be more theoretical. Moreover, you won't apply it the next day. Foundational knowledge is a "farsighted approach": it needs time, but it will be valuable forever.

Functional programming is a good example of foundational knowledge. It requires time to learn it, especially if you want to go deep in the mathematical part. It is likely that you won't benefit immediately from it. But it will change the way you reason about problems, and this will last forever.

### Horizontal knowledge

Horizontal knowledge is non-technical. It impacts several aspects of your life - like how you think, handle problems, communicate. Horizontal knowledge is not about _improving_ your knowledge, it is about _using it better_.

This week I started a book about how to focus better to be more productive. It will not improve my technical competences, but it will help me work better - and live better, I'm sure.

### How to chose?

Ok, we have given a little more structure to the various possibilities. Every type of knowledge is valuable, try to mix them a bit. The choice depends on your current needs. You started a project involving an interesting tool you don't know? Start learning that tool! (applicative knowledge). Do you like distributed systems and want to go more deep in the topic? Let's dive into it! (foundational knowledge). Do you feel tired and always stressed? A good book on how to handle stress may be of help! (horizontal knowledge).

The point here is: chose what you feel more important to you right now, and stick to it. Don't start several things in parallel, unless you have a lot of free time. Otherwise, you will end up wasting time and energy. Chose one, and focus on it. Once you finished it, chose another one that fits your needs in that moment. I repeat it again: **chose what you would like to learn in this moment.**

## Find any effective resource to learn the topic, and go deep into it anytime you feel comfortable

Once the you choose the topic, it is time to get it. You can do this in several ways. Read a book, watch a video on Youtube, enroll in a MOOC, read the documentation, read stories on Medium. It is not important _how_ you learn the new topic, but learn it enough to be solid.

It is not important also _when_ you learn it. Do you have some free time the Monday evening? That's it! Your company allows you to spend some working hours learning new things? Even better!

For me, its commuting. I spend about one hour every morning and every evening on a train, from Monday to Friday. Instead of being lazy on a social network, I prefer to invest time in learning.

## Put what you learn into practice

For me, the better way to learn something is getting practical. **Once you learned something new, put it into practice**. If it is horizontal knowledge, try to change your habits according to the new concepts. If you went with foundational or applicative knowledge, start a new project. You can go either with a complex project or with a simple one. 

The complex project may takes months of work, but it is a good chance to put together several topics you learned. I took this approach with [Scalachain](https://github.com/elleFlorio/scalachain), where I put together what I learned about blockchain, Scala and Akka.

The simple project is quicker to complete, and it allows you to focus on a specific part. It can be a good playground to test something that will be part of a complex project. Following this line, I created a [simple project to try Akka Cluster](https://github.com/elleFlorio/akka-cluster-playground), because I will integrate it in Scalachain.

## Share your experience with others

Always share what you learn. Put every project you create on GitHub or whatever public platform you prefer. Write a story on Medium, or a blog post on you personal website, to share your experience. This is important for a couple of reasons: first of all you can validate your knowledge. Trying to explain something to others is the best way to make you solid on it. You will receive feedbacks or contributions, helping you understand even better the topic. The second reason is that you will gain visibility. Companies will appreciate that you can show your competences, not only list them in a resumé. 

Share your work will help both others and yourself. That's the wonderful thing about it: **sharing knowledge is always a win-win!**

## Enjoy the ride

This is fundamental. **It must not become a second job, this is something you do for pleasure**. Don't push yourself to work on it when you feel tired, or you prefer doing something else. It is not important if it takes you one week,  six months, or even a year. There are no deadlines here.

## Conclusion

That's it, guys. These simple rules may sound trivial, but they helped me a lot in organising my learning path. Feel free to follow me on [GitHub](https://github.com/elleFlorio) if you are curious about what I will learn and share! :wink:

See you! :rocket: