|
|
Subscribe / Log in / New account

More frequent Python releases?

This article brought to you by LWN subscribers

Subscribers to LWN.net made this article — and everything that surrounds it — possible. If you appreciate our content, please buy a subscription and make the next set of articles possible.

By Jake Edge
June 19, 2019

Python has followed an 18-month release cycle for many years now; each new 3.x release comes at that frequency. It has worked well, overall, but there is interest in having a shorter cycle, which would mean that new features get into users' hands more quickly. But changing that longstanding cycle has implications in many different places, some of which have come up as part of a discussion on switching to a cycle of a different length.

Łukasz Langa, who is the release manager for the upcoming 3.8 release, as well as the manager for the date-to-be-determined release of 3.9, has proposed PEP 596 ("Python 3.9 Release Schedule (doubling the release cadence)"). As its name would imply, the PEP proposes halving the current release cycle to nine months, which would make the 3.9 release happen in June 2020. As described in PEP 569 ("Python 3.8 Release Schedule"), the Python 3.8 release is slated for October of this year; it is in beta at this point, so no new features can be added. The beta release also marks the start of development for the next release, so work on 3.9 has already begun. With that overlap, a nine-month cycle would actually allow seven or eight months for feature development and four or five months for shaking out the bugs from the first beta release on.

As proposed, each release would be supported with bug fixes for roughly 12 months, then it would move to security-fixes-only mode for the following four years. The idea is to get new features out to users sooner, rather than have them languish in an under-development release for a year or more. The overall development pace of the language would not change, but the delta for each release would be smaller, thus provide less risky upgrades. As the PEP puts it:

This change does not accelerate the velocity of development. Python is not going to become incompatible faster or accrue new features faster. It's just that features are going to be released more gradually as they are developed.

Consequently, while this change introduces the ability for users to upgrade twice as fast, it does not require them to do so. Say, if they upgrade every second release, their experience with Python is going to be very similar to the current situation.

Reaction

The reaction to the overall idea was positive, though several suggested that making releases every 12 months would be better. Nick Coghlan said:

Syncing on the calendar year makes for straightforward alignment with other 6, 12, and 24 month cadence projects (including annual development sprints), and makes time planning easier for both individuals and organisations.

Guido van Rossum agreed: "It makes the (approximate) release cadence easier to remember. 'New Python releases come out in <month>.'" But Nathaniel J. Smith suggested considering a six-month cycle, similar to what Ubuntu does. That would include a "long-term support" (LTS) version every so often, perhaps every third or fourth release. The PEP also mentions the possibility of an LTS release, since shortening the bug-fix period to 12 months is helpful to Python developers but may be inconvenient for users.

A problem with the six-month idea is that the number of active releases being supported will be higher. As Antoine Pitrou pointed out, that cost is not only borne by the core developers; third-party packages of various sorts will need to also support multiple concurrent releases. Smith said that he was envisioning that most releases would only be supported until shortly after the next release, except for the LTS versions. He ended up drawing a picture comparing the current system, the nine-month cycle as proposed in the PEP, and his idea for a six-month cycle.

The six-month idea did not garner much support; even Smith is not really advocating it. For one thing, dropping support after roughly nine months means that users have to either get on an upgrade treadmill or stick with an LTS release. Many Linux distributions will likely stick to LTS versions, though they may backport some features and fixes. Fast-moving distributions (e.g. Fedora), would be stuck in a situation where the non-LTS versions are only supported for significantly less time than the distribution, as Petr Viktorin pointed out:

Fedora releases generally live for 1 year, with several months before release for stabilization. If a Python release is supported for 9 months, 3-7 of that before it's released in Fedora (for stabilization of both interpreter and all the software using it, actually updating the software, and for calendar mismatches), a Python release would go EOL [end of life] long before the OS would.

Viktorin said that Fedora would likely have to skip some releases, perhaps only using LTS releases, under the six-month plan; the nine-month cycle proposed by the PEP would also be awkward, he thought.

The steering council discussed the cadence of releases at its June 11 meeting. As reported by Coghlan, the council is "definitely sympathetic to the idea", but normally the schedule PEP is informational in nature; it is maintained by the release manager and not formally adopted like other PEPs. The council would like to see the cadence proposal as a "regular" PEP that requires review and approval by the core developers—ultimately, it will be decided by the council or its delegate. Coghlan personally thinks that using PEP 596 as that PEP would be fine; the schedule PEP could come later, once a determination is made.

In a lengthy message of his own opinions (not necessarily those of the rest of the steering council), he said that the yearly cadence aligns nicely with events in the ecosystem (e.g. PyCon US and the annual core developer sprints). But he is concerned of the extra burden the existing support schedule would impose. Right now, Python releases are supported with bug fixes until roughly six months after the next release (two years total) and then get security fixes until they are five years old or so. Coghlan suggested something rather different:

