Monday, November 7, 2022

Ganging up

(posted Feb 5, 2023)

This is a record of one particular incident in May 2022 that shows how toxic was the environment I was in because of Adam and Perry (and to a lesser degree, Roman, who was my only peer at the team, lead by Adam and managed by Perry -- a peer behaving poorly is easy to handle when he doesn't have the team lead or the management support). 

This is written for CK people who are wondering if they are being gaslighted by Adam; read for yourself and decide. 

For everyone else, knowing this cast of characters may help you better understand the drama below:

  • Roman: a software engineer in the controls team, which at the time consisted of him, myself, and Adam. Controls team writes software that controls the industrial system directly.

  • Adam: the team lead for the controls team. When the company was smaller, Adam was the team lead for the entire software group, and when the software group was split into multiple teams, Adam was assigned to be merely the lead for this one team. On the day of announcement he looked quite bummed that his new status was lower than it used to be.

  • Perry: the software team manager who is very nice and agreeable but who was completely unable to confront Drew -- and Adam, as you'll see below -- or really resolve any conflict. He had never acted disrespectfully towards me however, and even what I perceived as his parting shot ("it was nice knowing you") might have been a genuine goodbye.

  • B****: a Science team guy with whom I worked closely on enabling sites and solving various problems, and have always had a very good work relationship with (I censored the names of people who are not at fault in any way)

  • I**: an Ops (Operations) team girl with whom I also worked on several occasions on enabling different sites and with whom like with B**** I also enjoyed working. 

  • Myself: the remaining member of the Controls team alongside Roman and Adam.
Here are the events that transpired as I recall them:

1.     End of May I prepare code which B**** and I** in the Ops tell me is needed to start reading W********** [facility] and which they say in the standup are waiting on for me. I invite Roman to review the code to make sure I did not miss anything safety wise but Roman blocks the code PR on aesthetic grounds; he first wrote a comment on the code in the company github page that something is very wrong, I replied that it was his own code block upon which he deletes his comment, but leaves the PR blocked

2.     I reach out to Roman in DM to clarify the issue and inform him that Ops are blocked on it; Roman claims code is "hard to read" and suggests a very different alternative that I believe is hard to read; I suggest since this is an aesthetic issue, if he agrees that the code works lets merge it to unblock Ops and then we can revisit later. Roman refuses and instead says "at least removed unused variables". The code in question was not unused variables but function parameters that I put for a specific reason. Roman insists they make the code "hard to read", falsely claims it fails the test (I prove that it doesn't), and speculates that "a new employee would be confused". I explain to him that every line of code I put in for a reason, that I was looking for help with correctness which he found no fault in, and I argue if the reviewer doesn't like the code he does not have to approve it but he should block the code only when it doesn't work, not when it doesn't meet his personal criteria of "hard to read"; nevertheless Roman refuses to lift the block still and demands I make the change to the style he prefers

3.     I say since we disagree, and I cannot move forward with his block in place, let's bring it up with the team, including the stakeholders, B**** and I** (Ops). Roman says he thinks stakeholders (Ops) should not be included, it is strictly a software question; I ignore that opinion and add the Ops to the meeting with Roman, Adam, Perry, and me.

4.     Adam immediately replies that my PR having changed 17 files and 170 lines is a "code smell".

5.     Perry jumps in and says Roman was correct to block my PR

6.     Roman defends his block on the grounds that my code has "poor readability", "bad design" and "no testing" (a previously unmentioned aspect that is outside of the scope, due to the nature of the code that was written long ago which his approach could not cover either).

7.     Moving from Slack to a video meeting between Roman, Adam, Perry and I, the three of them come on strongly that the PR should have been blocked, that the code I wrote is bad and needs to be changed, and we should do it since B**** and I** allowed for some extra time after Adam talked to them separately

8.     Perry admits at one point that the three of them are "ganging up on me" but says he believes the need for "software quality" justifies the ganging up.    

9.     I claim that the block was not done in good faith which is proved by the DM discussion between Roman and me in which I clarified all the (business) reason for the PR that were ignored, Roman's haggling ("at least remove unused vars") as well as Roman's deleted initial comment (for which he admits "I fucked up", but only in that video meeting, not in the PR where he made the comment or in the DM chat between all of us)

10.   Roman now backs off and says his blocking the PR was "miscommunication", implying he didn't have all the information (which is untrue, I spent over an hour in the initial DM to explain); Adam and Perry still justify the block

11.   Adam suggests a very different approach he calls "patterns" for solving the problem and in the interest of moving forward I agree to implement it.

12.   After several days when I implemented Adam's approach, in the best way possible, it turns out Adam's approach modifies 20 files and 200 lines, and is missing an opportunity for a new business need for the code that surfaced in the previous day; I also point out to the logical flaw in his approach that emerged clear

13.   In a standup Adam refuses to accept the argument and argues that the 20 files plus 200 lines is "not a code smell" because of potential for expansion (that doesn't exist). When I offer to write an "incident review" so that anyone in the software team can comment on he insists I shouldn't write it because I would be "biased", he said

14.   In a 1:1 with Perry, Perry says he now personally looked at my original PR and he agreed that it is the better solution and that I should check it in

15.   I ask Roman and Adam in a 3-way Slack chat if they agree with Perry's suggestion, because we as a team should arrive at the best code intellectually and not through an authority opinion. Roman responds that he, Perry and Adam met, unbeknownst to me, and decided that my original PR is better and should be approved; Adam does not chime in

16.   A couple of days later Adam sends a meeting invite to "catch up" saying there is no particular reason for this catching up, just wants to chat, and says "hey I haven't had time to chat with you, I've been working on building the leadership in this company". (Consistent with him being downcast on the day of announcement he would be merely a one small team lead instead of everyone's lead as he was in the first couple of years.)

17.   I turn the discussion to the issues we have, we touch on the PR and Adam says I had no reason to think there was anything wrong and in the same breath accounts for the time when W**** blocked his PR on unjustified grounds and how Adam was offended

18.   When I bring up our NPS score of * [a very low number] he says that me bringing it up "offends him". I insist on discussing it regardless, Adam claims the NPS score "would have been" high if only they had a Chromebook ready (which is not just speculative but also not true, our software wiped itself out).

19.   When I say how could this be the only reason our NPS score is very low when C**** is seriously pushing for a discussion on this issue, Adam says C**** has been "tasked" with that project by the management and that C**** is engaging in it merely because his performance will be evaluated on it -- implying lack of actual concern; this is very starkly at odds with my experience with C****

20.   Several times he attempted to explain away my reasoning about our problem by applying what I called psycho-babble -- "you feel that way because you are internalizing this and that", despite my stopping him every time he tried. After nearly 2 hours (meeting was scheduled for 15min) I leave with a strong impression that Adam is trying to manipulate me, compounded with his never admitting to being wrong

21.   In a 1:1 with Perry I raise that I have strong reasons to believe that Adam is exerting manipulative behavior towards me, I recount all the details from the previous meetings, and that there has been no discussion on what went wrong in our review process

22.   Perry denies that there are any such problems, says with Drew he had already received complaints by the time I complained (which if true raises the question why he hadn't acted) but with Adam he hasn't; I explain that as with Drew it takes time for manipulative behavior to be acknowledged (even J*** tried to defend Drew when he first reached out saying "I think he's a nice guy") but Perry dismisses this

23.   Perry defends Adam's "3 vs 1" approach -- in which Adam, after failing to produce a business reason why I should implement a sweeping change he proposed, said "there are three of us (Adam, Roman, and R******, although R****** was not fully on board) versus you" --  with "Adam had to decide". I say this is untrue, complete inaction on that front by anyone in subsequent  weeks and months shows there was no need to decide then, and that a developer cannot be coerced into making a change what he believes is wrong and detrimental to the business, especially of the kind that concerns nearly all stakeholders (ops, software, business, marketing, users, customers) and when the discussion at the company level has not been held and no valid argument in favor of the change has been produced.

24.   I tell Perry that I cannot join standups that Adam lead because of what I perceive as unfairness and attempts at manipulation and strongarming, that I do not want to put myself into stressful and unproductive situations, at least until what has happened is discussed; Perry does not say anything either way initially. Adam is away for a week during which I am present at standups; but when he is back I refuse to join, prompting Perry to DM to me the principles of Scrum, of which I am well aware, to which I urge him to bring the issue of what I see as incorrect and disrespectful behavior by my two team members, Roman and Adam. As nothing is resolved I tell Perry I am burned out by Adam’s disrespectful and manipulative behavior and Perry’s mishandling of the issue; he does not address any of it and occasionally sends a message or replies to my comments in Slack as if everything is normal

25.   In the remaining 2-3 weeks before the end of my employment I continue to work with other coworkers, particularly Ops, including nearly all day on the Juneteenth holiday to enable W********** [facility] reading data, and with M****, the new hire for the team with which I have a good working relationship and whom I help onboard; I continue monitoring the sites all day and on the weekends and helping troubleshoot issues, on one occasion because of these manual checks I catch a significant issue for which there was no alerts and N**** is very grateful for it, some in the software team comment that she should subscribe to "Davor as a Service" implying I provide valuable service not available otherwise; a week later the company attempts to terminate my employment.

As you see one teammate -- Roman -- tried to exercise power over me, I believe knowing that the team lead -- Adam -- will be on his side (since Roman had always taken Adam's side, as he did with Drew), and then both of them knowing that Perry will be compelled to do what Adam asks (Adam had claimed that he had told Perry, though Perry was his boss, to cancel the architecture discussion). 

This conflict with Roman is the event that eventually lead to the management trying to terminate my job, all because I would not allow a teammate to impose his will on me, as per Nassim Taleb's quote at the beginning of the blog. I have absolutely no regrets, and I very much recommend "speaking truth to power" and letting the chips fall where they may. 

No comments:

Post a Comment

"Move fast and break things" meets industrial facilities

(updated 10/1/23) "Start by being nice to every person you meet. But if someone tries to exercise power over you, exercise power over h...