"I'm trying to go down a bottomless pit. I'll never make it till the end."
That's what I thought when I tried to create my own video game. I was young, beautiful, and I was struggling to use
for loops and
arrays at the same time.
There was so much to learn!
Fortunately, I found the strength to continue. More and more, the concepts behind programming began to make sense. From there, learning wasn't a chore anymore, but an intrepid journey. Going through a book about C and trying to create my own adventure on MS-DOS was a crazy Indiana Jone's-like discovery I'll never forget.
My first video game wasn't great, but it was mine. It was my creation. Yet, what I remember today, with a tear in my left eye, is not the result, but the learning process itself. It was these "Aha!" moments which brought me the most joy!
I love learning. For a long, long time. That's why I tried, through the years, to make my learning gradually more effective and efficient.
Learning is essential for developers. We need to learn about the new breakthroughs, discoveries, and changes in the industry.
We need to learn about our history, to know what's really new, what's not, and what to do with it, in what context.
We need to learn about the business domain of the company we're working with.
We need to learn how to better communicates with our teammates.
We need to learn about what our customers really want.
The list goes on and on.
As you might have guessed, this article will brush over the wide subject of learning, as a developer. We'll try to answer these questions together:
- What's learning?
- Why do we learn? Should learning serve a goal?
- How to avoid ineffective learning methods, procrastination, and distractions?
- Should we have a mentor or learn by ourselves?
- Is practice only makes perfect?
- How to test ourselves to avoid the illusion of competence?
- Are feedback important? What kind of feedback can you get? What feedback should you be interested in?
Ready to dive? Good. Take your machete and let's go together through the Deep Jungle of Knowledge.
Sometimes, we can be very surprised of the meaning of common words. Especially if we never question their definitions.
For example, I'm always surprised to hear people saying that learning is only a question of memory. It's not wrong, but it's incomplete.
According to the oxford dictionary, learning means:
The acquisition of knowledge or skills through study, experience, or being taught.
This gives us clues about how to learn (study, experience, or being taught), but not really about the meaning of "acquisition of knowledge".
Let's look at the definition of knowledge:
Facts, information, and skills acquired through experience or education; the theoretical or practical understanding of a subject.
We can already see, thanks to these definitions, two main fundamentals for learning:
- Remembering (acquisition)
I'll add a third one:
Transfer is applying the knowledge from the learning context to another context. For example, it could be applying the programming knowledge your learned at school to the side project you always dreamt to build.
Transfer is not a necessity for learning. After all, you can understand and remember something without ever using what you learned.
However, most of the time, we learn in hope to apply the knowledge acquired. That's why it's still a major component of our learning experiences.
Learning will enrich your life in multiple ways:
- Your opinions will evolve.
- Your vision on the world will change.
- You'll feel strong connections with people who share your interests, creating passionate and mind-binding conversations.
Learning can open doors in your professional life:
- It can help you climbing the corporate ladder.
- It can help you to negotiate a better salary. After all, we are knowledge workers: our worth is partly our knowledge.
- It will create opportunities for healthy debates with your fellow colleagues.
- Your CTO might call you "Rockstar" or "Ninja" too, you lucky pit of knowledge!
When you try to learn something, it's useful to have concrete goals you want to achieve with the knowledge acquired. These goals could be a good occasion to transfer your knowledge.
For example, you want to learn programming because you always dreamt to create a revolutionary video game, where you can break bricks with a ball. Maybe you want to learn what's the DRY principle, to finally refactor your favorite legacy application.
Without meaningful goals, it will be difficult to be motivated in the long run. Learning is not easy. Understanding can be a daunting task (depending of what you learn), remembering even more so, and transfer is maybe the worst of all.
It takes time, too. That's why being able to reach concrete goals with your new skills and knowledge can be very satisfying. It will give you the needed motivation to continue on your learning path.
It's even more true when you try to learn complex topics. Your motivation is something you should try to assess and even measure along the way, to see if you need to boost it by making (and finishing) something important to you.
It's always possible to learn for the sake of learning. Heck, I do it quite a lot myself. Yet, you need to have a good confidence on your motivation, and you need to be aware of the benefits of the learning journey itself.
If you have difficulties to find concrete ideas and goals where you can transfer your new knowledge, I wrote a whole article about techniques to generate project ideas.
Now that you have your goals, you need to decide how much you want to learn.
After all, you don't need to be an expert in everything.
Moreover, knowledge acquisition is not like buying a new table for your living room. You need some maintenance not to forget the knowledge and skills acquired.
It means that you need to constantly refresh your knowledge and skills, for everything you want to be an expert at. It takes time, energy, and require, again, a lot of motivation.
For example, let's say that your life's dream is to write a PHP script to rename automatically thousands of your holidays pictures. You don't need to be a PHP evangelist to answer your needs. Trying to understand superficially how PHP works to accomplish what you want might be enough.
Superficial learning works well if you don't have any goal, too. You can read about programming paradigms for example, by pure curiosity, to have a global overview of all of them. You can still dive deeper if you wish later.
Beyond the superficial, the Dreyfus model of competence can help you deciding how competent you want to become:
- Novice - Shallow understanding, or no understanding at all.
- Advanced Beginner - Can make things works, often rely on following a series of steps.
- Competent - Can spot the roots of problems (background understanding), know all the rules and can select a rule depending of the situation. Still make many mistakes.
- Proficient - Very conscious about performance, know perfectly what approaches to take in what situation.
- Expert - Intuition very well developed, apply his skills without thoughts, performances look magical.
Choose your destiny, depending on your needs!
Let's see now how you should prepare yourself before learning anything.
The following advice won't change your life from one day to another. You need to work on it, actively seeking to apply these advice, day after day. The rewards are, however, huge. I promise.
Let's go back years in your past, when you were young, innocent, and not a caffeine junky yet.
You're at school. The teacher is speaking about whatever subject he wants you to learn. His tone is monotonous, he doesn't believe in what he's saying, you think about what you'll eat at lunch.
The seconds feel like minutes. Minutes feel like hours. You can't do anything, except waiting. Will it ever end? Will you feel joy again? Is it the end of time?
Finally, against all odds, the course end. The teacher ask you to learn a new chapter of your book. He will test you next time.
At home, you read again and again the learning material. You have difficulties to concentrate, but you're a serious boy (or girl), so you push yourself through. After five reading, you judge yourself good enough to pass the next test.
You close your book, satisfied with yourself, and switch on the TV, because Youtube might not exist yet.
What I just described is the worst way to learn something. Passively listening to somebody, then passively going through some learning materials might teach you something, but very, very slowly. You don't need to be in a class for that: just switch on Youtube and consume passively any video on programming.
When you close your book after your passive learning, you think you learned something. Yet, when you'll pass your test, you'll understand that you really didn't.
This is called illusion of competence: we have often the impression we learned something, even if we didn't.
You should spend most of your time actively learning. You need to be an actor in your own learning, not only consuming it like you would consume Netflix.
I would compare active learning as playing a video game. Yes, I was a video game junky.
When you play, you're actively doing something. Consequently, I'm sure you can remember many more video games than what you read in your last books.
This is due to two things:
- Video games are fun. You can make your learning experience fun, too. More you'll learn what you love, more you'll like the process of learning.
- Playing is an active endeavor, not a passive one.
That being said, before actively learning, you need first to have some sort of passive learning. It's difficult to practice something if you don't know anything about it. As soon as you have a minimum of knowledge, active learning should be your priority.
In the section Learning Methods for Developers, we'll see concrete techniques how to learn actively.
One of the problems we have, as humans, is our innate talent for procrastination.
It's basically the fear to fail, mixed with constant distractions (which popup on our phones every two minutes). This will prevent you to even begin a learning session.
I have a very effective remedy against that:
- Prepare your environment. Put every possible source of distraction away. Goodbye, Super Nintendo.
- Switch off all the notifications on your devices (phone, computer, minitel, and PDA).
- You can use software to block websites you're addicted to (Facebook, Twitter, and whatnot).
- Follow the 5 minutes strategy: when you don't want to begin your learning session because you prefer capturing Pokemons, make a deal with yourself. Learn for 5 minutes and, if you're still unhappy, come back to Pikachu.
If you follow this recipe, you're already on the Enlighten Path of the Wise Learner™. More you'll follow it, less and less difficult it will be to motivate yourself. You'll build good habits. Isn't it beautiful?
Another problem we have, as mortals, is our sensibility for distraction. Beating the Demon of Procrastination (till it comes back) is not enough.
Again, I have a remedy for that. This time, it's more a question of mindset:
- You need to learn to enjoy the learning journey, not only the result of it. Try to get satisfaction in your learning sessions. If you have goals which matters, if you enjoy your craft, this should only be a problem at the beginning. More you'll learn, more interest you'll have to learn!
- You need to have a growth mindset, not a fixed one. In short, stop telling yourself that "I'm not good at this and that, so it's useless to try". You can be good at everything, if you put the time and dedication for it.
The pomodoro technique is very useful to structure learning sessions. Learning consume cognitive energy (it's tiring), so small sessions are better than cramming 12 hours non-stop. This technique allows you to learn for 25 minutes, with 5 minutes break between each session.
Personally, I'm using the fantastic app Productivity Challenge Timer on my phone for my pomodoros. It will gamify the whole technique: there are achievements, you can gain ranks depending on how many pomodoro you do in a given week. It's very simple to use, too. You can even use it as a time tracker!
Be careful, though: this can be as well terribly addictive. Don't let your cat die of starvation because you're on in a crazy 43-pomodoro-streak!
If you wanted to do 456 learning sessions the next two days and you did only two, you need to forget yourself.
What happens if you don't? Well, you'll torture yourself, blaming yourself that you should stop playing video games (or whatever else you consider a waste of time). You'll force yourself to forget about them and focus on what matters.
Our brain, which is weirdly wired sometimes, will think that you're very afraid of video games. Therefore, it might be dangerous, so you should think about them all the time in case they try to hurt you!
It's called ironic process theory and, according to my own experience, it's very real.
Accepting your thoughts, your mistakes, and moving forward is the best way to deal with this.
Here we are! After brushing over the mindset to have to learn effectively and efficiently, let's go into the learning techniques themselves.
Learning with a mentor or a teacher is often the best. Unfortunately, teaching is difficult, and good teachers might be equally difficult to find.
It's not because somebody is good at something that he'll be able to explain it clearly. For example, the expert blind spot can be daunting for beginners and experts alike.
On top of that, not every good developers are interested in teaching.
Even if you find a good mentor, you'll need a good dose of self-learning on top. This is not avoidable. Technologies change quickly, you'll need to keep up a minimum if you want to stay technically relevant.
Moreover, if your mentor is a colleague, for example, he has other stuff to do than only explaining everything he knows. I would consider a mentor as a support, not as your primary source of learning.
For example, it might be better for you to ask the "why" to your mentor instead of the "what". If you don't know what a factory is, for example, look at it by yourself and ask to your mentor why he wants to use it in a specific context.
The keyword here is "context". There are no general good answers in development, but acceptable answers in precise contexts.
If you're a beginner, it's difficult to ask the good questions to a mentor. According to the Dunning-Kruger effect, a beginner don't know how ignorant he is.
- He might think that there's not so much to know about software development, and that he knows most of it.
- Questioning what you don't know is difficult, especially if you think there is nothing more to know for a given subject.
A good mentor can help a beginner pinpointing what he doesn't know, and what questions to ask.
As I was saying just before, even if you have a good mentor, you'll need to learn by yourself too. The learning material can be a book, an article, a video, or whatever of your liking.
In my experience, books are always more valuable:
- You can often read many comments and critics about them, to choose the best for your needs. This is the power Internet gave us. It's more difficult to have this kind of feedback on other learning materials. Try to read Youtube comments to know what I mean.
- Books might go deeper in a topic, offering more information, examples, and case studies.
Whatever you choose for your goals, you need to spend some time watching or reading your source material with a good amount of focus, to try to understand it. This is the passive learning part.
You can make it less passive by taking notes, for example.
A last thing: self-learning doesn't mean that you need to be alone all the time. You can study with people, even if the amount of distraction might rise.
Even better: you can decide to study with a group of people on a precise topic, and meet with them from time to time to share your learning. It will boost your motivation, it can create healthy competition, and you can help each other. On top, you'll create strong social bounds around common interests.
Regarding competition, it's good if nobody takes it too seriously. Otherwise, it can affect your motivation negatively.
After choosing your learning material and learn a minimum on the subject, you need to practice.
I would recommend to do so as soon as soon as you can. I'm insisting here, but it's important. Enough is less than you think. Even if you're at the beginning of your study, far away from your goals.
Early practice will improve your odds to remember the learning material, and you'll be able to attest if you really understood everything.
If your goal is to build a software, begin early. Even if you only write five lines of code. At the beginning, the quality is not important. You can always improve it later. What's important is to begin.
However, only practicing won't bring you very far on the Path of the Ultimate Skill. Many developers out there practice for years, sometimes decades, without learning anything. They only practice what they know, and don't try to widen their knowledge. As a result, they repeat again and again their misconceptions, misunderstanding, and old habits.
Practicing makes sense only if you always try to learn new things in your thirst of knowledge, and question what you already know. Knowledge is meant to evolve, not to stagnate.
For more abstract concepts, testing yourself can be very powerful, to see if you remember what you previously learn.
Let's say that you want to learn some good design principles. You can try to apply them in your current project of course, but you won't necessarily have the occasion to do so. Plus, you need to remember them before trying to apply them.
It can be helpful as well at the beginning of your study, when you really don't have enough knowledge to practice.
After a learning session, you have mainly three ways to test your new acquired knowledge:
- Take a blank sheet and write everything you remember.
- Find some exercises and questions related to the subject.
- Create yourself questions and/or challenges while learning, and try to answer them afterward.
The first method is the hardest, but the most rewarding too. Depending of your learning, it can be difficult to do, especially when the knowledge is very broad. For example, I try to learn discrete mathematics, and this testing method is not appropriate. Since I don't want to be an expert in computer science (yet), I don't use it.
Doing exercises is good to retrieve your knowledge as well as increasing your understanding of the subject. Exercises and questions can help you avoid the illusion of competence. They can spot a new light on some aspects of the knowledge you missed to see before.
To come back to my study of Computer Science, I think this testing method is more adapted to the topic, to me, and to my goals, at least for now.
Creating yourself some questions and answering them later can be incredibly beneficial too:
- To formulate good questions, you'll need some level of understanding already. It's a good test by itself.
- Creating questions will increase your odds to remember the knowledge.
- It will oblige you to structure your knowledge. Otherwise, your questions won't really make sense.
Creating your own challenges can be beneficial, too. For example, you can give yourself the challenge, for the next 30 minutes, to find violation of the DRY principles in the project you're currently working on. You can imagine anything you want.
Studies show that testing yourself, using whatever method adapted to your personality and the topic you're trying to learn, is better without any help or external cue. It will help you remembering and retrieving the knowledge when you'll need it. However, it can be difficult to do.
Some studies show as well that you need some amount of difficulty when you test yourself, or even when you practice. You need to find a balance: not too hard, not too easy. This is what the psychology professors Elizabeth L. Bjork and Robert Bjork called desired difficulty.
The problem: we have tendency to be attracted by everything easy. Knowing that, you should try to push yourself to go more in the difficult side of things.
I spoke above about the illusion of competence, or having the impress you learned something, even if you didn't. This becomes obvious when you try to remember or apply the knowledge.
Forgetting is not as bad as we think. Actually, it's often the best case scenario. Learning can as well lead to misconceptions. It's when you thought you learned the subject, but you only misunderstood it. This will create faulty thinking, mistakes, and bugs.
To avoid these traps, feedback are very important. They can help you to:
- Assess your learning progression.
- Bring some light on what you don't know.
- Guide you on what you should learn next.
You can try to gather feedback about everything:
- Feedbacks about your learning methods themselves (meta-learning).
- Feedbacks about the material you're using.
- Feedbacks about your knowledge and skills.
We can differentiate two types of feedback: internal and external ones.
Internal feedback are the ones you get mainly from experimenting. They are feedback you create for yourself.
Sometimes, you need to slow down your learning frenziness and ask some questions:
- Was the material easy to recall? Why?
- Are your learning methods effective? Do you think there are better ways?
- Does this new knowledge bring you closer to your goal?
- Can you solve the problems you wanted to solve with this new knowledge?
When we begin to learn something interesting, we can get ourselves caught into a learning spiral, which might not be as useful as we think. That's why taking time to study our learning techniques, as well as the result of our learning, can save us time and energy on the long run.
Don't forget: you're not your study, your projects, or your work. It's fine to abandon something you invested (a lot of) time in. It wasn't a waste of time. Everything you'll do will bring you some knowledge, anyway.
It's especially true for "failures". To me, there is no failure: only opportunities to grow. Experimenting new techniques, even if they fail, will improve your learning abilities.
You can collect external feedback from everybody around you: colleagues, mentor, your boyfriend (or girlfriend), or even Reddit users.
You can seek external feedback about your learning strategies as well but, unless you know people very interested by learning itself, it might be more difficult.
You can receive essentially three types of external feedback:
- Feedback telling you that you're wrong.
- Feedback telling you that you're wrong, and explaining what's wrong.
- Feedback telling you that you're wrong, explaining what's wrong, and explaining as well how to fix it.
The first type of feedback is easy to get. They are pretty useful when there is only one good answer.
For example, if you're arguing on the Internet that objects in PHP are passed by copy and not by reference, somebody telling you that you're wrong can push you searching the undeniable truth and find that, indeed, you were wrong. You can therefore correct your misconceptions.
However, for everything which is a bit more complicated, the second type of feedback can be more useful. Unfortunately, they are more difficult to find.
Indeed, if somebody's telling you that anemic domain models are useful in some situation, and provide details and examples of these situations, you can go into an healthy debate where both of you can learn. It's how your knowledge will evolve, how your opinions will get more nuanced.
The third kind of feedback is the best you can find, but the most difficult to get as well. If somebody tells you that anemic domain models are useful, in what cases, and how to fix some of your code which should use them, you'll learn a lot.
Feedback are eerie. It's never nice to hear from somebody that you're wrong. You might take it as a failure. Consequently, you might be afraid to ask for them.
Again, understanding that a failure is nothing but another learning material can help. To really, deeply understand it, you need to work on it.
As an example, I know many people criticizing Reddit, because the feedback there are harsh, and often without any useful information. Personally, I love it:
- It trains me to accept feedback, even the harsher ones.
- It shows me the difference between useful feedback and useless ones.
- The majority of feedback from there are actually pretty useful.
Seeking feedback is a habit you need to build for yourself. Not only for learning. It's important for any creative endeavor, programming included. They will push you to improve, to always question your knowledge, and to fix your misconceptions. Without feedback, you'll take the Path of the Smelly Stagnation of Knowledge™.
Don't forget that you can discard feedback you don't judge useful. If you think the feedback you receive don't teach you anything valuable, toss it.
It's important to let your ego on side to appreciate the power of feedback. Detach yourself from them, don't take them personally.
A last thing: feedback can backfire. Even if you try genuinely to get the most of them, there will be moments where you'll feel like a fraud. That's why you need a good balance: seek enough feedback to help you progress, but don't try to collect too many of them at once, or your motivation and self-esteem might suffer. Allow yourself some time to digest them.
Positive feedback can backfire, too. When well-meaning people, often from your circle of friends or from your family, tell you that you're the best on Earth and in the whole known universe, you'll become too confident in your skills.
From there, you might end up in the Practice Loop of the Devil, where you only practice what you know without seeking any new knowledge, or without questioning the knowledge you already have.
Again, it's a question of balance. A positive feedback is always nice to receive, but don't get too cocky.
This article is not a magic guideline you can follow to learn everything automatically, but a framework you need to adapt to your personality and needs. As always, you need to experiment and find what works best for you.
What did we learn in this article?
- Learning includes understanding, remembering, and applying the knowledge in different situations (transfer).
- Ask yourself these important questions: why do you want to learn? How much do you want to learn? What do you want to achieve with this knowledge?
- Choose the best techniques for you to avoid procrastination and distractions.
- Choose the learning material considered good by a majority of your peers.
- Go through it, and try to practice the knowledge gained as soon as you can.
- Test your new knowledge to be sure you really learned it, and to bring the new knowledge in your long term memory.
- Seek internal and external feedback. Train yourself to squeeze as much as you can from them.
Whatever you want to learn, you can learn it. That's the mindset which always push me to improve and seek new knowledge and skills.
There's no age limit for that. As somebody said somewhere: the best time to learn was 10 years ago. The second best time is today.
A last word: don't forget that your lifestyle will impact grandly your learning skills. Sleeping well, drinking enough water, eating properly will help you in everything you want to do.
- Ultralearning - Scott H. Young
- The Science of Accelerated Learning - Peter Hollins
- Research finds practicing retrieval is best tool for learning - Amy Patterson Neubert
- Making Things Hard on Yourself, But in a Good Way - Elizabeth L. Bjork, Robert Bjork