Warning! Some thought provoking lies ahead.

You see, I get feedback from software developers all the time. I hear things like, I want to learn the Go language. Then I ask the question, why Go? What is your outcome? The response is a disappointing “because Go is cool. I will continue working as a .NET developer though.”

Another developer told me that he wanted to learn Ruby, because he was afraid of losing touch with backend. I asked him what languages his company is using. The answer was PHP. My second question was, how popular Ruby is in his area. the developer couldn’t answer this question.

I am not a big fan of learning for the sake of learning. If you get bored or you are afraid of an unprobable event, and you learn for the sake of learning, you are making one of the biggest mistakes of your career. Not only because you are most likely going to run in circles over and over again, but also because you are more likely to forget most of what you learned months after finishing the learning process.

Our goal is to master our career. You are better off planning what is useful for you. You will also create leverage by linking your learning goals to your career plan.

When will you know that you are ready for the next step in your career? As soon as you create something tangible. What is a tangible result? Something that you are comfortable with presenting to the outside world. A high quality blog post, an online service, or a GitHub repository will do.

Your learning plan will consist of five steps:

  1. Sync your learning plan with your career plan
  2. Set your milestones
  3. Create the big picture
  4. Get feedback and iterate
  5. Present your deliverables
1. Sync your learning plan with your career plan

In order to learn a skill, you need to know why you want it. Get clear on your goals first.


  1. What are your career goals?
  2. What skills will you need in order to reach these goals?
  3. What resources do you need in order to learn those skills?

Focus on both technical and non-technical aspects of your career. Focus on multiple timespans such as:

  • What are your career goals in 5 years
  • What needs to happen in 3 years to meet your goals in 5 years?
  • What needs to happen in 1 year to meet your goals in 3 years?
  • What needs to happen in 6 months to meet your goals in 1 year?
  • What needs to happen in 3 months to meet your goals in 6 months?
  • What needs to happen in 1 month to meet your goals in 3 months?

You may need to learn a new programming language, leadership skills, presentation skills, software architecture, functional programming, acceptance testing with Selenium, or anything you know you will use in the near future.

Once you are ready with your list, answer the most important question of your learning plan. What is the first, most important step you should take? Make the next step clear to yourself, and start focusing on it.

2. Set your goals and milestones

For each skill you would like to improve, determine projects and activities that measure your knowledge. Launch projects that will put your new skill into action. Start with the why, and the what will fall into its place.

Make these projects useful and practical on some level. Building an app for real users is better than building something just for yourself. Teaching others, blogging, shooting a youtube video where you explain something are all great ways of measuring your progress.

Make sure your goals and milestones are tangible. Don’t come up with a goal like “I want to learn ReactJs by understanding the example in the book I purchased”. Most likely, you would spend most of your time trying to learn nitpicky details that you would forget within a week.

Many books and courses are excellent, I have learned from many of them myself too. However, if you finish a book without creating something new that goes beyond the content of the book, your knowledge of the subject will fade as time passes. If you push your boundaries beyond the theory, you will learn some skills that may stay with you for the rest of your professional career.

A reasonable goal may be the following:

Example goal: Create a single page application in React and ES6 that enables software developers to track their own productivity using the Pomodoro technique and other useful productivity hacks such as (…).

Feel free to refine the exact specification later.

Your projects also keep your work focused. You won’t waste time on unimportant details. You will learn what matters. When I wrote ES6 in Practice, I had two guidelines in mind:

  • I wanted to tell you just enough to get started with solving exercises.
  • The exercises tell you stories and challenge you with a continuously increased difficulty. You will not only feel good after solving some exercises, but you will also know that you can solve problems on your own. Some of the exercises include concepts other books would give you in a theoretical section. By solving such an exercise, you prove yourself that you are capable of learning new concepts once you need to use them. This should give you confidence in your abilities and deepen your understanding at the same time. Worst case, you read the solution, and learn as much as from other tutorials.

Be specific about the time you are willing to invest in your side projects. Many people, sometimes including myself, tend to underestimate the time needed for a tech project often by a factor of 2 or 3. If you figure out that your lifestyle does not support creating a complicated side project, you have some life decisions to make. You will either change your lifestyle, or your career plan, or you will have to create a different learning plan for yourself.

Your goal may be quite simple. For instance, if you learn React, and you already have a blog, you may want to set yourself the following target:

A. Create a boilerplate for a React application, and upload it on GitHub
– Skills: ES6, React fundamentals, Webpack, NPM, BabelJs
– Deliverable: React boilerplate on GitHub
B. Use your React boilerplate to implement a Todo application1
– Skills: more in-depth React knowledge
– Deliverable: a refined React boilerplate based on the learnings of creating an application
C. Write a blog post about your learnings
– Skills: more structured React knowledge
– Deliverable: blog post

It may happen that you set a big goal for yourself, and you deliver your solutions incrementally in multiple milestones. For instance, in order to realize a productivity app, you might want to create:

A. an abstract productivity model to implement
– Skills: pomodoro technique, kanban, productivity research
– Deliverable: productivity model, documentation, software specification
B. a responsive website with components
– Skills: Bootstrap or pre-made web components
– Deliverables: the skeleton of the website with static data
C. automated testing, mocking are most likely needed for development
– Skills: Mocha, Chai, SinonJs, API endpoint design
– Deliverables: automated testing framework connected to the application, and a way to intercept and fake API calls. Design your API endpoints.
D. a React layer
– Skills: React, NPM, Webpack, BabelJs
– Deliverables: none, as it makes perfect sense to do D and E together
E. you may want to manage the application state with a library like Redux
– Skills: Redux
– Deliverables: a fully working application with a fake server
F. you may need some server side code and a database
– Skills: NodeJs, MongoDB
– Deliverable: a fully working solution

