In this video I'm presenting a pyramid of skills, a technique that will allow you to structure the list of skills that you want to learn, and to determine how much time to spend on practicing different skills.
- https://en.wikipedia.org/wiki/Four_stages_of_competence - four stages of competence, a concept on which I loosely based my pyramid
- https://www.slideshare.net/igorkokcharov/kokcharov-skillpyramid2015 - A hierarchy of skills by Igor Kokcharov, PhD - a similar concept that adds one more level (craftsman), which I find quite interesting
- https://apps.dtic.mil/dtic/tr/fulltext/u2/a084551.pdf - Dreyfus model of skill acquisition, it overlaps with the hierarchy above but it is much deeper and explains the process of acquiring knowledge (summary available on Wikipedia: https://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition)
- https://www.coursera.org/learn/learning-how-to-learn - "Learning how to learn", one of the most popular on-line courses ever, by Dr. Barbara Oakley and Dr. Terrence Sejnowski; it explains the process of acquiring knowledge (I'll be coming back to this topic in the future)
All the skills you need
As software developers we are often referred to as "specialists", which is the opposite of "generalists". Generalists are people with broad set of skills, kind of "jacks of all trades" that do not have any particular skill that they specialise in, but it's rather the combination of different skills that makes them valuable and unique. Specialists are people that focus on narrow set of abilities in which they acquire deep knowledge.
However when you look at job descriptions these days and see the "requirements" section, you might notice that the definition of "narrow" must be very broad, because it's not unusual that the list of required skills has 10 or more items.
You might be required to know 3 programming languages, have deep understanding of databases, web technologies, front-end development, API design, cloud technologies, mobile applications, and on top of that have excellent communication skills. How's that for a specialist?
The truth is though that as a software developer these days you need to know multiple different tools. Fewer people become real specialists, for example database admins. As a software developer you might be expected to know enough about database to manage data and do simple optimizations, but you do not need to become an expert. Similarly, you might need to know basics of security so that you avoid the most common problems, but you won't be expected to understand the details of pentesting etc.
The pyramid of skills
In order to evaluate your current skills, you can put them into 4 lists:
- First level: what I understand (skills with basic theoretical understanding, but no practical experience)
- Second level: what I can do (skills with basic practical experience)
- Third level: what I'm good at (skills with decent knowledge, but nowhere near expertise)
- Final, top, fourth level: what I'm expert in
Due to the nature of expertise, the fact that you need to spend much more time in order to become an expert than to have basic understanding, naturally each of these levels will have fewer items than the previous one. I've decided to turn them into a pyramid, somewhat based on the "four stages of competence" pyramid (you can find the link below this video)
Planning your skills
But hey, this series is meant for people who start their careers, who are not experts in any particular field yet. So what's the point? Well, here's the thing, what you can do with this pyramid is to plan your future skillset.
Decide what you want to be expert in, what you want to be good at, and what support skills you want to acquire in order to be able to perform well. Like this:
In order to get this right, you need to take a few things into account:
- what you already know (your existing skills that you'll use to build upon a new ones)
- what you want to know (what you would like to do, what you'd like to be expert in)
- what you have an opportunity to learn
- you should take into account what you can learn in your current role, because this is something that will happen while you work
- the other part is what you can learn in your spare time
Remember that as a programer you will need more than just technical skills. Think about more personal, skills that are relevant in your job and will help you have a good career. You don't need to be an expert in client communication or mentoring, but learning a bit about these things will allow you to overall perform much better as a software developer.
To show you how it works I prepared 2 examples that you can use as reference when working on your own pyramid.
junior front-end engineer, insurance broker company
Let's say I am a junior front-end developer that works at an insurance broker company. My team builds a web application that allows you to compare different insurance companies and see which one to choose when you want to buy insurance for your house, your car, your upcoming trip etc.
Top skills: my top skills will be React.js, framework that my company uses across the whole platform, and something that I really want to be an expert in.
Solid skills: as a front-end developer I want to be strong in CSS, I don't need to know everything, but I want to know it on a solid skill. Next, I want to be good in GraphQL which my company does not use at the moment, but hopefully we'll experiment with in the future. My other technical skill will web accessibility, a concept that I find important and I want to be a go-to person in the company when it comes to it. Finally I want to put effort into my communication skills, as I believe that I could be a person that facilitates understanding in the team.
Basic skills: next there are things that I want to know on basic level. There are many things that I need to be able to do without a really deep knowledge: code review, refactoring, web performance - these are just examples of things that I need to learn in order to support my other work, however these are not things that I am going to strongly focus on. When it comes to social skills, I believe that empathy, and creativity are two that I want to develop.
Concepts: finally there are a few concepts that I want to be aware of and understand them, so that I can do my job better, but also because I'm interested in them. For me these topics will be API design (so that I can work better with backend developers), machine learning (because I find it interesting), A/B testing. I also want to understand the insurance industry on a basic level, so that I know what I'm actually working on. It doesn't mean I'll be able to work as an insurance analyst, but it means I will be able to talk to analysts and understand the concepts they use in their work.
full-stack developer, software house
Another example will be a full-stack developer who works for an outsourcing company on various projects.
Top skills: my top technical skill will be Go, which is our language of choice for backend services. On top of that, I want to be expert in software architecture, which is something that will allow me to lead big projects in the future
Solid skills: as a full-stack developer, I need a good grasp of front-end, so I want to know well Angular. Additionally I want to have solid skills in refactoring. On top of that, I believe that time management and problem solving are going to be very important in my role and my future career.
Basic skills: in order to succeed as a software consultant, I should be able to work well with agile methodologies and understand client communication. Since I aim to be an all-around person, I also want to have basic skills in infrastructure. Additionally I want to spend some time developing open-mindedness which is very helpful in the ever-changing industry.
Concepts: a few of many concepts I'll get to understand are: security, networking, automated tests. Of course there will be many, many more items here.
Now, that's a lot of skills to learn! Isn't it too many? It might be, but having multiple things that you want to learn has its advantages: it allows you to practice no matter what you do. When you're in a meeting, you won't be writing CSS, but you can practice being open minded. When you lie in bed before sleep you might not be able to write code, but you can listen to na ebook about time management. On top of that, when you get tired of practicing one skill, you can just switch to another, so that you don't get bored.
But how much time to spend on each skill? That's a tricky question and I believe there is no one answer that will work for everyone. There are however 2 approaches which I believe make sense:
- you can spend 25% of your time in each category. This means that the 1-2 skills on top will still be the ones you spend most time on, and that will give you a broad approach to learn more things
- the alternative is to split it 40/30/20/10, this is a very focused approach, where the majority of your time will be spent on the top 3-5 skills. I believe it's good when you believe that you need to vastly improve your top skills, and once you're more comfortable with them, you can choose the broader approach
One more thing to remember: you will be able to learn certain things at work, but at work you're expected to deliver results, therefore the learning process there is different and you can't fully focus on developing skills. Take that into account when thinking about what and how to learn!
The goal of the pyramid that I showed here is to give you kind of a direction - as a developer it is very tempting to try to learn multiple things, and often it is overwhelming.
If you decide to use this technique, make sure that you keep updating it. Your job will be changing, your interests will be changing, the skills that you want to develop will be changing. It is always good to reassess what you want to know and what you want to achieve. It is important to have some kind of focus though.
One more note I'd like to add here - let your manager know what are the skills that you would like to learn. While they can't make sure that it will ever be possible, a good manager will write that down and they'll keep you in mind when there's an opportunity in the company.