So my proposal would be to go for something that's closer to a hybrid of the Fedora and Ubuntu lifecycles (as well as drawing inspiration from the Django release cadence): alternate between our existing regular support period (which I'll call a "Standard Lifecycle Release") and a new reduced support period that pretty much only lasts until the next feature release (which I'll call a "Minimal Lifecycle Release").

In this variant of the proposal, we'd have an alternating cadence where 3.8 would be a Standard Lifecycle Release, and receive bugfix releases for 2 years (until late 2021), and then security updates for a further 5 years after that (until late 2026). By contrast, 3.9 would be a Minimal Lifecycle Release (starting in late 2020), and its support period would be greatly truncated: after a final bug fix release alongside the 3.10.0 release (in late 2021), Python 3.9 would go into security fix only mode only until the 3.10.1 maintenance release. This approach would mean that if you chose to migrate from 3.8 to 3.9, you'd also be committing to migrate to 3.10 almost as soon as it was available. Alternatively, folks that didn't want to make that commitment could stick with 3.8 until 3.10 was available.

That would result in "a larger support matrix than today, but it's not dramatically larger the way it would be if we did a standard lifecycle release every year". Van Rossum's personal opinion is that a faster release cycle is desirable and paring down the support matrix is needed, but he is not in favor of an even-odd switch between the standard and minimal lifecycles.

But I just hate, hate, hate the idea that there is (intentional or accidental) semantics in the low bit of the minor version. When I encountered this convention years ago for Linux, every time it was significant I had to ask some expert what the convention was. Maybe we should just name the releases with short lifecycles betas? Or we could bump the major version each time after a new LTS release? (So e.g. 4.0 would be a short-lived release, and 4.1 would be the following LTS; then 5.0 would be the next short-lived release, etc.) I know that sounds crazy too, but let's please get a little bit creative about this rather than settle for even/odd.

Smith pointed out that the Django web framework does something similar, but that it still requires some knowledge to determine whether a release is short-lived or not. But he wondered if bumping the major release number would cause problems for programs that have checks like:

    if sys.version_info[0] == 3:
        ...
There is also the question of users being wary of a "Python 4" after the major upheaval that Python 3 brought with it. No one is suggesting (yet) making a change like that again, but changing the major version number would need some clear communication to users at the least.

Coghlan suggested a variation of his earlier idea that would allow for backward-compatible feature additions to point releases (X.Y.1 and X.Y.2) for 12 months, then bug fixes for 12 months, followed by three years of security-only fixes. Brett Cannon thought that the numbering scheme just made the problem Van Rossum raised worse; "you need innate knowledge of what those versions represent in order to know if there's new features or if it's just a bugfix release". To Cannon, that suggests moving to Semantic Versioning (semver):

To me that screams "[bite] the bullet and switch to semver" where we bump the major version every 2 years and we don't bother with intentional bugfix releases until we reach the point of no longer adding backwards-compatible features.

Cannon was concerned that people were getting too hung up on the idea that switching to Python 4 would worry users: "I say jump to Python 10 and basically start fresh with our numbering scheme". Coghlan did not think users would really wonder about which releases had new features and which were simply fixing bugs, but Paul Moore strongly disagreed: "I'm with Guido that you shouldn't need to ask an expert to understand the significance of a version number."

Coghlan created PEP 598 ("Introducing minor feature releases") to describe his ideas, but the reaction so far does not seem favorably inclined toward changing the interpretation of the point-release number. As Van Rossum put it:

Our position has always been that versions that only differ in the 3rd part of the version number should be compatible both ways, and (unless you hit an actual implementation bug) it should be safe to develop on, say, 3.9.5 and expect your code to run on 3.9.0 (as well as on 3.9.6, when it comes out).

I don't think we should lightly change this. Which leaves us with a faster release cadence. I am so far not objecting to a yearly cadence; but 9 months feels too fast to me.

Cannon agreed that a yearly cadence made sense and that no change to the version-number scheme was really necessary. He is also a member of the steering council, so that would seem to indicate that at least two of the five members are leaning that way. Most of the comments—Langa has been mostly silent since posting the PEP—seem to be assuming that the 12-month cycle will "win" over the proposed nine-month cycle, but any change will be somewhat tumultuous in the ecosystem. It seems unlikely, but possible, that the steering council could settle on "no change", at least for 3.9. But we are still quite early in the cycle for 3.9; if Langa updates his PEP to a 12-month cycle, it might well be adopted soon.


Index entries for this article
PythonRelease model


(Log in to post comments)

More frequent Python releases?

Posted Jun 20, 2019 5:26 UTC (Thu) by thomas.poulsen (subscriber, #22480) [Link]

Year based version numbers? Python20 would fit well with the python2 eol.

More frequent Python releases?

Posted Jun 22, 2019 8:46 UTC (Sat) by makapuf (subscriber, #125557) [Link]

Beware the Y2100 bugs ! Py2020 like rust does is even more explicit.


Copyright © 2019, Eklektix, Inc.
This article may be redistributed under the terms of the Creative Commons CC BY-SA 4.0 license
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds