NVC: Non-Violent Coding (ultra draft, not even close to be ready to publish)
Programmers get paid to communicate. We use code to communicate intentions to computers. We use chat messages and standups as ways of communicating with co-workers. The better we are at communication, the better our programs and communities will be. To that end, I want to introduce you to Non-Violent Communication. It's my goal to build safety and promote community in online spaces. NVC can be a great tool to help meet that goal. In this post I'll break down the building blocks of NVC and share a concrete example from my recent experiences.
NVC Building blocks
NVC is a evidence based communication model that got started in the midst of civil rights activism in the 1960s. It was then formalized as part of a master's thesis in 2008. Since then more than fourteen masters and doctoral thesis have tested the model and validated it's effectiveness. You can read more about the history and details of why it works on wikipedia.
The core of NVC is:
- Observe: State what you saw/observed.
- Emote: State how that observation made you feel.
- Need: What do you, as a human, need (independent of a specific request).
- Request: What specific action do you ask for from the recipient (Note that a request is not a demand).
Programmers are communicators. We need to learn to develop societal relationships based on partnership and respect rather than "retributive, fear-based, domination" quote.
Cop an example from Reddit
I am a moderator on /r/ruby on Reddit. I'm heavily invested in making that online watering hole a decent and fun place to hang out. A few months ago, there was a series of events over the request to rename a gem. First, someone posted a link to the request. Then the next day, someone posted a blog post about it. Both comment sections erupted into full-blown flaming-warfare. I didn't see the first one come in but was around for the second. I locked it down and wrote a reply showing different ways of communicating different perspectives using the above NVC framework.
To understand my reply, you need to know that the gem has the name "cop" in it. The United States was in the middle of protests against extra-judicial killings by police. Some devs wanted the name changed, some did not. Here's a few examples of less-than-stellar communication techniques used on the post.
- "from the people that actually use [gem name]". This is a logical fallacy called "No true Scotsman". It's trying to claim moral purity and superiority of the position by claiming people who take the opposite position are not "true users" of [gem name].
- Claiming that attempts to change the name are "policing [...] to do as they say",. i.e., basically saying "no, you're the real police if you want to police the name of this gem". The people asking for the name change are not authority figures and are not above the law. This is a false characterization of their action and ask.
- "This is beyond insane" name-calling—also ableist. I think "outrageous" is a pretty good reasonable replacement but still lacks clarification. Unless you state "why," it is outrageous to you, and how you feel, you're projecting your feelings on the others and assuming they feel the same way. Ridiculous is good too, but again... I need to state why.
- "This is just so dumb" more name-calling.
- Saying that if you're white, you cannot care about racial issues or that a campaign lead by white people is less valid. I recommend y'all read "White Fragility" and other anti-racist books.
- Claiming we need to keep our politics out of X/Y/Z. Unfortunately, everything we do is political. For some of us, existence is political.
- Claiming this is not going to accomplish anything, so, therefore, we shouldn't do it. It's OK that you don't think this change is very impactful, but that's a personal lens, not an objective fact. State your opinions as opinions.
- "Get over yourself" - the notion that you caring about a thing is, in fact, the problem, is well...a problem.
Rather than trying to "win" via dominating the conversation. NVC has a very different feel. Here's an example of how a pro and con comment could have been written:
- Observe: I see that people are protesting police brutality all over the world.
- Emote: It makes me uneasy that this project glorifies the work of "cops" and presents them as always right.
- Need: I need to express this outrage in every venue possible
- Request: Will you consider removing it?
- Observe: I'm watching people call for the change of the gem name.
- Emote: I'm confused as the movie "[gem name]" is supposed to be a satire of '80s policing, and the actions of the linter are effectively described as an "enforcement".
- Need: I .
- Request: I would like to discuss other ways we can protest police brutality instead.
These are wordy, but I believe that they get their points across well without dipping into yelling or insults. My post on the thread was picked up and shared as a positive example with other Reddit moderators.
Needs and goals
NVC is based on the assumption that all human beings have capacity for compassion and empathy and that people only resort to violence or behavior harmful to others when they do not recognize more effective strategies for meeting needs.quote.
In the above example people were disagreeing violently because, they might not know how to disagree non-violently. At the end of the day everyone wants what is best for the Ruby community. There are disagreements on how to get there, but we can recognize
Communication as Code
When I worked at Gowalla, a co-worker mentioned they hated when I had misspellings and grammar mistakes in my commit messages. I didn't care about it and dismissed the criticism.
Until they described the sensation of reading one of these commits while trying to understand what I was talking about. "When I hit a misspelled word, it's like hitting syntax error in code," they had to stop everything, handle the exception, and figure out my intent before moving on. In this case, my intent in writing the message was to convey information. However, the method I was using (not-spell checking and including grammar errors) lead to confusing and ambiguous communication.
When communicating with text, the "how" is just as important as the "what" of the message. People are not mind-readers and shouldn't have to be. NVC is a tool in your communication toolbox to improve clarity and bring intent and execution of the written word closer together. I use these tactics everywhere, from bug report comments to slack messages. I use NVC in my open source projects and on work email threads. I even practice it in person with my kids and friends.
To sum up the post using the NVC paradigm: "I see people posting comments in my communities and accidentally missing one another. This makes me feel sad that we can't communicate better. I need a strong online community. Because I'm a remote worker, my "online" communities are also my "real" communities. I ask that you consider adopting tools for better communication, such as NVC."
The case of an Accidental shit-poster?
Text communication strips off all context, so it's easy to accidentally shit-post. Many commenters might not realize that the author of a post will be reading their comment. They might not realize that ANYONE will read their comment. I often see people's personal frustrations redirected (unfairly) at others online. Here's an example:
When will the goddammit GIL be removed?
To which I responded back:
I removed your comment. If you've got a serious question, please ask it without attack or profanity.
As for your actual question and apparent hatred toward the GIL (known as the GVL since Ruby 2.0) you seem to be misinformed about its purpose and intention. It cannot easily be removed, and moving away from it would require more locking or more chaos. You can try a GIL/GVL free alternative such as JRuby if you want. But MRI likely won't "remove" the GIL any sooner than Python would (which is to say that it won't).
They responded back, defending their post. Likely because I didn't do a great job employing NVC in my response to them. So I responded again:
My main issue is around your language and tone. If you want to have a conversation around this, that's great. With just your first message, it's hard to know if you're just a troll or you actually want a meaningful conversation.
This link is great. If you want to have a conversation around changes with the GIL and "when it will be removed", that's great.
I would say that with Ruby 3, we technically no longer even have a GVL and now have a per-tractor lock, which I guess could be considered successfully removing the GIL. It depends on how "removing the Gil" is accomplished and what the success criteria look like.
I would also add that Matz has repeatedly said in an interview in the last 6 years since that was tweeted that removing the GIL (wholesale) is not a reasonable goal. It's a common question at RubyConf's over the years.
What would you guess the commenter responded after this post?
My apologies for my rudeness.
Wow. Going into my comment, I genuinely have no idea who I'm dealing with. It appears I've found a developer who is frustrated and isn't intentionally stirring up shit. I've had several successes with people walking back from inflammatory language when confronted (using NVC techniques) as I'm not escalating the situation. Using NVC doesn't guarantee success, but it makes it more likely.
Note: While I'm an admin in these conversations and, therefore, my voice has more authority, I 100% use the same tools and techniques in plenty of other communities that I don't have special privileges.
Comments don't happen in a vacuum
About a month ago, someone commented on a blog post about a 1.0 announcement of a code formatting library. They quoted part of the article, and they added this simple commentary:
And they fucked up the most basic things.
To this, I responded:
The devs of this library are on Reddit. Can you give your opinion as a critique rather than a criticism/attack?
If you're struggling with how to word things constructively, I recommend Non-Violent Communication (NVC). It can help you fully share your opinions without needing to hold back and without attacking.
Unlike before, they didn't change their tune or apologize. However, the comment was down-voted into oblivion. If you're looking for a way to engage with behavior you don't like and you don't feel comfortable commenting, then downvoting is an option. Also, as a side note, I usually disable comment replies everywhere I can. I go back and look at them manually when I'm in a reasonable frame of mind. Before I did this, I noticed that people tend to want to have "the last word" in a comment disagreement/argument. Every time I saw the orange dot indicating "new reply" on my profile, my adrenaline kicked in, and I started "armoring up" for a fight. It wasn't healthy.
Less profanity, just as much negativity
It can be easier to determine "over the line" comments if someone uses a direct attack or profanity. Here's a more nuanced case:
Real programmers don't need active_support to handle dates (but can choose to use it when it makes sense), as ruby has its own library, and active_support only extend it nice to have features.
In this case, one of the other mods pinged me, and the comment already received many downvotes. Someone responded to it:
"real programmers" Lmao
It's not very NVC. To which the author responded:
[I have a] way of speaking, tend to forget on internet people don't know my way of expressing. But if you need to use rails libraries to do ruby, you're not a ruby developer, but a rails developer. Way too much people proclaim to be ruby developer but can't do much once we take rails off.
Basically, while they got the message that their comment was not being taken positively, they felt they had to defend it.
After talking about it, the other mod removed the original comment, and I wrote up a reply:
Hello! The mods noticed you got a ton of downvotes here and didn't feel the comment was adding to the conversation, and we removed it. I want you to have a happy and productive experience on /r/ruby. We want you to express your opinions. We also want you to be aware of the community norms around this issue.
Real programmers don't need active_support to handle dates.
I think this is the biggest issue. The trope of "real programmer" is seen by many to be toxic and gatekeeping.
[I have a] way of speaking, tend to forget on internet people don't know my way of expressing.
It's effortless to be misunderstood on the internet. In the future, I recommend if you find people taking issue with your post, consider that as a sign that your communication is not clear. I recommend the framework "NVC" (non-violent communication) when things might be misconstrued. It helps increase the chances people will understand your intent. Likewise, if I'm making a joke with sarcasm, I use
/sat the end to make that clear.
This line you posted is good, but the reason it's being downvoted is the follow-up you're not a ruby developer" is doubling down on the problematic framing. People don't like gatekeeping. We try to keep /r/ruby open and friendly.
How do you think this person responded?
Thank you for the feedback. I highly appreciate it.
While I don't know what's happening on their end, I see that they've taken the opportunity to acknowledge my feedback. They didn't feel the need to armor up further or dig a more giant hole. While I might not change how they feel about "real programmers" (yuck at this concept), I've communicated that this is not a value that the community shares. That message was received and acknowledged. An apology would have been better, but honestly, acknowledging was more than I was expecting in this scenario.
I've been reading Building Successful Online Communities" (MIT Press), which is a research-driven look at how online communities are shaped and grow. I'm not done yet. Still, it has cemented the concept that there is "no neutral" when it comes to communities. With this in mind, I've been a bit more active and aggressive around moderation. Not-moderating something is as much of an action as moderating it.
Isn't this info useless? Its quite obvious. Hardly anyone will see it in the wild. And result is quite predictable and can hardly break anything.
The author responded, very graciously if you ask me:
Thanks for the honest feedback. I wrote this blog because I was expecting splatted nil to be nil in an array and though many people would assume the same.
Also, Matz is nice.
Hey, no offense :) its good you are learning and sharing your thoughts! But only real feedback may help you grow, in my opinion. [...]
At this point, I stepped in:
Here's some real feedback: if you come across as a jerk, your feedback will be disregarded. Even if it's not personally relevant or interesting to you, please be respectful to the author.
Do not pretend "isn't this useless" is anything other than an unkind jab at the author.
If you're having difficulty seeing why it's unkind, then I recommend investing in reading about Non-Violent Communication (NVC).
I could have worded this perhaps a bit better from an NVC standpoint. Basically, I'm trying to say I observed them using "isn't this useless", which I saw as an attack and intentionally being a jerk. This made me feel that my community is being attacked. I need a safe and supportive community. I request that people critique instead of criticizing other devs work, mostly work that's being provided for free". Which would have been a better response, as my original is a little attack-y.
They responded to my escalation:
Good luck to have any progress and evolution in non violent, smooth-edged and hyper tolerant environment
I didn't think this was going to end well, I did want to make it clear what my expectations were, though:
I don't need luck. I've got a block button. Will you agree to work on your attitude?
Yeap, totally predictable – cancellation culture is the only weapon of tolerants :)
It seems that you should only feel sorry for people who think that «Doesn't matter what you do, unless you directly harm other person». On the other hand, it makes other people plow like crazy, while first – just take it easy and drink their smoothies :) [...]
Then I blocked them for 3 months. I'm not perfect. I make mistakes. I try to be patient, but my patience is not limitless. I am very grateful for those "daring greatly" in the arena and sharing their learning with the public—the critic, less so.
Note: If you've not seen it before, I recommend reading up on the Paradox of Tolerance.
I came to this concept of NVC through my personal therapist. I have a hard time asking for things from others as well as sharing how I'm feeling. NVC helps me because it allows me to plainly state what's going on in my head while minimizing the fear that my intentions and desires will be misinterpreted.
Most people that I think could benefit from NVC online have the opposite issue. While I'm worried I might accidentally create conflict where there is none, many actively seek confrontations as a way of communication. Suppose you're trying to talk to someone in real life, and that person is insulting you regularly. In that case, you're not going to have a productive conversation. Online communication is no different. By using NVC techniques, you'll increase the likelihood that your main point will actually be heard. When people feel attacked, they put up defenses. When people are invested in guarding themselves, they're not listening.
In the middle of these two ends of the spectrum, there's also the "accidental shitposter". Someone who is not afraid to speak their mind and not actively looking to insult, hurt, or dominate. These people might speak "as if talking to a friend," and sometimes, friends tease and taunt one another. Unfortunately, text communication strips all context. So what one person might think of as light critique, another might interpret as a full-blown criticism. Using NVC helps by making intent and context clearer.
In addition to these positive examples of how people could communicate, I included some negative examples as well.
While not all written communication needs to be structured in an NVC framework, there are plenty of times that it's clear the conversation is heated already. Using NVC might not "win" the argument. Your "request" might still go un-fulfilled. What it can strengthen is that your voice was heard.