Good idea to think in systems and figure out how to lift the quality of the team but it’s okay to give direct feedback. Especially if the feedback is like GP’s in that it kicks off a constructive conversation, which iiuc is exactly what your final sentence there is waxing on about…
Edit; to be clear I’m suggesting to not aim to avoid conflict. Certainly don’t stoke it for no reason but there is a healthy kind of conflict and how it is engaged with, which builds trust, deepens human relationships, and leads to growth for everyone involved. Psychological safety etc
Seriously though, I don't think there's "healthy conflict". There are healthy relationships where you can someone they're full of it without it being an insult or you can discuss how to write better software without it being perceived as a personal insult. An environment where people want to grow, are curious, are friendly, and just talk about how to do things better. Once you're in "conflict" territory it's something else. Unfortunately in most organizations you actually do have to get into conflict territory to impact change but I don't see that as a positive thing, just a negative that is a fact of life.
EDIT: This "I noticed blah" pattern is what's taught in formal management training as a method of giving feedback. I know because I've done those. The problem is that wrapping negative feedback in some formulaic pattern is transparent and doesn't work. So the person receiving this immediately strips away your formula and hears the negative feedback. I know that's what I do when someone uses those tools on me. The way forward is not to use those tools but to engage in a true positive way and foster a positive atmosphere. A smart person already knows there's a problem when their code got rolled back. The discussion shouldn't be about their performance "issue" but just about assigning people jobs they can handle and giving them tools and support to that right. There are exceptions when there are more complicated things going on, but the way this is handled when people have good intentions and are motivated is to generally keep helping them stay motivated and have good intentions even when they make mistakes.
One generalized example I've seen. Jimmy proposes to make a change that assumes all Foos in production have been replaced with Bars, and will cause an outage if that's not so. Reviewer A says "hey, this seems risky - are you sure the Foos are gone?" "Yes, I'm sure, there's no way that there could be any Foos left". When it turns out that he didn't really check and there were some Foos left, your options are:
* Frank and conflict-laden conversation with Jimmy. By all means say it nicely, but the bottom line is that you can't maintain a collaborative culture if reviewers can't trust the things Jimmy certifies to be true. The underlying unhealthiness might be that it's too hard to verify production state, or that Jimmy isn't competent enough to do it, or that Jimmy is just lazy. You'll have to engage in some conflict to find out.
* Put Jimmy in a penalty box, where everyone knows they can't give him the normal level of trust and need to double check his work. (Won't Jimmy notice, and won't you then have to give him the same conflict-laden conversation? Probably.)
* Let Jimmy run around wrecking things until his relationship with the team is so compromised he's forced to transfer or quit.
Having seen managers pick all three options, the first seems clearly best to me.
We don't expect people to be perfect. Everyone will occasionally make mistakes. I would not frame it as a loss of trust.
If the answer is no then I agree there's a problem that needs to be root caused. Maybe the root cause is Jimmy had a fight with his spouse, or didn't get enough sleep. Maybe Jimmy just can't do the job we're asking him to do.
Beyond that there are process questions to be asked. Don't you have some sort of staged deployments? dev/stage/prod? The reviewer that was concerned about whether Foos are gone - why was he concerned? Is there an easy way to check that?
I wouldn't say there's never a situation for difficult conversations. But usually those are not the right tool for the job. Jimmy is completely aware (presumably) that he said no Foos are left, and that when his code merged the remaining Foos caused an outage, and that his change had to be rolled back to recover. He is a responsible and trusted member of the team. How does he own up to that? What is your culture? If he is not responsible nor trusted than eventually he'll not be there and that's something to be reinforced positively and understood by a high performance team. It's just my experience that if you're at a point where you're playing those games then it usually isn't going to result in a positive outcome. Those tools are not appropriate for high performance teams in high performance organizations. Maybe they are in different organizations.
EDIT: In the military for example it is common to reinforce what people need to do via some sort of punishment. The difference is that you got people who possibly don't want to be there in the first place and in general you don't fire soldiers. That method sort of works but it doesn't really produce the kind of environment a lot of us would like to be in and there's always conflict between fear of punishment and taking initiative.
I would also say there are other things that can be done in this scenario, including a culture of postmortems, where you review the incident as a team and brainstorm ways of avoiding it in the future. This can be tricky to be done in a truly blameless way but if done right can act as a positive reinforcement. In general it's better that peer pressure and culture are the mechanisms that drive people vs. managerial action simply because the manager can't be everywhere all the time. The manager drives that culture.
My response is based on my own experiences with management that are incapable of moving the needle on anything, rarely have any constructive input, and ultimately cause their team to either quit or be fired. Then they themselves get pressured to quit.
It's very obvious to devs when someone delegating couldn't even do the work themselves or would do an even sloppier job. It's one thing to expect higher performance, but quite another to demand it while spending all day in meetings giving limp wristed handshakes and bullshitting their way through every question they get from anyone.
I understand that it's already hard enough to hire good devs let alone promote one into management. I'm suggesting how an organization goes about making and promoting those people from within. This industry cannot go on like this. I don't care if someone isn't perfect when I hire them, but I do care that everyone wins.
"you're sloppy" is too personal.
"this is not to the standard what I would expect" with reasons is factual, if, having been on the receiving end of, harsh. But it should not be done publicly.
"This has to be changed because it will break" (on a PR) is perfectly fine.
"This wasn't even run through linter, please don't drive folks to force push hooks" can be 3rd person passive aggressive (e.x. I'm not advocating for them but others want a series of hooks that is just...too...much...) but potentially factual.
"This .cs file was 2500 lines. You were given a choice but instead you chose violence" is something that was very very hard to not reword into something more polite when a PR wanted to add another 2600 lines. At the very least turn it into a more constructive "This .cs file is already 2500 lines. We need to stop the violence and refactor the class per-business-aspect."
I like that last example, because it shows some very subtle differences in how the same information can be communicated while severity/importance is still pretty dang clear.