Ask HN: How to work with people who push back forcefully?

86 points by bovinegambler ↗ HN
I've worked at a large, famous software company with an academic-inspired workplace and culture for almost 8 years and been fairly successful.

Several times in that span, I've worked with people who push back quite forcefully on comments or feedback on topics or practices that have either explicit company standards or at least generally accepted best practices.

It seems to me that most people at the company are conflict-avoidant so that when these people push back aggressively, it's often a successful strategy. Ten minutes of arguing and wearing the other person down saves them 20 minutes of writing unit tests or fixing their code or whatever. I've seen in the past that these people effectively carve out an unspoken exemption for themselves because everyone is sick of having the same conversation.

I'm the tech lead but not manager of my current team and I'm responsible for the technical execution of the team and the success or failure on that level. There are a bunch of great people who do great work and are pleasant to work with but there's one person who is so unpleasant to work with. I hate that I have to constantly remind this person of company/team/professional standards and that it feels like every conversation is an argument (examples below). I hate that this is in my head on the weekend.

Questions:

- I try as much as possible to explain _why_ practices are what they are, the effects on our project, the team, etc. Any suggestions for these conversations in the future?

- I can't control this person's behavior but I can control my response. Suggestions for dealing with this personally so I'm not wasting my Sunday thinking/writing about it?

- Other thoughts or feedback?

Thank you so much in advance!

Some examples: - Sending a large PR that changes many files at once because their changes kept growing in scope as they were trying to figure out how to do something. Company has lots of guidance about small changes being easier to review, less bug-prone, etc and how to break them up. I try to emphasize the benefits for the team and codebase, the respect for the reviewer, etc. Generally get push-back like "What does it matter?", "It's already done.", "It would take too much time to break up.", "I'll do that next time", etc.

- Adding unit tests for some piece of logic. The benefits of unit tests are so fundamental, but I try to emphasize that there are many people working on the codebase, don't want to accidentally introduce bugs, protect that logic for the future, etc. Generally get push-back like Well it's so simple. It's not worth testing. I'll add a test later. etc

- On Friday, I discovered a chunk of code copied from Stackoverflow. It was crappy code, which is what caught my eye in the first place. Company has clear guidance that if you want to use outside code, we must verify the license and segregate it from owned code. (If you're curious why: it's hard to know where the SO code originally comes from, maybe copied from a closed-source project or one with GPL license or whatever, and even if it's original to SO, there is a license for that and it wouldn't be considered owned by the company). I was shocked to receive push-back on this. The person said things like "how would anyone find out", "what does it matter", "everyone does it", "it's so low risk, who cares"

94 comments

[ 5.5 ms ] story [ 182 ms ] thread
figure out why, do they feel threatened or bullied? Are they headstrong? Are they trying to do something you don't get or care about? Are they actually smarter than you?

If you can adjust your behavior to compensate for what they perceive and you then want to, you can do something about it.

Start a disciplinary process or it will only get worse over time.
Document (preferably the whole series of incidents) and escalate. It helps if evidence is not modifiable (e.g. review comments are immutable and can't be deleted).
“Never wrestle with a pig because you'll both get dirty and the pig likes it" - the source of disagreement here is about whether or not policy needs to be followed, not about the details of the policy, so stop trying to argue the policy on it's merits. You need to do a quick review of roles and authorities, clearly lay out (ideally mutually agreed upon) standards, and identify the implications of not following the policies - i.e 'if not xyz as agreed, then the PR won't be approved' or 'if sarcastic/bad attitudes in meetings, then I'll work with [the people manager] and create a PIP'.

Empathy is super effective in this situation - use the magic words 'it seems___' and get their reaction. 'It seems like you're trying to get as much code done as possible and see these policies as busy work'. 'it seems like you don't think the quality of the team's output is how you'll be measured'. Sometimes there is legitimate misunderstandings (were they told they need to write x lines this year to be promoted?), other times they're missing an implication and need a reality check.

This is great, to add to "it seems" is also the "It feels". So for OP it's something like:

It feel like you think this policy doesn't apply here. It does and we're looking for Teamwork. These policies are for the Team, skipping them disrespect everyone (not just OP)

Then PIP and boot of you have to. The bad attitude spread and bring everyone down.

Tell your boss to make someone else tech lead.
It can be hard.

The key is to

1) not engage in conversation

