Thanks a lot for all your input. I hope that I could resolve most of your
concerns. I will now start a vote on this FLIP.

Cheers,
Till

On Tue, Dec 7, 2021 at 4:28 PM Till Rohrmann <trohrm...@apache.org> wrote:

> Hi Fabian,
>
> Thanks for your input. Adding the definition of the different labels to
> our documentation is definitely part of this FLIP.
>
> I agree that deprecation is related to API stability. For the sake of
> keeping this FLIP narrowly scoped I left it out, though. For the time being
> I suggest that we stick to our current deprecation process that says that a
> deprecated API can only be removed after it has been deprecated for at
> least one release. Of course, deprecating and removing a @PublicEvolving
> API can only happen in minor or major releases, for example. This process
> is a bit stricter than what the API stability guarantees require because
> with the API stability alone we could remove the APIs directly w/o the
> deprecation period. Other details I would leave for a follow up FLIP
> which formally defines the deprecation process.
>
> Cheers,
> Till
>
> On Tue, Dec 7, 2021 at 10:08 AM Fabian Paul <fp...@apache.org> wrote:
>
>> Hi all,
>>
>> Thanks Till for starting this discussion. It is great to see these
>> facts written down since they definitely caused friction in the past
>> because of different interpretations. Overall I agree with everything
>> being said in this FLIP. I was just wondering whether we can put the
>> label explaining table somewhere into our docs. FLIPs are usually only
>> snapshots for the time being and are hard to search for. It would
>> allow users to instantly determine the meaning of the used annotation.
>>
>> I am also missing in this FLIP the connection to the Deprecated
>> annotation. I think we also need to clarify how this should be used in
>> conjunction with the API stability.
>>
>> Best,
>> Fabian
>>
>> On Mon, Dec 6, 2021 at 10:03 AM Ingo Bürk <i...@ververica.com> wrote:
>> >
>> > Hi Till,
>> >
>> > seems I misunderstood it then; thanks for the clarification! And yes,
>> with
>> > that I would fully agree.
>> >
>> >
>> > Ingo
>> >
>> > On Mon, Dec 6, 2021 at 9:59 AM Till Rohrmann <trohrm...@apache.org>
>> wrote:
>> >
>> > > Hi Ingo,
>> > >
>> > > No, the added method can have a weaker stability guarantee as long as
>> the
>> > > user does not have to implement it. In order to give an example the
>> > > following extension would be ok imo:
>> > >
>> > > @Public
>> > > interface Foobar {
>> > >     @Public
>> > >     int foo();
>> > >
>> > >     @Experimental
>> > >     default ExperimentalResult bar() {
>> > >       return ExperimentalResult.notSupported();
>> > >     }
>> > > }
>> > >
>> > > The following extension would not be ok because here the user needs to
>> > > implement something new:
>> > >
>> > > @Public
>> > > interface Foobar {
>> > >     @Public
>> > >     int foo();
>> > >
>> > >     @Experimental
>> > >     ExperimentalResult bar();
>> > > }
>> > >
>> > > Moreover, if the user uses bar(), then he opts-in to only get
>> @Experimental
>> > > stability guarantees.
>> > >
>> > > I will add this example to the FLIP for illustrative purposes.
>> > >
>> > > Cheers,
>> > > Till
>> > >
>> > > On Fri, Dec 3, 2021 at 6:52 PM Ingo Bürk <i...@ververica.com> wrote:
>> > >
>> > > > > Would it be enough to say that for example all classes in the
>> module
>> > > > flink-java have to be annotated? What I would like to avoid is
>> having to
>> > > > annotate all classes in some internal module like flink-rpc.
>> > > >
>> > > > I don't think it is, but we certainly could restrict it to certain
>> top
>> > > > level o.a.f.xyz packages.
>> > > >
>> > > > > Extending existing classes will only be possible if you can
>> provide a
>> > > > default implementation
>> > > >
>> > > > That I'm totally fine with, but based on that sentence in the FLIP
>> if I
>> > > > have a public interface and extend it, even with a default
>> > > implementation,
>> > > > I _have_ to have this method be stable already as well, right? I
>> couldn't
>> > > > for example add an experimental method to an interface.
>> > > >
>> > > > This would also include all classes used as argument and return
>> type of
>> > > > such methods too, which seems quite restrictive.
>> > > >
>> > > >
>> > > > Best
>> > > > Ingo
>> > > >
>> > > > On Fri, Dec 3, 2021, 17:51 Till Rohrmann <trohrm...@apache.org>
>> wrote:
>> > > >
>> > > > > >That's still a much weaker requirement, though, as classes can
>> just be
>> > > > > left unannotated, which is why I prefer annotating all classes
>> > > regardless
>> > > > > of location.
>> > > > >
>> > > > > Would it be enough to say that for example all classes in the
>> module
>> > > > > flink-java have to be annotated? What I would like to avoid is
>> having
>> > > to
>> > > > > annotate all classes in some internal module like flink-rpc.
>> > > > >
>> > > > > > How would you handle e.g. extending an existing Public interface
>> > > with a
>> > > > > new method in this case, though? You'd be forced to immediately
>> make
>> > > the
>> > > > > new method Public as well, or place it somewhere else entirely,
>> which
>> > > > leads
>> > > > > to unfavorable design. I don't think we should disallow extending
>> > > classes
>> > > > > with methods of a weaker stability.
>> > > > >
>> > > > > Extending existing classes will only be possible if you can
>> provide a
>> > > > > default implementation. If the user needs to do something, then
>> it is
>> > > not
>> > > > > compatible and needs to be handled differently (e.g. by offering
>> a new
>> > > > > experimental interface that one can use). If we don't enforce
>> this,
>> > > then
>> > > > I
>> > > > > don't see how we can provide source stability guarantees.
>> > > > >
>> > > > > Cheers,
>> > > > > Till
>> > > > >
>> > > > > On Fri, Dec 3, 2021 at 5:22 PM Ingo Bürk <i...@ververica.com>
>> wrote:
>> > > > >
>> > > > > > Hi Till,
>> > > > > >
>> > > > > > > Personally, I'd be fine to say that in API modules (tbd what
>> this
>> > > is
>> > > > > > > (probably transitive closure of all APIs)) we require every
>> class
>> > > to
>> > > > be
>> > > > > > > annotated.
>> > > > > >
>> > > > > > At least we'll then need the reverse rule: no classes outside
>> *.api.*
>> > > > > > packages CAN have an API annotation (other than Internal), of
>> course
>> > > > with
>> > > > > > many existing violations that need to be accapted.
>> > > > > >
>> > > > > > That's still a much weaker requirement, though, as classes can
>> just
>> > > be
>> > > > > left
>> > > > > > unannotated, which is why I prefer annotating all classes
>> regardless
>> > > of
>> > > > > > location.
>> > > > > >
>> > > > > > > If we have cases that violate the guideline, then I think we
>> either
>> > > > > have
>> > > > > > to
>> > > > > > > remove these methods
>> > > > > >
>> > > > > > How would you handle e.g. extending an existing Public interface
>> > > with a
>> > > > > new
>> > > > > > method in this case, though? You'd be forced to immediately
>> make the
>> > > > new
>> > > > > > method Public as well, or place it somewhere else entirely,
>> which
>> > > leads
>> > > > > to
>> > > > > > unfavorable design. I don't think we should disallow extending
>> > > classes
>> > > > > with
>> > > > > > methods of a weaker stability.
>> > > > > >
>> > > > > >
>> > > > > > Best
>> > > > > > Ingo
>> > > > > >
>> > > > > > On Fri, Dec 3, 2021 at 4:53 PM Till Rohrmann <
>> trohrm...@apache.org>
>> > > > > wrote:
>> > > > > >
>> > > > > > > Hi Ingo, thanks a lot for your thoughts and the work you've
>> spent
>> > > on
>> > > > > this
>> > > > > > > topic already.
>> > > > > > >
>> > > > > > > Personally, I'd be fine to say that in API modules (tbd what
>> this
>> > > is
>> > > > > > > (probably transitive closure of all APIs)) we require every
>> class
>> > > to
>> > > > be
>> > > > > > > annotated.
>> > > > > > >
>> > > > > > > For sake of clarity and having clear rules, this should then
>> also
>> > > > apply
>> > > > > > to
>> > > > > > > nested types. As you've said this would have some additional
>> > > benefits
>> > > > > > when
>> > > > > > > doing refactorings and seems to be actually required by
>> japicmp.
>> > > > > > >
>> > > > > > > >This seems to be quite incompatible with the current
>> > > interpretation
>> > > > in
>> > > > > > the
>> > > > > > > code base, and it would prevent valid (and in-use) use cases
>> like
>> > > > > marking
>> > > > > > > e.g. a single method experimental (or even internal) in an
>> > > otherwise
>> > > > > > public
>> > > > > > > (evolving) API.
>> > > > > > >
>> > > > > > > If we have cases that violate the guideline, then I think we
>> either
>> > > > > have
>> > > > > > to
>> > > > > > > remove these methods or adjust their stability guarantees
>> (time of
>> > > > > > > reckoning ;-). Otherwise, we won't be able to give stability
>> > > > > guarantees,
>> > > > > > I
>> > > > > > > fear.
>> > > > > > >
>> > > > > > > Cheers,
>> > > > > > > Till
>> > > > > > >
>> > > > > > > On Fri, Dec 3, 2021 at 4:23 PM Ingo Bürk <i...@ververica.com>
>> > > wrote:
>> > > > > > >
>> > > > > > > > Hi Till,
>> > > > > > > >
>> > > > > > > > Thanks for starting this discussion, and as you noticed, I
>> qutie
>> > > > care
>> > > > > > for
>> > > > > > > > it as well. :-)
>> > > > > > > >
>> > > > > > > > When implementing the ArchUnit rules, I noticed that
>> > > project-wide,
>> > > > > > > > different teams / modules use and understand the API
>> annotations
>> > > in
>> > > > > > > > different ways. Therefore, I think it is important to both
>> get
>> > > > > clarity
>> > > > > > on
>> > > > > > > > the meaning of these annotations (= your FLIP), but also on
>> how
>> > > to
>> > > > > > > actually
>> > > > > > > > use them.
>> > > > > > > >
>> > > > > > > > One thing I would like to bring up for discussion is
>> requiring an
>> > > > API
>> > > > > > > > annotation on every class. This seems to be a controversial
>> > > > > suggestion,
>> > > > > > > > though personally I think it would allow our tooling do its
>> job
>> > > > best.
>> > > > > > An
>> > > > > > > > obvious downside is "it's annoying", but so is the current
>> > > > > requirement
>> > > > > > of
>> > > > > > > > having JavaDocs on every class (including tests). If this
>> were to
>> > > > > ever
>> > > > > > be
>> > > > > > > > considered, this should be implemented (also) in Checkstyle,
>> > > > though,
>> > > > > to
>> > > > > > > > have it as immediate IDE feedback, which IMO would also
>> mostly
>> > > > > > eliminate
>> > > > > > > > this downside. The other downside is that it encourages
>> throwing
>> > > > > > > > Public(Evolving) around, but that would really only make an
>> > > > existing
>> > > > > > > > invisible problem actually visible; ultimately, I think
>> this is
>> > > > > > something
>> > > > > > > > that committers just need to consider.
>> > > > > > > > It would be nice to only require this in *.api.* packages,
>> but
>> > > > that's
>> > > > > > > just
>> > > > > > > > not the world we live in, nor will it be anytime soon;
>> however,
>> > > it
>> > > > > > would
>> > > > > > > > allow us to make sure that new non-internal APIs are only
>> added
>> > > in
>> > > > > > > *.api.*
>> > > > > > > > packages, or that no public APIs are added in *.internal.*
>> > > > packages.
>> > > > > > > >
>> > > > > > > > Another aspect that came up both when implementing the
>> rules and
>> > > > > again
>> > > > > > > in a
>> > > > > > > > discussion is whether (or when) nested types (classes,
>> > > interfaces –
>> > > > > > > > not members) need to be annotated explicitly. My
>> understanding[1]
>> > > > is
>> > > > > > that
>> > > > > > > > this is actually needed for japicmp to work correctly.
>> Besides
>> > > > that,
>> > > > > I
>> > > > > > > > think doing so adds benefits such as making the breaking
>> change
>> > > > > visible
>> > > > > > > > when promoting a nested type to a top-level type, which
>> would
>> > > > likely
>> > > > > go
>> > > > > > > > unquestioned if the type is not annotated but "inherited"
>> its API
>> > > > > > > > stability, losing it in the process.
>> > > > > > > >
>> > > > > > > > Now to actually comment on your FLIP:
>> > > > > > > >
>> > > > > > > > > In order to determine the stability guarantee a given
>> > > > > class/interface
>> > > > > > > can
>> > > > > > > > provide, we have to take a look at all methods a user has to
>> > > > > implement
>> > > > > > > and
>> > > > > > > > use for using the given class/interface. The weakest
>> guarantee of
>> > > > > these
>> > > > > > > > methods specifies the guarantee we can give for the
>> containing
>> > > > > > > > class/interface.
>> > > > > > > >
>> > > > > > > > This seems to be quite incompatible with the current
>> > > interpretation
>> > > > > in
>> > > > > > > the
>> > > > > > > > code base, and it would prevent valid (and in-use) use
>> cases like
>> > > > > > marking
>> > > > > > > > e.g. a single method experimental (or even internal) in an
>> > > > otherwise
>> > > > > > > public
>> > > > > > > > (evolving) API.
>> > > > > > > >
>> > > > > > > > [1]
>> > > > > https://github.com/apache/flink/pull/17133#issuecomment-925738694
>> > > > > > > >
>> > > > > > > >
>> > > > > > > > Best
>> > > > > > > > Ingo
>> > > > > > > >
>> > > > > > > > On Thu, Dec 2, 2021 at 3:48 PM Till Rohrmann <
>> > > trohrm...@apache.org
>> > > > >
>> > > > > > > wrote:
>> > > > > > > >
>> > > > > > > > > Hi everyone,
>> > > > > > > > >
>> > > > > > > > > I would like to start a discussion about what kind of API
>> > > > stability
>> > > > > > > > > guarantees we want to provide to our users. The Flink
>> community
>> > > > > > already
>> > > > > > > > > agreed on some stability guarantees, but these guarantees
>> were
>> > > > only
>> > > > > > > > > communicated via the ML and not properly documented [2].
>> > > > Moreover,
>> > > > > > I've
>> > > > > > > > > seen more and more complaints about breaking changes (some
>> > > > rightful
>> > > > > > and
>> > > > > > > > > others not) on the ML recently [3] because we rarely mark
>> our
>> > > > APIs
>> > > > > as
>> > > > > > > > > stable. This motivated this FLIP.
>> > > > > > > > >
>> > > > > > > > > The proposal first concentrates on source API stability
>> > > > guarantees.
>> > > > > > > > Binary
>> > > > > > > > > stability guarantees are explicitly left out for a
>> follow-up
>> > > > > > > discussion.
>> > > > > > > > >
>> > > > > > > > > In essence, the proposal follows our current stability
>> > > guarantees
>> > > > > > while
>> > > > > > > > > updating the guarantees for @PublicEvolving that we are
>> already
>> > > > > > > providing
>> > > > > > > > > w/o having stated them. Moreover, this FLIP proposes some
>> > > > > guidelines
>> > > > > > > for
>> > > > > > > > > determining the stability guarantees for an API object,
>> how to
>> > > > > evolve
>> > > > > > > > them
>> > > > > > > > > and some additional requirements for the return and
>> parameter
>> > > > types
>> > > > > > of
>> > > > > > > > > methods.
>> > > > > > > > >
>> > > > > > > > > All in all, I hope that this proposal is more reflecting
>> our
>> > > > > current
>> > > > > > > > > understanding of stability guarantees than being
>> controversial.
>> > > > One
>> > > > > > of
>> > > > > > > > the
>> > > > > > > > > outcomes of this FLIP should be to properly document these
>> > > > > guarantees
>> > > > > > > so
>> > > > > > > > > that it is easily discoverable and understandable for our
>> > > users.
>> > > > > > > > Moreover,
>> > > > > > > > > I hope that we can provide more stable APIs our users can
>> rely
>> > > > and
>> > > > > > > build
>> > > > > > > > > upon.
>> > > > > > > > >
>> > > > > > > > > There will be a follow-up FLIP discussing the problem of
>> how to
>> > > > > make
>> > > > > > > sure
>> > > > > > > > > that APIs become stable over time.
>> > > > > > > > >
>> > > > > > > > > Looking forward to your feedback.
>> > > > > > > > >
>> > > > > > > > > [1] https://cwiki.apache.org/confluence/x/IJeqCw
>> > > > > > > > > [2]
>> > > > > https://lists.apache.org/thread/5jm25783oq5svyk7rr8g1gly2ooxqhjr
>> > > > > > > > > [3]
>> > > > > https://lists.apache.org/thread/kzhfc3t6omzo2kyo8zj9yxoh8twq5fzr
>> > > > > > > > >
>> > > > > > > > > Cheers,
>> > > > > > > > > Till
>> > > > > > > > >
>> > > > > > > >
>> > > > > > >
>> > > > > >
>> > > > >
>> > > >
>> > >
>>
>

Reply via email to