One quality that programmers seem to share with the Borg is their quest for perfection. This phenomenon has a long history and knows many forms. It gets hold of many programmers and consumes their souls leaving a permanent mark on their existence and the way of thinking. It might seem unimportant, hardly worth mentioning, but it is in fact one dangerous beast that comes silently under the cover of the night, unseen and unexpected and it takes away the brightest yet the most fragile of the kind. The others discover this transformation when the next morning they look into the eyes of the one spirited away and see an empty look, a fractured, incomplete spirit, just a shadow of his former self. At this moment they realize the great loss, but powerless to help they keep to themselves and return to their everyday existence hoping it was all a dream which will never come true. They get on with their lives having consoled their mind the beast would not lay his eye on them. The weak illusion helps to restore the serenity of mind…
Until the night falls.
And whence does this predilection come, what minds does it absorb and what forms does it take? Let us venture into the realm of the spiritual…
Until rather recently I was not aware of the wide spread of this problem. Lately I have been observing an ever increasing flow of discussions on this subject and the cries for help from people suffering from that technological form of perfectionism. It would seem that not only the number of those fallen victims to this mind invasion is increasing but the severity of the cases is also growing taking it up to the level of obsession. It is crucial to recognize this development in oneself and watch its movement to find the means to constrain it then to control it and possibly combat it. In order to do this we need to investigate the origin of this drive to perfection.
At a very basic level, programming is about controlling the machine. One learns to write programs that dictate what processes and activities will take place in hardware. Most programmers enjoy just that – their hand having the power to wheel, to define, to structure, to govern. That's where it begins, the drive to govern the entirety of things, from the lowest components up to the larger modules.
And you know what helps? The fact that a programmer can indeed control the machine at all levels. We will use a high-level programming language with a rich framework to quickly implement a complex behavior. Then we can customize certain components of the framework to adjust it to our specific needs. Finally we go down to the machine level to redefine what happens to the bits in the most primitive of operations. And it works.
It provides for a wonderful sensation of success. Then comes the realization of one's powers, which are exercised and tried and sharpened. Then one day it arrives, certain inner urge not only to control everything but to step up and add a perfect structure, balance, beauty and harmony to the raw functionality. And it seems to work for the most part. Yet not for all of it. Something is always missing and when it is discovered it diminishes the entire work which has to be redone again in order to account for the last missing element. Or so it seems. For the last element turns out to be just the one before the last. And that last one again betrays us by refusing to be the final one. And here it goes, a quest to finish a masterpiece of perfection, to adjust one then the other part, to account for the last element of the puzzle, then to correct something else, then quickly redesign the entire system to streamline the latest changes and then…
It begins again. Something else to adjust, to change, to fix, to redesign, in an endless loop of iterations, going in circles but never approaching that ultimate point of perfection when all words are said, the last page is written and the book is closed.
It just never arrives.
And it hits hard the feeble body and mind taking it upon himself to create perfection with his imperfect hands.
This quest for perfection has multiple levels of consciousness. The lower ones are present in many programmers and it is actually a good thing for it pushes them away from chaos and disorder. The upper levels swallow programmers with a vast experience of searching for the Holy Grail. Those levels are purely destructive, they bring unhappiness and disrupt productivity. It takes time to unlearn that false purpose in life which has defined one's existence and the mental model for so long. Then and only then can one descend to the lower levels where there is life again and the place for joy.
Invitation
It all begins very early, when a young fellow is just beginning to experiment and uncover his programming potential. This is a period of learning, wonderful discoveries and excitement about a myriad of things. One gets fascinated about an idea, a concept, a data structure or an algorithm and flings himself into this field. One spends days and nights programming, experimenting, composing a kaleidoscope of bits and pieces trying to create a small wonder. This is a great time yet it is a chaotic time, when one doesn't know yet his powers, doesn't understand the structure and order and doesn't have an eye for the big picture. One however learns that potential power embodied in his fingers waiting to leave the constraints of the body and mind.
Spiritual search
And that time arrives with a bit of knowledge and practice. One gets skilled enough to accomplish useful programs, when one has mastered the secrets of the binary system and the dark labyrinths of data structures and algorithms. One understands the scope of the object-oriented programming, the use of the code constructs, the relationships between the components and the place and time for the tools in one's hands. With that labor skills mastered, one slowly begins to look at the whole with different eyes and understand the need for structure and order.
He attempts to introduce style into his code, to experiment with various approaches. The naming of elements, their grouping, their interfaces, their composition, it all starts to matter now. He asks questions, he looks at the work of those he deems inspired, he imitates the work of the masters feeling unconscious need to communicate with the higher power, to touch the destiny. At this stage one knows individual magic words but fails to invoke the electron incantation. The young padawan understands his shortcomings and seeks out for guidance.
The Origin
And having been noticed by the spirits he receives that help. He learns the Origin.
Experienced adepts around him introduce him to the best practices of the industry. Everything that concerns the use of data structures and algorithms, the code composition, separation of concerns and the layered architecture. He learns the cornerstone of belief which is the design patterns. He learns about elegance, simplicity, performance and maintainability. He sees a firm foundation for his spiritual search. And he embraces it with an open heart and a naïve soul. It is the time when his spiritual development receives a strong impact and his belief starts to change him by leaps and bounds. It is also the event which predetermines his future fall from just the plane he is not supposed to reach.
Practice
With that new knowledge to bring sense into his life and to give him that deceptive understanding of the universe he begins to actively practice his religion of structure and order. He throws himself vehemently into all religious practices such as the universal modeling language, test-driven development, code reviews and refactoring all of them swirled into a spectacular dance at the rhythm of scrum sprints. The practicing changes his life, his mentality, it reinforces his belief in his powers and in his capability to control the endless universe. He now brings significant structure, logic and order into his code. More so, this order gradually takes over the initial programming goal and the task at hand does not serve any more to help that structure and order to find embodiment in code. The cause-effect chain has been reversed. Somehow magically, this religion does indeed help to master the challenge faced earlier at the complexities of application requirements and programming problems. He enjoys that airy sensation of flying above the frightening land of algorithms breeding flocks of data structures. This order has completely filled his low and until now insentient life. He is thankful to the higher force which now leads and supports his existence. Naturally he wants to give back to those great powers that be. He starts to spread the word.
Preaching
So he helps younger wandering souls to discover and embrace the Origin. He is preaching with dedication, passionately, almost vehemently putting his personal life into background. He spends hours, days and nights online arguing about the slightest variations of interpretation of the Origin and its fundamental beliefs, refusing to pull himself away from the computer until he has persuaded the last astray unbeliever of his endless fault, until there are no more of those who are wrong on the Internet. He preaches to his colleagues, even taking personal time to refactor good working code in an attempt to introduce the universal order into it and sign it with the ink of inspiration. He begins to manifest the signs of the obsessive refactoring disorder. The borders of night and day dissipate and the biorhythms disrupt resulting in serious psychological and physical injuries to the feeble body that is a vessel for the enlightened soul. Social relationships begin to disintegrate but he doesn't notice his losses in the mundane world.
At that stage of his spiritual development all perspective of the original goal to which programming was merely a tool is entirely lost. There is no more limited attainable objective in view, schedule and deadlines have become meaningless. Only the higher order and the structure of code make sense to the one who has touched the destiny.
But what good is a prior who doesn't seek a higher inspiration, who doesn't want to become closer to the great powers of the universe, who doesn't want to ascend to a higher plane of existence and understanding?
And he begins to study the holy books looking for nuances, buried secrets and hidden messages. He sees misinterpretations. With his highly developed mind he writes his own interpretations. Naturally, he practices more than even to uncover the higher laws of the binary system, the magic of composition and the inclination of bytes. He redesigns his programs to reflect his better understanding of the wisdom of the universe. For this understanding improves with each rewrite, a next round of refactoring begins immediately to engrave in code that new vision of the universe which is all encompassing, which is unending, which is eternal and which is all-wise. The names of variables and methods now must be nothing less but a reflection of the thousand and one names of the cosmos. The interconnection of modules now has to exactly correspond to the composition of the strings channeling the universal energy. The structure of the programs now must do no less than unveil the larger purpose of the universe while their interfaces must be the signs pointing at the long roads in the continuum.
But he the priest has not yet understood that the endless universe will not fit in the limited scope of his program, just as the cosmos laws will not fit into his lower mind.
Failed ascension
In that unending quest to obtain a piece of that perfection and mirror it in one's own creation, composed with imperfect hands, written with a broken pen on a paper which is flawed, he completely loses himself. One last time he brings together all his physical and mental forces to learn everything there is to learn, to see everything there is to see and understand what is there to understand and attempts to cross the threshold of consciousness and rise to a higher plane of existence where his mind will embrace the universal knowledge and finally solve the puzzle of the perfect code.
And he burns his wings and fails. And he gets trapped between the planes, without having reached the ascended state and unable to return to the lower plane of the mundane programming.
The lower beings recognize the horror of his situation by the dark cloud which has veiled his eyes. He seems to have lost his vital energy, unable to continue and produce good working code. Nothing motivates him any longer. New tools, languages, frameworks, concepts and ideas, all that now only causes tiredness and aggravates his depression. Food and drinks are not consumed but that doesn't seem to affect the one who almost shed his physical body but got trapped between the planes. Nobody knows what can possibly return the life to the one who touched the higher consciousness but wasn't allowed to join the ranks of the ascended.
But the lonely existence between the worlds is not a salvation and he must learn to accept to take a step back and regain his human form and return to the physical world of mundane programming where there are the rays of light and spring and la vita nuova, the new life. No easy path but there are mind techniques which will help him eventually make a first step on the road to recovery.
Accepting mind limits
The first step which is a precondition for returning to life is to understand that one's mind has its limits. What can be understood by an individual mind is limited, a group of elements which can be simultaneously perceived as a whole together with their relationships has its maximum size, the information which can be kept in memory has its upper amount. The complexities of the practical code usually do exceed the mind limitations on all fronts. One strives to control that vast multitude of details which is beyond one's capacity and one eventually loses this battle.
This phenomenon is the old knowledge which is why the civilization has long approached the problem by decomposing a complex structure into smaller components down to the level which can be safely handled by individuals. It has been proven that any attempt to control a very complex structure all alone is a futile exercise for a human. Code and application architecture are no different. Even if it seems to be simplified by being all right here, stored in files close together on a single machine before one's eyes, the intrinsic complexity of what is stored in those files still remains high.
One must learn to let go of those millions of little uncontrollable things, stop trying to bring them all together into a perfect composition and find peace and relief of burden.
Understanding inherent imperfection
To deal with the vast complexity of the structures and relationships, decomposition is an answer. We split the large into the smalls and hand over those components to different people to handle. This is the only approach that works.
But different people have different experiences, skills, opinions and the stage of their spiritual development. Which is why the outcomes of their work and what can be perceived as the quality of their work will vary. But since there are no two minds in the world that think and believe identically, it is not possible to assemble a group of equally capable people. Here is to see how group work will always result in unleveled quality. This is the part which many people know in mind but cannot accept in their heart, so they strive for all eternity to streamline the style, structure and quality with everyone involved. And they inevitably fail.
That is one side of the problem, to understand that even between the people directly involved, the perfection is not to be sought.
Looking deeper, we use ready programming languages, prebuilt frameworks and prepackaged components in our work. These components are not perfect either for they were conceived by imperfect minds and constructed with imperfect hands in groups of differently skilled people. Therefore flaws are to be expected even in the foundation elements of our work. And if we build on flawed components, then our work itself will know blemishes.
One must understand that no matter what, regardless of the time, costs and efforts, whatever comes out of his hands will have limits, flaws, functional and conceptual errors. One will only succeed in his work if one accepts prior to starting that his creation will not be perfect and that he will not be trying to reach that unattainable goal all throughout the process.
Embracing the motion
In practical software development, programs are often developed to meet an objective which is only vaguely defined and is constantly moving and changing. Therefore older parts of the code might be a perfect match for older specifications but usually an imperfect match for the new requirements. Since it is not possible to rewrite all of the older code any time the requirements change, the older code is minimally adjusted to work in the new situation and left as is. This results in inconsistent code style and architecture which takes out the chance of reaching perfection.
On a different tangent, since the objective is changing then the definition of what might be a perfect match for this objective is constantly changing as well. With that understanding one can easily see how perfection can only exist theoretically for a brief moment. Since implementation doesn't happen in an instant but always incurs a delay to match the changed requirements, the perfect match for the current goal is not achievable in practice. And even if it were, its value would be diminished by its brief temporary existence.
One must stop his attempts to hold on to the constant change, forget perfection as an inherently unachievable goal and embrace the continuous movement as a guiding element to help make the code better.
Redefining perfection
If we really think about it, can one understand perfection if one's mind is incapable of understanding the complexity of individual components and their roles and relationships in the big picture? The answer is obvious and that is one more reason for the permanent failure to attain that goal.
But since it seems to be contained in programmers and in humans in general, that strive to achieve perfection in all and everything, one could trick his mind and redefine perfection. Actually, define it initially since the definition of absolute perfection is beyond us. Let us set smaller achievable goals. Let us define what perfection means to us. The well structured and easily maintainable code which can quickly be understood by new people is one option. Application architecture which is easily scalable to meet the growing throughput demand is a second variant. Or perhaps it is resilience to change within the scopes of foreseen for today and tomorrow? Each of us can decide for himself.
By defining our local and a smaller target, one can actually hope to achieve it and by doing so to find satisfaction and the enjoyment of an accomplishment rather than suffer from the constant depression caused by an always failing effort to reach the unreachable.
Recovering priorities
Completely lost his track on the quest for perfection one has indeed forgotten the now abandoned cause of why it all started. And recalling to the first days for a brief moment before it leaves him forever one can actually restore the vague image in memory of the objective one tried to achieve. The initial goal to which programming code was merely a tool. In the mundane world one would speak of business goals, but we'll not challenge the broken mind with the complicated language. We would simply recall a few colorful images that we had associated with our future project.
That original purpose was supposed to finally become the source of our enjoyment. It was meant to bring us the satisfaction of an accomplishment. Not the code itself, not the hidden relationships of programming structures and not the ultimate balance of bytes and bits.
One must open his eyes and understand that even if we have failed that ambitious but unimportant goal of perfection, we do have succeeded in accomplishing our initial objective. And we can find relief and happiness in seeing things have worked out after all.
Enjoying high evolution state
Even if one has failed to reach the enlightened state, one has however transcended all the barriers of possible for most of the mundanes. One has mastered the complexities of code, one has learned to wheel its powers to one's needs and accomplish grand objectives. One has surpassed all levels of programming religion and has risen above the code in an attempt to bring beauty and perfection to it. It is a commendable ambition, but an unrealistic one.
That thought should not bring suffering and unhappiness. One must learn to see the brighter side, to look back at one's spiritual development and see how one has grown and improved his skills and advanced his thinking process to surpass any expectations.
With this note we close our healing and recovery course being convinced the mind of a broken soul has now been restored and found peace and the purpose in life again.
P.S. Even if the author has tried hard to achieve perfection in this writing he has no illusion of having reached even the glimpse of that state. Therefore he kindly asks the readers to be condescending to his humble efforts.