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