Stop the CYA Game
There’s a sickness that can take hold of large enough organizations where software teams who depend on each other start to blame each other for organizational failings. Once the blame game starts, there are two paths the battle can take:
- The organization will devolve into a fury of political intrigue powered by fear and threats. This is a pathological culture. Or…
- The organization will become so locked down in documents, processes, and rules, that nobody can get anything done. Each department fends for itself and enforces their rules strictly. This is a bureaucratic culture.
These are two of three options defined by the Westrum IT culture model. The third option is a healthy, “generative” culture.
I’ve never experienced a pathological culture, but I have certainly experienced a bureaucratic one, and there’s one activity that screams “I work in a bureaucratic culture,” more than anything else—CYA (cover your ass).
I hate CYA because it’s bad culture. But I really hate it because it optimizes for problems that don’t exist yet.
Premature optimization is the root of all evil.
- Donald Knuth
CYA Promotes Premature Optimization
Teams who believe that they must CYA will bend over backwards purchasing insurance policies against the potential bad actions of other teams.
They might purchase an insurance policy against a bad API by wrapping it in so much error handling and logging that 50% of that error handling is code that will never run. Simpler code would have worked.
They might purchase an insurance policy against misinformed designers or product managers by writing comprehensive documentation about how a portion of the product ought to behave, down to every detail like which code snippets to use, what errors must be handled, and what states need to be shown to the user. Pedantic documentation like this insults the intelligence of the other teams’ programmers, the product sense of the product manager, and the taste of the designer. It’s an expensive insurance policy purchased because of a vague anxiety that someone is incompetent.
These insurance policies are not necessary, and the price you pay is loss of culture, creativity, camaraderie, time, and teamwork. What is necessary is open communication, an open codebase, clear leadership channels, and a willingness to share information and thoughts across teams.
It is a much better deal to believe that the other teams are just as smart as yours. Choose to believe that their designers have just has much taste or more. Choose to believe that their product manager gets the business case just like you do. Choose to believe that they have something to teach you.
And you know what? If it turns out that they are incompetent, then you can buy that insurance policy. But don’t do it before you know you need it. That’s premature optimization.
Thanks for reading Re:Fundamentals! Subscribe for free to receive new posts and support my work.
Documentation Hell
Documents are farts in the wind—pungent for a brief moment, and then forever out of sync.
One thing CYA teams like to do is document, document, document.
Documents have their place, but let’s not forget what they are.
Documents are a management tool. Gross! They exist so that managers, who don’t have time to look at the code, can feel involved and up to date with the work.
Documents are wishes about how the product and system should behave.
Documents are farts in the wind—pungent for a brief moment, and then forever out of sync.
Documents are arguments to upper management that someone did wrong or right.
But, documents are not the truth. The truth about the state of the system is only in the code. The truth about what the system can or can not do is again only to be found in the act of coding. The truth about which team is at fault and which team needs to update is in the code. Someone somewhere will have to make a discovery in code to fix that bug, speed up that process, or handle that edge case.
So, why do CYA teams optimize for documents over code? Because they can be more easily emailed to a manager and held up as evidence against another team. Evidence that they did their due diligence, but the other team didn’t. But the evidence doesn’t tell the whole story, only the code can.
A much better alternative is to optimize for coding. Optimize for finding out real things about the system. Optimize for trying an experiment to observe reality with real code really running on a computer. Optimize to do the thing programmers are meant to do! Proving ideas that way is much more positive culturally, and a much more effective persuasion device.
Insisting in dealing primarily with working software simultaneously sets the bar of excellence higher for every team, and maximizes programmer happiness and productivity.
A programmer met with a challenge to produce working software to prove a point will have a blast. But give them a document to write? Much less fun.
Missing the Point
My next problem with CYA is that a team who is concerned with it is not aiming at the company’s goals. They contort otherwise productive goals into destructive goals. They might not say it outright, but their actions betray it.
“We want to help our customers” becomes “we want to protect our product.”
“We want to work with others” becomes “we want to protect our team.”
“We want to move technology forward” becomes “we don’t want to make a mess.”
“We want to try something new” becomes “we will sit and wait to be forced.”
I’m Protecting My Team
Managers CYA the hardest.
They’ll play games to make sure they and their reports never look bad. They will deflect questions, answer with lengthy documents, setup meetings, pad estimates, and generally waste time, all to the tune of, “I’m protecting my team.”
They create this vision of self sacrifice and inform the team that they are taking on a wave of requests and competing priorities which the team could never handle, not in a million years.
I think, sometimes, it’s justification for a job that’s not necessary.
Programmers are not children. A manager is not a parent. Chief among a lead programmer’s jobs is to say “no” to unhelpful requests that don’t move the needle. Or, better yet, “no, but you are welcome to investigate. Pull requests welcome!”
This type of response encourages play with the actual stuff we all care about—the code and the software—over documents and vague ideas. Treating software as actually malleable and available to other teams is a powerful alternative to needing manager approval and sync-up sessions and prioritization meetings.
Those are all insurance policies for problems you don’t have yet.