threads / patch / 42790

patcham: counteract gender bias

Subject: [PATCH] am: counteract gender bias

## tl;dr

10 messages between Jul 7, 2016 and Jul 8, 2016. Diffs are folded; open one to read it.

replies: 9people: 4as markdown or json

Johannes Schindelin· Jul 7, 2016, 11:47 UTC · lore

Since d1c5f2a (Add git-am, applymbox replacement., 2005-10-07), i.e. for almost 11 years already, we demonstrated our disrespect to the pioneers of software development like Ada Lovelace, Grace Hopper and Margaret Hamilton, by pretending that each and every software developer is male ("his_tree"). It appears almost as if we weren't fully aware that the first professional software developers were all female.

We know our field to have this unfortunate gender bias that has nothing to do with qualification or biological reasons, and we are very sad about the current gender imbalance of the Git developer community.

Let's start changing that by using the variable name "her_tree" for an equal number of years out of fairness, and change to the gender neutral "their_tree" after that.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
Published-As: https://github.com/dscho/git/releases/tag/gender-bias-v1
 builtin/am.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)
Show changes to builtin/am.c +8 −8
diff --git a/builtin/am.c b/builtin/am.c
index d5da5fe..2c7f3dd 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -1584,14 +1584,14 @@ static int build_fake_ancestor(const struct am_state *state, const char *index_f
 }
 
 /**
- * Do the three-way merge using fake ancestor, his tree constructed
+ * Do the three-way merge using fake ancestor, her tree constructed
  * from the fake ancestor and the postimage of the patch, and our
  * state.
  */
 static int run_fallback_merge_recursive(const struct am_state *state,
 					unsigned char *orig_tree,
 					unsigned char *our_tree,
-					unsigned char *his_tree)
+					unsigned char *her_tree)
 {
 	struct child_process cp = CHILD_PROCESS_INIT;
 	int status;
@@ -1599,7 +1599,7 @@ static int run_fallback_merge_recursive(const struct am_state *state,
 	cp.git_cmd = 1;
 
 	argv_array_pushf(&cp.env_array, "GITHEAD_%s=%.*s",
-			 sha1_to_hex(his_tree), linelen(state->msg), state->msg);
+			 sha1_to_hex(her_tree), linelen(state->msg), state->msg);
 	if (state->quiet)
 		argv_array_push(&cp.env_array, "GIT_MERGE_VERBOSITY=0");
 
@@ -1607,7 +1607,7 @@ static int run_fallback_merge_recursive(const struct am_state *state,
 	argv_array_push(&cp.args, sha1_to_hex(orig_tree));
 	argv_array_push(&cp.args, "--");
 	argv_array_push(&cp.args, sha1_to_hex(our_tree));
-	argv_array_push(&cp.args, sha1_to_hex(his_tree));
+	argv_array_push(&cp.args, sha1_to_hex(her_tree));
 
 	status = run_command(&cp) ? (-1) : 0;
 	discard_cache();
@@ -1620,7 +1620,7 @@ static int run_fallback_merge_recursive(const struct am_state *state,
  */
 static int fall_back_threeway(const struct am_state *state, const char *index_path)
 {
-	unsigned char orig_tree[GIT_SHA1_RAWSZ], his_tree[GIT_SHA1_RAWSZ],
+	unsigned char orig_tree[GIT_SHA1_RAWSZ], her_tree[GIT_SHA1_RAWSZ],
 		      our_tree[GIT_SHA1_RAWSZ];
 
 	if (get_sha1("HEAD", our_tree) < 0)
@@ -1657,7 +1657,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
 		return error(_("Did you hand edit your patch?\n"
 				"It does not apply to blobs recorded in its index."));
 
-	if (write_index_as_tree(his_tree, &the_index, index_path, 0, NULL))
+	if (write_index_as_tree(her_tree, &the_index, index_path, 0, NULL))
 		return error("could not write tree");
 
 	say(state, stdout, _("Falling back to patching base and 3-way merge..."));
@@ -1667,13 +1667,13 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
 
 	/*
 	 * This is not so wrong. Depending on which base we picked, orig_tree
-	 * may be wildly different from ours, but his_tree has the same set of
+	 * may be wildly different from ours, but her_tree has the same set of
 	 * wildly different changes in parts the patch did not touch, so
 	 * recursive ends up canceling them, saying that we reverted all those
 	 * changes.
 	 */
 
-	if (run_fallback_merge_recursive(state, orig_tree, our_tree, his_tree)) {
+	if (run_fallback_merge_recursive(state, orig_tree, our_tree, her_tree)) {
 		rerere(state->allow_rerere_autoupdate);
 		return error(_("Failed to merge in the changes."));
 	}
-- 
2.9.0.278.g1caae67

base-commit: 5c589a73de4394ad125a4effac227b3aec856fa1
Mike Hommey· Jul 7, 2016, 12:49 UTC · re: Johannes Schindelin · lore

Re: [PATCH] am: counteract gender bias

On Thu, Jul 07, 2016 at 01:47:19PM +0200, Johannes Schindelin wrote:
Show 14 quoted lines
> Since d1c5f2a (Add git-am, applymbox replacement., 2005-10-07), i.e. for
> almost 11 years already, we demonstrated our disrespect to the pioneers
> of software development like Ada Lovelace, Grace Hopper and Margaret
> Hamilton, by pretending that each and every software developer is male
> ("his_tree"). It appears almost as if we weren't fully aware that the
> first professional software developers were all female.
> 
> We know our field to have this unfortunate gender bias that has nothing
> to do with qualification or biological reasons, and we are very sad
> about the current gender imbalance of the Git developer community.
> 
> Let's start changing that by using the variable name "her_tree" for an
> equal number of years out of fairness, and change to the gender neutral
> "their_tree" after that.

You make it sound like the decision to use "his" was conscious and on purpose. I doubt that was the case, especially 11 years ago, when these issues weren't as publicized. Let's not attribute to malice on part of the people who wrote those lines what can be attributed to linguistics.

Mike
Jakub Narębski· Jul 7, 2016, 13:24 UTC · re: Mike Hommey · lore

Re: [PATCH] am: counteract gender bias

W dniu 2016-07-07 o 14:49, Mike Hommey pisze:
Show 20 quoted lines
> On Thu, Jul 07, 2016 at 01:47:19PM +0200, Johannes Schindelin wrote:
>> Since d1c5f2a (Add git-am, applymbox replacement., 2005-10-07), i.e. for
>> almost 11 years already, we demonstrated our disrespect to the pioneers
>> of software development like Ada Lovelace, Grace Hopper and Margaret
>> Hamilton, by pretending that each and every software developer is male
>> ("his_tree"). It appears almost as if we weren't fully aware that the
>> first professional software developers were all female.
>>
>> We know our field to have this unfortunate gender bias that has nothing
>> to do with qualification or biological reasons, and we are very sad
>> about the current gender imbalance of the Git developer community.
>>
>> Let's start changing that by using the variable name "her_tree" for an
>> equal number of years out of fairness, and change to the gender neutral
>> "their_tree" after that.
> 
> You make it sound like the decision to use "his" was conscious and on
> purpose. I doubt that was the case, especially 11 years ago, when these
> issues weren't as publicized. Let's not attribute to malice on part of
> the people who wrote those lines what can be attributed to linguistics.

Also, in all (?) other places we use "ours" and "theirs"; it looks like git-am was a strange exception with "ours" and "his" (also, it was/is inconsistent in using plural vs singular form). Though perhaps it was created before the terminology solidified...

As to why it was not noticed and not fixed: probably no-one worked in this area, thus nobody noticed this (callee just don't care how the parameter is named).

Instead of nebulous "fairness" (i.e., be unfair in other direction), in my opinion it would be better to simply fix the issue, be consistent and use common terminology.

-- 
Jakub Narębski
Junio C Hamano· Jul 7, 2016, 16:04 UTC · re: Jakub Narębski · lore

Re: [PATCH] am: counteract gender bias

Jakub Narębski <jnareb@gmail.com> writes:
> Also, in all (?) other places we use "ours" and "theirs"; it looks like
> git-am was a strange exception with "ours" and "his" (also, it was/is
> inconsistent in using plural vs singular form).  Though perhaps it was
> created before the terminology solidified...

I also thought that "ours" vs "his" was strange mixture of plural and singular when I first saw it, but it turns out there was no mixture.

It originates at 47f0b6d5 (Fall back to three-way merge when applying a patch., 2005-10-06), where the code used $his_tree and $orig_tree, (there was no reference to "our" tree), both singular. They were copied to "git am" introduced at d1c5f2a4 (Add git-am, applymbox replacement., 2005-10-07) almost verbatim.

The use of "ours" & "theirs" is now established, and I agree with you that the use of "his" that is contained to the fall_back_3way helper function (cf. contrib/examples/git-am.sh) is an oddball.

We should just use "theirs" to be consistent from the beginning, as you suggested. There is no need to churn the codebase for political correctness to first use "hers" that everybody knows will *not* be the final form.

Johannes Schindelin· Jul 8, 2016, 07:08 UTC · re: Junio C Hamano · lore

Re: [PATCH] am: counteract gender bias

Hi Junio,
On Thu, 7 Jul 2016, Junio C Hamano wrote:
> We should just use "theirs" to be consistent from the beginning, as
> you suggested.  There is no need to churn the codebase for political
> correctness to first use "hers" that everybody knows will *not* be
> the final form.

I will change the patch to say "theirs" (BTW "they" is nowadays considered not necessarily plural only, but can be used as a gender-neutral singular: https://en.wikipedia.org/wiki/They).

However.

I strongly disagree that this is the correct course of action. In my view, this has nothing to do with political correctness. It has all to do with respect instead. And I find it disrespectful to quietly paper over the issue instead of making a bold statement (which my patch constitutes).

There seems to be no support for my position.

Therefore, with sadness, I set this aside as yet another concession to those men who are really comfortable to equate "programmer" with "he" in their minds and at the same time feel utterly offended when addressed as "How are you ladies doing today?".

I absolutely despise having to change this patch, yet I do not currently have the time nor the nerve to insist on my version of the patch.

Regards, Johannes

P.S.: Having said that, I do notice that the communication on this mailing list has become much more civil in the past few years. I am pleased by that, and I am hoping for much more, to the point where we are truly inclusive. It will be more productive, and also much more fun.

Johannes Schindelin· Jul 7, 2016, 14:12 UTC · re: Mike Hommey · lore

Re: [PATCH] am: counteract gender bias

Hi Mike,
On Thu, 7 Jul 2016, Mike Hommey wrote:
Show 20 quoted lines
> On Thu, Jul 07, 2016 at 01:47:19PM +0200, Johannes Schindelin wrote:
> > Since d1c5f2a (Add git-am, applymbox replacement., 2005-10-07), i.e. for
> > almost 11 years already, we demonstrated our disrespect to the pioneers
> > of software development like Ada Lovelace, Grace Hopper and Margaret
> > Hamilton, by pretending that each and every software developer is male
> > ("his_tree"). It appears almost as if we weren't fully aware that the
> > first professional software developers were all female.
> > 
> > We know our field to have this unfortunate gender bias that has nothing
> > to do with qualification or biological reasons, and we are very sad
> > about the current gender imbalance of the Git developer community.
> > 
> > Let's start changing that by using the variable name "her_tree" for an
> > equal number of years out of fairness, and change to the gender neutral
> > "their_tree" after that.
> 
> You make it sound like the decision to use "his" was conscious and on
> purpose. I doubt that was the case, especially 11 years ago, when these
> issues weren't as publicized. Let's not attribute to malice on part of
> the people who wrote those lines what can be attributed to linguistics.
It was not my intention to imply that the original decision was conscious.

What with me being a non-native speaker, would you kindly suggest a commit message that conveys the intention better?

Thanks, Dscho

Johannes Schindelin· Jul 8, 2016, 07:17 UTC · re: Johannes Schindelin · lore

[PATCH v2] am: counteract gender bias

Since d1c5f2a (Add git-am, applymbox replacement., 2005-10-07), i.e. for almost 11 years already, we used a male form to describe "the other tree".

While most likely unintended, this gave the erroneous impression as if the Git developers thought of users as male, and were unaware of the important role in software development played by female actors such as Ada Lovelace, Grace Hopper and Margaret Hamilton. In fact, the first professional software developers were all female.

Let's change those unfortunate references to the gender neutral "their tree".

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
Published-As: https://github.com/dscho/git/releases/tag/gender-bias-v2
 builtin/am.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)
Interdiff vs v1:
 diff --git a/builtin/am.c b/builtin/am.c
 index 2c7f3dd..1f0aa99 100644
 --- a/builtin/am.c
 +++ b/builtin/am.c
 @@ -1584,14 +1584,14 @@ static int build_fake_ancestor(const struct am_state *state, const char *index_f
  }
  
  /**
 - * Do the three-way merge using fake ancestor, her tree constructed
 + * Do the three-way merge using fake ancestor, their tree constructed
   * from the fake ancestor and the postimage of the patch, and our
   * state.
   */
  static int run_fallback_merge_recursive(const struct am_state *state,
  					unsigned char *orig_tree,
  					unsigned char *our_tree,
 -					unsigned char *her_tree)
 +					unsigned char *their_tree)
  {
  	struct child_process cp = CHILD_PROCESS_INIT;
  	int status;
 @@ -1599,7 +1599,7 @@ static int run_fallback_merge_recursive(const struct am_state *state,
  	cp.git_cmd = 1;
  
  	argv_array_pushf(&cp.env_array, "GITHEAD_%s=%.*s",
 -			 sha1_to_hex(her_tree), linelen(state->msg), state->msg);
 +			 sha1_to_hex(their_tree), linelen(state->msg), state->msg);
  	if (state->quiet)
  		argv_array_push(&cp.env_array, "GIT_MERGE_VERBOSITY=0");
  
 @@ -1607,7 +1607,7 @@ static int run_fallback_merge_recursive(const struct am_state *state,
  	argv_array_push(&cp.args, sha1_to_hex(orig_tree));
  	argv_array_push(&cp.args, "--");
  	argv_array_push(&cp.args, sha1_to_hex(our_tree));
 -	argv_array_push(&cp.args, sha1_to_hex(her_tree));
 +	argv_array_push(&cp.args, sha1_to_hex(their_tree));
  
  	status = run_command(&cp) ? (-1) : 0;
  	discard_cache();
 @@ -1620,7 +1620,7 @@ static int run_fallback_merge_recursive(const struct am_state *state,
   */
  static int fall_back_threeway(const struct am_state *state, const char *index_path)
  {
 -	unsigned char orig_tree[GIT_SHA1_RAWSZ], her_tree[GIT_SHA1_RAWSZ],
 +	unsigned char orig_tree[GIT_SHA1_RAWSZ], their_tree[GIT_SHA1_RAWSZ],
  		      our_tree[GIT_SHA1_RAWSZ];
  
  	if (get_sha1("HEAD", our_tree) < 0)
 @@ -1657,7 +1657,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
  		return error(_("Did you hand edit your patch?\n"
  				"It does not apply to blobs recorded in its index."));
  
 -	if (write_index_as_tree(her_tree, &the_index, index_path, 0, NULL))
 +	if (write_index_as_tree(their_tree, &the_index, index_path, 0, NULL))
  		return error("could not write tree");
  
  	say(state, stdout, _("Falling back to patching base and 3-way merge..."));
 @@ -1667,13 +1667,13 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
  
  	/*
  	 * This is not so wrong. Depending on which base we picked, orig_tree
 -	 * may be wildly different from ours, but her_tree has the same set of
 +	 * may be wildly different from ours, but their_tree has the same set of
  	 * wildly different changes in parts the patch did not touch, so
  	 * recursive ends up canceling them, saying that we reverted all those
  	 * changes.
  	 */
  
 -	if (run_fallback_merge_recursive(state, orig_tree, our_tree, her_tree)) {
 +	if (run_fallback_merge_recursive(state, orig_tree, our_tree, their_tree)) {
  		rerere(state->allow_rerere_autoupdate);
  		return error(_("Failed to merge in the changes."));
  	}
Show changes to builtin/am.c +8 −8
diff --git a/builtin/am.c b/builtin/am.c
index d5da5fe..1f0aa99 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -1584,14 +1584,14 @@ static int build_fake_ancestor(const struct am_state *state, const char *index_f
 }
 
 /**
- * Do the three-way merge using fake ancestor, his tree constructed
+ * Do the three-way merge using fake ancestor, their tree constructed
  * from the fake ancestor and the postimage of the patch, and our
  * state.
  */
 static int run_fallback_merge_recursive(const struct am_state *state,
 					unsigned char *orig_tree,
 					unsigned char *our_tree,
-					unsigned char *his_tree)
+					unsigned char *their_tree)
 {
 	struct child_process cp = CHILD_PROCESS_INIT;
 	int status;
@@ -1599,7 +1599,7 @@ static int run_fallback_merge_recursive(const struct am_state *state,
 	cp.git_cmd = 1;
 
 	argv_array_pushf(&cp.env_array, "GITHEAD_%s=%.*s",
-			 sha1_to_hex(his_tree), linelen(state->msg), state->msg);
+			 sha1_to_hex(their_tree), linelen(state->msg), state->msg);
 	if (state->quiet)
 		argv_array_push(&cp.env_array, "GIT_MERGE_VERBOSITY=0");
 
@@ -1607,7 +1607,7 @@ static int run_fallback_merge_recursive(const struct am_state *state,
 	argv_array_push(&cp.args, sha1_to_hex(orig_tree));
 	argv_array_push(&cp.args, "--");
 	argv_array_push(&cp.args, sha1_to_hex(our_tree));
-	argv_array_push(&cp.args, sha1_to_hex(his_tree));
+	argv_array_push(&cp.args, sha1_to_hex(their_tree));
 
 	status = run_command(&cp) ? (-1) : 0;
 	discard_cache();
@@ -1620,7 +1620,7 @@ static int run_fallback_merge_recursive(const struct am_state *state,
  */
 static int fall_back_threeway(const struct am_state *state, const char *index_path)
 {
-	unsigned char orig_tree[GIT_SHA1_RAWSZ], his_tree[GIT_SHA1_RAWSZ],
+	unsigned char orig_tree[GIT_SHA1_RAWSZ], their_tree[GIT_SHA1_RAWSZ],
 		      our_tree[GIT_SHA1_RAWSZ];
 
 	if (get_sha1("HEAD", our_tree) < 0)
@@ -1657,7 +1657,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
 		return error(_("Did you hand edit your patch?\n"
 				"It does not apply to blobs recorded in its index."));
 
-	if (write_index_as_tree(his_tree, &the_index, index_path, 0, NULL))
+	if (write_index_as_tree(their_tree, &the_index, index_path, 0, NULL))
 		return error("could not write tree");
 
 	say(state, stdout, _("Falling back to patching base and 3-way merge..."));
@@ -1667,13 +1667,13 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa
 
 	/*
 	 * This is not so wrong. Depending on which base we picked, orig_tree
-	 * may be wildly different from ours, but his_tree has the same set of
+	 * may be wildly different from ours, but their_tree has the same set of
 	 * wildly different changes in parts the patch did not touch, so
 	 * recursive ends up canceling them, saying that we reverted all those
 	 * changes.
 	 */
 
-	if (run_fallback_merge_recursive(state, orig_tree, our_tree, his_tree)) {
+	if (run_fallback_merge_recursive(state, orig_tree, our_tree, their_tree)) {
 		rerere(state->allow_rerere_autoupdate);
 		return error(_("Failed to merge in the changes."));
 	}
-- 
2.9.0.278.g1caae67

base-commit: 5c589a73de4394ad125a4effac227b3aec856fa1
Jakub Narębski· Jul 8, 2016, 07:50 UTC · re: Johannes Schindelin · lore

Re: [PATCH v2] am: counteract gender bias

Hello Johannes,
On 8 July 2016 at 09:17, Johannes Schindelin <johannes.schindelin@gmx.de> wrote:
Show 12 quoted lines
> Since d1c5f2a (Add git-am, applymbox replacement., 2005-10-07), i.e. for
> almost 11 years already, we used a male form to describe "the other
> tree".
>
> While most likely unintended, this gave the erroneous impression as if
> the Git developers thought of users as male, and were unaware of the
> important role in software development played by female actors such as
> Ada Lovelace, Grace Hopper and Margaret Hamilton. In fact, the first
> professional software developers were all female.
>
> Let's change those unfortunate references to the gender neutral "their
> tree".

In my opinion more important reason than being "gender neutral" is that Git uses the "ours" / "theirs" terminology in all other places - this patch makes Git consistent and code easier to understand (it also removes weird plural "ours_tree" vs singular "his_tree" in code arguments).

But nevermind that...
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
> Published-As: https://github.com/dscho/git/releases/tag/gender-bias-v2
Junio C Hamano· Jul 8, 2016, 21:39 UTC · re: Johannes Schindelin · lore

Re: [PATCH v2] am: counteract gender bias

Johannes Schindelin <johannes.schindelin@gmx.de> writes:
> Since d1c5f2a (Add git-am, applymbox replacement., 2005-10-07), i.e. for
> almost 11 years already, we used a male form to describe "the other
> tree".

This actually is older than that commit by 9 commits. I may have said it already, but it originates at 47f0b6d5 (Fall back to three-way merge when applying a patch., 2005-10-06).

Show 8 quoted lines
> While most likely unintended, this gave the erroneous impression as if
> the Git developers thought of users as male, and were unaware of the
> important role in software development played by female actors such as
> Ada Lovelace, Grace Hopper and Margaret Hamilton. In fact, the first
> professional software developers were all female.
>
> Let's change those unfortunate references to the gender neutral "their
> tree".
I'd add this at the end.
	Doing so would also make the fallback_merge_recursive(),
	which is an oddball, more in line with the other parts of
	the system where we contrast what we have vs what we obtain
	from others with "ours" vs "theirs".  This inconsistency was
	also unintended.

I do not think changing these references to "her" and keep them like so for 11 years is a proper way to show "respect" anyway, by the way, so this round is a definite improvement over that version.

Thanks.

← back to recent threads