On Jul 2, 2014, at 4:14 PM, Andrew Gaul <g...@apache.org> wrote:

> Giving a date-based notice as Guava does for some recent breakages,
> e.g., InputSupplier scheduled for removal in December 2015, makes some
> amount of sense given jclouds historical lack of major release
> predictability.  However, I generally doubt that we can provide strong
> guarantees about breakages while addressing the large backlog of jclouds
> technical debt and relying on Guava deprecated and beta APIs.

Because we’ll have both a major and minor release cadence the release dates 
will be predictable. Of course things will drift a bit because of holidays or 
voted down RCs but it will still be predictable. Saying something is going to 
be removed in version X is akin to saying something will be removed on date X.

> Further I do not understand the proposed workflow for changing or
> removing an API.  Let's assume we are at 1.7.3 as today and will release
> 1.8.0 in a month, and new major versions every six months.  At which
> point in the development cycle can I commit a breaking change to master:
> 
> 1) at any point before 1.8.0 release
> 2) immediately after 1.8.0 release
> 3) at any time during 1.8.x
> 4) when someone changes the project version to 2.0.0
> 
> Previously we allowed 1-4 but the proposed scheme only allows for 4?
> When do we decide to bump the major version number and which fraction of
> the release cycle allows breaking changes?

On an example 6 month major release cadence

3.0
3.1 - 6 weeks
3.2 - 6 weeks
3.3 - 6 weeks
4.0

Pre 3.0 you have class Foo you want to replace with class Bar. 

Anytime prior to 3.0 you can make commit (a) to master that adds class Bar and 
deprecates Foo which includes the annotation to use Bar and the fact that Foo 
will be removed in 4.0. Commit (a) should not be backported.

Anytime after 3.0 you can make a commit (b) to master that deletes class Foo. 
Commit (b) should not be backported.

That’s it. To me that’s simple and predictable. It always gives users 6 months 
to deal with breaking changes and backwards incompatible removals only happen 
in major versions. 

Yes we could open it up to say you can deprecate and remove things outside of 
major release boundaries as long as you give users 6 months notice (e.g. 3.2 to 
4.2 as above) but that seems complicated and counter-intuitive to users.

> Also consider a more complicated example, I tried to accommodate the
> most number callers when moving from InputSupplier to ByteSource but
> strongly suspect that I caused breakages for several users and I still
> have not completed this work.  How would we address this under the
> proposed scheme, given that Payload *implements* the deprecated
> InputSupplier interface, other than introducing a new Payload2 class.

I don’t think we should optimize around a particularly tangled example. There 
can always be exceptions to the policy or guidelines or whatever it is we’re 
talking about here though.

> This discussion discourages me since it discusses some idealized
> breakage policy and does not connect to the reality of where jclouds
> exists.  Going forward this semantic versioning discipline and ongoing
> API changes will ensure that we bump the major release number
> (MAJOR.y.z) every time instead of the minor one (x.MINOR.z)

I’m not sure where this comes from. The major and minor release cadence would 
remain the major and minor release cadence. 

We wouldn’t bump the major release arbitrarily because we felt like making 
breaking changes. We would bump it in line with the major release cadence 
ensuring our users have at minimum 6 months to deal with breaking changes. 
There’s no point in having a cadence if we don’t follow it.

> but this
> does not really do anything for users except for moving a number around.
> Strong promises of compatibility will discourage many (breaking)
> improvements, big and small.  I worry about this a lot given the
> existing quirky jclouds API and the large about of suboptimal API use I
> observe in Stack Overflow questions and jclouds-user mails.

Are you working under the idealized assumption that users are tracking jclouds 
code very closely and are consuming breaking changes rapidly? I can guarantee 
you this is not the case. So many old versions are still in use.

Not having a predictable deprecation policy guarantees that users will be more 
likely to stay marooned on old versions because they’ll have no idea at what 
point things will break on them.

I think making potentially breaking changes every 6 months is actually very 
progressive in the world of Java. I think it’s a good trade off between 
providing a stable and predictable platform for users to build the businesses 
upon vs improving that platform in backwards incompatible ways.

Regards,
Everett

Reply via email to