How to find a path to mastery as a software developer

LabyrithPlanning out a software development career is hard at all stages of the game. There is no well-defined path to mastery for a developer, unlike other fields like medicine or law where you must get a precise degree with clear specialties. It can be terrifying since you’re never sure if you’re going in the right direction. Many people go to school to get started so they have a common basis of computer science, but even that is not a given. Even at school you can choose among many electives, and your internships and projects will shape the beginning of your career.

How to you know that you’re doing the right thing? In my opinion, the best way is to start working on concrete projects as soon as possible even if it’s scary. This will help you stay on track and will give you clarity on what you should specialize in. If you aim to progress in software development, specializing in a field is a must. Just learning skills at random is not an optimal strategy if mastery is important for you. You need to have a strong specialty and supporting skills if you want to be an effective and productive developer.

It’s hard to know what a job looks like if you’ve never done it before, so give yourself a chance to discover what’s going on. The same goes if you want to switch to a new specialty because you’re currently dissatisfied with your current line of work and feel stuck.

If you don’t have a job or internship and need to get started working, you can get involved in open source, work on your own side projects or join a group working on something interesting. Always stay curious and keep learning. If you come across something that you don’t understand, take a few minutes to do more research on it. You’ll learn what skills are useful in a way you would never get from a tutorial or a class and start making (and fixing) your own mistakes. For example, being able to do small modifications to images will always come in handy if you’re a web developer. Another good example is writing: new coders often underestimate the amount of writing that goes on when you work on large projects and have to communicate with clients and coworkers.

When you’ve been in motion for a while, you’ll be able to figure out better where you should go and what are the important skills you need to acquire to fill the gaps in your knowledge. At this point, you should write out a rough plan to map out where you really want to go. Often, one more programming language or algorithm is not the answer. Knowledge of an industry or soft skills like public speaking may be more important to you.

After a while, the natural learning you get by doing real work will most likely slow down once you’ve mastered the basis of what you need to do your job. You must make sure you keep learning regularly to move in the direction you want to go even if it doesn’t come from your job. You’ll never really get rid of all the gaps in your knowledge, but you’ll learn how take action and let the gaps take care of themselves. Experience will make this easier, like public speaking gets slightly easier with time but never really stops being scary.

Once you have enough tools in your toolkit, you’ll see that the coding itself is not the most important thing. The really hard thing is how to use technology to solve problems for real people in their businesses and their life. At this point, you’ll see that you’re still a beginner like most of us, since working with people is a lot harder than working with machines.

You’re not learning too slowly

Learning a new framework or language always feels slow and sluggish at first. I’m working on learning Ruby on Rails right know after a year or two of not learning a new framework and I had also forgotten the feeling. At first, I stumbled at every step on the way and nothing was familiar even if I’ve been programming for the web for many years. Not to help things, Rails is a strongly opinionated framework, so a lot of things are done by convention and not by configuration or by code. It’s a great productivity boost once you know the proper conventions, but it’s hard to deduce all of them at once when getting started.

hourglassAt first, I had the impression that I was going slower than usual. For a developer with a good grasp of the web and of other frameworks, a few weeks should be enough to get up to speed in a related technology and reach a point where they’ll be able to produce work at a decent pace. Not top cruising speed, but a few months down the line nobody will notice that they were new at it.

I’ve started two months ago and I’m barely getting there, but the thing is, I’m going at it in my spare time. I realized it was totally normal and that I was not growing soft with some simple mathematics. I’m sure you’ve also had the impression that you were too slow and not as productive that you could be when you started learning a framework for a new project or a new job, but it’s totally normal if you look at the time involved. Here is a ballpark estimate of what you can expect depending on the time you have to learn:

  • If you’re learning as part of your job as a full-time developer, you’ll have about 30 hours a week to get up to speed if you don’t have any other task to work on. This number gives you some padding for a few meetings and unforeseen emergencies. If you learn by yourself using online resources, 3 weeks is a reasonable time frame to learn a new framework you’re not familiar with, so 90 hours are needed. Let’s round it up to 100 hours.
  • If you’re learning on you own and have a busy life, you’ll have time to work on it maybe 1 to 2 hours a day for a total of 5 days a week because you’ll most likely be busy a few nights a week. So 5 to 10 hours a week would be a realistic estimate. If learning that same skill takes 100 hours, you’re looking at 10 weeks to 20 weeks to do the same job. So, in the end, it’ll probably take you 3 months at the very least, and probably something like 6 months if you’re too busy.

These times are not strictly equivalent, but should end up being about the same: if all your learning is concentrated in a short time frame, you’ll loose less time to context switches. It’ll be faster to get set up and remember what you were doing if you’re working on it all the time, and you’ll need switching less often for the same result if you’re working a full day on it.

