The No-BS Guide to Engineering Team Conflicts
No-nonsense approach to resolving conflicts in engineering teams. Real examples, actionable steps, and building psychological safety.
“Your engineers aren't children, and you're not their therapist.”
I learned this lesson the hard way during my first year as an engineering manager. I'd spent three weeks playing mediator between two senior engineers, scheduling separate meetings, carefully documenting their grievances, and crafting the perfect resolution plan. The result? Both ended up leaving the company within six months.
That experience fundamentally changed how I approach team conflicts. Here's what actually works, backed by more than a decade of managing cross-functional engineering teams.
Spotting Conflicts Before They Explode
Most costly team conflicts don't start with a bang — they simmer quietly until they boil over. Here's what to watch for:
Technical Warning Signs:
- Increasing number of revert commits: When team members start undoing each other's work, it often indicates disagreement about technical direction that they're not discussing openly.
- Parallel implementations of similar functionality: People building duplicate systems can signal they're avoiding collaboration due to interpersonal tension.
- Unexplained delays in cross-team dependencies: When simple cross-team requests take unusually long, it often means people are avoiding interaction with specific team members.
- Sudden increase in “offline discussions” referenced in PR comments: This usually indicates people are avoiding public disagreement, but aren't actually resolving their differences.
- One team starting to build “wrappers” around another team's services: A classic sign of teams losing trust in each other's work and trying to insulate themselves.
Communication Red Flags:
- Excessive formality in Slack messages: When engineers who were once casual suddenly become formal, they're often creating paper trails for future escalation.
- Moving discussions from public to private channels: This can indicate people are forming alliances or avoiding public confrontation.
- Declining optional cross-team meetings: Teams starting to isolate themselves is occasionally the first step toward deeper collaboration issues.
- Shoulder-tapping for “quick chats” after meetings: When people consistently want to “discuss offline,” they might be avoiding public disagreement while building resentment.
Early Intervention Strategies That Work
Here's how to address each warning sign effectively:
For Technical Symptoms:
- Review git history patterns: Schedule regular “architectural story” sessions where teams explain the evolution of their code. This surfaces underlying disagreements in a neutral, technical context.
- Set up informal coffee chats with team/tech leads: These casual settings often reveal tensions that haven't surfaced in formal meetings. The key is to ask open-ended questions about cross-team collaboration.
- Join more code reviews as observer: Don't interfere unless necessary, but watch for patterns in how different team members interact. This helps identify if conflicts are personal or truly technical.
- Schedule architecture review sessions: Create a neutral space where teams must explain their technical decisions to peers. This helps surface underlying conflicts in a constructive way.
For Communication Changes:
- Increase 1:1 frequency temporarily: Use these sessions to probe deeper into team dynamics without putting anyone on the spot publicly.
- Add “team dynamics” section to retros: Create structured space for discussing collaboration issues before they become personal conflicts.
- Create more pair programming opportunities: Forced collaboration can break down artificial barriers and helps people remember their colleagues' competence. If the conflict is full-fledged, though, this can do more harm.
- Set up cross-team technical sharing sessions: This rebuilds empathy by helping each team understand others' challenges.
Direct Resolution Is Non-Negotiable
The moment you notice tension between team members, resist the urge to jump in and fix it. Your first response should be: “Have you talked to them directly about this?”
80% of the time, engineers avoid direct conversations because they're uncomfortable. Too bad. Professional adults need to handle uncomfortable conversations — it's part of the job description.
Set clear expectations: “I expect you to have a direct conversation with Alex about this by Friday. Please let me know how it goes.” Give them guidance if needed, but don't let them off the hook.
When coaching direct conversations, provide a clear framework:
- State the impact on your work specifically
- Listen to their perspective without interrupting
- Propose concrete changes moving forward
- Set a follow-up time to review progress
Psychological Safety: The Hidden Cost of Conflict
Every unresolved conflict creates ripple effects across your team's psychological safety. I watched a high-performing team crater after two senior engineers spent months engaging in passive-aggressive code reviews. The impact:
- Junior engineers stopped asking questions in meetings
- People avoided suggesting new approaches
- Code reviews became superficial to avoid conflict
- Innovation practically ceased
Your response to conflicts sets the tone. When you avoid addressing issues directly, you signal that maintaining comfort is more important than maintaining standards. When you play endless mediator, you signal that people aren't expected to handle their own problems.
The Manager-Direct Report Conflict
This is the trickiest type of conflict because the power dynamic makes it hard for your direct report to address issues openly. I've been on both sides of this, and here's what works:
- Acknowledge the Power Imbalance:
- Explicitly state that disagreement won't affect their role or opportunities
- Create clear escalation paths to your manager
- Document all performance discussions separately from disagreements
- Bring in a Third Party:
- Ask your manager or a peer manager to mediate
- Consider moving the report to another team or manager temporarily
- Have HR present for sensitive discussions
- Set Clear Boundaries:
- Separate technical disagreements from performance discussions
- Create written decision-making frameworks
- Establish regular feedback sessions with your manager present
Real Example: I once had a senior engineer who fundamentally disagreed with my technical direction for the team. Steps that worked:
- Asked my manager to review our technical discussions
- Created a technical steering committee that included other senior engineers
- Set up skip-level meetings for the engineer with my manager
- Documented all technical decisions with clear rationales
- Kept performance reviews focused solely on objective metrics and actually demonstrated to the engineer that our disagreement didn't affect their evaluation (they were still meeting expectations)
What Didn't Work:
- Trying to handle it privately (“Let's keep this between us”)
- Mixing technical and performance discussions
- Informal resolution attempts without documentation
- Expecting the power dynamic to resolve itself
When Direct Resolution Fails
Sometimes direct conversations don't work. Maybe there's too much history, or the power dynamics are complicated (like when a senior engineer and a junior QA engineer clash). That's when you step in — but not as a mediator.
Here's my framework:
- Schedule one meeting with both parties
- Set ground rules upfront:
- No interrupting
- No personal attacks
- Focus on specific behaviors, not character
- Each person states what they need to work effectively
- Document agreed-upon behavior changes
- Schedule a follow-up in exactly one week
The key? Keep it ruthlessly focused on future behavior changes. The moment someone starts disputing past grievances, interrupt and redirect: “We're here to agree on how we work together going forward. What specific changes would help?”
The Developer vs. Product Manager Scenario
A common conflict I've seen multiple times: A developer feels the PM keeps changing requirements mid-sprint, while the PM feels the developer is inflexible and doesn't understand business needs.
Here's how I handle it:
- First meeting agenda:
- Developer commits to raising concerns about requirement changes within 24 hours
- PM commits to consulting developer before accepting scope changes
- Both agree to cc each other on all requirement-related communications
- Weekly sync established to review upcoming changes --> make it part of the sprint planning or backlog refinement
- Follow-up meeting focuses solely on:
- Were these commitments kept?
- What's working/not working?
- What needs adjustment?
When Things Go Wrong: Real Horror Stories
I've seen some spectacular failures in handling team conflicts. Here are some cautionary tales:
The Toxic Code Reviews Spiral:
- Senior engineer Tom started leaving increasingly harsh comments on junior engineer Sarah's PRs
- Manager noticed but thought “they'll work it out”
- Sarah started taking twice as long to submit work, triple-checking everything
- Other team members noticed and started walking on eggshells with their own PRs
- Three months later: Sarah quit, two other engineers were actively job hunting
- Team velocity dropped 40%
- Recovery time: 8 months and two new hires
The “Not My Problem” Backend/Frontend War:
- Backend team changed API response format without warning
- Frontend team had to scramble to fix breaking changes
- Frontend tech lead complained to manager
- Manager's response: “Work it out between yourselves”
- Result: Teams stopped communicating directly
- All communications went through formal RFC documents
- Simple changes took weeks
- Both teams started building redundant systems to avoid dependencies
- Technical debt exploded
- Recovery time: 4 months of architectural redesign
The “Keeps The Peace” Disaster:
- Two senior architects had fundamentally different views on microservice design
- Manager kept alternating between their approaches to “keep everyone happy”
- Architecture became inconsistent
- New team members couldn't understand why similar problems had different solutions
- Deployment complexity increased exponentially
- Both architects eventually left, frustrated
- Team inherited unmaintainable hybrid architecture
- Recovery time: 18 months of gradual system rewrites
Prevention > Cure
The best way to handle team conflicts is to prevent them. Some practices I've found effective:
- Clear team agreements about communication channels and response times
- Regular cross-functional pairing sessions
- Rotation of responsibilities so everyone understands each other's challenges
- Zero tolerance for passive-aggressive behavior in code reviews or team meetings
- Regular retrospectives with honest discussion about team dynamics
- Explicit discussion of what psychological safety means in practice
The Long Game
Remember: Your goal isn't to make everyone friends. It's to maintain a professional environment where people can do their best work. Sometimes that means having tough conversations and making unpopular decisions.
Success looks like:
- Teams focused on shipping value rather than internal drama
- Clear expectations about professional behavior
- Quick resolution of conflicts when they arise
- Team members who can handle disagreements directly and professionally
- High psychological safety despite occasional conflicts
The best engineering managers I know aren't conflict resolution experts - they're experts at setting and maintaining professional standards that prevent most conflicts from escalating in the first place.
Your job isn't to solve every interpersonal issue. It's to create an environment where professionals can resolve their own conflicts, and to step in decisively when they can't.