In the last post that I wrote about the Dreyfus model, I’d promised I would come back here and tell you about some techniques to evolve in the model scale and here I am to do that, but firstly I would like to thank the people that gave me very good feedback in a direct and indirect way - by commenting and sharing my post. For an advanced beginner at blogging, the feedback is amazingly rewarding. Thank you!
Before going into deliberate practice I would like to state something: scientific research shows that expertise in any field comes from hard work and practice, not from innate talent. In almost every case of famous human expertise, at least a decade of hard work was needed in order to reach world-class skills. However, hard work isn’t enough - the journey to expertise requires smart work, aka deliberate practice.
Andy Hunt states the following about learning: “Learning isn’t done to you; it’s something you do. Mastering knowledge alone, without experience, isn’t effective. A random approach, without goals and feedback, tends to give random results.”
So let’s see how to learn deliberately.
According to Dr. K. Anderson Ericsson, deliberate practice requires five conditions:
- You need a well defined task.
- You should be motivated to pursue the completion of the task.
- The task should take into account the existing skill - it should be challenging, but never too hard.
- You should be able to quickly evaluate your efforts and receive feedback. The amount of time between an action and feedback is directly related to your improvement.
- You should be able to repeatedly perform the same or similar tasks, concentrating on fixing mistakes you’d made before.
To apply deliberate practice you need to have goals in your life, like become a better programmer, run faster and for longer periods, lose weight, etc, but goals are normally too open and almost never get past the state of a “want to do” thing. A good way of focusing on your goals is through SMART objectives.
SMART stands for Specific, Measurable, Achievable, Relevant and Time-boxed. The idea is that for any goal you must have a plan composed from a series of SMART objectives. The SMART characteristics are explained below:
An objective must be clear, unambiguous and concrete. The objective “I want to learn Scala” isn’t specific but “I want to create a concurrent search engine with Scala” is a lot of times more specific.
To know when you’re done, or at least getting closer to your objective, you must be able to measure it. This characteristic is tightly related with being specific: you can’t measure the accomplishment of an abstract objective. It’s easier to handle small steps when measuring an objective - you don’t need to plan it entirely from the beginning, but it’s nice to plan at least your next step.
The objective should be realistic and attainable. An unrealistic objective is just a source of frustration - it leads to nowhere. You should be able to complete your next objective starting from who you are now. Writing an entire application with a new language in a week is an example of unrealistic objective, but writing a small part of it instead or only its skeleton, is a lot easier to be done.
The objective must be important to you. You should be passionate and have control of it - it must make a difference in your life. There is no point in doing something you don’t want to. It’s worth to mention that the objective should bring you forward, right?
The objective must have a deadline, because without it, an objective would probably be pushed aside by the day-to-day routine, without ever being completed. It’s important to have small objectives with small time-boxes - the feedback of completing something is a major factor to continue your efforts, and so, long term objectives can make you lose this incentive.
A while ago, Jason Rudolph made a nice list of goals that a software developer can use to track improvement and “level up as a developer”: http://jasonrudolph.com/blog/2011/08/09/programming-achievements-how-to-level-up-as-a-developer/.
The list got quite famous and has been forked, improved and used by a lot of developers.
So, after establishing objectives you need a plan to execute them.
Active (not passive!) Investment Plan
Do you invest time to learn? Or is your studying time relegated to your free-time, competing with Twitter, Reddit and video games? I agree with Andy Hunt and David Thomas in the Pragmatic Programmer book: you need to invest on your knowledge portfolio. It should be managed as a financial portfolio, therefore you need to:
- Invest regularly.
- Review and rebalance it.
- Diversify your investments.
- Manage risky with riskier technologies and conservative ones.
**Investing regularly and reviewing your efforts and results are, in my opinion, the most important aspects of a good investment plan. **
It takes time until the investment pays itself, but with constant long-term small sessions of study and practice the investment will be accumulated and will become a real asset. Long sessions of study are even better, but they are also harder when you have work and other responsibilities knocking on your door. Reflection on your objectives and goals are also extremely important: some of your efforts may show themselves as less relevant with time, so being quick to identify and stop them can save you a lot of time.
As Benjamin Franklin said, “An investment in knowledge always pays the best interest”.
Before closing, there are two study techniques that have been making a big difference to me lately and I got them from reading “Pragmatic Thinking and Learning: Refactor Your Wetware”: SQ3R (reading technique) and Mind Maps.
Reading written instructions are generally considered the least efficient way of learning. Most of our brain isn’t engaged while we are just reading, therefore much of our brain power isn’t being used. To solve this problem there are many techniques that work not so differently from each other, and we will see one of them: SQ3R.
SQ3R is an acronym with the following steps of the process it proposes:
First you need to survey what you’re going to read. You should look over the table of contents, chapter introductions and any feature that the author might have left.
The intention with the survey is to formulate ideas of the content to then be able to write down questions you want answered from the book. You should try to rephrase chapter titles and subtitles with those questions, so during the reading you’ll look for answers to them.
Now you can read the book, keeping in mind the questions made during the last step.
At this step you should recite, recall and rephrase the most important parts of the book and the answers to the questions from the “Q” stage. The goal is to be able to rephrase the major ideas and answers of the book with your own words. This step is something like “Test Driven Learning/Reading”. The processes of making deliberate attempts to retrieve the content and rephrase it with your own words consolidate learning and strengthen the connections in your brain. This research article from Henry L. Roediger, III, and Jeffrey D. Karpicke shows that the act of immediate testing after reading promotes better long-term retention than just repeatedly studying the same text.
At the end you should start a review all the material you produced while reading. Is there any portion of the book that need further study? Should you take more notes? Can you recall the major points? Is every question answered clearly? A good way of taking notes and clarifying the content is through Mind Maps.
A mind map is diagram that outlines information (topics, ideas, concepts, etc.) and shows how they are related. The idea is to start by writing the subject in the center of a piece of paper and then draw lines to subheadings, recursively increasing the depth of each node with headings, concepts, insights, etc. Below is a picture of two mind maps that I made while reviewing the “Pragmatic Thinking and Learning” book:
Unfortunately mastery of the knowledge alone isn’t enough - the model built on your mind, the questions you ask as well as the experiences and practices you have are more relevant to your performance. While all those things I wrote will help you a lot, it’s vital to have an active investment plan, develop good habits and be aware of the results of your actions to increase what is working and eliminate what is not. As someone famous once said: “Eternal vigilance is the price of liberty.”
Although I tried to write what I liked and considered the major points of the “Pragmatic Thinking and Learning” book, it’s much more dense with a lot of topics that I haven’t even mentioned (like the R and L side of our brain, debugging your mind, more techniques and more) - it’s really worth reading.
Below I made, just for fun, a list of what to do if you DO NOT want to learn deliberately:
- Tackle big and hard problems from the beginning
- Don’t make an investment plan - learn passively.
- Do the same thing you always do, ignoring new possibilities.
- Read without any reflection, goal or review - in other words, not deliberately.
- Don’t reflect on what you do, don’t be aware.
- Do nothing but work, learning everything “on-the-fly”. (like almost every programmer!)
I hope that the content written here will be useful for you. It certainly was for me! :-)