How to deal with weird passive-aggressive text communication from your co-workers or subordinates
People are better about being honest and direct when speaking face-to-face. By contrast, they can be weirdly passive-aggressive when commenting via text.
In 2019, I was asked to help a company I'll call OxyMetaFin, a fast growing startup that offered financial services to those who only had very small amounts of money to invest. Having opened up the world of investing to a demographic that had been previously excluded, this startup enjoyed explosive growth. Their tech stack was built with the Ruby On Rails framework. However, they had made some tragically poor technical decisions, which threatened to derail their growth.
What were the real problems? How did they manifest? Who did they affect? I needed to learn all of this fast, so I set up one-on-one meetings with all of the key people: the CEO, the CFO, the CTO, the head of marketing, the lead UX designer, and many more.
I discovered the main problem was that they had blurred the difference between their databases and their caches. That is, they had no clear concept of the current Truth about their system. Was a user currently active? Had that user paid their membership fees? At times it was impossible to know, because user data was stored in multiple locations with no one location being considered the source of ultimate truth.
Over the next few months, great progress was made to improve the centralization of data, and this in turn helped smooth operations for everyone else, including the customers, and also customer service (who got less and less angry complaints from the customers, as the software improved).
But let's back up a bit. Towards the end of my second week is when I started having odd interactions with a programmer named Pei, a programmer who had been at the company for four years and who therefore had been there longer than any other member of the tech team. This was a text exchange we had on Slack (he was in another city, so I could not meet with him directly):
Me: Hi, Pei. I haven't yet had a chance to talk to you one-on-one. You are the most experienced software developer at this company, so I'm eager to hear your ideas about how the company should move forward. Can we schedule some time to talk?
Pei: Hey, welcome. I'm glad you signed up. We have some fun stuff ahead. I'll have to get back to you on meetings.
Me: Thank you. I'm excited to be here. My schedule is fairly flexible, so just let me know a time that's available on your side, and we can put it on the calendar.
Pei: Sure. You should focus on learning about the company. Your first few weeks, you'll need to learn a lot.
Me: Absolutely. I want to learn as much as possible as fast as possible. That's why I'd like to talk to you, whenever you have some time.
Pei: Yeah, we'll be working together a lot. I can answer all of your questions.
Me: Yes, I was told you’ve been here longer than any other computer programmer?
Pei: Yes, four years. Nobody else was able to last that long.
Me: Great, so you understand where everything is and how it all ties together?
Pei: Yes, but I've rebuilt everything. Going forward the team will use my new version of the code. I put everything in Docker to speed future development.
Me: Awesome. Great job. I'd love to learn more about that, if you have any time in your schedule.
Pei: I don't have much time to talk. I'm facing hard deadlines. Massive hard deadlines. They keep piling more and more onto me. They think I can do anything and everything. I’m very busy.
Me: But you must have some time to talk?
Pei: Maybe not. I’ve got deadlines.
Me: I only need an hour of your time, at any point this week or next week.
Pei: You wouldn’t understand because you’re new here. I’ve got real responsibilities. They’ve dumped a lot on me. I keep this place alive.
What to make of this? Was he asking for pity? He seemed to have a lot of time to chat on Slack, but for some reason he didn't want to talk to me directly over video. I wasn’t angry, but I was confused by his demeanor. Was he being willfully obstinate or did he simply not realize what my role would be?
Me: I realize you are very busy, but it is important that we talk. From this point forward I’m going to play the main role in ensuring an architecture is put in place that will allow this place to continue to grow.
Pei: There are 11 main repos. I'm sending you some info on how they tie together. I wrote a bash script that will do the work for you. Just run the bash script.
Why use both bash scripts and also Docker to weave the code together? Why not use one or the other? That’s the kind of question I’d like to ask him. But first I needed him to commit to some time when we could talk.
Me: Fantastic. This will help me get things running on my laptop.
Pei: Yes, that is what I do. I join an organization, I figure out what it needs, I analyze the situation carefully, and then I do the actual work that makes life easier for everyone else. When I’m allowed to, I save organizations from chaos. My brain is designed for the meta layer of problems, the systemic problems. I see the big picture, and I fix problems at the scale of that big picture. The architectural layer. But I actually do the real work. I don’t sit around talking.
Whoa. There was a lot to unpack there. Was he accusing me of just talking, but not doing real work? And was it true that he saw the big picture and saved companies from chaos? If the code was a mess, and he was the longest serving member of the tech team, then shouldn’t he take some of the blame for the code being a mess? What did he mean when he said “when I’m allowed to?” Was he trying to say that someone had stopped him from fixing the problems in the code? Was he being defensive?
Me: Fantastic. As soon as you have time, I'd love to dive into the details. I’d like to know how the code got to be a mess, and how you think we should clean it up.
Pei: It will take you months to learn the details.
Me: Well, I'll learn as fast as I can.
Pei: You don't have to do everything on your own, thankfully. My role right now is kind of mixing into yours, but along with expectations of full-time development, so my time is much more limited than yours. I would just take a deep breath and give it a few weeks. You're already way ahead of where I was when I started, because I've done so much work to clean things up for you.
What was this? He had no idea what my responsibilities were because I hadn’t explained them to him yet. Why was he adopting this tone of voice? Again, I wasn’t angry, I was mostly just confused.
Me: I'm sure the team is grateful that you've managed to bring order out of chaos.
Pei: How well do you know Ruby On Rails? There is a kind of Zen to Ruby. Some people get it and some people don't. Let's plan at some point some practice sessions to make sure you are up to speed. If you plan major architectural achievements that require us to work together, you'll find Rails will be a good playground for that. I'll make sure your skills are current and you are able to work in Rails.
Wow. What was I supposed to do with that? My technical skills had already been vetted by the CTO, there was no reason for Pei to arrogate this responsibility to himself. He and I were both highly experienced engineers – he had about 15 years of experience, and I had 20. If he wanted to challenge my credentials, I wanted to have that conversation face to face over video, not merely in text messages on Slack.
Me: The CTO reviewed my previous work before I started here, but of course, when I have code to push, I'm sure you'll be part of the code review process. I look forward to whatever comments you might have at that time.
Silence. An hour went by and he didn't write anything. It is possible that he was called into another meeting, or he had some other work to do, or maybe he was trying to snub me. One problem with communication over Slack, versus talking to someone in an office, is that there are more ways for miscommunication to develop. What does the silence mean? And then:
Pei: Ok, I think what you need to do is gather up your most important questions and go after those goals first. You need to prioritize. You won't be able to do everything, so you're going to have to figure out what the most urgent issues are. If you try to do everything at once, you're simply going to fail.
Me: You are right, we need to prioritize. I'd like to get your input. That's why I'd like to schedule a one-on-one meeting.
Pei: Just so long as you understand, this won't be easy. I'm worried you think this is easy. The code is complex. There is no simple fix. This is going to take real work. So think about what your top priority is. You need to get that right, or you will fail.
Why was he telling me how to do my job? Before I'd even started, I wrote a 10 page document full of standard questions that I use to orient myself quickly at a new company. My questions roughly follow what Amazon now refers to as the "AWS Well-Architected framework." Like the framework, my questions revolve around six pillars: operational excellence, security, reliability, performance efficiency, cost optimization, and sustainability. I'd already discussed this with the CTO and we'd agreed that operational excellence and reliability were the two points of real crisis.
But even more so, why should I trust Pei’s judgement? The code was a complete mess and he was the most senior engineer, serving for the longest amount of time. Maybe he was the reason the code was a mess. Maybe the situation struck him as complex because he was incompetent. I needed to evaluate his skills before I could trust any of his assessments. He was boldly claiming that he needed to assess my skills, which was an oddly aggressive move on his part. It was as if he wanted to go on offense before I had him on defense. But again, I wasn’t angry, I was just puzzled.
Was Pei jealous? Perhaps he felt that he should have been given the role of coming up with a rescue plan? That would be interesting to talk about, directly, during our one-on-one meeting. But again, I did not want to have such a conversation through a series of sniping remarks on Slack.
So, wait, who was this guy?
I reviewed Pei's resume and I spoke to the project manager about him. Here is what I learned: he has 15 years experience, all of it as a Ruby On Rails engineer. He has no management experience. He has no substantial experience with other programming languages. He has no experience with infrastructure (devops). From this I concluded: when it comes to Ruby on Rails he is far more talented than I will ever be. I'm a generalist who has done professional work in eight different languages, plus I've done substantial infrastructure (devops) work, plus I have substantial management experience. He is a specialist who knows Rails deeply.
A good argument can be made in favor of Pei, and he is the person who should make that argument. But he shouldn't be making it to me. He should have made it to the CTO. Before I was ever called in to help this company, Pei could have asked for a one-on-one meeting with the CTO and then said: "I am a great engineer, and it is time for me to begin to gain management experience. I'd like to be given the role of overseeing the revamp of our overall system. We don't need to bring in an outside consultant such as Lawrence, instead just give the whole job to me." And then the CTO would have said yes or no. If yes, then great, Pei has the job of his dreams. If no, okay, then Pei has to decide if he can live with that decision, or whether he should quit and find a place that sees his potential the same way he sees it. Either way, direct, honest, one-on-one communication with the CTO is going to give him clarity about his potential and his future. Sniping at me in Slack does nothing. It's stupid, but worse than that, it is ineffective.
And again, I wasn’t angry with Pei, I simply thought his behavior was self-destructive. If he wanted to be in charge of redesigning the software, he needed to ask for that responsibility. And if he lacked the confidence to ask for it, then it was understandable that he was angry with himself, but I couldn’t allow him to vent his frustration in various indirect passive-aggressive ways. Whatever he needed to say, he needed to say it to his CTO, not to me.
Still, he couldn't avoid me forever. The next week I finally got him to agree to a one-on-one conversation, via video. And when we finally spoke that way, I was surprised by how meek he was.
Me: So, I see two issues as being central. One, the data. We need to have a clear source of truth. And the other big issue is monitoring, broadly defined. We are currently flying blind. The engineers have some intuition about what is working and what is broken, but we don't have many facts.
Pei: Yes, I agree.
Me: We don't know which database queries are slow. We don't know which parts of the code generate the most bugs. We don't know how often API calls to 3rd parties fail. We have no integration tests, no health checks, no log analysis.
Pei: I agree, this is important.
Me: So I'm thinking we need to get more monitoring in place, more unit tests, more integration tests, more real-time health checks.
Pei: Yes, I agree.
Me: Towards that end, we also need to put in place a CI/CD system, from where we can run the tests. Also, it will give us more flexibility in setting up test environments for the development team.
Pei: Yes, that is true.
Me: If we start using Docker in production, the CI/CD tool can also do that for us.
Pei: Yes. I also suggest setting up our infrastructure to run Kubernetes.
Me: We wouldn't ever run Kubernetes ourselves.
Pei: Why? We could get security, scalability, isolation, everything we need, if we commit to the combination of Docker and Kubernetes.
Me: We won't ever run Kubernetes ourselves. We might run Docker on AWS Fargate, which I think uses Kubernetes under the hood. But we can rely on some other service to do that for us. We won't do it ourselves, we don't have the time or resources to deal with that extra layer of complexity.
Pei: I feel like you haven't really thought about this.
Me: Actually, I have thought about this and I have discussed this with the CTO and my final decision is that we can rely on other services to run our Dockerized apps. We don't need to run Kubernetes ourselves.
Pei: Um... okay.
Me: Are we agreed these are the priorities?
Pei: Sure. Let me know how I can help.
Me: I will. Thank you.
Pei: I'm just here to help.
Me: Thank you.
I have dealt with this personality type before: unable or unwilling to express their frustrations in a face to face conversation, their frustration instead leaks out in a series of oddly aggressive text messages, either in email or in a chat app like Slack.
Going forward, I'd have to adjust my style with Pei, recognizing that what he truly felt would be expressed in passive aggressive text messages, and I'd just have to filter out the aggression and focus on whatever grain of truth remained.
And again, I wasn’t angry with Pei, if anything I felt sorry for him. He was the type who lacked the confidence to advocate for himself. Sadly, his career would probably never reach the heights that he thought he deserved, because he was too shy or too introverted to do a good job of selling himself to the top leadership.
I'm happy to say, once we started having regular one-on-one conversations, the amount of weird aggression he expressed in text messages slowly decreased.
For anyone who is a bit like Pei, my recommendation is that you force yourself to do more one-on-one conversations. This is especially true if you ever hope to move into management, but it's also true if you never want to go into management. Such conversations will force you to move beyond your comfort zone. If you can get used to direct, honest, respectful communication in a one-on-one setting, you will become far more effective in your career, at whatever level you want to operate. You don't need to shout, and you don't need to use curse words, you just have to be direct, straightforward, and honest.
Does this honesty run the risk that someone, sometime will think you are arrogant? Maybe, but it is better to come across as slightly arrogant, while setting a firm boundary, than to try to please people by saying things that you don’t really mean. As an example, I had two alternatives regarding Pei (aside from being honest). I could let him think we would build our own Kubernetes infrastructure, only to tell him the truth a month later, at which point he could accurately accuse me of lying to him. Or I could simply give in and do what he wanted (build our own Kubernetes infrastructure), risking my reputation and my career on a strategy that I thought was a mistake, all because I wanted to keep some random software developer happy. Do either of these options seem wise?
Listen to others, keep an open mind, but in the end you have to advocate for what you honestly believe. And as much as possible, demand the same from others.
Now, everything that I have so written so far, about Pei, is a true story that I first wrote for my weblog. At least one person seems to have misunderstood my story and commented on Twitter (@Maries_Dad1976):
You “highly educated” folk have built a bizarre world of human interaction that isn’t human in the least. I read the entire article. If you were negatively affected by that interaction with Pei, then you do not understand what real conflict is. Like, at all.
To which I would say:
Pei was negatively affected because he was undermining his own career. My criticism isn't, "Pei showed emotion! He showed anger! This is bad!" Just the opposite: he struggled to hide his anger, when he should have shown confidence in himself, and he should have expressed himself directly to the CTO. If anything, within reasonable bounds, he should have shown more anger. But not to me. He should have expressed that to someone who could actually give him what he wanted.
If you want a promotion, go talk to the person who can give you that promotion. If you want investment money for your startup, go talk to a VC. If you want more time to work on refactoring the company’s software, go talk to the project manager who controls the schedule. But if you spend all of your time griping to the janitor, the two of you may eventually agree that the whole company sucks but the janitor probably cannot give you a promotion, or money for your startup, or more time to work on refactoring the company’s software, or whatever else you might want.
To be clear, this company paid me an absurd amount of money to come in and help them reorganize. If Pei wanted that money for himself, he should have said something to the CTO. But he stayed silent, and then later he was angry with himself, and he behaved in an almost juvenile manner, trying to defy my authority, because he wanted that authority for himself, even though he had never clearly asked for that authority.
Why did I get the job instead of Pei? I don’t know. It is possible the CTO did not think highly of Pei. In which case, it was up to Pei to either convince his boss otherwise, or to quit and find a better, happier place to work.
But again, at no point was I angry with Pei. I was initially confused by him, and then later I felt sorry for him. He sabotaged his own career because he lacked the confidence to ask for what he thought he deserved. And then his frustration leaked out in a series of passive-aggressive text messages which did absolutely nothing to help him.
My advice: don't do anything that is going to cause you to later hate yourself.
But this is also true: the above is only my advice to Pei. My advice to a manager would be different. Sometimes you might have an employee who is gifted but shy, in such cases you should promote them before they even ask. I discuss this in Some of the best people will say all of the wrong things during an interview – you should hire them anyway. An employee needs to promote themselves to management, but management should be discovering the talent on the team even when it doesn’t promote itself. The two sides need to reach out to understand each other.
Idk why I'm up at 4 am reading your posts Lawrence but I am eating it all up like candy. you're a fantastic storyteller and clearly strong technically too. this is a great example of the blending of those two things to create some actual learnings for people reading this. I ain't like Pei but I've worked with people like that person - I think there's a bit of Pei in all of us engineers though
Great insight and advice!