This is an iteration on a 2016 blog post I originally published on Medium.
Engineering is a team effort. Engineers learn from one another, challenge and improve upon each other's decisions, and depend on one another for code reviews. But what do you do when you and a coworker have a technical disagreement, and you just can’t seem to get anywhere?
I like to work with individuals who demonstrate maturity, and the ability to navigate disagreements and resolve them productively signifies maturity to me. Here are some tactics that I like to use to resolve technical disagreements.
- Strive for objectivity. Try to uncouple your ego from the discussion so you don't feel threatened by other people's ideas. Shift the dynamic of the conversation from “me vs. you” to “us vs. a problem”. Try to articulate and agree on your goals. Draw up lists of pros and cons for each solution you're considering and see if this helps you come to an agreement.
- Take time to prepare your case. Discussions are not productive if your grasp of an idea is still fuzzy. Everyone involved should take some time to think through their points of view and be able to clearly explain their line of reasoning.
- Understand the other person’s ideas and points. Make a good-faith effort to see their point of view. Remember, your teammate has the same good intentions that you have. Get curious. Ask as many questions as you need to ask until you understand the other person’s proposal well enough to communicate it back to them. This will let you address each point directly or sometimes come around to the other person's perspective.
- Identify and acknowledge your assumptions, uncertainties, and gut feelings. “I guess what I’m worried about is…” and “I’m not sure I understand why/what/how…” are good ways to begin this line of thought. This will open the door for collaboration and let your team help you address your concerns.
- Say “You can convince me if…” and then list what things the other person needs to prove to make you change your mind. This exercise will help you both be objective, and will also force you to think through and understand what really matters to you.
- Step away for a cool-off period. If discussion gets heated then emotion is probably interfering with your ability to think and communicate clearly. Agree to take a break for a few hours or a day and then try again later. If you feel embarrassed about getting emotional, it can help to acknowledge what happened: "Sorry I got a little worked up back there! You can tell I'm passionate about this, but I don't want to let emotion affect our decisions." Most people can relate.
- Just build it. If discussion doesn’t seem to be getting anywhere, try proving your idea with code. For example, build a prototype, run performance tests, write pseudocode, or ultimately just implement one of your ideas as an experiment and agree to perform a team assessment to decide if it’s a success or failure based on agreed-upon criteria. You can always rewrite it later if it turns out to have been the wrong decision. And wouldn't it be great if the other person's idea turns out to be successful?