On the other hand, when you have to stretch it out, you’ll have more time to for new knowledge to sink in between sessions as long as you build the habit of doing it regularly. It’ll take longer to reach the same result for sure, but you’ll reach the same point eventually.

You’ll still be working as a software developer in 6 months: this time will pass anyway, so if you start investing some time now you’ll have a brand new skill down the line. So don’t be too hard on yourself if you feel that learning something is taking you forever: you’re not too slow, you just have to put in the time to get better at it.

Highly productive web developers are T-shaped

Highly productive developers have a deep understanding of their specialization and are incredibly focused. They are rarely confused: they know what’s going on in their project and can find the source of a problem in a flash. They are also skilled in a variety of other subjects and can discuss the relative merits of other technologies with ease.

TShapedHow can you become this way and be productive in your own work? If you want this kind of skills, you must plan to develop your knowledge in a way that allows you to be T-shaped. Put simply, a T-shaped programmer has strong core knowledge in a domain that grounds them and allows them to be effective, which is the base of the T, and other skills in a wide variety of subjects, which is the bar of the T.

I first heard of the concept of being T-shaped in an article about success (http://www.artofmanliness.com/2013/04/09/to-succeed-in-work-and-life-be-mr-t/) on the the Art of Manliness blog. This is how I’m structuring my own growth, so I was glad to be able to put a name onto it. I also believe this is the most efficient way to develop your skills. Being T-shaped is not something that you’ll achieve in a year or two: rather, this is a lifelong pursuit of growth.

This is also a good way to invest in your future: if you only have superficial knowledge of many code bases and frameworks, you’re always starting over again without building a strong base of skills. You have to go in depth in a at least one area: once you have a strong grounding, moving to new languages and frameworks will be faster and more effective since you’ll have a stronger understanding of programming itself to start with.

For a web developer, what is a good plan you can follow to become T-shaped and ultimately become a more productive developer? In my experience, the following knowledge is required as a web programmer if you want to build a proper base for your T. When you’ll have those skills, you’ll be a strong web developer and you won’t fear missing out on new technologies and trends: you’ll have the evergreen knowledge that will allow you to learn new stuff faster.

  • Building pages in HTML and understanding how they are rendered, how they behave in the browser and the DOM (Document Object Model) that is used to represent them. Regardless of the language used to render pages, it’s always HTML in the end with some CSS and JavaScript.
  • Understanding what happens at the HTTP level when you request a page or sends information, and how those requests are structured so you can debug a wide variety of problems and understand what’s going on in general.
  • Styling your HTML with CSS to know how styles behaves and how they are applied to elements.
  • Having strong knowledge in at least one programming language used to build web pages such as PHP, Ruby, C# or Python.
  • Using debugging tools such as Firebug or the Chrome developer tools and the debugger for your language of choice to solve problems efficiently.
  • Understanding JavaScript language itself, which is the language used to code logic on the client (browser). There are many frameworks that make using it easier, but understanding how those frameworks are made will help you adapt easily to any of them.
  • Understanding how data is stored in a database and how to retrieve it or manipulate it using SQL queries. This is often abstracted in modern frameworks, but sooner or later you’ll need to look at the real data to debug.
  • Sticking to good programming practices in commenting and structuring your code, and understanding how to manage your time efficiently while coding.

Notice that I didn’t include any knowledge about frameworks, API or libraries in there: those change all the time, and you’ll pick them up easily if you base is strong. You can’t commit all the details of the APIs and libraries to your memory, but you can master them basic building blocks and use them to understand the APIs as needed.

Once you filled up the base of the T, you can opt to develop knowledge in additional areas that will allow you to leverage your core skill more efficiently and add to your body of experience. Those skills don’t need to be directly relevant to your work: their role is to add more depth to your knowledge. You will fallback on those skills to fix bug or respond to demands that are normally outside your job description but that will allow you to grow. Anything that you’re curious about and that’s not directly linked to your daily routine is a good fit here. This is the time for dabbling and short-term experiments!

Here are a few ideas to get you going:

  • Server-side and client-side frameworks, including popular CMS like WordPress or Drupal
  • Other programming languages
  • CSS preprocessors
  • Creating and editing images
  • Designing good user experiences (UX)
  • Managing various kinds of servers
  • In-depth knowledge of your favorite IDE or text editor
  • Advanced computer science concepts like big data or complex algorithms
  • Coding for the desktop or mobile
  • Soft skills such as writing and speaking at conferences

You don’t need to see these two lists as a huge mountain to climb: they are there to give your ideas of what your skills may look like in many years if you’re aiming to master web development and be highly productive at it. You need to build your own unique plan depending on your goals as a developer so you can aim in the right direction even if technology keeps changing.