The three metamorphoses
Three metamorphoses of the programmer do I designate to you: how the programmer becomes a junior, the junior a mid, and the mid at last a senior. These three stages are given in the IT world. However, when analysed closely, there is no consensus on what those stages are and how they differ from one another. In many cases, the progress is based on the years of experience with any given technology according to a belief that the longer you work with something, the better you get at it. Another place may take different certificates into account when assigning titles. Sometimes it depends on the type of tasks and projects that you have in your day to day work. All in all, each company probably has its own understanding of the programmer’s progress but the matter is not without its own depth.
Truth be told, most of us don’t think much about the title in our everyday work. We usually focus our attention on it when we search for a new job or try to negotiate a better contract in the current one. However, downgrading the meaning of those stages to merely a negotiation argument is a big mistake. It can offer us a roadmap for our career development and keep us on the right track.
There are articles on the internet discussing what features a code of most experienced programmers poses. They are surely very helpful but they focus only on the final result of the work. They describe the type of code that a senior programmer writes. You can see how you compare to those standards and possibly show you the way for your coding skills development. However, this is only a part of the picture, extremely important, nevertheless, the career development should not only improve your coding skills but also the reasons and mindset of working.
The threefold scheme of the development can be found even in Greek philosophers. Aristotle divides all living creatures based on what they were able to do. Therefore the simplest beings have only a nutritive soul, that is all they can do is to eat and reproduce. Animals as more complex have a sensible soul, which means they can interact with the world with their senses. Finally, human beings are capable of rational thoughts so they additionally have a rational soul. Similarly, Plato describes the same three elements but he limits his analysis to the human mind alone. Both studies show two important features of this scheme. The first one is that the difference between stages is a qualitative one and not only quantitative. Therefore the higher stages add a new type of element that does not emerge from a simple addition of the previous one. The second is that the higher the stage the more complex it is. This is also the reason for the ordering of the stages.
Is there anything in those analyses that can shed some light on the programmer development? The latter aspect of the above-mentioned philosophers’ studies shows some similarities with coding as with time we usually get to work on more complex projects and issues. The former characteristic, however, is not easily transferable to the IT world. With the experience we produce a higher quality code but this differs greatly from the qualitative distinction in Aristotle and Plato thinking. The stages of career development are not separate entities but places on the single person’s path. Therefore, we might find more clues from reading theories dealing with a single person’s development. In the history of philosophy, there were two such theories that can be particularly helpful in this matter. The first one was written but the Socrates of the north, that is Søren Kierkegaard, the second one was given by the greatest nihilist of the XIX century, Friedrich Nietzsche.
Kierkegaard describes three stages of life and calls them an aesthetic, ethical, and religious respectively. The first stage is associated with the immersion in the sensuous experience. The whole world of an aesthete is focused on searching for pleasure. At the same time, such a life is very fragile and unstable. Any relationship that is formed cannot last too long. An aesthetic person prefers new experiences and new possibilities over any long-lasting relation.
The above characteristic resembles a common beginning of a programmer. When faced with the rich and vast IT world we often jump from one technology to the next. Every month or even a week starts with a tutorial of a recently popular framework or a library. Our first projects usually start easily but they rarely have a successful conclusion. This approach, however, has its merits. Without much experience it is valuable to try different options. This way we can find which parts we are good at and which interests us the most. Nevertheless, we need to be careful not to fall into the trap of chasing every new shiny thing.
The aesthetic stage, according to Kierkegaard, leads to disappointment and a feeling of futility of life. For a junior programmer this may appear as a willingness to change jobs as soon as there are no projects in the hottest technologies. Checking and testing new things is useful when we are learning either in school or by ourselves. Day to day work, however, rarely allows for such a frequent change of technologies. Going to a new company will help to join an interesting new project but soon, we will get bored with it as well. This, inevitably, ends in a vicious cycle of chasing the next big thing.
The main deficiency of the aesthetic life is freedom. Acting without any direction is frivolous. Kierkegaard is of the opinion that freedom in its core is not an ability to do anything that comes to our mind, an ability to satisfy every need we may have but it is an act of choice where a subject chooses themselves as the one who decides about their life. Such a decision puts any spur-of-the-moment action to a halt and thus breaks the never-ending chase for a new experience. This is an ethical stage and it is associated with the universal and shared by the community. It does not mean to subject oneself to the morality of society, far from it. The choosing is a conscious decision of acknowledging the rules and norms that express general ideas.
We can see a similar transition on a programmer’s career paths while they gain more and more experience. With maturity comes a decision in which direction they want to progress. All the new and shiny technologies are not so appealing and they do not cause yearning for a project which uses it. At this point one must still be aware of the developments in the field but now there is a realisation that not all things need to be tried out immediately or even at all. The chase after new technologies gives way to focus on improving general skills which are more instrumental in picking up and familiarizing yourself with any technology that will be needed in the future.
This is also the stage where a programmer begins to understand good practices and standards of coding. They are not viewed as limiting rules but as tools which help both writing and, more importantly, reading the code. Similarly to Kierkegaard analysis, conforming to those procedures is not simply submission to them but the acceptance of the ideas they express. Mature programmers do not hide from their mistakes. They understand their strengths and shortcomings and can take responsibility for them. They realise that any errors are just errors, bugs that need and can be fixed.
The last stage in Kierkegaard’s analysis is the religious one. It is characterized by an absurd, a complete negation of the reason and total reliance on faith. The Danish philosopher calls it a jump into the faith and it happens when general rules clash with an individual situation. According to him, no general rule can cover all possibilities fully. There is always a person in every act and they need to be taken into consideration. Kierkegaard illustrates this with the example of Abraham who was asked by God to sacrifice his only son. Such a request is beyond any common laws but Abraham has faith that God will somehow save his son. Thanks to that faith he is relieved of his request at the last moment.
Due to the fact that this stage is inherently related to God as He is understood by Christianity, there is no much analogy in the career of a programmer. Having said that, we can notice one aspect that may appear when you get to the senior level. At the medium level when you have embraced the rules and found yourself in a steady place there is a temptation to strictly follow all guidelines with a belief that such a way will yield the best results. Any departure from those paths is viewed as a mistake. Omitting documentation writing, skipping some tests or hard-coding part of the logic is nothing more than a sign of short-sighted approach in business. In most cases this is indeed the fact. However, a senior programmer frequently has to deal with tasks which are completely new and don’t have an approved way of resolving them. It may be a design of a new system in the project, an ephemeral bug or a new business idea that has never been created in the field. Those tasks may fall outside the scope of good practice guidelines and a programmer finds themself in uncharted territory. In those tasks, they need to gather all their knowledge and experience from previous projects, their understanding of underlying ideas behind standards and try to come up with a solution that can work within strict boundaries. Those limits may vary. Sometimes it is a limitation of a technology that the project uses, sometimes they are purely caused by budget. In all those cases it is their responsibility to provide a working solution that will make the job successful. This code does not have to be written strictly according to standards, it may use some shortcuts here and there. The most important thing is to accomplish the goal. They must trust their skills and their experience as such a case has never been considered before. All in all, a senior programmer must develop trust in his own abilities.
The first discourse in Thus spoke Zarathustra concerns the three metamorphoses of a spirit which shows how it is evolving to become truly free. The first metamorphose is a camel. It is a pack animal and it symbolises tradition which a human takes on his shoulders and needs to bear. The second metamorphose is a transition from a camel to a lion. This stage marks the moment when the human spirit breaks the shackles of tradition by the wildness of a lion. The last metamorphose is a transformation into a child. A child in Nietzsche’s works denotes innocence and a new beginning. It is a creator not burdened by any past guilt.
At first glance, Nietzsche’s evolution may look like a reversal of the one proposed by Kierkegaard. The camel resembles an ethical stage in which Man subjugates himself into general norms and ethics whereas the lion mirrors an aesthetics stadium of life in which Man wants only sensuous pleasures. This is true to some extent, for sure. However, both schemes share similarities when examined more closely. In both cases, the first stage is the one when we define ourselves by external sources. In Nietzsche’s case, this is by complete servitude to tradition.
This trait does not invalidate previously sketched character of a junior programmer but it complements it. The sheer amount of information makes the constant pursuit for the new technology often feel like a necessity. Constantly repeated slogans that you cannot stop learning and the rapidly changing technology landscape make the newcomers feel overwhelmed. Every year brings new articles about 5 or 10 new things to master that year. Struggling to cope with such a pressure they switch between languages and frameworks, trying to test and learn everything, deeply convinced that all good programmers know all of them by heart. This leads to a belief that they need to take up this burden and make several projects in every relevant technology that they can put into their portfolio.
Similarly to Kierkegaard’s analysis, freedom is in the core of the transition from a camel to a lion in the second metamorphose. According to Zarathustra teachings, a lion has a more egoistic character. Its freedom is a negative one, the one where it fights against tradition imposed on it without any consideration of its desires. The lion reckons with this tradition. For a junior programmer, this is the moment when they start to realise that it is impossible to meet all the expectations. At this moment they start to think about what they truly want. Kierkegaard showed us that a mid programmer focuses on a direction in which their career needs to move. Nietzsche teaches us that this stage may be caused by a negative attitude towards our past experiences. Nietzsche’s lion is not completely free because its entire will is based on the reckoning of what the world is giving it. In the end, this is the most important task for the mid programmer as well, they need to reconsider the IT field and find their own place in it.
The complete process ends only when a programmer evolves into a child. A child is a renouncement and a new beginning. This is the only stage in Nietzsche’s scheme that has the ability to create something new. The camel only took anything that the world needed him to bear, the lion only defied all those impositions and it couldn’t move past breaking the limitations. It is only a child who can create something truly unique. A lesson we are taught here is that a senior programmer should approach their work like a child, without any guilt toward their past mishaps, toward anything that they are supposed to do. This is evident mostly in those tasks which don’t have any strictly defined solutions. This is the place where the child-like nature of a senior programmer may fully reveal itself.
To sum up, there is a common theme we can infer from both analyses. At first, when we are inexperienced, we often rely on the external world to give us guidance. This has two consequences. Firstly, we tend to unconsciously accept everything we find and, secondly, because of it we are willing to switch to something different as soon as we hear it may give us better results. With the experience comes the realisation that we must choose the domain to work in and those expectations to know everything and always be au courant is not realistic and frankly speaking not always worthwhile. With projects and practice, we learn how to oppose what we are told we should do and we start to decide about our career by ourselves. The peak of the journey is with the moment when we have enough self-confidence that we willingly want to take on the hardest tasks requiring all our knowledge and allowing us to fully use our creativity. A career path of a programmer is not a path of skills but of Man who needs to grow and progress in all aspects, not only the technical ones.