The Changelog: Software Development, Open Source - Python's new governance and core team (Interview)
Episode Date: June 6, 2019We’re talking with Brett Cannon for a behind the scenes look at Guido stepping down as Python’s BDFL (Benevolent dictator for life) and the process they had to go through to establish a new govern...ance model, the various proposed PEPs to establish this new direction, the winning PEP, and what the future holds for Python.
Transcript
Discussion (0)
Bandwidth for Changelog is provided by Fastly. Learn more at Fastly.com.
We move fast and fix things here at Changelog because of Rollbar.
Check them out at Rollbar.com.
And we're hosted on Linode cloud servers. Head to Linode.com slash Changelog.
This episode is brought to you by DigitalOcean.
DigitalOcean makes it super simple to launch a Kubernetes cluster in minutes.
The DigitalOcean Kubernetes platform empowers developers
to launch their containerized applications
into a managed, production-ready cluster
without having to maintain or configure the underlying infrastructure.
They seamlessly integrate everything with the rest of the DigitalOcean stack,
including load balancers, firewalls, object storage spaces,
and block storage volumes.
They even have built-in support for public and private image registries
like Docker Hub and Quay.io.
Developers can now run and scale container-based workloads
with ease with the DigitalOcean platform.
Learn more and get started for free with a $50 credit at do.co.changelog.
Again, do.co. ChangeLog.
All right.
Welcome back, everyone.
This is the ChangeLog, a podcast featuring the hackers, leaders, and innovators of software development.
I'm Adam Stachowiak, Editor-in-Chief here at ChangeLog.
Today, we're joined again by Brett Cannon for a behind-the-scenes look at Python as Guido steps down as the BDFL benevolent dictator for life. And the process they had to go through to establish this new governance model, the various proposed PEPs, to establish this new direction, the winning PEP, of course, and what the future holds for Python.
All right, we're back.
Brett Cannon's back.
We are so excited.
This is a two-time guest.
Gosh, man.
It's just such a good day, Brett. I'm just so glad to have you here, man.
I feel very privileged to have made it to the two-time guest level of the changelog, so thanks for having me.
Well, that means you definitely didn't suck.
Oh, that's good.
And not to give you too much praise, but get the four, maybe five.
That's better.
What's the record?
Mike Parham's at four, I believe, right, Jared?
Or five?
Four or five.
I think Mike Parham might be our highest guest.
We have a few people at three, but Mike, I think, has the most.
Yeah.
All right.
New thing to strive for in life.
That's right.
That's right.
Either way, since the last time we talked, which was episode 318, some big news, some
big things happened in the Python community.
One of the biggest things was the BDFL, Guido, stepped down.
So maybe give us the lay of the land of how the community,
how the language, how the whomever is involved in Python
has reacted to this.
It seems so far to have been well received uh when guido retired well i should rephrase it he
he phrased it as taking a permanent vacation uh so actually when he announced there were a lot of
like conspiracy theories going around and slash hope that he was actually joking or oh he's just
taking a break and he'll actually come back he really didn't retire a lot of wordsmithing going on in that uh email so what did he do then uh he retired
yeah at least as the benelic dictator for life for python he definitely retired um
i think the community's uh accepted fairly well When it first happened, a lot of people spoke out
and said, thank you so much for your time and dedication
and everything you did.
He received a couple awards subsequent,
acknowledging his contribution to open source
and obviously to Python.
And I think everyone's been fairly respectful
of the reasons why, and obviously
we can get into that.
And yeah, I think it's turned out to be pretty well received, and I don't think anyone's
really held it against them in any way, shape, or form.
Well, they shouldn't, right?
I mean...
Oh, yeah.
God, no.
You can only have such a long term of service, you know?
You can't be in it to win it for forever.
Yeah.
Well, he started...
Yeah. Yeah. can't be in it to win it for forever yeah well he started yeah yeah well he started python uh december of 1989 yeah so retiring in july of 2019 means he's yeah over 29 years so i look at that
and think like ken griffey jr 1989 rookie card upper deck yeah anyways that was my hero when i was a kid but unfortunately
he didn't have the the stick-to-it-edness that guido has shown that's right yeah that's the
difference there because griffey got injured quite a bit and uh didn't have the career that
he could have had that's right guido's been going on and on until a happy retirement from bdfl at
least it sounds like he's still somewhat involved. But undoubtedly, there was a big reaction
because when you have a dictator for life
and then the life part doesn't happen to be true anymore,
then it's like, what do we do?
And that's where we all were left, right?
Exactly.
When Guido announced his retirement,
as part of that announcement, he said, he basically asked the development team, so what are you going to do now?
He purposely did not tell us how to choose how to manage ourselves going forward.
There was no succession plan.
There was no specific guidance of, i think you should do this it was very much
i am stepping down and taking a vacation i'm still around he's he didn't unsubscribe from
alias or anything or fall off the earth uh but he very purposely said you all are
going to figure it out on your own and good luck and i i call doing a mic drop but basically
he kind of just left it to us i don't know him personally obviously but it seems like
there's either a massive amount of trust or this is a gigantic experiment you know to get it right yeah and it it felt like both right it was i and i think he did trust
that we would figure it out but i think it was also kind of his way to say i don't want to
force anything upon you now it is now your choice to decide how you want to run yourselves.
And so I'm going to let you decide for yourselves instead of telling you how
you should do it. I view it as a much
more kind of
stereotypical
hippie decision of, yes, you're
all going to choose how you're going to want to run the commune
now. So I think it was
very much along the lines of, I don't think
he wanted to have his last act
as bdf he'll be and now you're going to run your project this way i think it was very much more
like i i think it's now up to you all to decide how you want to do it and it's you're the ones
are going to be leading uh not leading living with this longer than he does so it should be up to you
to decide how you want to do it any chance there's any
lost archives
of like
scribblings from Guido
or something like that
there's like
future of Python
that has not become
in a pep near you
sometimes
like on a cave wall
who knows
I'm just thinking like
gosh this guy must like
have so many dreams
that
that may be just
left under the table
and
I don't know I'm just kind of
curious if we'll find some lost
Guido archives or something.
Probably not actually
just because
he's still participating
so he is still
providing advice
we are still getting
Python and Hamster proposals and he's still providing
input so I think if there was something
he honestly decided he really wanted
he could totally still
do that and
see that come to fruition
so I don't think honestly even if there was something
he wanted to get to that hadn't happened before
his retirement he still has the opportunity
to do it so I would honestly hope that he didn't have any regrets going like,
darn, I didn't get to that one thing.
I would hope that he would still feel empowered enough
to still get to see that happen.
So the announcement came July 12th of 2018.
We last had you on the show.
We recorded in October, and it was very much in progress
what was going to happen.
The peps were in progress.
For those of us who are not deep in the Python community,
maybe the uninitiated, explain what peps are, what that process is,
and then once you do that, you can go into what happened,
July, August, September, moving forward to get to where we are today,
which there is a new governance in place.
We're going to try to tell that story and also, you know,
peel back the whys behind what the decisions finally came to be.
Yeah, I mean, to give the plot away, Python did not collapse.
So obviously it all worked out in the end.
You're not going to listen to the end, Brett. You ruined it.
Yeah, I know. Oh, well.
But yeah, story time.
So before July 12, 2018, the way PEPS worked,
and PEPS are Python Enhancement Proposals, and they're very much based on the IETF's RFC system.
Basically, what would happen is if someone had a major change they wanted to make to Python,
typically this is language level. It can be module level, but it was kind of a gut feel of what
really required a PEP and what didn't. But basically, you would write this document that would
give an abstract of what you wanted to change, a rationale of why you wanted to change it, an explanation of exactly what that change was,
hopefully implementation,
discussions of backwards incompatibility problems potentially,
and then also act as a historical document
of what came up in the discussion of this idea.
Because PEPs tend to lead to changes to the language.
It tends to be fairly controversial with some people.
And so the PEP also records rejected ideas and why they were rejected.
And if it's in the middle of a conversation, any current open issues that are still open for debate.
But basically, that's it.
It just becomes a document that records a proposal for an idea. And for the fateful retirement day,
what would happen was Guido would either choose to make a pronouncement himself
and either accept it or reject it,
or in the last few years, he added the concept of PDFL delegates,
where basically Guido would say
look I don't have enough domain specific knowledge
in this area but this other person does
and I trust them to make a good decision
so I'm going to delegate my BDFL powers for this one pep
to them and then they would play that role
so they would be the one that you would have to convince
they would be the one that would provide the feedback
and ultimately they would be the ones that would make the call of
whether to accept or reject the PEP. And that's basically it. And anyone technically could make
a Python enhancement proposal. It is open to the public. We do ask people to propose the idea first
to a main list called Python Ideas. That's Python's Python dash ideas, if you're going to search for it later.
And just to make sure that it hasn't been discussed before,
because obviously 29 years of history means there's a decent chance
your idea has come up before.
And then if the general people on that main list go like,
yeah, that's not a crazy idea,
or are able to give you feedback as to why it's a crazy idea,
you can then consider moving forward and writing a draft PEP,
sending it to the list again, getting feedback,
getting it kind of tightened up, ready to go,
and then get that sent to Python Dev
and have the real serious discussion.
So that's how the PEP process worked.
And then starting July 12th, that all came to a screeching halt
because we no longer had someone to make the BDFL decisions on a single PEP.
So what happened is we basically put Python's feature development
from a PEP perspective on hold.
We literally put our forks down and said, okay, no more. Pencils down.
We are not going to touch a pep.
No one is in a position of power right now
to make a call on any peps.
Whether it's to actually
make a decision or to actually delegate
to someone. So we all just
immediately agreed to that.
Day to day kept working though.
We still fixed bugs and stuff and kept moving
towards
getting I believe we were still under Day-to-day kept working, though. We still fixed bugs and stuff and kept moving towards getting...
I believe we were still under Python 3.8 at that time?
No, it would have...
Yeah, Python 3.8 development would have started by then.
So day-to-day was still going on, but the high-level stuff stopped.
And then we started to discuss, what the heck are we going to do?
As we discussed just a minute ago,
Guido left it completely up to us
to decide how we wanted to handle our governance.
How do you run the Python open source project now
from a development perspective?
And so we very quickly agreed
that we were going to do it through the pet process
if for any other reason than because we all agree on it,
and don't reinvent the wheel if you don't have to.
So we just decided at least we were going to be proposing peps
on potential governance models.
And then we tried to get initial, I don't want to say deadlines,
because we didn't keep to them at all, but at least
guidelines of when we wanted to aim for this stuff to get done. Because we realized we were in a very
interesting position of we didn't want to rush this because obviously there's the possibility
for some of us to actually live with this for a long time. I've been contributing to Python now for 17, 16 years?
17 years?
So whatever decision here,
I could have to live with for decades.
So I didn't want to rush it personally.
But the other thing is we also realized
the Python community,
specifically in the open source community,
honestly, as a whole,
was very much watching what we were up to
and users especially
and not wanting to see us necessarily take forever because having the language kind of in this
uh what some of you does a crisis of leadership uh last too long so we were in this weird spot
where it's like let's not rush it but we don't want to take too long to give the impression that
we don't know what the hell is going to happen or what's going on and thus you should not use python because who
knows if it's going to be around in a year right so we more or less seem to have agreed that we
were definitely going to try to get it done uh at least the major steps in 2018 um i think some
of us were hoping to get it completely wrapped up in 2018 that didn't quite happen but we didn't miss by too much
and so with that squared away
we realized while people were starting to think about
how we wanted to govern ourselves and make governance
model proposals we also had to figure out how to choose
the actual model
because there's kind of a
recursive problem here.
Well, all right, how do you choose?
Well, you got to choose how you're going to choose.
Well, how are you going to choose how you choose?
Well, you could choose how to choose how to choose how to choose.
And you got to stop somewhere.
So we realized figuring out simultaneously while we were choosing,
or not choosing, coming up with our potential governance models,
we also had to figure out how we were going to actually choose.
Because once again, Guido did not provide guidance on that.
He just said, it's up to you to decide how you want to decide.
So we also started a simultaneous discussion somewhat on voting.
We are lucky enough that we all tried to get together
for a week once a year in September
at the Python dev sprints, where it's only core devs
because we find we aren't very productive at sprints
at conferences like PyCon because we're trying to help newcomers
get up and going and answer questions for people.
And so it's not a good productive time for us.
So we started annually having a week where it's just core devs
so that only core devs are able to ask questions of each other
so that we can get more focus time.
And in September 2018,
I was hosted at Microsoft in Redmond, Washington,
in the United States.
And we were able to get a bunch of us in a room
who cared about voting,
because obviously you can really nerd out
a voting system, it turns out.
And some people cared a lot and some people
could care less and so some of us who cared got together in a room and we just brainstormed and
kind of like okay what feels right what feels wrong where do we want to do the voting and where
do we want it to go uh we came up with what we thought worked. We took it back to the main list
shortly thereafter in September
while people were still getting proposals
for government smalls.
There was back and forth on that.
There was a lot of discussing.
And it was kind of tricky
because, as I say,
we were trying to choose
how we wanted to choose,
but we had no one in a position
to choose how to choose how to choose, right? but we had no one in a position to choose how to choose
how to choose, right? So how do you choose what voting model? There's no one in a position to say,
all right, that voting model seems to win, right? Does that have more votes or how do you vote for
a voting system? It was a really odd position to be in because it was done entirely by consensus and just sheer willpower of everyone
involved to kind of go like okay this seems like the voting system everyone mostly seems to agree
on but we have no real way to like officially declare that so we kind of all just went like
okay this seems to be what everyone jelled around and so we're going to go forward with this
if you got a problem speak up and i don't really remember anyone specifically speaking
up but honestly had they it would have been needed like a large number of people to really
speak up to go like no that seemingly consensus is not right so we ended up on a voting system um it was uh based around the uh condescending method it's basically it was
uh sort of like ranked ballot it's there there's a whole thing uh we can if you really want to get
into the nitty-gritty details uh but there it's all written down in a pep uh It is in, I believe, the PEP 8001. That PEP lays out how we did the voting. So
with that out of the way, and that was decided, I believe we've decided on that sometime in
October, maybe by the end of October. We had started to get a kind of coalescing
of what models we wanted.
And so come about mid-November,
I believe we set as the deadline
to get all of the proposals in and locked in.
And then we held a vote
from the beginning of December till mid-December 2018,
and then we got a result,
and then we all took a big deep breath for having finally settled that one,
and then the selected model, and we can discuss the models if you want later,
required some elections, so we had to hold those elections.
We held those elections from mid-January to mid-February.
We did that, and then the elections finished, and then the new governance model kicked in
more or less that day, and we've been running under that model ever since.
This episode is brought to you by the O'Reilly Open Source Software Conference in Portland, Oregon, July 15th through the 18th. is where you go to understand what's shaping software development from AI and cloud technology to distributed computing and learn how to put it to work for you and your team. Whether you're
looking to understand where software development is heading or machine learning can make or break
your code, OzCon is where you'll find your answers. Hear from industry leaders like Pete
Skomoroch, Holden Carew, Allison McCauley, and Sam Charrington. Passes start at $7.96 when you register with the code CHANGELOG20 before June 7th.
Again, before June 7th, use the code CHANGELOG20 and head to oscon.com slash changelog to learn more and register. so brett as you describe this entire process i can't help but wonder do you like this stuff
um governance and voting and model like the cone the condirect method is this stuff like
get your juices going or is it just like drudgery in order to continue?
Because if it was me, I'd be like,
I'd like to just do the features of the language.
But here we are.
So I have a bachelor's degree in philosophy.
You like that stuff.
Yeah, so I like political philosophy.
So I like the ideas behind it i like the thought problem
of just thinking through the ramifications of the decisions but the i will fully admit that
the whole process was a bit stressful um because i i i am vested to the level that I am.
At this point, I am one of the longer-serving core devs
that's still active.
And so I felt kind of like a vested interest
of making sure this went well and smoothly.
And so the actual decision-making was a bit stressful
and trying to herd the cats as it were of like
okay let's try to get all this done by this date so we don't drag on and trying to drive try to
keep the discussions focus and trying to do all that while not having people think that i was
trying to play mini pdf all and trying to become my own trying to become an overlord in the middle of all this or something while still trying to somehow exert some good forcing motions
towards reconciliation and actually ending it.
It was kind of tricky.
So yeah, learning about all the voting methods was interesting.
The arguing about it was nice.
So anytime that power leaves a scenario,
there's a vacuum, right?
So you have the person who's been the dictator,
as the acronym states, for a long time, gone.
No, like you said, no secession planning,
no handing off the keys to the kingdom to this person,
and now they're in charge.
That, I would imagine, produces a power vacuum.
Python's a very important language,
very important community, open source project.
And undoubtedly there's lots of money involved
because it's producing money for all the businesses
that are using it, et cetera, et cetera.
How heated were the debates? How heated were the debates?
How heated were the arguments?
Was it relatively civil?
Was there any, not the name names, but were there moments
where it was like, wow, this is really intense?
So you're right, there's a lot of money.
I mean, I know of a bank
that has billions of things trading daily thanks to Python, right?
Like, that's just one example.
I mean, I don't think there's probably a single Fortune 500 company that's not using Python somewhere.
So there is definitely money behind it but and one of the very interesting things about python is it's probably it is
definitely the most popular programming language that is what i call community-based open source
right there it and versus corporate-based open source it's not a go or um a rust where there's
a very specific backer who is who basically acts as a backstop to make sure things happen.
I'm not saying necessarily that they overexert control,
but that there is a backstop there to make sure things happen.
Right.
Or even JavaScript, right?
Like they have ECMA there,
and companies pay people full-time to work on JavaScript.
So there is no worry of JavaScript disappearing.
Python, on the other hand,
I think now we can potentially claim
we have a single core dev
who gets to spend all his time on Python.
And honestly, he gets to do that
because he just declared one day at work
he was going to do it and no one said no.
So, and I think he calculated
if you add up all the core devs
who get any form of paid time,
I think we might equate to three developers on Python.
So it's very volunteer-based,
which means pretty much everyone who's participating
isn't really being driven by their employer.
It's pretty much across the board driven by people
who are choosing to put their time and effort into it.
I mean, I'm very lucky. I got made manager of my team in March officially. And as part of that,
I made a deal that any time I have that's not spent managing my team, I get to put into Python.
So I can steal a good chunk of time when my team doesn't ask too much of my time.
But I'm extremely lucky in that perspective. So you to microsoft for that but it's not normal and so it means that there's not money
in the management of the language everyone's pretty much acting as altruistically as they come
which does mean though that it can become very passionate because there's not this, like, oh, I'm going to just make sure this works for my company, but it's for the company, not me.
I don't have to worry too much versus I am putting my personal blood, sweat, and tears into this project, so I very much care that this result comes out well.
There was – it got kind of heated over the voting system, actually.
The actual individual governance models, there was enough of a variety there that covered the gamut of what I think everyone kind of expected as potential outcomes that there wasn't really any major heated discussions on that. But the voting system actually, there were times where it's like, wow, okay, that person's really passionate
about this specific approach
and really feels like there's going to be
potential disenfranchisement of people
if we don't choose the right voting model.
And that was an honest to God worry,
was if we chose a voting model
that people disagreed with
at a fundamental level as not being fair,
that could delegitimize the actual choice made through that voting system.
So there was some heated discussion around the voting.
It worked out in the end and it wasn't horrendous.
I think everyone also very much realized that this was a very unique situation
and everyone was a little stressed and worried about the outcome anyway. so i think everyone put in a bit of extra effort to try to
stay civil and try to make it not horrible basically so there was there were seven models
proposed and these are the voting on which model to use you said was the one that got
was was under debate versus the voting on how to vote.
The first one that you all just, that was kind of a consensus,
a soft consensus, but the actual voting on the governance models. Or maybe was there a bunch of people in the room saying,
hey, 8012, hey, 8011.
These are the peps, 8010 through 8016, which, by the way,
the steering council model eventually won, which we'll talk about how that works.
But these seven PEPs, was there advocates for each one?
And they describe why the commons governance model makes more sense.
And somebody else would say why the external governance model made more sense, et cetera.
Correct.
I mean, because we use the PEP process, the author always acts as the advocate for that PEP.
So when someone made the proposal that I wanted,
basically another BDFL, for instance,
and that was PEP 8010,
Barry Warsaw wrote that,
and he, by default, became the de facto advocate for that.
And there were discussions.
A lot of it was around clarifications uh to try to
work out exactly what peps were defining clearly because some of the pets were very specific about
how things would run going forward and some of them were very uh loose on purpose uh we have
historically uh because we had guido as bdfl did not have very strict rules about how
things happened it was always just whatever guido said which meant we've never really had to write
down a lot of things things just kind of organically grew out of the project in terms of
how to make decisions and basically if there's ever a disagreement you just ask guido all right
what's the decision and then he would make it and that basically made's ever a disagreement you just ask guido all right what's
the decision and then he would make it and that basically made it that decision the rule of law
but we purposely didn't want we if purposely as a group never wanted to get drowned in the minutia
of how certain things happened um but now that we had peps uh proposing new governance model some
of them were very specific on how things happened.
So a lot of the discussion at that level was people wanting to get very clear clarification on what certain things did or did not mean.
And then after that, there was some discussion of, so I like this because of this.
I don't like this because of that.
But actually, there wasn't a ton of back and forth um discussion actually some
people got a little frustrated from that like some people were going like okay i don't have the time
to keep up with all the little discussions of what each of the peps are uh i'd like to hear
people's opinions and some people and there was actually some discussions about whether people
should come out and say okay my name is brett cannon and i like this because of this and i
don't like the other six because of this and this is my preference uh because they felt that was
kind of influencing they'd rather have people actually read them themselves and i said like i
just i want to hear other people's opinions just to see where they're coming from, to see if that sparks a thought on my side.
But it was very fluid in that regard.
So it wasn't a lot of that.
I mean, really, the coming to consensus and trying to make decision of the voting model,
the 8001 PEP, was really it.
After that, it was just a lot of clarification, a little bit of people here and there occasionally stating i like this or i don't like that and you could read into it sometimes
based on how they were asking for clarification questions like well you say this but what does
it mean in this situation they weren't really leading per se but it was very obvious where
people were coming from with their questions but otherwise it was pretty much a
here are the seven at the, here are the seven ideas.
Go read a bunch of PEPs for two weeks, and then we're going to start voting in two weeks
and be ready to have a ranked choice order of what you like over what.
So as I said, the steering council model, which was PEP 8016, won out.
Now that it's all said and done, you can go ahead and just tell us was this your choice
or did you did you have to settle other people like this one did you like another one more
was this uh we're hoping for what no actually uh so no this was actually not the one i voted for uh pep 8000 and i believe 11 uh yes the python governance model led by a trio of pythonistas
so the one five yeah
now we got
well
it's interesting though
we do have five
it's good
yeah
yeah
that was actually
also discussed
like
do we
do we need to have
an odd number
does it really matter
because if you have a tie
you just basically
can just say
well then that fails
so there's even
discussions at that level
it's like is odd numbers important is there such a thing as too big of a number or too small of a number basically can just say, well, then that fails. So there's even discussions at that level.
It's like, is odd numbers important?
Is there such a thing as too big of a number or too small of a number?
So no, actually, this was not my top choice.
What I like about it, though, is top, tree of Pythonistas.
I like that.
Can I go for the acronym, huh?
Yeah, I do.
Well, coming back from the military, you called the,
jeez, I'm showing my age here when I forget these things,
First Sergeant.
The First Sergeant was in charge of the unit, the whole entire brigade.
And that person you would call Top.
It's just a term of endearment, a nickname,
but it was meant to mean they're the person in charge.
They're the Tops, man're the top yeah top i kind
of like that for that reason so if adam was voting and he goes solely on acronyms he's like which of
these model has the best acronym well let's dive deeper into those details then so i like that
aspect of it what is the dramatic differences between uh 811 and 816? Well, how about this?
Why don't I go through all of them real quick?
And then that way I can kind of just, I'll just kind of call out the major differences.
Cool.
So, 810 was basically a elected BDFL.
Otherwise, same thing.
So, really all that did was just dictate how do we vote in a BDFL and how do we throw out
the dictator.
That didn't win basically because we couldn't agree.
People didn't, there was a disagreement over whether that PEP needed to specify who the initial dictator would probably be.
Or whether or not that should be completely left out and then after that was a general feeling that there was no single individual
who could directly replace guido's uh commute ability to lead the community as well as has
his technical acumen so honestly that very quickly didn't have any chance
uh 8011 was the trio which as i mentioned was basically BDFL but split across three,
to kind of help take care of that issue of not having a single individual but having at least across three people,
a good way to manage the community and all that,
but also have the technical acumen to actually either make decisions or to delegate as necessary.
AD12 was actually Rust's governance model.
So that was very much everything is run by working groups.
And working groups can form themselves, but then you had to get voted in.
And then it was all about how to dissolve the working groups and how to choose which
working group handles peps. That one was very much a devolvement of power to more or less give everyone an equal chance to kind of lead if they chose to in their chosen area.
That one actually came in second in the voting.
And I will mention that the trio came in third.
And I don't remember if they were that close.
All the voting results are public, by the way,
so you can totally look at the actual voting results.
But it wasn't a huge difference.
813 was kind of interesting because that was for a...
It was basically, let's run python like an enterprise
uh it was kind of the idea of when it when you go to your vp with an idea you sit in a meeting
you tell them what your idea is you pitch it to them you try to convince them in that meeting
that's a good idea and then if they like it, they say, okay, great, go do it.
Or they will sit there, pepper you with questions, hopefully good questions, and then say, no, go back and go fix it.
And that's basically what this model laid out.
The other interesting thing about it, though, was it specifically said the council members could not be core developers with the idea being that you want someone who is impartial
and has no specific pre-existing leanings that would cause them to make a bad decision because
they just have a pet project they want to see or change they want to see happen that didn't happen
because basically a lot of the core developers said,
no, I don't trust an outsider to know how the project necessarily works
and how to handle things appropriately
in the Python community, etc., etc.
So that didn't really go anywhere.
PEP 8014 honestly was anarchy.
And I'm not joking.
Jack Jansen actually admits in the PEP
that he would have used the word anarchy,
but it's such an overloaded term of negativity
that he didn't feel like he could say it that way.
But basically, all it said was to choose on peps,
there should be a vote.
And that there would be more or less.
And then there's a council to decide the result of the vote.
And that's it. And it says the council to decide the result of the vote and that's it and it says
the the council should decide the result of the vote based on how the vote finished who voted how
those people voted it was very much like we could have a vote among our vote in the core devs we
could vote with the community we can look at who voted and how they voted, or we could not care.
Basically, all there was was there was an election council
to validate the results of the election,
but they're allowed to interpret the results of that election
almost any way they want.
In the blurb on that, by the way,
PEP 8000 has all these blurbed out,
and 8014, it says,
instead, this is determined by the council
of elders sounds kind of cool yeah i like that is it as late describe what an elder is like how old
you gotta be uh no there is no age limitation yeah 38 80 or no everyone suddenly starts
nominating their grandparents yes my granddad should be on this
Because he's old enough
And he still has his wits about him
That one sounds like you have to go on like a spirit quest
Out into the mountains or something
Come back different
Yeah come back different
With your feature
With your pep all written up
I've seen the whole
Didn't actually place last though
I mean that one got uh it actually
ranked fifth out of the seven so it wasn't last the external council came in last last yeah no
that one uh and actually that one had the best quote from uh monty python the holy grail at the
end where they um if you've seen the movie when king arthur runs into the commune out uh
collecting muck out in the mud uh that was basically the model he was going for
was having an autonomous commune run python i'm in a nice experiment yeah um 8015 uh was
organization of the python community that one was basically basically it said there was going to be a council
and the council either
chose a BDFL delegate
or there would be a vote.
And that's basically what the council did.
Otherwise, the kind of expectation was
it was going to be
everything was going to be done
in working groups otherwise.
I don't think that one
because it wasn't quite strong enough
in a specific position because there was still choosing delegates,
but there were still working groups and votes.
And honestly, after all of this, I think there was some voting fatigue
after all the discussing of voting and what has to happen for a proper vote
that I think some people were going like,
yeah, I don't want to have to vote every time there's a new PEP.
So please don't ask me to vote that much.
So I think that's partially why that PEP lost.
And then AD16, which has actually become PEP 13,
and PEP 13 is the actual official governance model PEP.
That was the steering council one.
And what that basically said was every release of Python, we will elect a council of five people. There can be no more than two
people from the same company to make sure that no company can basically own the council. And
the council has absolute power except for changing PEP 13, which dictates how votes are handled and who gets to vote.
And then the other little interesting bit of the PEP is it basically says the
council has absolute power, but looks to use it as little as possible.
So the PEP itself says the council should try to find consensus among the core
developers.
And I will admit,
the reason I personally didn't like this pep
is that felt a little too wishy-washy to me
and too ripe for abusive power,
if that was what people were worried about.
Because if the council has absolute power,
they don't have to listen for consensus from the core devs.
It's just kind of a hope.
And I felt like if you were just going to hope for that,
you should just go ahead and just do the trio and keep it simple.
But because subsequently,
since we've done this,
I've actually had people quote that part of the pep to me at least twice that
the council was supposed to find consensus.
So it's there, but it can't be ignored, but the council's not trying to ignore it.
So it's put it in an interesting perspective of like the council can basically do what
they want, but they're trying not to.
But it also means that almost any action taken by the council, if it hasn't had a full-blown discussion
before, can be questioned as
not trying to reach consensus.
So that was one of the reasons I voted against it.
But it won, and
we have not collapsed, so it seems to
be working.
And those are all the models.
Is there an escape hatch built in? Like if
the steering council model is an utter
failure, can there be not an overthrow of the council,
but an overthrow of the model and say,
let's revote and try a different one of these seven
or a new one that somebody else proposes?
Are you stuck with it for good?
Well, so not necessarily.
So what the PEP specifically states
is what the definition of a core developer is,
and very specifically what an active core developer is.
So you had to have contributed to Python in the last two years to be considered active.
And so that makes you eligible to vote.
And then through approval voting, we vote in anyone who has put themselves forward to run on the council.
It can be a core dev or it can be an external person who is sponsored by a core dev, I believe.
So that also lets people who are not core developers participate,
although everyone currently on the council is a core developer.
You are allowed to call for a vote to throw out a council member,
and that can include the entire council.
People can also propose changes to PEP 13,
and that calls for a vote from other core devs.
So technically what you could do, if you were not happy with this model,
is propose a change to PEP 13 that basically completely rewrote how the model
worked. Call for a vote
and as long as
the council does not veto
actually we can't even
veto this. So basically
if you propose a change to PEP 13
that says we're going to go back to a
dictator and
a majority of Cordes voted for it,
that would change the model.
So you could still do it potentially.
One thing to pay attention to is the sheer amount of detail
in each of these proposals.
I mean, I can only imagine, was this,
this is the comprehensive list, right?
How was this formed? Did you reach right the how how was this formed did you reach
out to those that cared enough and said hey propose you know a new model well so what happened was
uh i think we we obviously knew some pre-existed based on various people who have participated in
other open source projects actually if you look you look at PEP 8002,
it's actually a survey of other open source projects
and how they govern themselves.
So it's actually an interesting document
just to read how, in one place,
how other projects do their own governance.
But basically what happened was we just went,
okay, if there's a way you feel
we should be running the project,
please speak up
and write a PEP.
And basically,
810 was obvious because that was
a dictatorship. 8011,
which was the trio, made sense to
those who thought there was no singular individual
who could replace Guido.
The community governance model
was basically Rust, so that was already known. The community governance model was basically Rust,
so that was already known.
The external governance model was a unique one.
The commas governance model was Anarchy,
so you could say that was unique
or you could just say that was obvious as an option.
And then the organization of the Python community
as this kind of hybrid approach was a unique one.
But it was very much just us going to ourselves, what would we want?
And then people just, some opinions just very quickly came up and bubbled up.
And then some came along.
Like 8016 was not actually originally a proposal. up in October based on various discussions that sparked Nathaniel Smith and to, and I
believe he had some coauthors, yeah, Donald Stuff, to come up with the proposal.
It was based on what they were hearing and where they thought things could potentially
go.
So yeah, we didn't specifically reach out to anyone other than some people specifically
going out and researching what other communities did and how they handled themselves and just kind of taking a step
back and looking at if anyone's felt inspired to then take the time and effort to write
up a PIP to propose it and advocate for it. This episode is brought to you by GoCD.
With native integrations for Kubernetes and a Helm chart to quickly get started,
GoCD is an easy choice for cloud-native teams.
With GoCD running on Kubernetes, you define your build workflow
and let GoCD provision and scale build infrastructure on the fly for you.
GoCD installs as a Kubernetes native
application, which allows for ease of operations, easily upgrade and maintain GoCD using Helm,
scale your build infrastructure elastically with a new Elastic agent that uses Kubernetes
conventions to dynamically scale GoCD agents. GoCD also has first-class integration with Docker
registries, easily compose, track, and visualize
deployments on Kubernetes.
Learn more and get started at gocd.org slash Kubernetes.
Again, gocd.org slash Kubernetes. So let's focus in on PEP 8016 because that's the one.
It's the one model to currently rule them all.
The steering council model, there's five members of the steering council.
You've been talking about it a little bit.
One of the things I found interesting is the duration and the term.
So there's no term limits,
but a new council is elected after each feature release.
And I'm curious if that's a known quantum,
or are you guys on like a six-week cycle,
or does it just depend on how Python features roll out?
So we, that is a roughly known quantity,
we release every 18 months for new feature releases.
That's a good duration for a steering council, it seems.
Yeah, so
the 18 months is actually
we occasionally discuss, do we want to switch
to a year? Do we want longer?
Because
we kind of got into
Linux distros early as a thing,
the 18 months just seem to have always worked out as a good number
and it's continued to work out.
Although there has been rumblings of like,
what happens if we did annually like some languages?
So it's known, it's not like lockdown every October 15th
or every March 15th we do a release,
but it's roughly around those months.
And we do know this initial group is going to be truncated because the next release of Python is later this year.
So this initial council is going to have a shortened cycle.
But yeah, so it's roughly known that basically if you end up, you will be on for 18 months.
Now, as you did point out, Jared, there is no term limits.
And that was somewhat on purpose.
The idea being that if people felt people were doing a good job, there was no reason to kick them out.
We do recognize there is institutional knowledge and just running things.
But it does allow bringing new blood because people will come on and come off as necessary.
We did look at the Django Slaughter Foundation and how they run things.
And out of their original council, I believe they have three that are still on.
So there is some churn.
But there is full recognition that basically people, I don't want to say people are lazy,
but honestly, if people do a reasonable enough job, people will keep voting in people if they think a reasonable job is occurring.
And so there was acknowledgment that the initial group of people, unless they step down, chances are they will keep being on it.
And people seem honestly fine with it.
So the lack of term limits so far hasn't been a problem.
But then again, we haven't had a second election or a third or a fourth or a fifth.
Come back in a decade and then we'll see if people have problems with the lack of term limits so far hasn't been a problem, but then again, we haven't had a second election or a third or a fourth or a fifth. Come back in a decade,
and then we'll see if people have problems
with the lack of term limits.
So we should mention that you're a member of this council.
Congratulations.
Thank you.
Yes, and the twist ending to this story is Greedo's back.
He's on the list.
Yeah, so it was funny.
So I put my name forward.
As I said, I feel invested in Python at this point.
I'm lucky enough to have a lot of friends in this community.
So I want to see Python to keep going,
if for any other reason,
to just selfishly make sure PyCon continues to happen
so I get to spend a week hanging out
with good friends of mine somewhere around the world.
But Guido actually emailed me asking if I thought it was okay for him to run
because he did say when he retired that he didn't want to completely walk away from Python
and didn't want to participate.
He just didn't want to be the sole person in charge anymore. I think I've heard him in an interview kind of related to sending your kids off to college.
They're still your child, and you still talk to them and try to help them out with life,
but they're not living on your roof anymore, and they're not coming to you day to day with all their problems,
and you don't have to make them lunch anymore.
So I think that's basically where Guido was coming from.
He felt he still has a technical insight to provide and he still wants to
help out.
He just didn't want to have to run all the political stuff and all those
kinds of decisions.
So I personally told him that I thought it was reasonable and a good thing to
do.
And I think it also helped with validity of the council for,
so there's good optics honestly
to be able to go like okay guido may have stepped down as bdfl but he's on the council that someone
helps legitimize it and uh yeah i know some people have been worried like are we just a mouthpiece
for guido and he's still pulling the strings behind the scenes and the answer is no uh Guido attends the meeting that's my next question yeah yeah no we were told you to say no yeah it's really all
deep state and it's really a shadow government for Guido and it's totally just so we can take
blame for everything uh no so uh Barry Warsaw, Carol Willing, Nick Coggan, and myself plus Guido. We have weekly meetings, and Guido's just another participant.
He takes notes just like the rest of us have taken notes in the meetings.
He gets no special treatment.
If he has some technical thing to say, we listen to him just like anyone else would listen.
I mean, obviously, he has some very deep knowledge
of how the language is structured so obviously we listen to him as someone who's been working
on python for 29 years but it's not like we are willing to go against him in a decision
um like i've that we've had one thing that kind of split the council and i i personally went
against what guida wanted and it just was what it was.
And it was nothing personal.
And he knew that.
And I knew that.
And it was just a thing.
The decision was made and it's no big deal.
So no,
he was,
he's not running the council behind the scenes in any way,
shape or form.
And there's already been decisions where others have disagreed and it was no
big deal because we're all basically friends anyway.
And it's just,
okay, it is no big deal, because we're all basically friends anyway. And it's just, okay, no big deal.
I'm not that intimate with the contributions history of Guido,
but one of the stipulations is having non-trivial contributions in two years.
So does that mean that he will continually actually write code for Python?
Yeah, I mean, he still participates.
We have not officially defined what that represents yet.
I actually am in the middle of writing some code to try to hopefully automate how we calculate that
based on contributions to certain repositories.
But Guido still participates in PEPs.
He's still been named BDFL delegate on a couple peps at this point he
he's made prs and merged them so he's still participating it seems like his succession
plan was not a succession plan that was a succession plan and the fact that he like he
wants to be involved it seems like maybe some of his underlying motivations might have just been to
resolve himself off of like some of the pressures and responsibilities that the bdfl model requires of the dictator oh very much so i mean the key
catalyst to this was that python introduced what we call excitement expressions or the walrus operator and it was a very controversial decision
it introduced new syntax where there's definite benefits but it was viewed as
margin one of those things where it's a marginal benefit in several cases that you might scatter
about in some places but it didn't introduce a new capability to the language
that was not somehow doable without it being there.
And at this point, people very much like Python's size
because we have a phrase that Python fits your brain,
and whenever there's new syntax
that doesn't open up a new avenue of abilities
that weren't possible before,
people very much worry that that feature
is going to lead to a potential
cascade,
or that will be the feature that finally pushes some other aspect of the
language out of their head.
And because of the amount of negativity he got over that pep,
he just finally said,
forget it.
I don't want to have to fight that hard for one of my decisions ever again.
It was just, it was funny.
He just went, enough's enough.
I just don't want to be that kind of focal point.
And I think the best way to kind of point that out is if you look at what the hierarchy used to be, it all funneled to him, right? So all the pressure of all the development
more or less funneled to this one individual
very, very decisively.
And then now that he's no longer doing that,
the pressure is alleviated
not only among all five of us.
It does not mean there's five more PDFLs
so we have five times more capacity
as some people have suggested.
But also because the PEP specifically
says we have to get consensus, it also falls a bit more on the
overall development team to have to come to an agreement and participate
and make decisions as well. So that also helps
alleviate some of the pressures like, well, we try to get consensus.
No one can come to consensus, so we're just going to let it go.
Unless we feel as a council something is very critical
and we need to make a decision
and we really think this is for the benefit of the team.
And thus we have to potentially make that unpopular decision
that not everyone's on board for
because we honestly think that it's important enough
to make that kind of call.
So have you you as a council
well i guess first of all i'm curious why the number five is the magic number um i know you
had the other one with three this one was five i haven't read the details enough to know if there
was like a specific reason for five but i'm also curious if it's if the council itself has been
stressed at all in terms of decision making so far i know it's only been a couple of months
that y'all have been active but has there been any difficult decisions
where you haven't reached consensus or struggled to get there uh so for the number five if i
remember correctly uh it was mainly it's an odd number and it's enough that reaching consensus means there isn't
any specific,
um,
way to hopefully directly influence people to get what you want,
but it's not so big that actually reaching consensus is difficult.
I mean,
basically five is a manageable number without feeling like,
Oh,
there's just this magic little cabal.
I can see with three where you could just turn one person to your side
and basically strong arm the third,
where with five you'd have to convince two others.
So it requires a little more effort there
in order to get a vote to go your way.
Yes.
In terms of any controversy so far uh yeah um we purposely try to present
any decisions we make as a council there's we don't say like oh well these we voted this way
and thus the results this so i don't want to necessarily point out any specifics in terms
of splits but i will say there has been at least one where we've split three two um but i, I mean, as I said, no one felt like,
oh my God, this is such a horrible decision,
why are we doing this, who didn't get their way.
It was just like, oh, all right, well, that's too bad.
But that was it.
We have had at least one decision we made
that was viewed as somewhat controversial.
And honestly, I think part of the controversy was,
honestly, we were a little sloppy in the process.
Basically, we, I think it was last month,
accepted a PEP to move our issues over to GitHub.
And the PEP that outlined the reason behind the decisions
wasn't updated fully,
and it had some factually inaccurate statements
that need to get fixed.
It doesn't necessarily change the decision, but it was just kind of a sloppy way of handling it.
And so people called us out on it and it was totally rightfully so to be called out on
and we do plan to fix it.
That was somewhat controversial.
There have been other times where things have been stated or suggested.
And as I said, I've had people like quote back at me you didn't ask for consensus blah blah and then honestly that was main typically just people not
noticing that something else had been discussed uh somewhere else and so it was usually just
misunderstanding i was able to say no actually it was brought up over here and people didn't object
and that usually settles that pretty quickly so it's it hasn't been too tumultuous
really uh i mean we only all got elected february 4th i think i was in new zealand at the time on
vacation so i was off by days in the western hemisphere anyway so i don't even remember the exact technical day um but it uh so we just haven't been
going too long it seems to be working out pretty well uh people seem to be more or less happy with
the way things are going people have not been going like we need to overthrow me or someone
else on the council or the whole council or there's not been a crazy thing. I think we've all agreed that in about three years time,
we're going to kind of have a little retrospective on this and go,
how do we think this has worked out? Do we think this is the right thing?
Do we need to tweak something? Do we need to completely replace it?
Much like I think Jared, I think you asked earlier, how do,
or maybe it was, yeah. how do you completely replace it?
Well, we can change PEP 13.
And so we've already decided as a group that in about three years,
we're going to come back together and just have the discussion like,
everyone OK?
Is it all good?
Do we want to completely throw this out and try again?
And so we're aware that it is kind of experimental still.
And we're all still trying to figure things out.
I mean, everyone is, right?
It's one of those things where because it's a new model,
everyone's trying to figure out where people,
at least I think the development team is still trying to figure out
where they want the council to fit in and be
and where those boundaries of what should the council just directly handle
versus when should we try to specifically get consensus and then even at that point there's always going to be the question of
was that consensus or not it's always going to be a little hazy and there's always going to be those
times where decisions are made and it's like there seem to maybe be consensus but not clear consensus
and is that acceptable and and i'll see people are people and there will always just be some people who just disagree
and it just is what it is.
How do you think all this will play out
for the future of Python?
So when we look at its impact,
its ability to garner newcomers,
grow as a language, as a community, et cetera,
one of the concerns before was the BDFL model
where you have a dictator instead
of a committee or some sort of proper governance models that you have now how do you think the
long-term benefit to the language and those using it will play out give me some speculation here
i'm hoping that it will actually um i don't want to say accelerate but I'm hoping it will
open up some avenues to some things
that we haven't been able to try before
I don't think it's going to
hurt the popularity of the language
I think we've reached cobalt level
of integration
into companies where there's no chance in hell
people can get rid of us at this point
so Python will always be around
just whether or not we are,
the name Python is used in hatred or in love.
We'll hopefully be where things end up,
but hopefully it stays love.
My hope though is by having five of us,
it kind of opens up the potential for having ideas of how to try to move things forward.
I kind of view the council as
if everyone were to quit tomorrow volunteering,
there's at least five of us around
to make sure something functions somewhere
and we can somehow kickstart the project again.
I view the council as now the backstop.
As part of that, I'm hoping as a council
we can work towards focusing the community's energy towards improving
things right like Python 2 for instance has been a long running I don't say albatross but it's been
a weight on us in terms of maintaining it and dealing with that transition in the community
and that's all ending on January 1st 2020 right that's when Python 2 is going to officially be
retired and I think the hope is all that energy that's been kind of put behind my ending on January 1st, 2020, right? That's when Python 2 is going to officially be retired.
And I think the hope is all that energy that's been kind of put behind migrating people over
will suddenly be freed up
and hopefully the council can help
kind of focus it towards things
that we think can help the community continue to grow
and be a wonderful, welcoming place for everyone.
For instance, to give actually a concrete example
of that, Adam,
is we're currently working to potentially get a product manager
through the PSF to help out with some things.
Like the initial thing we're thinking about
is the sunsetting of Python 2, right?
That has a very hard deadline.
And there's some things we probably need to work out.
There's communication on that.
And so we're hoping we can actually hire someone
to do that kind of work
because Lord knows I don't want to have to grow
through the python.org website
and find every reference to Python 2 and rip it out.
That's just not what I want to do with my Sundays.
We're also talking about like having a vision document
with kind of just like expositorily saying like,
where do we see Python in 10 years?
Where can we potentially try to, as I said,
funnel the energy of the community
towards things that we think will have beneficial payout
to keep the language relevant going forward
and something people want to use?
Because we don't want to end up in a position
where we are just comfortable with where we're at,
and then we lose sight of where the community is going,
and then we have to be left behind by our users
because we just aren't where they need to be.
So that's my hope is the council will enable that
because before Guido just didn't have the bandwidth on his own
to do that kind of thinking.
And now that there's five of us,
I'm hoping we can spread that around enough
that we can actually see those kinds of things come to fruition
and have a positive impact going forward.
That's a hard burden to bear solo. It's much better to have a team.
Yeah, exactly.
Brett, one last question for you. I'm curious about the Python Software Foundation, its role in the new governance,
if it has any at all. Can you explain how they play a role? I don't know who they are or you are. ahead uh yeah so the python software foundation as a non-profit is basically evolved
since its founding in oh god i don't remember i was elected to it in 2003 so that's when my memory
starts uh it basically holds all the like uh ip for python and all the trademarks and then it also
does all the community outreach uh but it's always been run very independently
of the Python development team,
such that if the Python development team
has something they need monetarily,
like infrastructure,
we can go to the PSF and ask for it.
But otherwise, the PSF doesn't dictate anything
to the actual development team.
So for us, actually, part of PEP 13 specifies
that the council acts as the intermediary
between the development team and the PSF.
So for instance, we've started this conversation with the PSF about,
hey, could you potentially hire a contractor
to be a PM for the development team
to handle the Python 2 sun setting?
And that sort of thing.
The PSF helps organize and get funding together
to fly core devs together for our weekly sprint
every year in September.
But otherwise, they stay out of it.
Basically, they just say, hey, you come to us with what you need,
and otherwise we are never going to try to influence
the development of Python itself,
because that's viewed as like a political wing
kind of coming in and influencing the language.
And that's just not how the PSF is structured
or its mandate anyway.
So to us, it's acting more, I don't want to say a piggy bank
because that just discounts the great people at the PSF
and how they've always been very helpful when we needed stuff.
But basically they just say, come to us with what you need,
and otherwise we're going to leave you alone and let you do what you want.
Well, Brett, it's been awesome catching up with you.
This pep talk has been, oh, sorry, that was a good pun,
has been a lot of fun catching up with you for one,
but then also just seeing, no, I didn't rehearse that.
I was on the fly.
Catching up with you.
It's just been a lot of fun. I mean, it's good to, to hear that the Python community is taking
the right steps. Thanks to Guido for seeing, I guess, his own future for one and the pressure
on him and then how to, uh, you know, provide a new way and, and even better to not actually put
it in writing at first and let you all figure it out.
I feel like that's really been the best step. Would you agree with that?
Yeah. I mean, I think it's worked out for his personal well-being and I think it's going to
work out well for everyone. Yeah. I'm hopeful for the future.
We'll have to maybe do something like this more often too. We talk about the
underpinnings of Python in the community and how the council is working out maybe the the five-year check-in as you mentioned
three-year check-in yeah hey i gotta do what i can to get my next four uh guest spots on so
i can get the running crown of six i'll get you your ring soon enough yeah happy to be on if you
want all right thank you for tuning in to this episode of the changelog. Hey, guess what? We have discussions on every single episode now.
So head to changelog.com and discuss this episode.
And if you want to help us grow this show, reach more listeners and influence more developers,
do us a favor and give us a rating or review in iTunes or Apple podcasts.
If you use Overcast, give us a star. If you tweet, tweet a link.
If you make lists of your favorite podcasts,
include us in it.
Of course, thank you to our sponsors,
DigitalOcean, OzCon, and GoCD.
Also, thanks to Fastly, our bandwidth partner,
Rollbar, our monitoring service,
and Linode, our cloud server of choice.
This episode is hosted by myself,
Adam Stachowiak, and Jared Santo.
And our music is done by Breakmaster Cylinder.
If you want to hear more episodes like this, subscribe to our master feed at changelog.com slash master.
Or go into your podcast app and search for Changelog Master.
You'll find it.
Thank you for tuning in this week.
We'll see you again soon.