How an engineer can be competent and incompetent at the same time
You might know them.
They don't like to argue. Their time is only worth spending with those who have already proven themselves worthy. When they do argue, though, they use personal experience instead of the reason. The only people who understand, are the ones in their inner circle that share similar experiences.
They blame the company because of the recruiting strategy that lead to hiring incompetent engineers, and also lay blame for the incompetent engineers that are still with the company. They believe that legacy code would not exist if people were competent, or if the company had invested early on using their suggested new framework or library that promises to solve all the problems.
They don't like to teach. They are tired of it. They are tired of explaining things and not having them being applied to their desired standard.
They are tired of pairing. They believe programming is easy (because of their Curse of Knowledge) and therefore everybody has the obligation to know every best practice, design pattern and test strategies out there alone. Everybody should simply learn to code the right way. Those who fail to do so are stupid and unworthy of attention or respect.
They get angry towards those who don't understand. They believe they are right first, but accept they could be wrong only if somebody provides an objective empirical argument that contradicts their claim, even if their initial claim is not composed of an objective empirical argument. If there is no strong argument to contradict their claim, their claim is always right.
They get angry toward those beginners who think they know everything. They shout and curse instead of objectively pointing out that nobody knows everything and explain why the beginner can be wrong and what they can do to help to get it right.
The Angry Programmer is an individual that spends their time in being angry about things that are wrong instead of working efficiently to make things right.
There's this funny test called Myers–Briggs Type Indicator (MBTI). The results of the test are comprised of 16 personalities that attempt to indicate psychological preferences in how people perceive the world and make decisions.
The test is very weak and is considered pseudo-science. Trying to generalize the complexity of the human behavior in a small set of personalities is not an easy task and definitely, requires greater scrutiny before being considered as truth. For the purpose of this article, though, I am not going to consider MBTI as truth, just as a mental model of a hypothetical set of described personalities and how they might relate to the characteristics of the Angry Programmer.
There is a study that the University of Western Ontario did in 2002. The study aimed to identify which personalities are more prevalent in the software engineering industry using MBTI as a baseline. The ISTJ and ESTJ personalities seem to make up the largest percentage in the industry, while the introverts INTJ and INTP seem to be more represented in software engineering than the general population (7% and 8% respectively).
I have seen a lot of anecdotal evidence from several independent individuals that demonstrate a certain personality pattern for the best engineers in the software development industry. If MBTI was right, they would fit them inside "The Analysts" spectrum (*nt*), and would be composed of:
Rules, limitations, and traditions are anathemas to the INTJ personality type — everything should be open to questioning and reevaluation, and if they see a way, INTJs will often act unilaterally to enact their technically superior, sometimes insensitive, and almost always unorthodox methods and ideas.
INTPs are known for their brilliant theories and unrelenting logic — in fact, they are considered the most logically precise of all the personality types.
The underlying thought running through the ENTJ mind might be something like “I don’t care if you call me an insensitive b*****d, as long as I remain an efficient b*****d”.
An odd juxtaposition arises with ENTPs, as they are uncompromisingly honest, but will argue tirelessly for something they don’t actually believe in, stepping into another’s shoes to argue a truth from another perspective.
My theory is that The Angry Programmer would be more likely to sit in one of the judging personalities for the best software engineers (maybe INTJ and ENTJ), but theoretically, nothing would stop them from emerging from any other judging personality. The Angry Programmer is basically a set of behavioral attributes with strong judgmental characteristics.
The Angry Programmer represents a specific set of attributes that form a unique personality. And it can change.
Anyone can change their personality, consciously or unconsciously, including the Angry Programmer, and there is a reason why being able to change is important. When the programmer is angry, they don't have the opportunity to step back and make a clear judgment to find the better answer. This means the Angry Programmer may come up with bad proposals for a problem, even if the answer is correct! If the answer is incorrect, there is the chance that they will think they are right, even when they are wrong.
If a professional is not able to effectively and efficiently fix a problem or communicate a solution, even when there are external blockers, they wear the burden of creating strategies aimed to remove those blockers.
If the Angry Programmer cannot fix a problem because of somebody else's incompetence, then they are incompetent for failing to provide a solution.
Another interesting effect is that if the Angry Programmer always agrees with those in their own circle and rejects the ones outside their circle (unless they have proved themselves), then they will never really meet another person that in their perspective is an "Angry Programmer". The ones like them will be able to communicate with each other clearly while excluding those who are skeptical but still interested in standing on their shoulders.
It is unlikely the Angry Programmer will bring long-term value to the project or team they are inserted in, but acknowledging their existence is the first step to find them and come up with strategies to help so that they can be less angry and more useful.
Acknowledging the existence of the Angry Programmer is the first step to help them to be less angry and more useful.
The Angry Programmer can exist anywhere (even outside programming) but some things are common between them and it might be related to the individual personality.
If you are not able to acknowledge the existence of the Angry Programmer or have never met one yet, then maybe (just maybe) it could be that you have been one this whole time without knowing it.
In the end, all of us have a little bit of the Angry Programmer inside. We are always working with people and companies that do things wrong, and that sometimes makes us angry.
What really matters, though, is being self-aware in how we handle it and come up with smart actions to fix what is wrong instead of being angry about it.
Being angry won't change anything.
Are you in Sydney? You can find me on the Software Crafters meetup every end of the month.
Edit January 16, 2019: Naomi Most points out, in an insightful response, about some misconceptions I might have had when writing this post in regards to the personality types from MBTI. It's not the first time this happens, and I have written a post about how relying on abstractions can cause problems and misunderstanding.