2) add mechanical tools that fail the build if coverage isn’t enough!

A lot of times people argue that it’s stupid to have a “target” code coverage. I used to be one such person until I saw what happens when you leave it to people. Most people would still keep quality bar high, but one rotten fish spoils the pond and the tools that mechanically measure quality metrics are very effective in pushing back on bullshit like this.

Oh and whatever you do, don’t engage in debate on this. They /will/ wear you down.

> add mechanical tools that fail the build

I wish this wasn’t so damn effective.

Anecdata says that people who are too stubborn to adapt to other people’s best practices often don’t mind the practices, only the way they are conveyed.

You describe your workplace as academically-inspired, yet experimentation and large PRs are discouraged. In you shoes, I'd double-check to make sure the "small-PRs-only" policy is in alignment with the company values before making that a real point of contention.
The small PRs thing literally came out of things like "The Principles of Product Development Flow", which talks extensively about Queuing Theory, as well as the findings from Accelerate which came out of academic research. So... I can very much see how it would be aligned?
IMO this person needs to come to Jesus or be fired.

> I'm the tech lead but not manager

You need to have a conversation with the manager. Document the violations of standards and company policy. The manager should review this with the problem employee, in writing, and the employee should sign an acknowledgement that the warning was received and understood.

If the employee does not improve he or she should be terminated. Such people are like cancers if they are allowed to remain unchanged.

Ideally the "large, famous" software company already has defined an HR process for managing situations like this.

If you can't get backing from the manager or the manager's manager then you need to think about whether you want to stay in a company that isn't giving you the support you need to be "responsible for the technical execution of the team and the success or failure on that level."

I will add to this that the OP should seek out or ask their manager to find a principal/staff level engineer that can take on the individual effort of helping the renegade engineer fall in line. That may be more in line with their responsibilities than a team lead.
Aren't lead and staff basically the same thing at a lot of places?
Not at all, at least at FAANGs I was lucky enough to observe from the inside myself.

Team lead there is essentially a middle ground between the engineering manager and IC devs. Sometimes teams do with just ICs+manager, sometimes it has that TL layer in-between (usually on larger teams, either in the number of people or the scope of work). TLs can be either senior or staff engineers (only seen seniors as TLs though). Both senior and staff engineers can be either ICs or TLs.

Often, I see TL positions being either just a stop-gap for transitioning to being an engineering manager or as a lite test-drive of whether the person would actually like being in a management position (as opposed to an IC).

This is the correct answer. CtJ or hit the bricks.
Hard to say without more info about the relationships and company structure. It looks like this person is pushing back on your judgement with their own judgement. If you can't fall back to finding a mutual understanding then you're at battling for power. If you have the seniority you can just say "No, this is the standard that the team agreed on and we enforce, your PR is not being approved until it is fixed", and if you don't then I think you need to involve someone who is one level above you to resolve the judgement dispute.

If you're not willing or able to clash, you'll have to try find some compromises that improve the situation but make for an undesirable choice for this person. eg. In the PR example, require that large PRs require an in-person walk through.

Are any of these examples concrete/factual, or are they all exclusively opinion based?
I'm not op obviously but I have the same person on my team saying the exact same things, it's as concrete as it's given
First two of these examples may be on the religious or yak shaving end of debates, where the best practice is probably not an absolute.

1. There are code bases and PRs where coalescing many small changes into one "this changes how we do this" commit is encouraged when it's a semvar level change requiring coordinated edits to keep working, rather than a purely iterative change.

2. Most research shows universal unit test coverage is lower ROI than judicious coverage of intefaces and risks.

If many of your discussions fall in this zone, it's possible you, yourself, may be taking guidelines as too black and white.

Meanwhile ...

3. That one is just bad.

Do you have source on item #2? I've been looking for some to back this point, but can't find any.
> If many of your discussions fall in this zone, it's possible you, yourself, may be taking guidelines as too black and white.

I have very mixed feelings about this. On the one hand, I’m no fan of following process for the sake of it.

On the other, the way to address policies that need an update is to sit down with the lead/manager and propose changes with evidence as to why.

Deciding to just do things your way and then arguing about it is not the way.

IME it’s pretty much impossible to change rules adopted by a bureaucracy if you are just a cog.
If you can automate the rules, do it. If you can’t automate the rules, don’t try to enforce them, just ask why.

