What "Experimental" is really saying is "Public, but not API stable". In that sense, "Internal" is not suitable, as it suggests that a method will never be public.
What would you think of renaming "Experimental" to "PublicEvolving" ? That would carry pretty much explicitly the meaning that it is intended for public use, the basic concept will stay, but it may change a bit (code using that may be adjusted a bit in the future). In contrast "Experimental" sounds to me like "no idea if that class/feature is going to be there in the future". What do you think? Stephan On Sat, Feb 6, 2016 at 3:17 PM, Stephan Ewen <se...@apache.org> wrote: > Hi! > > These suggestions sound good in general. > > I am wondering if "Experimental" is not the wrong word here, because most > of the things are not experimental, but just possibly subject to slight > changes (though API breaking). > > Experimental has the connotation that something is unstable (execution > wise) and should best be avoided altogether. > If half of the Flink code base is marked "Experimental", it seems to > contradict that this is actually in 1.0 shape. > > I actually like the term "Internal" that was also suggested. It pretty > much says what we actually want to say: A certain method or class is not > declared part of the public API, but as of now only internal API. > > Greetings, > Stephan > > > > On Fri, Feb 5, 2016 at 8:38 PM, Fabian Hueske <fhue...@gmail.com> wrote: > >> Hi, >> >> @Experimental and @Internal have the class scope, because we need to be >> able to mark internal classes of @Public classes as experimental or >> internal. >> >> In some cases we annotated classes as @Public and all (or most) methods as >> @Experimental, to indicate that a class can be used, but its internals >> might change. >> For example TypeInformation is a public class (and many classes that >> extend >> this class) but most methods are @Experimental to allow users to used a >> TypeInformation as is, but keep the freedom to change the internals. If >> you >> find something that does not look correct, please start a discussion >> about. >> The annotations can still be changed before the 1.0 release. >> >> I agree with Max that annotating more classes with @Experimental (not only >> inner classes) would be a good idea. >> IMO, we should annotate all classes that belong to the user-facing API >> with >> either @Public or @Experimental. This would mean that all non-annotated >> classes are not part of the API and must be considered as internal. I >> believe this would avoid a lot of uncertainty and also easy the annotation >> management as a whole. For instance, we can more easily check how the API >> (stable and experimental) changed between releases. >> >> Cheers, Fabian >> >> 2016-02-05 17:24 GMT+01:00 Maximilian Michels <m...@apache.org>: >> >> > Hi Robert, >> > >> > Thanks a lot for all the work of going through the classes. At first >> > sight, the classes look quite well chosen. >> > >> > One question concerning the @Public, @Experimental, and @Internal >> > annotations: >> > >> > @Public may only be used for classes or interfaces. @Experimental or >> > @Internal are used for marking methods in @Public classes only? If >> > that is the case, we should restrict the annotations to this scope via >> > @Target. The current master also permits to tag classes with >> > @Experimental or @Internal. >> > >> > Marking classes with @Experimental might actually make sense. What was >> > the rational behind always declaring a class public first to restrict >> > its methods to internal or experimental? >> > >> > Cheers, >> > Max >> > >> > On Fri, Feb 5, 2016 at 3:07 PM, Robert Metzger <rmetz...@apache.org> >> > wrote: >> > > Hi, >> > > >> > > tl;dr: we now have @Public, @Internal, @Experimental annotations. >> Check >> > > your stuff before the release! >> > > >> > > Fabian and I spend some time the last weeks to annotate all classes we >> > > consider to be userfacing and stable with the "*@Public*" annotation. >> I >> > > just pushed those changes to master. >> > > >> > > There is also an annotation "*@Internal*" for marking interfaces users >> > > should not use because they are internal to the system (for example >> > > "DataStream.getId()"). >> > > >> > > The annotation "*@Experimental*" marks unstable methods within stable >> > > classes (for example SingleOutputStreamOperator.uid()). >> > > Also note that we should also annotate @Deprecated methods with >> > > @Experimental so that they are not part of the stable interface (this >> > works >> > > only before the 1.0 release). I checked that all current @Deprecated >> > > annotations are excluded. >> > > >> > > >> > > *I would like to ask everyone to spend some time before the 1.0 >> release >> > to >> > > go through some core classes and see if there is anything we forgot.* >> > > *We will not be able to touch methods and classes which are public >> after >> > > the 1.0 release.* >> > > >> > > Some areas where I feel we should check closely are the following: >> > > - InputFormats >> > > - State-related classes >> > > - Windowing related classes >> > > - DataStream API (global() / forward(); output to files; ... ). >> > > >> > > Fabian and I also realized that there are some downsides to this >> > annotation >> > > approach. >> > > a) By not annotating all classes, its easy to forget some classes. And >> > its >> > > not obvious to users that "no annotation" means "not public". >> > > >> > > b) For example the "SourceFunction.SourceContext" interface is @Public >> > > because users use the methods of the interface. >> > > However, the underlying implementations are internal to Flink (users >> will >> > > most likely not implement their own SourceContexts). Adding a new >> method >> > to >> > > the SourceContext interface will break its compatibilty (because users >> > > would need to implement the new method), however, for API users it >> does >> > not >> > > matter when we are adding new methods. >> > > We decided to make the interface @Public, but we added a comment >> > explaining >> > > the issue. >> > > If we want to add a method after the 1.0 release, we can define an >> > exclude >> > > in the maven plugin which enforces the interface stability. >> > > >> > > >> > > For making the whole annotation analysis business a bit easier, I'm >> > > currently working on a little tool to output a list of public classes >> and >> > > methods. I'll post that on the mailing list at a later point. >> > > >> > > Regards, >> > > Robert >> > >> > >