Cutting through the illusions of perfect order
Since I got my first job as a developer, I always enjoyed attentively following the intense discussions between other developers. While that definitely helped me form my own opinions, there's actually something way more valuable I got out of it.
It has taught me how big of a factor the self-awareness of each individual team-member is, in relation to the success or failure of a project.
Developers were arguing, stating strong opinions on certain patterns or just the naming of variables. While it was comparably easy to keep an objective, unemotional perspective on things for me as an observer, that was usually not the case for the people directly involved in these discussions.
Usually, both would get quite agitated and even personally insult each other. Sometimes explicitly, other times rather subliminally communicating why "you are not as good of a developer as I am" or that "only a stupid developer would do something like that."
Soon enough I caught similar thoughts surfacing in my own mind. Allowing me to now feel, what I've observed in others many times before. There are many possible reasons for arguments going off the rails. It may just be some bad night's sleep or issues within the family, rendering one's ego more fragile than usual. But in many cases, it would boil down to the simple fact, that people just have a really, really hard time facing criticism, when it's pointing out nasty stuff they've been shoving under the carpet.
I figured I could describe the dynamics involved by splitting the path of a developer's personal development into several stages typically revolving around these kinds of conflicts. There surely are many different expressions to them and one may go through them multiple times, but it may still help to get an idea of how things take place.
You're working on a solution for a long time. A problem arises. You look away and work your way around the problem, trying to protect your (not so) perfect solution. Someone criticizes you for it and you will come up with all the reasons why not to address it. You may find his proposed solution even offending, as yours is great already as it stands. And after all, you just spent many hours figuring out what you implemented.
The Transition of Growing Up
Then, at some point, you will find the courage to honestly consider the possibility, that you would do yourself (and everyone else) a favor if you just admitted to the problem and took proper care of it. There you go now, fully committed to finding the best solution for your problem.
Premature Wise Guy
So now that you grew up and feel like a responsible adult, you find yourself looking down on a world full of ignorant men, unfortunately, most of them not ready to receive your wisdom.
Why though? Isn't it obvious that your truth is the absolute truth?
People are so blind. So you start to preach and make the world a better place - or so you think - while feeling a sense of pride and superiority.
Strange though, isn't it, that most of these attempts seem to make everyone involved feel worse? But hey, at least that variable is now properly named.
In this state of mind, things are going to degenerate particularly fast if you come across some guy in his irresponsible phase as one can imagine.
The Transition of Introspection
Having now experienced quite a few discussions, looking back at them you now realize how your approach was not the be-all and end-all solution either, unlike you desperately hoped for.
You may now acknowledge that there are indeed situations in which the way opposed to the one you vowed for would be the best solution. Figuring out there are pros and cons to any approach. Despite your idea seeming so true and absolute, there is at least that one use case where a different way of doing it, would be more appropriate.
Your job has been so much about creating order and labeling things, that you forgot about the fact that whatever order you've come up with is not more than what it is - an order you have come up with - and therefore should always be considered to be discarded when necessary.
Running into these same patterns over and over again, your awareness for them will inevitably grow along the way.
It will become a lot easier to see through your own inadequacies and struggles as well as others. Your empathy for everyone and everything increases.
And suddenly an argument that would have previously been stressful and unproductive and leaving feelings of resentfulness behind, is now going to take entirely different turns. Turns, in the direction of a considerate, well-meaning attitude with a genuine interest in collaboration.
How could we potentially prevent ourselves from falling into these destructive patterns or at least not get stuck in them for way too long?
Observe your thoughts and feelings. Take any negative emotions during discussions as a mirror, pointing to the dark areas within your mind. And take the courage to look deep into it, and find what's causing it. It may be painful sometimes, but it's the most effective way for any improvement.
Choose your words wisely
Note for example the difference between "You are wrong" and "The downsides I see in your proposed approach are those and if we did it the other way, this could be a major benefit, what do you think?". Always try to frame your sentences constructively. We're not here to conquer anyone, we're here to build amazing things together!
Love and show some compassion
It's needed in software engineering just as much as anywhere else. Maybe even more so than in many places, considering the widely spread imposter syndrome among developers.
Going down the rabbit hole to find the origins of feelings of hatred, you usually won't find anything but your own flaws. So, why not give yourself a little break.
The code we write, should be based on a synergistic exchange of ideas for the betterment of everything and everyone.
I would love to hear your experiences on this!
And feel welcome to share any feedback and suggestions, thanks :)