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?

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

Reply via email to