Post

The Single Game Fallacy

The Single Game Fallacy

Incentives are everything

Human beings are social animals that are inherently self interested. If you disagree, you’re just wrong. For all its faults, there’s a reason capitalism has become dominant across the globe. It more than any other system we’ve conjured thus far leverages these ideas. That we are capable of and desire to collaborate, but only insofar as it improves our own lives in the long run.

In any social system cheats will emerge. If altruism is the norm, it pays to cheat. You can reap the rewards of collaboration without paying the costs. This is why there aren’t “true” altruists. Altruistic behavior has the baked in assumption that it is advantageous in aggregate over a long time horizon1. I dislike framing it this way though. That doesn’t mean we can’t be altruistic, it just means we aren’t naive saps about it.

Well, we mostly aren’t. There is great diversity the strategies for how people approach collaboration and cheating. Being evolved beings we have an intuitive sense of fairness that is then heavily influenced by culture. I would like to influence that culture, and I think the best way to do so is to take an analytical approach with a simple heuristic for deciding what to do.

The Call is Coming from Inside the House

Unless you work at a truly small company, there are bad actors among your peers. I like to put it this way, let’s assume for a moment your hiring process is 99% effective at screening out unrepentant shit head. It’s not, but let’s pretend. If you work at a corporation with 100,000 employees, well then at least 1000 of them are a major problem. It might be tempting to say but they get found out, but we all know that isn’t the case. They game the system and if anything tend to be more resilient and harder to fire.

Unless everyone is vigilant and creating an environment where cheats aren’t rewarded, they’re going to exist and prosper. Like all problems of human coordination, we can’t wish upon a star that people are better than they are and always do the right things. So what’s the optimal strategy?

Borrowing from Game Theory

In studies of the evolution of cooperation, a surprising trend emerged. The best performing strategies actually tended to be among the simplest. If we create a simulation where animals can share food, fight for it, or try to share but get thrown away by an unexpected fight one of the best performing strategies is Tit-for-Tat. This strategy starts nice and cooperates, but if the other player defects (cheats), it will respond in kind on the next iteration.

It’s a topic worth reading up more on. There are nuances around forgiveness to account for miscommunications, etc. But the key takeaway for our purposes was that there are two high level classes of interaction:

  • Single games
  • Repeated games

Single games are just that, you encounter the other player once and never again. If you do the math, the best strategy for you here is to cheat. With a repeated game, this isn’t the case. You become known as a cheater, the other player gets to respond, and now there’s no one left for you to exploit. By continuing to cheat you only harm yourself.

Application

When I’m dealing with a patently unreasonable person and I need something from them, I ask myself is this a single game or a repeated game? In other words, if I set the precedent of giving in, how often am I going to bear this cost? If it’s a one time interaction, the cost of fighting them and forcing them to do right by me is likely far greater than the cost of just eating the loss and letting them get away with cheating. If it’s once or twice a year, it’s the same.

The takeaway is clear, while it’s unfair the best option for me is just to shrug it off. Yes, I’ve been harmed. But getting into a “it’s the principle of it dammit!” situation will only serve to further harm me.

Now let’s consider this is a person and situation I’m going to encounter frequently, a repeated game. Precisely the opposite is true. Yes, it would be easier right now to just let it go. Especially if it’s small. But the cumulative cost over time is immense. Far greater than the cost of fighting now and correcting the behavior.

Remember too, just how an honest player can change their strategy once they encounter a cheat in a repeated game, cheats change too. If trying to cheat results in a harsh conflict with no pay off and time wasted, the selfish cheat is incentivized to drop it. Either the behavior has to improve, or (more likely) they go somewhere else to find someone more averse to conflict to cheat off of instead.

Examples

Regrettably, these are all real 🥲

Example 1: Pull Request from a new team member

A new person is suddenly dumped onto your team for unclear reasons. They eventually go to make their first PR, but it has some serious issues. There’s no automated testing at all for the change integrating with an external component. They don’t follow basic practices like naming things well an abstaining from using magic numbers. When feedback is given, they are rude, dismissive, and refuse to make any changes. They argue that they have so much experience which is why they know their way is best. When asked to then use that experience to explain, they take the wonderfully unfalsifiable position that you need to have equal experience to even understand the argument and so you just have to trust them.

This person is a rogue actor among rogue actors. That’s probably why they’ve been dumped on you come to think of it, who wants someone like that on their team? They’re on your team now, and pull requests are one of the most common things you do. This is a repeated game.

Don’t. Give. An inch. Hold the quality bar, and grab your magnifying glass. Take nothing the person says for granted and insist on excellence on every detail no matter how small. Stay away from subjective areas that water down your position. Make it clear that crap isn’t going to fly around here.

Example 2: A feature gap in a partner team’s largely static component

You need to consume a library for integrating with proprietary systems for retrieving and leveraging certificates. It’s bundled as a part of an SDK that also provides platform integrations for your proprietary deployment / service infrastructure. The library offers no mechanisms on how to integrate with it in a testable way. In fact, it takes hard dependencies on the specialized production environment. Meaning that if you load the DLL and you aren’t in prod, your service will crash.

You go to discuss this, and end up in a bizarre debate where the overall lead asks why you’d want to be able to start your product outside. They take the position that the only kinds of tests have value are unit and testing in prod. They dig in their heals when asked if that means iPhone apps should only ever be tested on real hardware.

Here we have a single game. We only need to integrate with the library once. We have a narrow focus, using it as the TLS certificate. The amount of changes both to attitude and product to fix these problems are monumental. At this point, it’s better for you to just take one for the team and create a small abstraction layer. Never depend on the library directly, and reattribute that to the other internal users stuck in the same boat you are.

Example 3: A new feature with a partner team

Rather than full examples, just think through the principles. The answer here is it depends. Is this a feature integration happening once and never again? Or once but by the time anything new happens it’s all being thrown out and replaced by other in-progress work anyway? Single game. Is it a new feature add with a major partner and you frequently add new interdependent features? Repeated game.

Stepping Back

Single vs repeated game is a useful heuristic, but it’s just that: a heuristic. It can on occasion yield the wrong answer. When you have an intuitive grasp of the underlying ideas around incentives here, you can take a step back and view things in more generalized terms.

Is the cost of enforcing good behavior higher or lower than the cost of eating the bad behavior?

At the end of the day, that’s the question that informs both sides of all of this. If a cheat is going to cost you more, you need to fight. Because by fighting you increase the cost of bad behavior, and they’re now forced to change.

  1. There are lots of great little YouTube videos on how altruism can evolve, and the qualities that will emerge for it to survive. For a detailed account of how altruism that truly seems to be selfish can emerge, consider reading The Selfish Gene by Richard Dawkins. Fun fact, this book is where the word “meme” was coined. ↩︎

All rights reserved by the author.