Skip to content

Commit 2c687cd

Browse files
authored
Merge pull request #3262 from pnkfelix/compiler-team-rolling-leads
Rolling co-lead roles for T-compiler
2 parents e56963f + f89fc3f commit 2c687cd

File tree

1 file changed

+287
-0
lines changed

1 file changed

+287
-0
lines changed
Lines changed: 287 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,287 @@
1+
- Feature Name: n/a
2+
- Start Date: 2022-05-09
3+
- RFC PR: [rust-lang/rfcs#0000](https://github.com/rust-lang/rfcs/pull/0000)
4+
- Rust Issue: [rust-lang/rust#0000](https://github.com/rust-lang/rust/issues/0000)
5+
6+
# Summary
7+
[summary]: #summary
8+
9+
The Rust Compiler Team has used a co-leadership model since late 2019. This RFC
10+
codifies the expectations the team has for its leads and the time and effort we
11+
expect to be necessary to meet those expectations. It also specifies a
12+
succession plan, via which a team member can rotate through junior and senior
13+
leadership positions.
14+
15+
Note: this RFC is adapted from a longer
16+
[document](https://hackmd.io/2dnAg2SNS5CbRkljqLHaeg?view) by pnkfelix. That
17+
draft was the subject of compiler team steering meeting ([compiler-team#506][])
18+
and has also been circulated amongst project leadership. In other words: No
19+
surprises here.
20+
21+
[compiler-team#506]: https://github.com/rust-lang/compiler-team/issues/506
22+
23+
# Motivation
24+
[motivation]: #motivation
25+
26+
We want to enable rolling leadership, to prevent burnout for the leads
27+
themselves, and to encourage new leaders to step up and push the team towards
28+
new unexpected directions.
29+
30+
To enable such rolling leadership, we need to establish a shared vision for
31+
what our expectations are for our leaders, as well as the vision for what
32+
succession planning looks like.
33+
34+
The expected outcome is that we have healthy team whose leads will expect to
35+
only serve in that role for a limited time (on the order of 2 to 5 years), and
36+
whose members can have opportunities to take on that leadership role themselves.
37+
38+
# Guide-level explanation
39+
[guide-level-explanation]: #guide-level-explanation
40+
41+
The Rust Compiler Team uses a rolling co-leadership model of governance, with a
42+
senior lead and a junior lead each serving the team as team representatives and
43+
decision owners, for a total of two to five years.
44+
45+
Roughly every one to two years, a new junior lead is selected, the current
46+
junior promoted to senior, and the current senior returns to being a normal
47+
compiler team member.
48+
49+
# Reference-level explanation
50+
[reference-level-explanation]: #reference-level-explanation
51+
52+
The Rust Compiler Team uses a rolling co-leadership model of governance, with a
53+
senior lead and a junior lead each serving the team as team representatives and
54+
decision owners, for a total of two to five years.
55+
56+
## Team Representative
57+
58+
The leads represent the compiler team by speaking with Rust users, individual
59+
contributors, or organizations seeking to support development of Rust; they also
60+
represent the team by engaging with other teams in the Rust project.
61+
62+
A team lead must have a rough understanding (at least) of what tasks fall under
63+
the remit of the compiler team, and which are better suited for another one of
64+
the Rust teams.
65+
66+
A team lead should be aware of what large scale initiatives are happening within
67+
the compiler, so that they can speak in an informed manner about what issues in
68+
the compiler are being addressed, and which issues are not likely to be
69+
addressed in the near term.
70+
71+
A team lead should be aware of what painpoints (technical, social, etc) that the
72+
compiler team is suffering from most. The leads should be prepared to provide
73+
advice on how others can provide support, and the leads should be prepared to
74+
reach out on behalf of the team to identify external stakeholders to the team
75+
who could drive progress forward on resolving issues that face the team.
76+
77+
The leads' representation of the team should manifest itself via structured
78+
communication, such as blog posts on https://blog.rust-lang.org/inside-rust/
79+
80+
## Decision Owner
81+
82+
The leads own decisions on behalf of the compiler team.
83+
84+
Most choices made by the team are consensus-driven by the usual "FCP all-but-two
85+
with no concerns" process.
86+
87+
The leads own making decisions about urgent issues or ones with a specific
88+
deadline. For example, deciding what to do about a critical release-blocking bug
89+
should happen before the release, preferably long before. Likewise,
90+
beta-backport decisions need to be made in time for the backport to happen
91+
before the beta is lifted to stable.
92+
93+
Finally, when adverse events happen, the leads are responsible for reviewing
94+
what decisions or processes led to the event, and taking action to prevent
95+
future occurrences of the same event. Examples of this include the incr-comp bug
96+
that plagued the 1.52.0 release, which led to a 1.52.1 release four days later
97+
(and three steering meetings as follow-up).
98+
99+
## Time Commitment, Expectations, and Competencies
100+
101+
Let us recall that any compiler team member is allowed to:
102+
103+
* drive progress on backlogged work,
104+
* draft steering meeting proposals, and often write the associated steering meeting document to drive the meetings,
105+
* solicit individuals to form working groups to address important problems,
106+
* take on the resolution of unassigned or abandoned P-critical or P-high issues, and
107+
* drive larger initiatives related to the compiler.
108+
109+
None of that is exclusively the domain of team leads, though the team leads are
110+
expected to take part in such activities as time permits.
111+
112+
The compiler team leads need to do the following as well:
113+
114+
* issue “unilateral approval” for decisions (such as beta backports) that are either urgent or are trivial enough to not require team discussion,
115+
* drive the two weekly meetings (Thursday triage, and Friday steering),
116+
* engage in asynchronous zulip conversations amongst Rust leadership,
117+
* author communication on behalf of the team (such as the 1.52.1 blog post and the 2022 ambitions blog post),
118+
* coordinate with each other as co-leads, either in an on-demand manner, or via periodic "sync-up" meetings.
119+
120+
We expect these leadership related duties may consume 8 hours per week, on
121+
average, with high variance. That’s in addition to whatever time one might spend
122+
on actual development work on Rust itself.
123+
124+
Any member of the T-compiler already has the technical competencies necessary to
125+
be a lead for the team. (For example, they need to build the compiler and run
126+
its test suite, bisect the git history, and post pull requests, especially ones
127+
that revert existing changes.)
128+
129+
A person who leads the team *also* needs enough social connection with the
130+
other T-compiler team members to feel comfortable reaching out for one-on-one
131+
communication when necessary.
132+
133+
Thus, the main prerequisites to be a candidate for T-compiler leadership are
134+
"membership in the T-compiler team" and "regularly attends the Thursday and
135+
Friday T-compiler meetings." (A record of leadership on one or more project
136+
groups or working groups is probably a good thing to have as well, but is not a
137+
strict requirement.)
138+
139+
## Term Length and Leader Selection
140+
141+
> *"Choose your leaders with wisdom and forethought.*
142+
> *To be led by a coward is to be controlled by all that the coward fears.*
143+
> *To be led by a fool is to be led by the opportunists who control the fool.*
144+
> *To be led by a thief is to offer up your most precious treasures to be stolen.*
145+
> *To be led by a liar is to ask to be told lies.*
146+
> *To be led by a tyrant is to sell yourself and those you love into slavery."*
147+
> -- Octavia E. Butler
148+
149+
The Rust Compiler Team uses rolling co-leadership model of governance, with a
150+
senior lead and a junior lead. After serving in their positions for one to two
151+
years, the leaders, with input from the team, select a teammate who is not a
152+
current lead, and that teammate becomes the new junior lead. The old junior lead
153+
becomes the new senior lead, and the old senior lead is again a normal compiler
154+
team member.
155+
156+
The specific term length is left variable since the timing for when a shift in
157+
leadership makes sense will depend on context.
158+
159+
In code:
160+
161+
```
162+
enum Level { Senior, Junior }
163+
struct Member { lead: Option<Level>, ... }
164+
165+
fn roll(curr_senior: &mut Member, curr_junior: &mut Member, incoming: &mut Member) {
166+
assert_eq!(curr_senior.lead, Some(Level::Senior));
167+
assert_eq!(curr_junior.lead, Some(Level::Junior));
168+
assert_ne!(curr_senior, incoming);
169+
assert_ne!(curr_junior, incoming);
170+
curr_senior.lead = None;
171+
curr_junior.lead = Some(Level::Senior);
172+
incoming.lead = Some(Level::Junior);
173+
}
174+
```
175+
176+
### Selection process
177+
178+
When the senior co-lead decides that they are ready to step down, and have
179+
confirmed that the junior co-lead feels ready to take on the senior co-lead
180+
role, then the two tell the T-compiler team privately about the intention to
181+
have a rollover in leadership.
182+
183+
Then the T-compiler team members can nominate their teammates to serve as the
184+
new junior co-lead. We here follow the model of our FCP process: The leads
185+
should provide a ten-day window for nominations to come in, unless they get
186+
confirmation that the set of nominations is complete.
187+
188+
After nomination is completed, the outgoing senior and junior co-leads discuss
189+
the set of nominees, and also, if desired, have short discussions with the
190+
nominees. Then, the senior and junior co-leads select the new co-lead from the
191+
set of nominees. And that’s it! Then current leads just need to publish a blog
192+
post saying that the leadership is scheduled to roll over, who the new junior
193+
lead is, and the date that it takes effect.
194+
195+
# Drawbacks
196+
[drawbacks]: #drawbacks
197+
198+
Why should we *not* do this?
199+
200+
Committing to specific term lengths puts pressure on the leads to identify new
201+
leaders earlier than they might otherwise. Note that if the leads fail to identify
202+
any suitable candidates, then we will have hit a (hopefully exceptional) situation
203+
where we will need to ask the current leadership to stay on board for longer than
204+
expected. At that point, the leads' ongoing goals **must** include the proactive
205+
seeking of the next generation of leaders.
206+
207+
# Rationale and alternatives
208+
[rationale-and-alternatives]: #rationale-and-alternatives
209+
210+
## Rolling, not Rotation
211+
212+
We specify here a rolling leadership process, where we will see a shift in
213+
leads, but not every team member is required to serve as a leader at any point.
214+
An alternative model is a true *rotating leadership*, where every team member
215+
will eventually become a lead.
216+
217+
Our rationale for this is that we do not think every team member is interested
218+
in becoming a lead. If we adopted a true rotation and forced someone to become a
219+
lead who did not really want the role, then that probably be bad for that
220+
individual, and probably would be bad for the team as well.
221+
222+
## Selection, Not Election
223+
224+
We specify here that the new junior lead is *selected* (from a set of
225+
individuals nominated by the compiler team) by the current leads. An obvious
226+
alternative would be a pure democracy where the electorate (either the compiler
227+
team, or some superset thereof) gets to vote for who the new junior lead will
228+
be.
229+
230+
When it comes to co-leadership, the two leaders need to be able to work
231+
together effectively; we believe they need compatible working styles
232+
and complementary sets of skills. Therefore, we currently are choosing a
233+
system where the
234+
current leaders have final say on who the next junior lead will be, in order to
235+
optimize for healthy intra-leader communications.
236+
237+
## Do Nothing?
238+
239+
If we stick with the status quo, where no protocol is specified at all, that
240+
would not be the end of the world. We can certainly *emulate* any model we want;
241+
the [original doc](https://hackmd.io/2dnAg2SNS5CbRkljqLHaeg?view#A-%E2%80%9CNew%E2%80%9D-Process)
242+
argues that the process described here matches what the team has already informally employed.
243+
244+
However, there is value in setting down formal expectations. It is *healthy* for
245+
us to tell our teammates: We want each of you to have a chance to perform in
246+
this same role, if that appeals to you, and we want it to happen in a time frame
247+
that is within sight, not some far off future.
248+
249+
250+
# Prior art
251+
[prior-art]: #prior-art
252+
253+
Obviously the Rust governance RFC specified aspects of project leadership:
254+
https://rust-lang.github.io/rfcs/1068-rust-governance.html
255+
256+
pnkfelix isn't sure what other Programming Languages or Projects have adopted a
257+
formal structure for rolling or rotating leadership. Many use a
258+
[BDFL](https://en.wikipedia.org/wiki/Benevolent_dictator_for_life) model
259+
instead.
260+
261+
Python did have a formal [abdication][python-xfer] of BDFL from Guido van Rossum,
262+
but it explicitly chose not to establish a successor.
263+
264+
[python-xfer]: https://mail.python.org/pipermail/python-committers/2018-July/005664.html
265+
266+
267+
# Unresolved questions
268+
[unresolved-questions]: #unresolved-questions
269+
270+
- What parts of the design do you expect to resolve through the RFC process before this gets merged?
271+
272+
Are the term-lengths anywhere near appropriate?
273+
274+
Wesley asked this question on an earlier draft of this:
275+
> Given the flexible time commitment, a tenure of this length basically requires
276+
> the lead to be somebody that works on Rust as part of their job. I'm not sure
277+
> we want to limit our pool of candidates to just those people.
278+
279+
# Future possibilities
280+
[future-possibilities]: #future-possibilities
281+
282+
Should other large teams look into adopting this model?
283+
284+
Many small teams do not have sufficiently large membership to justify two
285+
co-leads; can this same system work fine there, and just rely on calibrating new
286+
leaders amongst all the participating members (which, since we're talking about
287+
small teams, would be a relatively small set of people)?

0 commit comments

Comments
 (0)