Wizard, Warrior, or Developer?
Early on in my career as a developer I struggled with a lot of the same questions almost every other developer face. One of the major issues developers face is something called impostor syndrome. Almost every developer I have ever met regardless of their skill level think they are just an average to below average developer. Every time a developer gets online and starts to read blog posts or release articles about the newest methodologies, frameworks or packages they feel like they are falling further and further behind. I don’t think I have ever met a developer who considers themselves a “rock star” or a “ninja”. I’m sure those people do exist but I would say they are few and far between.
A lot of times these feelings lead developers to feel like they need to learn everything and become an expert at everything. This causes us to spread ourselves very thin and never really focus on refining our skills so we never become an expert at anything. So is it better to be an expert at one niche thing or is it better to be a jack of all trades and master of none?
Jack of all Trades or Master of One
I don’t think there is a single answer to this question, I think it all depends on your desired career/position and team size. If you want to create marketing style websites on your own as a freelancer, you will probably need to know a little bit of everything, UI/UX, HTML, CSS, and maybe some server-side language knowledge for CMS’s. However, if you have a large team of developers you may be able to narrow your focus to just one of those areas. If you want to create web applications you may need more server-side skills and probably less client-side skills. If you want to create RESTful APIs you don’t need any client-side skills at all.
So where on the scale do you want to be? Depending on where you are in your career you may not know. When you are early off in your career you may need to be more of a jack of all trades just so you can experience a little bit of everything to find where your passions are. I personally started off as a “Full Stack” developer and over my career I have migrated to be much of a server-side developer. This doesn’t mean I have no interest in client-side development, I actually enjoy playing with some of the modern javascript frameworks like Angular, React or VueJs. However, this means I focus most of my effort towards being a better server-side developer. So how do you determine what you should focus on and how much you can focus on?
Life is a Game
When people ask me this question I like to use an analogy that I can relate to. I think of my life like an RPG (Role Playing Game), and the first thing you do when starting an RPG game is create a character. Most of the time in that character creation process you get a certain number of attribute points that you allocate to different attributes. The way you allocate those points really dictates how you are going to play the game. If you focus on strength/power and stamina you will end up being some type of warrior, if you focus on intelligence you will be something like a mage, wizard or healer. One character isn’t inherently better than the other, they all have their strengths and weaknesses.
If you want to play the game as a solo player then you may need to distribute your skill points out over all the attributes. But if you want to be really good then you need to find a team and each team member narrows their focus to a specific role. A really good team normally has a tank character to take damage from the enemy (warrior with a lot of health), a couple different DPS (Damage per second) characters (mages, ranged, melee) to inflict massive damage on the enemy and a healer to keep everyone else alive.
So how does this relate to us as developers? I think of attribute points basically as time. This means that some people may have more attribute points to distribute across the skills than others depending on lifestyle, family situation, etc… Just because one developer is “expert level” in three areas doesn’t mean every other developer should or even could be “expert level” in three areas. However, regardless of how many points each person has, we all have a set amount of points.
Narrowing Your Focus
So when I went from being a “full stack” developer to more of a server-side developer, what did that mean? That meant I needed to take attribute points away from HTML, CSS, Sass, Gulp, Bower, etc… and migrate them to server-side skills, which for me happened to be PHP, Laravel, REST, MySQL, etc…
Years ago I would go to meetups and hear people talking about Gulp/Grunt and really have no idea what they were talking about. I felt like I was so far behind all other developers because of this. I was tempted to dive into those technologies but I knew that in order for me to deep dive into that I would have to take points away from something else. At that point there wasn’t really anything else I wanted to pull points out of, so I didn’t end up learning gulp for a couple more years.
New technologies come around all the time and my first reaction is, “that looks really cool I need to check it out” or “this is the new industry standard I need to learn it”. For example, IOT (Internet of Things) really interests me, cyber security really interests me, game development really interests me, etc… However, when I actually sit down and think about it none of those interests fit into my current life. Then other times technologies come out that I decide are worth investing some time into. For example, a couple years ago I learned AngularJS, since Angular has moved to version 2 I really don’t have an interest in continuing to work with Angular. So when VueJS came out I spent some time learning and working with it to see if it could be a replacement. Eventually I will probably also dive into React for a while to see how I like it. At some point I will end up dropping one of those and dedicate my client-side javascript time to just one of those frameworks.
So what happens if I get to “expert level” at a certain skill, can I then take my attribute points away from that skill and move them somewhere else and maintain that skill level? In the web development industry this really isn’t a possibility. Lets say you spend a year or two focusing on one skill like React. Then you decide you are an expert so you want to add more skills to your developer skill set, so you stop working with React for a year or two to learn Go. After you spend that year or two on Go and go back to React you are no longer at the same level. For that year or two other developers have continued to keep all their attribute points in React and they have pushed the technology farther ahead. Even if you didn’t get rusty and forget some things you still aren’t a leader in the technology anymore.
Final Thoughts
So in conclusion don’t fall into the temptation as a developer to try to be an expert at everything. Either be a jack of all trades and master of none, or narrow your focus and just accept the fact that there will always be newer cooler technologies that come out. Don’t fall into the temptation to always think the grass is greener somewhere else.
I challenge you to try to figure out where you have your attribute points set, if you are happy with the allocation don’t change them, if not then adjust them. This can also make it much easier when it is time for you to find a new job. Try to find a job where your responsibilities and your time allocation comes close to matching your attribute point allocation.
Here is my personal attribute point breakdown (just using 100 points to make it easy). Some of the categories are broad but you can be as specific as you want.
50 - PHP (Laravel, Composer, Web Socket Servers, etc...)
15 - Client-side Javascript (VueJs, React, Angular, jQuery, Web Sockets)
10 - Build process / Deployment (Gulp, Webpack, Continuous Integration, npm, docker)
05 - Automated Testing (PHPUnit, Codeception, Unit testing, Functional Testing)
05 - Database Structure and SQL (MySQL/Sqlite)
05 - Server Administration (Apache, Nginx, AWS, Security)
05 - Client-side UI/UX (HTML, CSS, Sass, Bootstrap)
05 - Go Language (New Years Resolution)