Andrei Dobrinski's Blog

How I Learn Technical Skills

As a developer, learning new technologies is a key part of maintaining, broadening, and honing your skillset. Exploring new technologies allows you to steer your career, learn more about what interests you, and develop your skills. Learning as a developer means taking the opportunity to design your own path from awareness to expertise.

I started my coding journey in 2016 as a self-taught developer. Since then I’ve had some great mentors teach me and I developed my own strategies for learning new technologies. I’ve learned and worked with web technologies such as React, Svelte and GraphQL and mobile technologies like Swift, Flutter and React Native.

I’ll be sharing my approach to learning new technical skills. Keep in mind that this article is not prescriptive towards how you should learn - the intention is to share an outlook that would hopefully help you with your learning.

Intended Audience

This is intended for developers that like to think about how they learn, and explore strategies for learning new technologies.

Why do I want to learn this tech specifically?

It’s important to think about why you want to learn a technical skill so that you can consciously choose a learning plan that fits well with your goal. There’s no wrong answer here, but setting a goal for yourself can help you prioritize where to spend your time.

While learning is great in general, when there’s limited time, channeling your efforts towards an attainable goal can increase the likelihood that you’ll stick with the process. The health and fitness world has the idea of “the best exercise is the one you’ll keep doing”, which I think applies to learning a new skill as well.

Let’s go over some examples of why you may want to learn a new skill.

  • To prepare to enter a new career

    “As a marketing coordinator, I want to learn software development so that I can become a developer”

  • To deepen your skillset vertically across the stack

    “As a frontend developer, I want to learn backend development to become a fullstack developer”

  • To broaden your skillset horizontally across your discipline

    “As a frontend web developer, I want to learn iOS to understand how other languages/frameworks build UIs.”

  • To build a product, business or side project

    “As a frontend developer, I want to learn backend development to build a fullstack app that does X”

  • To learn a general principle through a specific skilled approach

    “I want to learn Haskell in order to better understand functional programming”

  • Out of curiosity and personal enjoyment

    “Let’s see what Flutter is all about”

Understanding what drives you is a helpful start to planning how to approach a new skill. Let’s look at a general process for how this might work.

The learning process

While the process will likely get adjusted based on your goals, timeline, and prior knowledge on a subject, the order of these steps will usually stay consistent. Let’s get into what that looks like:

  1. Exposure and immersion
  2. Theoretical knowledge
  3. Practical knowledge
  4. Feedback
  5. Reflection

Exposure and immersion

The first stage is exposure and immersion, where you’ll find and take in information related to what you’re trying to learn. The aim is to broadly understand what the tech is, and what kinds of problems people solve with it, rather than diving into the specifics of how to solve a given problem. This step should familiarize you with the community and culture around the skill you’re learning.

Sources like articles, press releases, email newsletters, podcasts, interviews, and critiques written by experts will be great places to start exploring more about the skill you’re learning. I recommend finding what works best for your learning style (for example keeping up with a blog series vs. playing a podcast on your walk).

I enjoy listening to podcasts as a way to explore new technologies I haven’t worked with. Listening to conversations with experts helps to understand what they think about working with the technology and how it fits into an ecosystem or stack.

Setting a certain amount of time for immersing yourself in the technology helps to avoid getting stuck in the research phase. After that, you can decide if you want to move on to the next step. If you do continue with the technology, find a source that you enjoy to keep you up to date on developments in the field.

If you find that after learning more about the technology it’s not be the right fit for your goals, then this is where you can pivot to a new plan. Either way, this was a great opportunity to learn more about the technology and yourself.

Theoretical knowledge

After learning more about the technology and the community around it, you can start to dive into more theoretical knowledge. At this point you’re getting into the specifics of how the technology works and how it’s used. The goal is to find the answer to questions such as:

  • What types of problems does the technology solve?
  • What are some of the common APIs being used?
  • How could the tech fit into the full stack of a project?
  • Are there any major limitations you should be aware of?

You’ll find some of these answers through looking at introductory code examples of the tech in action. You can also read blog posts or tutorials that focus on how someone solved their specific problem with this tech, which will usually have direction on steps to follow to replicate their work. You can also find this information from the documentation of the technology itself. Observing how the tech presents itself for use through documentation and how others are already using it gives you a good sense of what it’s capable of.

At this stage you can start to consider how this technology might be used to achieve your specific goal and you can now start to explore how you may make adjustments for your specific use case. Typically, this will be the early stage of deciding on your technical architecture, and how you’ll get from point A to point B, before you start to actually code anything.

I enjoy reading through tutorials of problems similar to the one I’m looking to solve. Seeing the solutions in code helps to get a better understanding of what it’d be like to use the technology - the APIs and syntax in a context that’s similar to the one I’ll be working in.

You’ll also want to consider any major limitations that the technology has in relation to your goal. Once you’re confident that the technology is a potential fit for your goal and you can see yourself working with it, it’s time to move onto the next step.

