While improving as programmers, it is easy to feel that we are perpetually stuck at a beginner phase, not quite making it to the next level. But we should not feel that way because everyone is a beginner whether they admit it or not.
What is the opposite of a beginner programmer, anyway? There is no clear definition of this mysterious ‘expert’ status that all beginners seem to be striving for. Maybe the opposite of a beginner is a person who writes good code. Or, more concretely, it could be someone who has certain years of experience in some technology. But our attempt to define an expert only ends up raising more questions. If someone has years of experiences in a technology, is she an expert in that technology and a novice in others? How many years of experience is required and who decides the threshold? I believe that we are unable to identify the very thing we are chasing because we try to define the expert status purely in terms of knowledge.
In reality, experienced programmers are not smarter than beginners. What sets those experts apart from beginners is their intuition. Through experience, seasoned programmers can train their intuition to do things that their rational thoughts cannot even name. That intuitive system of thoughts come from the same part of the brain we employ to do things such as completing the phrase “bread and …”, or finding a strong move in chess. All in all, the reason experienced programmers are effective is not that they are particularly knowledgeable, but largely because they have an intuition that guides their decision-making process.
In programming, intuition is not a voodoo science but reflects true expertise. Psychologist Daniel Kahneman argues that there are two basic conditions for the intuitive system to be trained for a task:
- an environment that is sufficiently regular to be predictable
- an opportunity to learn these regularities through prolonged practice
I believe that programming satisfies these two conditions quite sufficiently. First of all, programming is an extreme example of a regular and predictable environment. A computer will always perform just as we instruct it to, nothing more or less. In other words, our programs do what we tell them to do. Therefore we can predict their behaviors to a great degree of certainty. To the second point, we definitely can learn these behaviors by writing programs regularly. Remember the first time you learned some programming language. At first, you might have been unsure about how your code will behave as you were writing them. But through prolonged usage, you must have ingrained the language’s preordained behaviors in your brain. At that point in the learning curve, many times you have at least a rough idea of how a program will behave before you even run it.
Expert programmers are just “intuitive beginners” who have put in their time to cultivate sound intuition that truly reflects mastery. They do not possess some superhuman knowledge that beginners are not privy to. And for this reason, I believe that it is unfortunate that some people feel as though they are ‘stuck’ in a beginner stage, and try desperately to lift themselves up to the next level in vain. There is no such thing as being ‘stuck’ in a certain phase of learning because learning is continuous! After all, we are all just beginners with different levels of intuition. Intuitions cannot be taught. It can only be learned through prolonged practice, in an environment that is sufficiently regular to be predictable.
Therefore our definition of programming expertise needs to shift from rational terms to emotional terms. Experts are those that can make sound decisions based not entirely on their knowledge but also on intuition. If we neglect the emotional part of being an expert, only then we might well be perpetually stuck in the beginner ‘phase.’ A journey without a clear destination is bound to take us nowhere. It is in that aimless drift that we find ourselves prisoners of the status quo.
We are all beginners. Memorizing esoteric algorithms or data structures does not magically make us experts. Our journey of learning is continuous and there is no barrier that we have to climb over to proclaim ourselves as non-beginners. All we can do to progress in this continuous journey is to keep building stuff that works to absorb the extremely predictable environment of programming fully in our minds through practice. Shun any advice that claims to teach what it takes to free yourself from the novice status that you are supposedly married to. The premise does not make sense because there is no such thing as a beginner status. We are and forever will be just beginners of different kinds.