I violated a code of conduct


Jeremy Howard


October 28, 2020

Update Oct 30, 2020: NumFOCUS has apologized to me. I accept their apology. I do not accept their assertion that “At the time of the interview, the committee had not determined that there was a violation of the code of conduct, only that there were two complaints filed and being examined.” The email to set up the call said “We would like to schedule a meeting so that we can discuss the results of our investigation with you” - nothing further. During the call, the committee stated the list of violations, and said “that is what the reporters stated, and what we found”. I asked why they didn’t take a statement from me before that finding, and they said “we all watched the video, so we could see for ourselves the violation”. The committee offered in their apology email to me to have a follow-up discussion, and I declined the offer.

Summary: NumFOCUS found I violated their Code of Conduct (CoC) at JupyterCon because my talk was not “kind”, because I said Joel Grus was “wrong” regarding his opinion that Jupyter Notebook is not a good software development environment. Joel (who I greatly respect, and consider an asset to the data science community) was not involved in NumFOCUS’s action, was not told about it, and did not support it. NumFOCUS did not follow their own enforcement procedure and violated their own CoC, left me hanging for over a week not even knowing what I was accused of, and did not give me an opportunity to provide input before concluding their investigation. I repeatedly told their committee that my emotional resilience was low at the moment due to medical issues, which they laughed about and ignored, as I tried (unsuccessfully) to hold back tears. The process has left me shattered, and I won’t be able to accept any speaking requests for the foreseeable future. I support the thoughtful enforcement of Code of Conducts to address sexist, racist, and harassing behavior, but that is not what happened in this case.


In my recent JupyterCon keynote, “I Like Jupyter Notebooks” (re-recording provided at the bottom of this post, if you’re interested in seeing it for yourself), I sought to offer a rebuttal to Joel Grus’ highly influential JupyterCon presentation “I Don’t Like Notebooks”. Joel claimed in his talk that Jupyter is a poor choice for software development and teaching, and I claimed in my talk that it is a good choice. The NumFOCUS committee found me guilty of violating their code of conduct for having not been “kind” in my disagreement with Joel, and for “insulting” him. The specific reasons given were that:

  • I said that Joel Grus was “wrong”
  • I used some of his slides (properly attributed) and a brief clip from one of his videos to explain why I thought he was wrong
  • That I made “a negative reference” to his prior talk
  • I was also told that “as a keynote speaker” I would “be held to a higher standard than others” (although this was not communicated to me prior to my talk, nor what that higher standard is)

Code of Conducts can be a useful tool, when thoughtfully created and thoughtfully enforced, to address sexism, racism, and harassment, all of which have been problems at tech conferences. Given the diversity issues in the tech industry, it is important that we continue the work of making conferences more inclusive, particularly to those from marginalized backgrounds. Having a code of conduct with explicit rules against violent threats, unwelcome sexual attention, repeated harassment, sexually explicit pictures, and other harmful behavior is the first step towards addressing and stopping those behaviors. The JupyterCon code provides the following examples of unacceptable behavior, none of which are at all similar to what I did (i.e. saying that someone was wrong on a technical topic, and explaining how and why):

  • Violent threats or violent language directed against another person
  • Discriminatory jokes and language
  • Posting sexually explicit or violent material
  • Posting (or threatening to post) other people’s personally identifying information (“doxing”)
  • Personal insults, especially those using racist or sexist terms
  • Unwelcome sexual attention
  • Advocating for, or encouraging, any of the above behavior
  • Repeated harassment of others. In general, if someone asks you to stop, then stop

My experience with the NumFOCUS code of conduct raises a few key issues:

  • The CoC enforcement process involved conflicting & changing information, no opportunity for me to give input, the stress of a long wait of unknown duration with no information about what I was accused of or what would happen next, and the committee members violated their own CoC during the process
  • There were two totally different Codes of Conduct with different requirements linked in different places
  • I was held to a different, undocumented and uncommunicated standard
  • The existence of, or details about, the CoC were not communicated prior to confirmation of the engagement
  • CoC experts recommend avoiding requirements of politeness or other forms of “proper” behavior, but should focus on a specific list of unacceptable behaviors. The JupyterCon CoC, however, is nearly entirely a list of “proper” behaviors (such as “Be welcoming”, “Be considerate”, and “Be friendly”) that are vaguely defined
  • CoC experts recommend using a CoC that focuses on a list of unacceptable behaviors. Both the codes linked to JupyterCon have such a link, and none of the unacceptable behavior examples are in any way related or close to what happened in this case. But NumFOCUS nonetheless found me in violation.