Practical knowledge

This is where you start to put your learning into practice - getting your hands dirty by trying out the technology for yourself. Applying your knowledge in a practical way can help make sure you don’t get stuck in the research and theory phases, and that you absorb the material.

There are a few different ways to approach the practice and I recommend finding a method that caters to your strengths.

Side projects

Side projects are great way to learn a new technology. I try to find a problem I care about, that is also something that I can reasonably solve with a simple MVP. I have found that taking on only one side project at a time helps me immerse myself in the technology, and increases the chance that I’ll complete the project. If possible, I also recommend limiting the rest of the project’s stack to technologies that you are familiar with to help keep your learning focused. As you become familiar with more technologies over the course of your career, you’ll be able to take on larger side projects that involve more technologies across the stack.

No side project is too small when it comes to learning through doing, especially when the solution is to a problem that is close to you. For example, I built a small gym todo app specifically to help with how I used the gym. I built an app to tell which produce is in season and one to help my girlfriend with creating YouTube playlists. Though these apps are quite small, they’ve been immensely helpful in understanding the technologies I used to build them with.

Practice problems

In addition to side projects, practice problems can be a great way to develop your skills. If the scope of what you want to learn is small, a Leetcode-style interview question might work well to try out your new skills in an isolated way. I recommend looking for narrow algorithmic problems online to help you cement you learning.

I’ve used exercism.org for practice problems and I’ve found the experience to be both helpful and fun. Keep in mind that you can look at others’ solutions for inspiration if you get stuck, but I recommend trying get a solution down yourself before looking at any answers.

Repetition

“Repetition is the mother of learning” - Russian proverb

Repetition is a key part of the learning process. One of the most effective strategies I’ve found for learning retention is re-typing a section rather than copying and pasting it in order to build muscle memory. Once you are familiar with the section, you can then introduce productivity tools like snippets or copying and pasting in order to work with the technology more quickly.

Feedback

This stage is about sharing your work with the world and soliciting feedback on how you went about your solution to the practical problem. The goal is to get a critique of your work and understand different ways the the problem could also have been solved.

Send your code up to GitHub and share it with a mentor, a senior developer, a peer, or a tech community that you’re a part of. Sharing code is great for general feedback but make sure to as specific questions as well. Ask for an opinion on:

  • How you went about a solution in a specific file
  • How you decided to organize and architect the solution
  • What someone else may have done differently if they were to solve the problem

Criticism can be valuable to receive, so make sure to listen and thank the person that took time to read your code and provide feedback. Ask clarifying questions about the feedback - if need be - and provide your line of thinking if asked why you went about the solution the way that you did.

At this stage, it’s important to separate yourself from the code that you write. Discuss the code as if it’s purely a tool that exists to solve a problem and not as something you produced that’s close to you. Don’t get defensive towards criticism and don’t take comments about your code personally. You are not the code that you write. Understanding this puts you into a place where you can learn very quickly and iterate with better and better code. Attaching yourself to a particular solution or implementation makes it more difficult to learn and grow from it.

Once you’ve understood the criticism, you can decide whether it’s something that you want to incorporate in your side project or practice problem. Repeat the feedback and iteration as many times as you’d like, until you’re ready to reflect on the work you’ve done.

Reflection

The work is done and it’s time to look back on it and think about what you’ve learned. A smaller project could involve a simple mental reflection, where you think about what you’ve learned and what this means for you going forward. A larger project could involve writing, talking, or otherwise sharing your experience with others. The goal with reflection is to form your own opinions on using the technology to solve problems and consider the role you want it to play in our future.

Writing is my favourite way of reflecting on my learning. A blog post is a good option for more concrete and sharable knowledge. A set of notes can be a good resource to come back to or share with someone going through the same learning.

Other options for public reflection could be to:

  • create a talk for a meetup or conference
  • post on a tech community (Stackoverflow, Reddit, or a local tech community)
  • create a video/infographic/social media post

Teaching and talking about a skill is a great way of locking down the learning for yourself. Explaining an idea means that you know it well enough that you can communicate it to someone else. Answering others’ questions can reveal gaps in your understanding and encourage you to research to fill those gaps.

A side benefit to public reflection is establishing yourself as an expert in a field, which could create opportunities for your career. If a company is considering two candidates with similar levels of experience, having an established blog/talk/YouTube channel goes a long way to differentiate the value you can bring to a company. A good teacher is a valuable asset on any team.

There are benefits to public reflection or learning in public, as Swyx calls it. I particularly like the the idea of “make the thing you wish you had found” when writing as a form of reflection. That being said, reflection does not necessarily need to be public. Keeping private writing or a set of notes still helps to learn skills in a way that you can remember them later.

Reflection, either public or private, helps to build a base of knowledge that you can refer back to later. Revisiting a blog post or a GitHub repository where you’ve solved a problem before means that you won’t have to solve it again, even if you forget the solution.

We’ve looked at the 5 steps in the learning process, but let’s hone in on the essential core of learning - alternating theory and practice.

