On Fri, Feb 8, 2013 at 11:42 AM, Vincent Massol <[email protected]> wrote:
>
> On Feb 8, 2013, at 11:18 AM, Vincent Massol <[email protected]> wrote:
>
>>
>> On Feb 7, 2013, at 5:52 PM, Vincent Massol <[email protected]> wrote:
>>
>>> FWIW Guava is using a @Beta annotation:
>>> http://code.google.com/p/guava-libraries/
>>>
>>> Extract:
>>>
>>> "
>>> APIs marked with the @Beta annotation at the class or method level are 
>>> subject to change. They can be modified in any way, or even removed, in any 
>>> major release. If your code is a library itself (i.e. it is used on the 
>>> CLASSPATH of users outside your own control), you should not use beta APIs, 
>>> unless you repackage them (e.g. using ProGuard). Here is a current list of 
>>> all the beta APIs.
>>>
>>> Serialized forms of ALL objects are subject to change. Do not persist these 
>>> and assume they can be read by a future version of the library.
>>>
>>> Deprecated non-beta APIs will be removed eighteen months after the release 
>>> in which they are first deprecated. You must fix your usages before this 
>>> time. If you don't, any manner of breakage might result (you are not 
>>> guaranteed a compilation error).
>>> "
>>
>> Interestingly a user points out the issue I had with using an annotation, 
>> see the comments in http://code.google.com/p/guava-libraries/wiki/Release10:
>>
>> Extract:
>>
>> "
>> My understandig of @Beta is, that these are the higly unstable parts of 
>> guava, so I don't want to use them (and I guess most developers don't want 
>> to because why should anybody make his lives more difficult when moving to 
>> the next version).
>>
>> But how do I do that? I don't want to look all the time at the source code 
>> when programming to make sure I didn't use the beta parts. Code completion 
>> knows nothing about @Beta (and it shouldn't!). Hence I have to remove all 
>> the beta parts. But why should the user handle the repackaging thing when 
>> you can simple release two versions: a beta / instable version and a stable 
>> / release version. Simple as that. Anybody can use the version he likes.
>>
>> Other OSS projects handle this much better. The same goes vor versioning, 
>> naming, packaging, downloading, etc. E. g. I never had such fruitless 
>> discussions with Apache software (and in case Apache commons collection ever 
>> releases a "generified" version, I'll most certainly switch back to that).
>> "
>
> Actually, reading further it seems only one user has an issue with the @Beta 
> annotation and others find it acceptable.
>
> ok so here's the summary of the brainstorming so far:
>
> * Proposal 1 (internal package):
> - Vincent
> - Marius
>
> * Proposal 2 (experimental package)
> - Caleb
>
> * Proposal 3 (@Beta/@Experimental annotation)
> - Thomas
> - Edy
>
> * Other proposal
> - Denis (use 1) for small changes and only use RN to mark new module as 
> experimental)
>
> Note that with proposal 3 we also need to remember 2 things:
> - we'll need to add CLIRR excludes but that can be done globally using the 
> global exclude so not too painful
> - we'll need to detail how long is the @Beta annotation supposed to stay. If 
> it stays forever it's the same syndrome as never releasing a 1.0 version 
> which doesn't help because people will use it in production anyway if it's 
> too long to be 1.0. So proposal 3 needs to have a max timeframe. IMO a full 
> cycle would be a good max time to remain @Beta annotations. So if you add the 
> @Beta in version N.P we have to remove it before N+2.0 (in practice that's a 
> max time of 1.5 years). We could also say N+1.P but it's harder to remember 
> since it means verifying at each release whereas N+1.P means verifying only 
> once.
>
> Personally I'm ok to try option 3 since I'd like to make progress on this.
>
> WDYT?

Ok for me.

>
> Thanks
> -Vincent
>
>> Thanks
>> -Vincent
>>
>>> Thanks
>>> -Vincent
>>>
>>> On May 3, 2012, at 9:47 AM, Vincent Massol <[email protected]> wrote:
>>>
>>>> Hi devs,
>>>>
>>>> We have recently voted a rule where we said that we will do the following:
>>>> * Always deprecate APIs
>>>> * Always move them to Legacy modules
>>>> * And when there's a technical issue to moving stuff to the Legacy module, 
>>>> only then, send a VOTE to remove an API
>>>> (see http://markmail.org/message/tino4ngttflc5i3s).
>>>>
>>>> This means that from now on (starting on 26th of April 2012)  we're not 
>>>> allowed to put excludes in CLIRR.
>>>>
>>>> However I've seen that we have added some CLIRR excludes after the vote 
>>>> was passed.
>>>>
>>>> I believe that the main issue we have is for "young" APIs that are not 
>>>> considered stable.
>>>>
>>>> Proposal 1: Internal package
>>>> =========
>>>>
>>>> * Young APIs must be located in the "internal" package till they become 
>>>> stable. I propose "internal" to reuse an existing package that we filter 
>>>> when testing for CLIRR. "internal" means that users should not use this 
>>>> API because it's considered unstable and can change at any time.
>>>> * When a Young API is considered stable enough and we want to open it to 
>>>> public consumption then we move it from "internal" to its target package 
>>>> (that's easy to with IDEs). From that point forward any changes to them 
>>>> goes through  the standard mechanism of deprecation/legacy.
>>>> * If we want to add a new method to an existing public API then this 
>>>> should not be considered a "young" API. It's just an addition to an 
>>>> existing API and thus goes directly to the deprecation/legacy cycle.
>>>> * We need to be careful to isolate "young" APIs from public API so that 
>>>> users don't inadvertently use "young" unstable APIs by mistake. If not 
>>>> possible then directly go through the deprecation/legacy cycle.
>>>>
>>>> The advantage of this proposal is that it doesn't change our current 
>>>> practices and is very easy to verify through CLIRR.
>>>>
>>>> Proposal 2: Experimental package
>>>> =========
>>>>
>>>> Another possibility I can think of is to introduce a new "experimental" 
>>>> package instead of reusing the "internal" one. It has the advantage of 
>>>> being able to follow "young" APIs and ensure they don't stay in that state 
>>>> indefinitely, while still allowing the user who uses it to notice it's 
>>>> experimental.
>>>>
>>>> Proposal 3: Experimental Annotation
>>>> =========
>>>>
>>>> Another idea is to just use an @Experimental javadoc tag  for experimental 
>>>> code. It has the advantage of using the target package but it has 
>>>> drawbacks:
>>>> * It's impossible for users to notice that they're using Experimental APIs 
>>>> since when they import a class they won't see anything that'll tell them 
>>>> they're using a "young" API
>>>> * It's almost impossible to tell CLIRR to exclude those APIs from its 
>>>> checks. The only way to do this is to modify the source code of the CLIRR 
>>>> plugin AFAIK. Thus we would need to exclude those manually using CLIRR 
>>>> excludes and thus before we release we would need to go over the full list 
>>>> of CLIRR excludes to ensure the excludes listed are only for "young" APIs 
>>>> marked "experimental".
>>>>
>>>> Note that I mentioned javadoc tag and not annotation because I believe we 
>>>> need to add information about when the Experimental API was first 
>>>> introduced so that we eventually move it as a proper API by removing the 
>>>> Experimental tag. Maybe we would need a rule such as: keep that tag for 
>>>> less or equal to 3 full minor releases (i.e. 6 months).
>>>>
>>>> WDYT? Any other idea?
>>>>
>>>> Thanks
>>>> -Vincent
>>>>
>>>
>>
>
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs



--
Thomas Mortagne
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to