I would rather not have to write this post at all. However I know that people will ask about why my talk isn’t available on the JupyterCon site, so I felt that I should explain exactly what happened. In particular, I was concerned that if only partial information became available, the anti-CoC crowd might jump on this as an example of problems with codes of conduct more generally, or might point at this as part of “cancel culture” (a concept I vehemently disagree with, since what is referred to as “cancellation” is often just “facing consequences”). Finally, I found that being on the “other side” of a code of conduct issue gave me additional insights into the process, and that it’s important that I should share those insights to help the community in the future.


The rest of this post is a fairly detailed account of what happened, for those that are interested.

My talk at JupyterCon

I recently gave a talk at JupyterCon. My partner Rachel gave a talk at JupyterCon a couple of years ago, and had a wonderful experience, and I’m a huge fan of Jupyter, so I wanted to support the project. The conference used to be organized by O’Reilly, who have always done a wonderful job of conferences I’ve attended, but this year the conference was instead handled by NumFOCUS.

For my talk, I decided to focus on Jupyter as a literate and exploratory programming environment, using nbdev. One challenge, however, is that two years earlier Joel Grus had given a brilliant presentation called I Don’t Like Notebooks which had been so compelling that I have found it nearly impossible to talk about programming in Jupyter without being told “you should watch this talk which explains why programming in Jupyter is a terrible idea”.

Joel opened and closed his presentation with some light-hearted digs at me, since I’d asked him ahead of time not to do such a presentation. So I thought I’d kill two birds with one stone, and take the opportunity to respond directly to him. Not only was his presentation brilliant, but his slides were hilarious, so I decided to directly parody his talk by using (with full credit of course) some of his slides directly. That way people that hadn’t seen his talk could both get to enjoy the fantastic content, and also understand just what I was responding to. For instance, here’s how Joel illustrated the challenge of running cells in the right order:

I showed that slide, explaining that it’s Joel’s take on the issue, and then followed up with a slide showing how easy it actually is to run all cells in order:

Every slide included a snippet from Joel’s title slide, which, I explained, showed which slides were directly taken from his presentation. I was careful to ensure I did not modify any of his slides in any way. When first introducing his presentation, I described Joel as “a brilliant communicator, really funny, and wrong”. I didn’t make any other comments about Joel (although, for the record, I think he’s awesome, and highly recommend his book.

The Code of Conduct violation notice

A week later, I received an email telling me that two CoC reports were filed regarding my JupyterCon keynote presentation. I was told that “The Code of Conduct Enforcement Team is meeting tomorrow to review the incident and will be contacting you to inform you of the nature of the report and to understand your perspective”.

The CoC wasn’t mentioned at all until after I’d been invited to speak, had accepted, and had completed the online registration. I had reviewed it at that time, and had been a bit confused. The email I received linked to a JupyterCon Code of Conduct, but that in turn didn’t provide much detail about what is and isn’t OK, and that in turn linked to a different NumFOCUS Code of Conduct. A link was also provided to report violations, which also linked to and named the NumFOCUS CoC.

I was concerned that I had done something which might be viewed as a violation, and looked forward to hearing about the nature of the report and having a chance to share my perspective. I was heartened that JupyterCon documented that they follow the NumFOCUS Enforcement Manual. I was also heartened that the manual has a section “Communicate with the Reported Person about the Incident” which says they will “Let the reported person tell someone on the CoC response team their side of the story; the person who receives their side of the story should be prepared to convey it at the response team meeting”. I was also pleased to see that much of the manual and code of conduct followed the advice (and even used some wording from) the brilliant folks at the Ada Initiative, who are extremely thoughtful about how to develop and apply codes of conduct.

One challenge is that the JupyterCon CoC is based on Django’s, which has very general guidelines such as “Be welcoming” and “Be considerate”, which can be taken by different people in different ways. The NumFOCUS code is much clearer, with a specific list of “Unacceptable behaviors”, although that list includes “Other unethical or unprofessional conduct”, which is troublesome, since “unprofessional” can be catch-all gate-keeping mechanism for whatever those in the “profession” deem to be against their particular norms, and which those outside the in-group (like me) can’t be reasonably be expected to know.

Some of these issues are discussed in an excellent presentation from Valerie Aurora, who explains that “a code of conduct should contain” “behaviors which many people think are acceptable but are unacceptable in your community”, and that “If you want to list good behaviors or describe the community ideal of behavior, do it in a separate document”, and in particular “Do not require politeness or other forms of ‘proper’ behavior”. Pretty much all of the JupyterCon code of conduct is a list of forms of ‘proper’ behavior (e.g. “be friendly”, “be welcoming”, “be respectful”, etc.) While broader and more subjective values, such as “be kind”, can be useful as part of a conference’s values, it is less clear if or even how they should be enforced via a code of conduct.

Overall, I felt very stressed, but hopeful that this would be resolved soon.

The calls

The promised call happened the next day. However, the representative told me that they would not be informing me of the nature of the report at that time, and would not be seeking to understand my perspective at that time. I asked why the change of plans. The representative explained that they had had a committee meeting and had decided to wait until they had spoken to the two reporters.

I was stunned. The representative could not even commit to a time when they would get back to me, or tell me what would be happening next. I told them that I thought that telling someone that they had a violation report, but then not saying what it is, or when or whether they would be able to provide their side of the story, or providing any time-frame for any next step was cruel. I told them that my emotional resilience was not high, since I’ve been dealing with challenging family health issues, and that I hoped they would consider changing their approach for other people in the future, so they wouldn’t have to deal with an open-ended and obscure charge like I did.

The representative explained that I had “made at least two people feel uncomfortable”. I told them that I really didn’t think that was fair. We shouldn’t be held responsible for other people’s feelings. As a proponent of Nonviolent Communication I believe that we should share how we feel in reaction to the words or deeds of others, but should not blame others for these feelings. Furthermore, if it is a requirement that talks make people feel comfortable, that should be clearly communicated and documented (NumFOCUS did neither).

The next call did not happen for another week (I had made myself available to meet any time). I was shocked to read that the purpose of the call would be to “discuss the results of our investigation”. I could not understand how they could have completed their investigation and have results, without any input from me. Nonetheless, I agreed to the call; I figured that all I needed to do was dial in, hear the results, and I was done.

The reports

One the call, I was surprised to find myself facing four people. The previous call had been with just one, and suddenly being so greatly outnumbered made me feel very intimidated. One of the representatives started by telling me exactly what the finding was. The reporters claimed, and the committee agreed, that there had indeed been a code of conduct violation, specifically in failing to be “kind to others” and in “insulting others”.

I was stunned. I think Joel is great, and I know for a fact that he doesn’t mind being called “wrong” (since the call I checked with him). I most certainly did not insult him. I said that I think his approach to coding is sub-optimal, and specifically that it would benefit from using Jupyter. I showed a clip of him live coding to demonstrate that. I found it shocking that part of the findings of the committee would be a claim as to why I showed a particular slide, especially considering they never even asked. I have no desire to discredit Joel, and I don’t think that my view that his coding setup is sub-optimal should be considered a slight on his character.

Could it be argued that I was not “kind”. I guess it could. I did a parody. In some ways, this is kind – it shows that (and I explicitly said this) that I think his presentation is brilliant and highly influential, to the extent that I put in a significant amount of time studying it and working with the jokes and structure as best as I could. On the other hand, I did indeed say he is wrong, and tried to show the errors he made by pointing them out directly on his slides; I don’t think that’s unkind, but it seems that NumFOCUS committee disagrees. Personally, I don’t think it can be argued I was insulting him. It’s quite possible to debate someone and say they’re wrong, without claiming they’re a bad person or saying mean things about their person. The JupyterCon CoC even mentions this: “When we disagree, try to understand why. Disagreements, both social and technical, happen all the time and Jupyter is no exception”.

There is a huge disparity between the examples that are provided on the Jupyter and NumFOCUS codes compared to what I was being charged with. Here’s the list from NumFOCUS of “unacceptable behaviors”:

  • The use of sexualized language or imagery
  • Excessive profanity (please avoid curse words; people differ greatly in their sensitivity to swearing)
  • Posting sexually explicit or violent material
  • Violent or intimidating threats or language directed against another person
  • Inappropriate physical contact and/or unwelcome sexual attention or sexual comments
  • Sexist, racist, or otherwise discriminatory jokes and language
  • Trolling or insulting and derogatory comments
  • Written or verbal comments which have the effect of excluding people on the basis of membership in a specific group, including level of experience, gender, gender identity and expression, sexual orientation, disability, neurotype, personal appearance, body size, race, ethnicity, age, religion, or nationality
  • Public or private harassment
  • Sharing private content, such as emails sent privately or non-publicly, or direct message history, without the sender’s consent
  • Continuing to initiate interaction (such as photography, recording, messaging, or conversation) with someone after being asked to stop
  • Sustained disruption of talks, events, or communications, such as heckling of a speaker
  • Publishing (or threatening to post) other people’s personally identifying information (“doxing”), such as physical or electronic addresses, without explicit permission
  • Other unethical or unprofessional conduct
  • Advocating for, or encouraging, any of the above behaviors

They also provide this samples of impact assessment on their enforcement guide:

These are behaviors that I strongly agree should be stopped, and the community should unite to stand behind this. But these are not the behaviors that the NumFOCUS committee focused on in this case, or in the sections of the CoC that I was found to have violated.

I have no idea what happened here – why some people decided to use a code that was, apparently, written to protect people from sexism, violence, racism, and intimidation, in this way. I know that I’ve made many enemies this year with my advocacy of universal masking, and have had to deal with constant harassment and even death threats as a result. I’ve also received a lot of abuse over recent years from some due to my attempts to democratize AI, from those who have felt their privileged positions threatened.

What now?

After they told me of the reports and their finding that I had violated the code of conduct, they asked if I had anything to say. I told them I didn’t. I’d only mentally prepared myself for what they said the call was about: to inform me of the findings. I told them I didn’t think it would be that useful, since they’d already completed their investigation and made their findings. I didn’t have a emotional resilience to engage in a discussion, and I told them that. One person then chuckled in response, and as I struggled to hold back tears he started talking at some length about how the next phase is for me to help them decide on next steps.

I had already told the committee that I wasn’t able to have a discussion. One of the NumFOCUS “unacceptable behaviors” is: “Continuing to initiate interaction (such as photography, recording, messaging, or conversation) with someone after being asked to stop.” Since he was ignoring my request, I interrupted him, repeated that I couldn’t carry on, and terminated the call. I really didn’t feel like having a committee of people I didn’t know watch me sobbing.

I’m an independent, self-funded researcher. I don’t have a legal team, a comms team, or colleagues to support me. I’m a rare kind of voice at conferences, which are mainly populated by people from big companies, well-funded universities, and hot startups.

It seems that perhaps the NumFOCUS policy just is not designed to consider the rights and mental health of people that are accused. Their policy says “As soon as possible, let the reported person know that there is a complaint about them (before the response team meeting)”, and that in approaching the accused, they should say ‘This behavior isn’t appropriate for our event/meetup’, and they should “Emphasize the result/impact of the behavior and that it should cease/stop”. In short, many parts of the document, including this one, assume guilt, and do not show any consideration for the accused. The potential for misuse and weaponization of such a code is of concern.

I’ve tried to make myself available for public speaking events when I can, in order to support the community. However, the potential cost is too great, and there is no real upside for me personally, so I don’t expect to be accepting invitations in the future, at least not for quite a while. I will of course complete those commitments I’ve already made.

I was not able to cope with the NumFOCUS CoC process. Although I’m not in the best position at the moment to handle something like that, I’m much better off than many. For one thing, I’m a white, cis, straight male, and I have had some success in my life which has helped my self-confidence. I’m also financially independent, and do not need the approval or support of the influential NumFOCUS organization. Many people, facing the same situation, may well feel forced to go along with the process, even if it is an emotional burden they are not well able to deal with. Many people who do not benefit from the privilege I have may not even realize they have the ability to say “no”. It was assumed by the committee that I’d have the mental toughness to be ready to face, via video, four people I didn’t know, as they told me of my “violations” and demanded I help them decide on next steps. Limiting NumFOCUS conference speakers to only those ready and able to handle such a situation may significantly limit the diversity of NumFOCUS conferences. NumFOCUS recently “screwed up badly” and has a lot of work to do to improve diversity in its community. Improving its Code of Conduct and enforcement process to meet the ideals of kindness, fairness, respect, and consideration that it demands of others, may help in this direction.

I don’t want this situation to stop my work from being available, so I’ve created a new independent recording of the talk, using the exact same slides and material. However I didn’t use a script for either talk, so the wording won’t be identical. The video is below. The PowerPoint slides are here.

PS: To the many friends I have at NumFOCUS, and those involved in the many projects I use and admire at NumFOCUS: this isn’t about you. You are all still just as awesome as ever, and I very much hope that my experiences with your Code of Conduct committee won’t in any way effect our relationship.