Alternating theory and practice

The 5 steps above outline my entire learning process from start to finish, but let’s hone in on what I consider to be the at the center of learning: alternating theory and practice. The idea here is to first learn something new in a theoretical sense, usually by reading or observing and then to implement that learning in a practical way.

The amount of time spent in either theory or practice can change based on how much foundational knowledge you have in the skillset or related skills. A longer amount of time might mean that you’re getting more familiar with a new concept and a shorter amount of time means that you’re actively progressing through new skills.

Let’s look at this through the lens of an example. Starting off with a new skill, one approach could be to read the entire documentation before putting anything into practice. This would mean a longer window between starting a “theory” block and switching to “practice”. Another approach could be to jump straight into the “Getting Started” section, getting a project up and running, and then referring to the documentation to get guidance before implementing a feature. Both of these approaches are valid identifying your own learning style will help you choose how to begin learning.

I prefer an approach that starts with large blocks of theory and practice at the beginning, with increasingly shorter blocks as the learning builds. Often this means that I’ll read the documentation entirely, to get a general sense of the technology’s capabilities rather than to deeply understand everything. Once that’s finished I’ll set a goal for a project, break it up into small chunks, and alternate theory and practice on each chunk - reread the documentation piece about how to do something and then immediately put it together.

A course or curriculum will typically build in the concept alternating of theory and practice into its design. Usually the instructor first takes you through a lecture on a topic before allowing you the space to put it into practice, either independently or with a code-along of a project.

It’s worth noting that the practice during a tutorial/course is different than the practice of writing your own code. Writing your own code introduces the ability to fail, and importantly to learn from that failure. Failure can be a great leaning opportunity if you’re willing to preserve until you find the resolution, because the experience of solving it yourself retains better than learning a solution to a problem you’ve never experienced.

Now that we have an idea of how to focus on the learning process let’s get into those now to choose a resource.

Deciding how to start learning

There are a lot of resources available when we first start learning technology. Apart from a formal education, we can use:

  • documentation
  • courses
  • tutorials
  • videos
  • Stackoverflow
  • anything that results from Googling “learn” follow by the name of the tech

The amount resources can be quite overwhelming to sift through, especially when many of them are not the most helpful thing depending on the amount existing technical knowledge you have.

Generally, the more guided resources are better suited to people that have less existing technical knowledge around a topic. For example, if you’re brand new to development or fresh out of a bootcamp and looking to learn a new technology, a course would be a good fit for you. Paid (or sometimes free) online courses have excellent guidance for beginners looking to get into a new technical space. Since courses typically contain both theory and practice, this takes the mental load off the student to decide how best to alternate the theory and practice for themselves. Courses will typically run anywhere between a 1-2 to tens of hours of content and cover a lot of ground. This means that you can get set up to start your own project soon after completing the course. I’ve taken many courses and they’ve been a huge help in getting me the experience I need to start a project of my end, especially early in my career.

Tutorials, videos, and Stackoverflow are the next step after courses in terms of guidance. They’re well-suited for folks that are familiar with the technology and are looking for a walkthrough or example of a specific implementation. I’ve found tutorials to be a good complement to a course after I’ve finished one and am looking to build my own project. Tutorials are also a good complement to an existing knowledge base in general - for developers proficient with the tech but looking to get guidance or inspiration about solving a specific problem. Skimming tutorials is also a good way to get familiar with how working code looks, which is helpful in deciding if you want to pursue the technology during the research phase.

Reading the documentation is great for all skill levels but is well-suited for people adept at programming in general and looking to get specifics about how a new technology works. For example, after I became familiar with a few JavaScript frameworks through courses, I was comfortable with skipping a course and going straight to the documentation with the next framework.

If the documentation fails, you can always look at the source code of the technology you’re learning to get a definitive sense of what it can do. This might be necessary for a more seasoned programmer working with a technology where the community resources and documentation is still immature.

Basing your learning approach on goals

Let’s refer back the earlier goals around you want to learn a new technology and see how the different resources may fit with the goals.

If you’re changing careers, building foundational knowledge, or deepening your skillset vertically across the stack then a course would be a good option. A good instructor can set you down the right path early, teaching both patterns and pitfalls of the technology early in your learning path.

If you’re broadening your skillset horizontally or building a business/project then you can jump straight into tutorials or documentation to hit the ground running, especially if you have some familiarity with similar technologies

Closing thoughts

Learning is both fulfilling and fun, but it can get overwhelming and even stressful at times. Keeping your sights set on the goal you want to achieve helps you move through the learning process productively and with minimum stress. Learning about how you learn and how to cater to your strengths helps you to set up a learning path that is best suited for you and most likely to lead to success.

Finally, remember that you don’t need to learn everything right now. Learn what you need to know in order to solve the problem in front of you, and let the reflection step be your guide into what to learn next.

Edit on GitHub

Back to All Posts
Built with ❤️  in 🇨🇦