As you can see, in these six milestones, you may be learning an avalanche of technologies. Set some target dates for yourself by estimating the amount of work needed for finishing the application.

Make sure you don’t treat yourself too hard for missing your target dates. The importance of measuring time is to figure out how good you are with estimating your own development velocity.

A side project like this will keep you busy for a long time. However, you will reap the rewards once you can demo your application. If your application is useful enough, you may even be able to monetize it.

Preparing you to monetize your application is outside the scope of this book. In order to develop an application for making money, you will have to continuously test what your users want, and aggressively modify your product. This process does not create an optimal learning experience for you, so let’s continue focusing on your career for now.

3. The big picture

It is now time to break down each milestone. Create a table of contents for yourself about the subject just as if you were writing a book. Determine how to break down the new skill into small pieces.

Discover pre-requisites, redundant topics, and make choices about what you will focus on. Don’t worry about making everything perfect. You will have several chances to refine your plan.

Do your research from several sources. When it comes to technologies, you can visit the official documentation, check out the table of contents of books, courses, youtube channels, online tutorials, and blogs. You may even find helpful GitHub repositories.

Once you are done gathering information, make sure you organize your information. For instance, a table with the following columns will do:

  • Module number
  • Description
  • Goals / Tasks
  • Resources
  • Status

Do your best to detect dependencies between the different modules you create for yourself, and order your modules accordingly. Don’t worry if you miss a dependency or two, as your study plan is lean enough to accept future iterations. Step 4 will be all about iterating your plan.

Link accomplishments to most of your modules, otherwise you will have a hard time tracking your progress. The more you use your acquired knowledge in practice, the deeper your understanding will be. If you just read a book, expect to forget 90% of the material. If you take notes, you may forget 80%. If you write an article on it with example code, chances are, you will only forget half of what you learned. As soon as you complete a project in practice, you are likely to remember the fundamentals for years.

4. Get feedback and iterate

Once you implement a module, you will face difficulties. Make a note of them, and modify your study plan bottom-up, starting with Step 3, and ending with Step 1.

For instance, you may figure out a dependency that blocks you. You may either reorder your modules, or add new modules to unblock yourself. You may even figure out that some of your modules are useless from the perspective of the outcome.

Always be goal-oriented! Cross out modules that don’t contribute to your goal. I can’t emphasize the importance of the Pareto principle often enough: 20% of your effort contributes to 80% of your results. When it comes to learning, the right 20% will give you the solid foundation that you can build on later in your career. If you need to dig deeper, you will understand the topics you need in depth. Many professionals get stuck in the bottom 80% of things to learn, at the expense of doing the top 20% right. Digging deeper only makes sense when you know where to dig.

The most frequent modifications only affect the big picture of your milestone. This requires you to re-iterate Step 3 only.

Sometimes you will discover a cross-milestone dependency, or you may replace technologies as you get to know more about the subject. For instance, you may initially decide on using a REST API for your project, but then you stumble upon GraphQL. Given that you already know about REST, and GraphQL perfectly fits your project, chances are, it makes sense for you to redesign the whole milestone. This way, you can make better use of your time, and learn something new.

Some of your decisions and discoveries may lead to small changes in your career plan. Other changes may shape the description of your projects. Make sure you go back to steps 1 and 2, and update them.

Don’t worry about changing your plan frequently. Flexibility is key in getting the best learning experience for yourself.

Your iterations may also depend on external feedback. Be open about your side projects. Show them to your colleagues and your friends. Post about them online, and discuss your discoveries in tech forums and communities. You will be amazed how quickly you can improve your skills.

Last, but not least, step back and look at your career path from time to time. Learning new things may unlock new possibilities for you. These are paths that you had not been aware of. Some path may revolutionalize either your future projects, or even your current project. If you unlock a new path, don’t be afraid of modifying your study plan in a top-down way.

5. Present your deliverables

Make sure you also think about presenting your deliverables. Let it be a GitHub repository, a portfolio site, or a blog post, find a way to show your results to an audience.

There will always be someone who loves what you do. There will always be haters too. As the famous urban dictionary phrase puts it, “haters gonna hate”. Whenever you receive criticism, ask yourself, what the intention behind the criticism is. Always take things objectively, and do your best to improve your products. Be thankful for constructive criticism.

You are also likely to receive destructive criticism. Don’t be affected by it. If you are, go back to chapter 2, and combat your fears and limiting beliefs. Criticism makes you stronger. Above all, facing criticism properly shapes your character, refines your professional code, and gives you a small edge at the workplace.

Always draw conclusions after finishing a side project. Ask yourself what skills you have learned, and how you will use these skills in the future.


Learning for the sake of avoiding boredom or avoiding pain linked to fear, is unhealthy from the perspective of your emotions, and from the perspective of your career.

Know your outcome, and design your career by creating a learning plan around it. Derive your learning plan from your career plan, and do your best to come up with tangible code, articles, or other deliverables that show when you can claim that you have mastered a subject.

If you present your work to the outside world, you create value that could potentially help other people. There is nothing more rewarding than helping others.

Think about it, if you could choose between fear, boredom, and the feeling that you contribute to something greater, which path would you pursue while learning something new?

Get hired faster with the Career Speed Guide!

Chances are, you are leaving money on the table.

Download the Professional Software Developer's Roadmap to Effective Salary Negotiations.

  1. see http://www.todomvc.com