|
| 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