# Proposal: A Code of Conduct for the Go community

Author: Andrew Gerrand <adg@golang.org>

Last updated: 17 November 2015

## Abstract

This proposal specifies a Code of Conduct for the Go community.
The code is to be enforced in all project-operated spaces (specified
in the Code of Conduct text, below). Other Go-related spaces (forums,
events, etc) are encouraged to adopt the code as well.

## Background

Since Go’s release over 6 years ago, a sizable community has grown around the
language. The golang-nuts mailing list has more than 17k members and receives
thousands of posts each month, and there are many major Go conferences each
year with thousands of attendees.

Today the various Go spaces are moderated by people that are unknown to the
public and with no specified policy. It is not clear to the members of these
spaces how they are expected to conduct themselves. In the rare cases where
people are banned, they are afforded no recourse.

For a community of this scale to grow and prosper, it needs guidelines
to encourage productive and positive participation, and a process for
resolving conflict when it inevitably arises.

The community must also grow to survive. An explicit goal of this proposal
is to promote cultural diversity within our community and thereby make it more
welcoming and inclusive. 

## Proposal

A Code of Conduct document is added to the “go” repository as
`doc/conduct.html`, visible on the web at https://golang.org/conduct.
The document is linked prominently from official Go spaces (such as the
golang-nuts mailing list).

The document text is as follows.

---

### About the Code of Conduct

#### Why have a Code of Conduct?

Online communities include people from many different backgrounds.
The Go contributors are committed to providing a friendly, safe and welcoming
environment for all, regardless of age, disability, gender, nationality, race,
religion, sexuality, or similar personal characteristic.

The first goal of the Code of Conduct is to specify a baseline standard
of behavior so that people with different social values and communication
styles can talk about Go effectively, productively, and respectfully.

The second goal is to provide a mechanism for resolving conflicts in the
community when they arise.

