For a long time in the history of mankind skill, talent seemed to be a divine manifestation, something given from above. And there is nothing surprising in this – for an ordinary person the work of a master was something akin to magic. The work of a programmer was perceived in the same way. It was believed that only capable, gifted people can master a computer. To the unenlightened, the programmer seemed like a magician, working wonders under the rapid clacking of a keyboard.
The work of a programmer is much like that of a craftsman. Therefore I propose to use the word “craftsman” in this article as an indication that a programmer has reached a high level of development in his profession.
Nowadays it becomes more and more popular, old stereotypes disappear and new ones appear. However, the question of how to achieve excellence in programming still remains open. The historical trend is such that more and more effective training and skill acquisition is required. In the field of IT, the need to become an expert is many times more urgent than in other spheres, because due to the globality of the profession one has to compete with developers from all over the world.
There is reason to believe that in the near future, due to the popularity of our field, the level of competition will be even higher. A very interesting phenomenon is taking place: a huge number of novice specialists against the background of the shortage of high-level experts. The question of how to achieve proficiency arises not only for every developer individually, but it is very important for companies which are interested in development of specialists and need good staff.
For a long time I thought that there was no such thing as perfect code. It was so until that very mythical 10õ developer was hired into our team. The project had just begun, and about a month before that I had created a working prototype of the API. The first thing the expert programmer did was to completely rewrite all my code in a couple of days. And he did it so nicely and elegantly, that it felt like the application was written not by a human, but by some advanced artificial intelligence. Nothing superfluous, easy to read, extensible. Even glancing through it subconsciously understood the meaning of what exactly was going on.
My friends and I started calling such perfect code “academic”. After I had seen academic code, a burning desire arose to learn to write the same; I began to notice dissatisfaction with myself. I became curious about the process of developing expertise, so I decided to explore the question in more detail. The main question was why some developers become outstanding, while others remain gray mediocrities, and whether it is possible to escape from the category of the latter to the category of the former.
Is excellence attainable , despite the Talent?
It turns out that it is not possible to become a master in all areas. Several conditions must be met for this to happen.
1- Quick feedback.
There have been studies in which specialists with years of experience in political science and financial analysis were asked to make predictions about future events. As it turned out, almost all of their statements worked worse than the flip of a coin. The experience and authority of the “specialist” had no correlation with the accuracy of his predictions.
Basketball players shoot the ball thousands of times a day, and immediately after the shot they see the result. If they were throwing today and seeing the result next week, their progress would be much slower. The situation for political scientists is even worse. Historical events don’t happen that often, and in such complex systems as society, simple randomness has a big impact. There are too few cycles such as make a prediction, get feedback, draw a conclusion, and achieving expertise in these areas is maximally difficult.
2-A pattern independent of random factors. The ability to perform something consciously, noticing the smallest details.
It is human nature to look for patterns even where there are none. An experiment was done on mice and humans. Mice were given two buttons, red and green. There was an 80 percent probability that the green one would light up, with a 20 percent probability that the red one would light up. If the mouse pressed the button that would light up next, it got cheese, if the wrong one, it got an electric shock. The mouse quickly realized that it was more profitable to press only the green button and accept an 80 percent chance of winning. The human, on the other hand, was looking for patterns – most often choosing the green one, but sometimes, trying to predict, the red one. In the end, the result of the man was much worse than the mouse: the correct answers were only 68 percent.
Programming fits these basic criteria perfectly. Every time code is written, it is immediately apparent whether or not it works. Of course, the reader may argue that the correctness of some architectural choices becomes evident only after a long time. Indeed, this is why the qualification of the decision-maker is very important when designing the architecture of an application. The correctness of the choice of architectural solutions does not have instantaneous feedback, and therefore it takes many years to gain experience in software design.
1. Learn from the masters, teach others
Human life is too short. It is impossible to make all the mistakes, draw conclusions and move on. Becoming an apprentice master can avoid possible mistakes and greatly shorten the path. It does not necessarily have to be a mentor, there can be highly qualified colleagues who will tell you at a code review that it is better to write one way and not another.
I have often noticed that good programmers are able to explain complex things in simple language. And it is impossible to understand what is the cause and what is the effect. Perhaps this works both ways: the ability to express oneself clearly is a big bonus for development. On the other hand, with the ability to program well, the skill to speak clearly and understandably grows involuntarily.
It makes sense to become a mentor for those who know less than you. By becoming a mentor you can develop the necessary skills for effective communication, as well as learn new things, because newcomers often ask unexpected questions. If someone helped you a lot at the beginning of your journey, help others as well, let this “merry-go-round” of mutual help keep on spinning: everyone will benefit from this. You are not raising competitors, but colleagues with whom it will be a pleasure to work.
2. hard work VS talent
Many companies use the word “talent” when searching for a specialist. Translated into less fancy language, it means the company is looking for someone who will do their job flawlessly. Interestingly, recent research on the subject suggests that talent as such does not exist. Also, many more studies have been published claiming that there is no genetically assigned “talent” than claiming the opposite.
“Talent” always comes with intense and deliberate work. For chess players, there is the so-called 10-year rule. Its essence is that no chess player managed to achieve significant success earlier than 10 years of conscious training. In the case of programming, this rule does not work so explicitly, but it’s hard to argue that programmers with more experience tend to write better code than programmers with less experience.
We can assume that outstanding developers simply have a higher IQ than average developers. Some correlation may indeed exist, but it’s not all that clear-cut. For a number of occupations, research has been done on whether a high IQ means an employee will perform better than others. According to observations, a high IQ indicates with some accuracy how a person will handle unfamiliar tasks. In the case when a person has been doing their job for several years, no correlation between IQ and quality of work has been found (3) (from the author: for some reason it seems that with a very large difference, for example between 80 and 140 there will still be a difference).
A study entitled “The Role of Conscious Practice in Ensuring Brilliant Results” by Anders Ericsson describes an experiment where music students were divided into three groups according to their level of violin playing: talents, middlings, and laggards. It was interesting that in all three groups the number of violin lessons per day at the time of the study was about the same. However, the “talented” violinists, besides the fact that they had more accumulated experience due to regular classes in the past, practiced with maximum concentration. If in the group of the best violinists the study was perceived as a high-intensive work, where it was necessary to give their best, in the group of weaker violinists the attitude to the lessons was much more frivolous, although everyone knew how important the lessons were.
3. Time is the best medicine
It would seem that enough to work for 10 – 15 years, and sooner or later you will become an outstanding master of his craft. However, this does not always happen. Sometimes it can be very difficult to distinguish one person who has 5 years of experience from another person who has 15 years of experience. We can assume that this happens because in the field of IT everything changes too fast and the knowledge you get 10 years ago is not up-to-date. But this happens not only in IT. In some spheres, years of experience play a cruel joke. It is a well-known fact that experienced doctors are less likely to give a correct diagnosis for a rare disease than yesterday’s medical students. Experienced specialists become hostage to their experience; they are accustomed to the fact that patients most often have a specific disease for certain symptoms, and are unlikely to suggest something exotic. The situation is similar for programmers who are stuck in outdated technology and have completely lost touch with the modern industry.
Constantly working in a comfort zone does more harm than good. Noel Tichy, a professor at the University of Michigan Business School, argues that there are three zones: the comfort zone, the learning zone and the panic zone. Progress is only present when working in the learning zone. In the comfort zone there is degradation of skills. In the panic zone, work is possible, but it causes rapid burnout, and a long stay in this zone is impossible. Specialist development is a marathon, not a sprint, so it is better to work in the learning zone, where there are simple things that are already familiar, but there are also qualitatively new tasks that will make you learn something.
The main difficulty is that these zones are constantly changing, and it is easy to miss the moment when what used to be in the learning zone is now in the comfort zone. Constant reflection on this topic is required in order to correctly identify the zone of learning.
4. deliberate practice
Conscious practice is the process of thinking each time about how you can improve the quality of your work. With deliberate practice, you need to continually and gradually increase the difficulty of the tasks you perform. As a rule, good experts give their best in solving even the simplest tasks in order to make the already familiar work even a little bit better. Returning to the conditional comparison of technical skills of programmers with 5 and 15 years of experience, it is safe to say that the difference would be significant if each of them consciously developed, learned, and not stayed long in the comfort zone.
Does this mean that we should forget about the rest of life, family, friends, hobbies and leave only work and study? Not at all. Conscious practice is only possible for a limited amount of time until one loses concentration due to fatigue. Probably everyone has noticed that concentrated work for four hours is much more effective than eight hours with distractions for everything unnecessary. With plenty of sleep and rest, concentration the next day will probably be as high as it is today.
Some professionals, when given a task, can’t concentrate for several days, and then at the last minute before the deadline, they take on the work and bring in the first result they get. Good specialists, on the other hand, work every day with about the same focus, without jerks or panic attacks. Such work is predictable, of high quality, and more likely to lead to the expected result.
It just so happens that we spend most of our time at work. And it is important that those with whom we interact at work are professionals, enthusiastic about their work. It’s important that management is also interested in your development.
To practice consciously, you need adequate deadlines for tasks, as well as qualified colleagues with whom you can discuss this or that solution. It is difficult to develop when tasks come one after another in a continuous flow, and each of them should have been done yesterday. Because of the sheer number of tasks with minimal deadlines, there’s no way to do each one well, let alone perfectly.
In one of my past jobs, there was a team where it was accepted to solve problems as quickly as possible. And it was presented under the guise that intensive solution of many different tasks would accelerate our development. At the time it seemed true to me, and this pace will allow you to quickly gain significant experience. This works for the time being. However, some time of such practice can lead to falling in love with even something one has adored all one’s conscious life. Specialist development does happen when you consciously solve a quality problem, not when you write a crutch for speed. After all, the goal is not only to fix the bug as quickly as possible, but also to understand why it occurred in the first place, and how to make sure that you and your colleagues don’t make the same mistake again in the near future.
Modern science says that genetics, IQ, and talent are likely to have minimal influence on whether or not a person becomes an outstanding professional. Personally, my opinion is that there may be an aptitude to do a certain kind of work, and this is reflected in whether or not we like to do something like that. But no aptitude is a guarantee that one will achieve excellence in a certain field. There are many examples in history of the more gifted children achieving nothing, and the unremarkable ones growing up and changing the world. So probably everyone has a chance to achieve mastery, but it will take a really huge amount of work, the right environment, and many years of practice.
If you have any interest in exploring this topic further, I would like to recommend reading the books, materials that were used in this article: 1) Jeff Colvin “Talent has nothing to do with it! What really distinguishes outstanding people?”, 2) Robert Green “The Game Master”, 3) Chad Fowler “The Programming Fanatic”, and also watch a great video on Veritasium The 4 things it takes to be an expert.