I worked at a place where 10k LoC PRs were the norm. At my next place, I’d open a 1k PR and people would lose their shit. They’d ask for it to be broken up into smaller PRs and my response was “it’s already ridiculously small”

Personally, I’d rather see the big PR and spend time reviewing that than trying to figure out what they’re trying to set up and do. As long as the big PR is coherent and well-written. If it’s spaghetti monster, I’ll pass.

I mostly agree due to the nature of not all code is straight up assembly/c/cpp, LOL. Knowing your target audience is key. In this case the team size, company size, ect.

I would be okay with larger PRs especially for configuration as code like ansible and terraform hcl. Hoping that people actually use comments and keep code chunks in relevant sections (I've begun paraphrasing ansible to use more whitespace between different "sections". This of course becomes more acceptable when one playbook or hcl folder is copied to another area for promotion purposes, but of course using tooling to check for diffs is crucial here.

I would honestly find #3 a tough pill to swallow as well, and where do you draw the line? If I copy a line of `arr.map()` and use my own variable names does that count? Direct copying from SO can be bad generally but also adding all the license hoop jumping overhead just seems annoying.

The first two are fine though as long as there is room for interpretation, but if the person is pushing back every single time that’s just obnoxious.

The "license hoop jumping overhead" is a legal requirement. If it ever comes out that your software contains code copied from some random web site, you're asking for a copyright infringement lawsuit. If you stick GPLed code in your code base, then your entire codebase is GPL and you're required to give away the source code on request. Even if something is MIT or BSD or similar license, you probably need to give the author credit in your software (this is why so many games have an "Open Source Licenses" option where you can read the licenses of various open source libraries they stuck in the game). If you forget to credit the author of the MIT licensed library you used, that's also a potential lawsuit.

In short, don't play loose with software licenses. The legal system has about as much interest in debating whether a company has to follow intellectual property laws as the tax collection agency does in debating whether you have to follow tax laws.

Yes I do understand the legal requirement for these kind of things, I was more trying to be understanding of why there was push back from the person the OP is describing. I also think anyone would be hard pressed to find an engineer who has _never_ copied anything from SO without attribution.
I absolutely have never put stack overflow code into a prodiction code base and I dont think Ive heard anyone talking about or seen anyone do that. I dont think that is typical all.

I use stack overflow to understand a concept or a technique frequently, but always type my own code from scratch.

Plenty of us coded before SO, but I think you're being too general. Using SO to see examples of syntax is completely different than copying a chunk/function/page of original code someone wrote to solve a problem.
The chunk of code copied from SO is a legit legal risk for the company, not a code quality issue — you need to either revert that or escalate it quickly.

The rest of it, I’d follow Galxeagle’s advice. Lay out the standards, lay out the consequences, have empathy, do not argue with them. Humane, but firm.

> The person said things like "how would anyone find out", "what does it matter", "everyone does it"

To me, this reads as a toxic person who would try to get away with these things if they hadn't been caught, and who could lead to a massive shift in ethics and morale if allowed to proceed unchecked. That's really alarming. Imagine if a person with this attitude was in a position where they were responsible for code safeguarding PII or other sensitive data (and arguably, this may already be true, e.g. if they were to introduce a security hole in their component). It's essential that you document everything contemporaneously (or as close to that as possible), ensure the person's manager first knows your concerns in private - and if they don't take any action, give them the heads up that you'll need to escalate to your manager about potential ongoing legal risks. It will be annoying to navigate the politics, but it will be much more annoying if the wound festers.

Frankly, there's a lot of talent out there right now with great ethical compasses and experience with large codebases, and allocating headcount to a toxic person simply isn't optimal in that context. And even if you're in a situation where a dismissed team member won't be replaced e.g. due to hiring freezes... this person may very well be having a negative effect on the team. Just first make sure that they're not someone's kid... and good luck!

(comment deleted)
In the end it comes down to “don’t negotiate with terrorists”. If they disagree with the policies that’s fine, they can bring it up at a meeting. Call a meeting even, showing you’re willing to listen to their input is important. But you‘ve got to make it clear as day that there will be no going rogue if they disagree.

In the ideal world you would be their manager. Right now responsibility and accountability are separated, which is most likely causing you stress. Bring this up with your manager: tell them your plan to deal with the situation, ask for input and their backup. That way you now have a bigger mandate, and you don’t get in trouble for being tougher than you have been so far. Managing up is as important as managing down.

It might sound odd to have to lay down the law of the land, while simultaneously advising you hear them out. It isn’t. People generally want to be heard more than they want to be right. Show them you hear their concerns. Let them bring all their frustrations out. Tell them you’ll try to improve the situation for them. But also say that you cannot have somebody on the team who doesn’t abide by the policies set, and this behavior cannot continue. The content of the policies is irrelevant to that point, it’s a clear chain-of-command issue.

> Some examples: - Sending a large PR that changes many files at once because their changes kept growing in scope as they were trying to figure out how to do something.

I'm the most senior developer in my team. Normally I block the PR with a change request and say exactly what I want, i.e "Please commit X and Y, in a new PR" and I give exactly the commands that this developer must run. Then, after this small PR is merged, I ask the developer to rebase the huge PR with the master, and do that until the initial PR get as small as possible. If you are not the manager or not team lead, the easiest way is to lead by example, mostly by doing together. Sometimes it can be frustrating, but I'm sure I bring those stuff up when I'm negotiating my salary raises...

If this is happening consistently and the person has been told consistently but still doesn't do it, then it is time for management to step in.

If they start getting their performance reviews taken down a rung or two explicitly due to not doing what was expected of them and communicated to them (repeatedly) then they might get the message. "You didn't get a pay rise this year because you didn't do what was asked if you on <occasions>, which led to extra work for the rest of the team. This was discussed several times with you on <dates>. You can improve by following the coding standards and listening to your TL when they ask you to do something multiple times. If you don't, then we may need to think about formal pip."

Get this person off your team however you can. When the sh*t hits the fan over one of their own special exemptions (like something fails in production that should have been caught in a unit test) it will NEVER be their fault. They will point the finger at everyone else and complain about how someone else should have done something, etc. Fortunately for you, this person is probably going to leave on their own soon anyway, because they know better than everyone else how things should be done and they'll jump ship.

Short of that, manage up - tell the team manager that this person is a drag on the team by not following standards, demanding special treatment, being generally disagreeable. it hurts team morale even if the junior team members don't say so (they may not even realize it themselves, but it is a real thing).

In the shortest term, as others have said, don't engage. Pick the rules you enforce, and enforce them. Request the additional changes on the PR to meet style guidelines and don't take no for an answer. Don't get into discussions or arguments about the merits of the standards, just say "These are the standards and we're all expected to follow them." If the standards are written down (and if they're not, then they aren't really standards) then cut off any discussion on the merits of the standards with links to the written standards. Use a "chore" conventional-comment (https://conventionalcomments.org/) to indicate that it's just a thing that has to be done.

If you can, make it someone else's problem. Refer them to the standards committee or whatever senior architect is responsible for guiding the standards, and let them handle the argument.

> - Adding unit tests for some piece of logic. The benefits of unit tests are so fundamental, but I try to emphasize that there are many people working on the codebase, don't want to accidentally introduce bugs, protect that logic for the future, etc. Generally get push-back like Well it's so simple. It's not worth testing. I'll add a test later. etc

This one is easy to solve. Having automation or, as usual, blocking the PR with a change request and having it blocked until the necessary code get the tests needed. Again: Maybe the developer will add it, maybe you can do it in a pair programming session, or maybe you just submit the tests to the PR and lead by example. Sometimes it can be frustrating, but I'm sure to bring such proactive actions up when I'm negotiating my salary raise..

The 'large PR' issue - I've been on the 'violating' end of that, but... there are actually times when a PR touching a lot of files and making changes is called for. I got push back at the last team I was on where this was an issue, and the stated thing was "it's hard to review".

Yet... no one ever - literally - pulled down code in a PR/branch and reviewed it locally, never reviewed any tests (in 2 years I never got one question about a test as in 'you missed use case X in your tests', etc). They literally just meant "reviewing this on the screen in the github UI is hard when there's more than a handful of files - it's hard to tell where the changes are or what they effect". This is why I would also have tests and (sometimes extensive) documentation in the PR, to help a review. Never happened.

I had "large" PRs (by someone else's labelling) about 10-15% of the time. I would get pushback - "this is too much - it's too confusing".

Me: "OK... let's schedule some time to review - maybe you can help me cut it back some, or you can assist me in some way in this work?".

Others: "don't have any time for that - this is just too much work".

OK, so... complain about the work, but when I ask for help to conform to your standards... I get a refusal.

I point blank asked multiple times when this was lodged as feedback - "what steps could I take to have made this smaller?"

The only substantive thing that would have made it somewhat easier to roll out some of these "larger" changes in smaller chunks would be to have had a more comprehensive feature-flag system in place.

I put a basic flag system in over a weekend - some server side, and some hacky method to respect the flags in client side code as well. It was done over about 3 hours, and was never improved. Again - very hacky. I had an "improvement" ticket in for... about a year, begging for more than a few hours to devote to tightening up "feature flag" system to be a bit more comprehensive, documented, etc.

Every "sprint planning meeting" it was the same "there's no time for that, it's not that important, quarterly deadlines, blah blah blah". But if/when I'd do things that were 'unticketed', that was met with accusations of being passive/aggressive, or being subversive, or 'not a team player'. "If you've got time to do that, you could have been helping out people who were behind". The same people who didn't write tests or documentation, and refused to meet with me when I asked for assistance in trying to accommodate their calls for "smaller PRs".

First year on the project was good, but as it grew, policy/procedure/scrum/agile got in the way, with more process and less ability to get useful stuff done. Second year was far less productive (at least, compared to what it could have been - I'm sure some people just saw forward progress as 'good', but we were greatly slowed by more process and ceremony over time).

Bluntly, I’m not sure why this a conversation. I’m all for productive disagreements (even on small things!), but there’s not a substantive point being argued here.

Try being more blunt & concise. Instead of explaining, just say “please add unit tests and I’ll approve,” and then disengage. They’re the one who needs their PR approved - not your problem.

The key here is escalation path. He’ll have to bring it up to his manager, and then the conversation is with his manager, and then you can have a broader “he can’t just ignore every standard” conversation.

> and then disengage

Seriously, you don't owe anyone your time to have a pointless debate. Boundaries are important, as is not wasting your own time. You explain the rules, you're done, conversation over.

'I didnt ask you to do it, I'm telling you to do it. Are you going to do what I am telling you to do? I will take any answer other than an explicit confirmation as a 'no'.'
Do you find this type of answer to actually help you accomplish your and your organizations goals? I don’t think many people would react well to that type of military style order frankly.
The only thing will accomplish is demoralizing your team and having then turn in the bare minimum workong code. You clearly don't care about what your team thinks, so why should they care about going above and beyond when writing their code?
(comment deleted)
IMO of the three examples only the last one is a clear case of a company policy that can and should be followed even at the expense of productivity, and if their argument is really "how would anyone find out" you need to kick that up the management chain--this person could be putting your company at risk. For the other two your rationale is essentially "doing it the standard way makes the team more productive", but clearly comes at the cost of making this employee less productive, and your argument is empty--they are already seeking to be as productive as they think they can be. Assuming this person on net is more productive than average just assign someone else to backfill their unit tests and learn to live with the overly complex PRs.
Enforcement by means of CI is a fairly simple approach for many issues. Issues should have a minimum set of requirements including suitable testing. No colleague should approve a PR unless it ticks the necessary boxes.

Our CI does a check to see if Terraform was correctly formatted prior to push and will fail before any "init" / "plan" / "apply" step is reached.

I'll ask because we're struggling with this now. What do you do to reduce the risk of an auto applied TF change going sideways? Our current workflow involves a manual review/approval by devOps.
Our teams all control their own infrastructure so there is very low risk of two pipelines trying to alter the same resources.

Step 1 plans, and outputs the changes to a local plan file.

Step 2 prompts for a human approval after viewing the above potential changes. Declining the approval simply ends the pipeline.

Step 3 applies step 1 using the plan file.

Ok, human involved in the loop, thank you!

I also think there should never be more than one source of truth for TF, but I have seen two devs fight it out in the development environment. Each add their own SNS topic with similar names, get very weirded out by how it seems to magically change as the other dev applies and deletes the first one and replaces it!

Yes, the code is treated no differently from any other language. A human has to confirm changes which will impact others.

The key is to act quickly when presented with a plan. It's advised to decline stale pending approvals and kick off a new pipeline for freshness.

There's no magic unfortunately :(

If this is the company I think it is, privately contact opensource-licensing, or just cc them on the review.