The third goal of the Code of Conduct is to make our community welcoming to
people from different backgrounds.
Diversity is critical to the project; for Go to be successful, it needs
contributors and users from all backgrounds.
(See [Go, Open Source, Community](https://blog.golang.org/open-source).)

With that said, a healthy community must allow for disagreement and debate.
The Code of Conduct is not a mechanism for people to silence others with whom
they disagree.

#### Where does the Code of Conduct apply?

If you participate in or contribute to the Go ecosystem in any way,
you are encouraged to follow the Code of Conduct while doing so.

Explicit enforcement of the Code of Conduct applies to the
official forums operated by the Go project (“Go spaces”):
- The official [GitHub projects](https://github.com/golang/)
  and [code reviews](https://go-review.googlesource.com/).
- The [golang-nuts](https://groups.google.com/group/golang-nuts) and
  [golang-dev](https://groups.google.com/group/golang-dev) mailing lists.
- The #go-nuts IRC channel on Freenode.
- The [/r/golang subreddit](https://reddit.com/r/golang).

Other Go groups (such as conferences, meetups, and other unofficial forums) are
encouraged to adopt this Code of Conduct. Those groups must provide their own
moderators and/or working group (see below).

### Gopher values

These are the values to which people in the Go community (“Gophers”) should aspire.

* Be friendly and welcoming
* Be patient
   * Remember that people have varying communication styles and that not
     everyone is using their native language.
     (Meaning and tone can be lost in translation.)
* Be thoughtful
   * Productive communication requires effort.
     Think about how your words will be interpreted.
   * Remember that sometimes it is best to refrain entirely from commenting.
* Be respectful
   * In particular, respect differences of opinion.
* Be charitable
   * Interpret the arguments of others in good faith, do not seek to disagree.
   * When we do disagree, try to understand why.
* Avoid destructive behavior:
   * Derailing: stay on topic; if you want to talk about something else,
     start a new conversation.
   * Unconstructive criticism: don't merely decry the current state of affairs;
     offer—or at least solicit—suggestions as to how things may be improved.
   * Snarking (pithy, unproductive, sniping comments)
   * Discussing potentially offensive or sensitive issues;
     this all too often leads to unnecessary conflict.
   * Microaggressions: brief and commonplace verbal, behavioral and
     environmental indignities that communicate hostile, derogatory or negative
     slights and insults to a person or group.

People are complicated.
You should expect to be misunderstood and to misunderstand others;
when this inevitably occurs, resist the urge to be defensive or assign blame.
Try not to take offense where no offense was intended.
Give people the benefit of the doubt.
Even if the intent was to provoke, do not rise to it.
It is the responsibility of *all parties* to de-escalate conflict when it arises.

### Unwelcome behavior

These actions are explicitly forbidden in Go spaces:

* Insulting, demeaning, hateful, or threatening remarks.
* Discrimination based on age, disability, gender, nationality, race,
  religion, sexuality, or similar personal characteristic.
* Bullying or systematic harassment.
* Unwelcome sexual advances.
* Incitement to any of these.

### Moderation

The Go spaces are not free speech venues; they are for discussion about Go.
These spaces have moderators.
The goal of the moderators is to facilitate civil discussion about Go.

When using the official Go spaces you should act in the spirit of the “Gopher
values”.
If you conduct yourself in a way that is explicitly forbidden by the CoC,
you will be warned and asked to stop.
If you do not stop, you will be removed from our community spaces temporarily.
Repeated, wilful breaches of the CoC will result in a permanent ban.

Moderators are held to a higher standard than other community members.
If a moderator creates an inappropriate situation, they should expect less
leeway than others, and should expect to be removed from their position if they
cannot adhere to the CoC.

Complaints about moderator actions must be handled using the reporting process
below.

### Reporting issues

The Code of Conduct Working Group is a group of people that represent the Go
community. They are responsible for handling conduct-related issues.
Their purpose is to de-escalate conflicts and try to resolve issues to the
satisfaction of all parties. They are:

* Aditya Mukerjee <dev@chimeracoder.net>
* Andrew Gerrand <adg@golang.org>
* Dave Cheney <dave@cheney.net>
* Jason Buberel <jbuberel@google.com>
* Peggy Li <peggyli.224@gmail.com>
* Sarah Adams <sadams.codes@gmail.com>
* Steve Francia <steve.francia@gmail.com>
* Verónica López <gveronicalg@gmail.com>

If you encounter a conduct-related issue, you should report it to the
Working Group using the process described below.
**Do not** post about the issue publicly or try to rally sentiment against a
particular individual or group.

* Mail [conduct@golang.org](mailto:conduct@golang.org) or
  [submit an anonymous report](https://golang.org/s/conduct-report).
   * Your message will reach the Working Group.
   * Reports are confidential within the Working Group.
   * Should you choose to remain anonymous then the Working Group cannot
     notify you of the outcome of your report.
   * You may contact a member of the group directly if you do not feel
     comfortable contacting the group as a whole. That member will then raise
     the issue with the Working Group as a whole, preserving the privacy of the
     reporter (if desired).
   * If your report concerns a member of the Working Group they will be recused
     from Working Group discussions of the report.
   * The Working Group will strive to handle reports with discretion and
     sensitivity, to protect the privacy of the involved parties,
     and to avoid conflicts of interest.
* You should receive a response within 48 hours (likely sooner).
  (Should you choose to contact a single Working Group member,
  it may take longer to receive a response.)
* The Working Group will meet to review the incident and determine what happened.
   * With the permission of person reporting the incident, the Working Group
     may reach out to other community members for more context.
* The Working Group will reach a decision as to how to act. These may include:
   * Nothing.
   * A request for a private or public apology.
   * A private or public warning.
   * An imposed vacation (for instance, asking someone to abstain for a week
     from a mailing list or IRC).
   * A permanent or temporary ban from some or all Go spaces.
* The Working Group will reach out to the original reporter to let them know
  the decision.
* Appeals to the decision may be made to the Working Group,
  or to any of its members directly.

**Note that the goal of the Code of Conduct and the Working Group is to resolve
conflicts in the most harmonious way possible.**
We hope that in most cases issues may be resolved through polite discussion and
mutual agreement.
Bannings and other forceful measures are to be employed only as a last resort.

Changes to the Code of Conduct (including to the members of the Working Group)
should be proposed using the
[change proposal process](https://golang.org/s/proposal-process).

### Summary

* Treat everyone with respect and kindness.
* Be thoughtful in how you communicate.
* Don’t be destructive or inflammatory.
* If you encounter an issue, please mail conduct@golang.org.

#### Acknowledgements

Parts of this document were derived from the Code of Conduct documents of the
Django, FreeBSD, and Rust projects.

---

## Rationale

*Do we need a Code of Conduct?*
Some community members have argued that people should be trusted to do the
right thing, or simply ignored when they do not.
To address the former: there are varying definitions of the “right thing”; a
Code of Conduct specifies what that means.
To address the latter: if we allow destructive forms of communication (those
that go against the "Gopher Values") to flourish, we will be left only with
people who enjoy that kind of communication.

The CoC also makes moderation processes more transparent: the various Go spaces
have always been moderated spaces, but the rules were never written down.
It seems better to be explicit about the behavior we expect in those spaces.

*Why write our own?*
There are many existing Codes of Conduct to choose from,
so we could have saved some time by simply re-using an existing one.
This document does draw heavily on existing documents such as the Rust,
FreeBSD, and Django Codes of Conduct, but it includes some original material
too.
I opted for this approach to specifically address the needs of the Go community
as I understand them.

*Is behavior outside Go spaces covered by this CoC?*
An earlier draft of this proposal included a clause that behavior outside Go
spaces may affect one’s ability to participate within them. After much
community feedback, I removed the clause. It was seen as unnecessarily
overreaching and as providing an opportunity for malicious people to oust
community members for their behavior unrelated to Go.

*The “Gopher Values” are not my values. I consider myself part of the Go
community; shouldn’t the CoC represent me, too?*
Members of the Go community are from many different cultures; it would be
impossible to represent the full range of social norms in a single document.
Instead, the values described by the CoC are designed to reflect the lowest
common denominator of behavior necessary for civil discourse.
Community members (including the author of this document) whose norms may be
regarded by others as impolite or aggressive are expected to be self-aware and
thoughtful in how they communicate to avoid creating conflict.

*The Code of Conduct document seems unnecessarily long.
Can’t it just be a version of the Golden Rule?*
The Go community comprises thousands of people from all over the world; it
seems unrealistic to assume that those individuals should have compatible ideas
about how to get along with each other.
By describing the kind of behavior to which one should aspire, and those
behaviors that are explicitly forbidden, we at least give all community members
an idea of what is expected of them.

Note that *this* document is a proposal document; the Code of Conduct itself is
a subset of the proposal document and is about 1,200 words long, including the
description of the reporting process. The “Gopher Values” section—the meat of
the thing—is under 300 words.

### Examples of CoC issues and their resolutions

These fictional examples show how community members and the working group might
use the Code of Conduct’s guidelines to resolve a variety of issues. In each
case, the goal of the intervention is to raise the level of discourse and to
make people feel welcome in our community spaces.

*Rude and unwelcoming behavior:*

* B and C are posting back and forth on a golang-nuts thread.
* D enters the conversation and proposes an alternative solution. 
* B and C ignore D and continue their discussion.
* D re-articulates their point in a different way.
* B responds to D by asking them to "butt out".
* C emails B privately, noting that B's reaction was uncalled-for, and suggests that B apologize to D.
* B replies that they have nothing to apologize for.
* C reports the incident to the CoC Working Group.
* E, a member of the working group, contacts B and C separately to get details on the incident.
* E asks B to apologize for being unwelcoming and rude, and notifies C that this action was taken.
* B acknowledges their mistake and apologizes to D.
* The issue is resolved.

In this case, B could have avoided conflict by just saying nothing, or by
responding politely to D’s messages. It’s not OK to be rude or exclusive in the
public forum. (If B and C want to discuss things privately, they should take it
off-list.)

*A classic troll:*

* B repeatedly posts about a particular issue, raising the issue on unrelated
  threads, as well as starting many redundant threads.
* The forum moderators warn B to stop, as derailing threads and spamming are
  against the CoC.
* B refuses and becomes belligerent, making insulting remarks about the
  moderators and other members of the community.
* The moderators ban B from the forum for 10 days, and post a message explaining this.
* The issue is resolved.

In this case, the goal is for the user to come back after a while and hopefully
be more productive in the future. We don’t want to ban them forever; it is
important to keep people with unpopular opinions around to prevent the
community from becoming an echo chamber.

*Condescending behavior:*

* B posts a message to /r/golang describing the approach they're planning to
  take for wrapping http.HandlerFunc and asking for feedback.
* C replies to the message "Why don’t you just do it the obvious way?" with an
  explanation of an alternate approach.
* D, a bystander to this exchange, replies “That may have been obvious to you,
  but you shouldn’t assume that it’s obvious to just anyone.”
* C replies “Well I guess you’re an idiot too, then.”
* E, a moderator, observes this interaction and sends a message to C to tell
  them their behavior is unacceptable.
* C insists there is nothing wrong with their behavior.
* E replies publicly to C on the original thread to say “Condescension and
  personal insults are not appropriate in this forum. Please observe the Code
  of Conduct when posting here.”
* The issue is resolved.

*A microaggression:*

* B has a typically female name and posts to a mailing list to announce a
  Go-to-Forth compiler they wrote.
* C replies “I am amazed to see a woman doing such great work. Nice job!”
* B writes to the CoC Working Group to say “I felt really deflated for my work
  to be seen as impressive just because I’m a woman. Can you say something to C
  for me?”
* D, a member of the working group, reaches out to C to explain how comments
  like that can make women feel out of place in technical communities.
* Recognizing the hurt C has caused, C sends an email to B to apologise.
* The issue is resolved.

In this case, we see the a working group member acting as a mediator for
someone who didn’t feel comfortable confronting someone directly.
The working group member D contacted C in private to discuss the issue,
to avoid bringing shame to C in public, since C apparently meant no harm.

*Impatient behavior:*

* B asks a seemingly simple question on the mailing list.
* C replies back with an answer and an additional comment to
  "RTFM before you ask simple questions!!!"
* B points out the small detail C overlooked in the question to clarify the
  complexity.
* C replies back "Ack! Sorry, I actually don't know."
* E enters the conversation and criticizes C for his behavior in his
  original reply, raising the issue further with a moderator.
* D, a moderator, replies to the list to ask C to be less impatient in their responses,
  suggesting they could have instead said something like "The docs cover this."
* The issue is resolved.

In this case, the moderators acted in a purely advisory role.

*An abrasive newcomer, a pithy response:*

* B makes their first post to golang-nuts:
  "What's the deal with Go's error handling mechanism? It's brain dead and stupid."
* C, a forum regular, replies “Oh no, not another one.”
* D, another regular replies (compensating for C) “Hi, welcome to the list. As
  I’m sure you can appreciate, this topic has come up many times before. Here
  are some links to previous discussions and articles that discuss the topic.
  Let us know if you have any questions that aren’t covered by those threads.
  Thanks.”
* E, a moderator, reaches out to C off list to ask them to refrain from this
  kind of pithy, unhelpful commentary in the future.
* There is no need for further action.

In this case, we see a community member (D) try to steer the discussion in a
productive direction, while a moderator tries to prevent future negativity
without creating a public drama.

## Compatibility

Some people feel stifled by the general concept of a Code of Conduct.
Others may find explicit efforts to improve diversity in our community
unpalatable for various reasons.
While a major goal of this proposal is to make the community more inclusive,
this does by definition exclude people that cannot abide by the goals and
principles of the code.
I see this as a regrettable but necessary and inescapable design tradeoff.
The implementation of the code may cause us to lose a few people, but we stand
to gain much more.

## Implementation

I (Andrew Gerrand) will submit the Code of Conduct text to the main Go
repository, so that it is available at the URL https://golang.org/conduct.
I will also set up the conduct@golang.org email address and the anonymous web
form. 

Then I will link the document prominently from these places:

* `README.md` and `CONTRIBUTING.md` files in the official Go repositories.
* The golang-nuts and golang-dev mailing list welcome messages.
* The #go-nuts IRC channel topic.
* The /r/golang subreddit sidebar.

I will work with the existing moderators of these spaces to implement the Code
of Conduct in those spaces, recruiting additional moderators where necessary.

Operators of unofficial Go events and forums are encouraged to adopt this Code
of Conduct, so that our community members can enjoy a consistent experience
across venues.

## Open issues

* The Working Group does not yet include anyone from Asia, Europe, or Africa.
  In particular, Europe and China are home to a large swath of Go users, so it
  would be valuable to include some people from those areas in the working
  group. (We have some volunteers from Europe already.)
* The proposed process does not "scale down" to projects of a single maintainer.
  Future revisions should permit a lightweight version of the process, but that
  is considered outside the scope of this document.

