14 March 2018

As developers, we pride ourselves on being the Spocks of our companies. We’re supposed to be cool and stoic in the face of even the most difficult problems. When we are faced with slow websites, we measure before we optimize. When we are given impossible dates, we deliver what is essential rather than what is perfect. When Product Managers come to us with a flashy new idea, we ask for the data to justify the cost of building said idea. These are all things to be proud of, but it’s exactly our belief that we are completely rational that blinds us. Even developers can be utterly irrational with bias, self control, and economics in our decision making. The title of my post is a parody off of Dan Ariely’s "Predictably Irrational" that explores the causes of irrational decisions in everyday life. My hope for you as the reader is to be able to identify these situations and make sounder decisions. Hoping to make a bit of a series out of this so enjoy!

Not Imagined Here

Many of us have heard of "Not Invented Here" syndrome, the practice of rewriting code that exists in Open Source or other intra-company teams. This behavior is driven by the assumption that because "I" wrote it then it is superior to code written by others. Not Imagined Here is roughly the same but is rather our resistance to the idea we don’t think of ourselves. We are often more critical of ideas that didn’t emerge from our own minds and we often take pleasure in proving someone else’s idea wrong. Critical discussion of an idea is almost always a good thing. Where it goes bad is when it becomes more about "winning" than actually assessing the strengths and weaknesses of the matter at hand.

Consider a new idea a co-worker is pitching to you, you suddenly feel a sudden urge to stop them mid-sentence. In a split-second you’ve made a decision about the merit of an idea. But that’s ok let my reasoning is sound, I can justify every bit of it to you. What just happend here? Do we all posess super human developer reasoning skills? Unfortunately we do not. In the book "Thinking, Fast and Slow" Daniel Kahneman breaks out the decision making processes into 2 Systems. System 1 is our instinctive reflexive system where the vast majority of our decisions are made. System 1 is tuned for speed and survival (No GC here!). System 2 on the other hand is home to our reflective and analytical processes. Most of our conscious and rational thought occurs here. Unlike System 1, System 2 requires some effort and the occasional Ctrl-C to prevent mental stackoverflow. This makes System 2 impractical for every decision but System 2 is really good at justifying decisions made by System 1. Now with that understanding back to that idea our co-worker is presenting to us. That urge to stop their idea mid-sentence and tell them it’s a waste of time…​ System 1. However our defense of our conclusion drawn from System 1 is often vigorously defended by System 2 because we’ll we can’t appear to reject an idea on a whim. Spock would never do that! So our arguments against the idea are often very reflective and thought out. But here’s the kicker, you’re defending a gut reaction to something you may not fully understand. This frequently leads to sub-optimal decision making within teams as well a reciprocal resistance to your ideas.

So how do we counteract our own mental processes? I think the first step is to start with goal of understanding the other person’s position before trying to place judgment. This can be difficult because we need to at least for a few minutes accept that the other person’s idea may be true/correct. Restating the idea in your own words can often be a great starting point to the conversation. Ask some questions around parts that are not clear. Next, admit the potential benefits to the other person’s idea then start identifying the assumptions that are required for the benefits to be realized. This allows you to identify potential challenges to the idea without being critical of the idea itself. It also allows you to realize that the idea may in fact be a good one if those circumstances are probable.

Now what about when it’s your idea and you feel you’re getting unfair resistance? You can play the same game with your ideas. Identify your own assumptions and see if you can find some common ground with the other person. If the assumptions are different and there is no common ground, it may become obvious that both parties may not be addressing the same problem. It’s very hard to accept a conclusion when you don’t agree on the premises. You may also find that you’ve made a bad assumption in your thought process. If none of this works you might be getting trolled. Lets face it some folks just like to argue and prove folks wrong to make themselves feel bigger (I can’t stand these people!). In cases like these there’s little value in continuing the conversation. Your time is best used influencing others in the organization. And if you’re convinced you’re right, just write the code! It never ceases to amaze me how often working code helps move ideas forward.