Ilya, it is a good point about jar name. If it really unresolvable problem we 
should leave modules name as is(I do not insist on renaming it was just a 
proposal)

I also not really got you point about 'zillion JARs'. Do you think it will be a 
problem if the number of JARs increases a little? If so can you clarify it with 
some specific examples?

-- 
Best regards,
Anton Kalashnikov



09.12.2020, 18:12, "Ilya Kasnacheev" <ilya.kasnach...@gmail.com>:
> Hello!
>
> When you do mvn dependencies:copy, you will now end up with
> "ignite-core-X.Y.Z.jar", "ignite-indexing-X.Y.Z.jar"
> But if we remove "ignite" from artifact name, user will end up with cryptic
> "configuration.jar", "raft.jar", etc, etc.
>
> Remember that group name is discarded in file names. Therefore, every
> project out there keeps stuff like "spring-" or "hibernate-" in artifact
> name.
>
> I also hope that our users will not end up with zillion JARs.
>
> Regards,
> --
> Ilya Kasnacheev
>
> ср, 9 дек. 2020 г. в 16:16, Anton Kalashnikov <kaa....@yandex.ru>:
>
>>  Hello,
>>
>>  I totally agree that we should start to think about the module
>>  organization.
>>  I suggest making the new confluence page where we define new rules on how
>>  to develop modules.
>>  In my opinion, at least, the following topics should be covered there(it
>>  makes sense to discuss every topic separately, not here):
>>  * In which cases new modules are required
>>  * The naming of modules, packages
>>  * Class dependency management ( inversion of control, no more context)
>>  * Test organization ( module contains only unit, module tests. All
>>  integration tests are in the extra module)
>>  * Feature/Module lifecycle - experimental, stable, unstable, deprecated
>>
>>  Let's get back to the original topic. I agree with the package naming
>>  rule:
>>  if the module name is configuration the package name should be
>>  org.apache.ignite.configuration and only after that any other subpackages.
>>  Also, I don't sure that we need ignite- prefix in the module name because
>>  it doesn't have any extra information:
>>
>>    <groupId>org.apache.ignite</groupId>
>>    <artifactId>ignite-configuration</artifactId>
>>
>>  we don't lose anything if convert it to
>>
>>    <groupId>org.apache.ignite</groupId>
>>    <artifactId>configuration</artifactId>
>>
>>  I also hope that jigsaw can help us somehow with class visibility.
>>  But if not we can take agreement that for example 'internal' package -
>>  shouldn't be touched outside of the module -
>>  of course, using the proper class access level is also the solution(where
>>  it is possible)
>>  org.apache.ignite.configuration.Configurator // it has access to the
>>  internal package but it shouldn't return any class from the internal
>>  package only from the public one.
>>  org.apache.ignite.configuration.DynamicProperty //interface
>>  org.apache.ignite.configuration.internal.properties.IntDynamicProperty
>>
>>  User API makes sense only for one end module - ignite(or ignite-core)
>>  which depends on all other modules
>>  and doing some integration(adapters) and provide final API for the user.
>>  So I agree that separated module Ignite-API with zero dependencies will be
>>  a good solution.
>>
>>  configuration module:
>>    Configurator.baseline().enabled() -> DynamicProperties
>>
>>  ignite-api module:
>>    BaselineConfiguration.enabled() -> boolean //interface
>>
>>  ignite module:
>>    BaselineConfigurationImpl implements BaselineConfiguration{
>>      Configurator configurator;
>>      public boolean enabled(){
>>         return configurator.baseline().enabled().value();
>>      }
>>    }
>>
>>  So maybe my example is not so good. But I want to show that end-user API
>>  will be defined only in ignite-api
>>  and you need to adapt it in ignite module which leads to some
>>  overhead(especially in my example)
>>   but it makes development pretty manageable/predictable -
>>  you can easily implement a new module without any worries that user starts
>>  to use it.
>>  It will be available only after making changes in ignite-api.
>>  The major advantage here is the small size of ignite-api which allows to
>>  carefully review every change
>>  which allows keeping ignite API in better quality(I hope at least)
>>
>>  Nikolay, maybe is it better to discuss your question on a separate topic?
>>  Because looks like it is a pretty discussable topic.
>>
>>  --
>>  Best regards,
>>  Anton Kalashnikov
>>
>>  09.12.2020, 10:31, "Nikolay Izhikov" <nizhi...@apache.org>:
>>  > Hello, Zhenya, Ivan.
>>  >
>>  >> Hello Nikolay, if i find out introduced features structure in some
>>  project, i would prefer to choose different one )
>>  >
>>  > Many, of the real world users disagree with you.
>>  > Please, take a look at some examples from widely used projects:
>>  >
>>  > Kafka -
>>  
>> https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/common/annotation/InterfaceStability.java#L28
>>  > - Stable, Evolving, Unstable
>>  >
>>  > Spark -
>>  
>> https://github.com/apache/spark/tree/master/common/tags/src/main/java/org/apache/spark/annotation
>>  > - AlphaComponent, DeveloperApi, Evolving, Experimental, Private,
>>  Stable, Unstable
>>  >
>>  >> Having officially "unstable" features doesn't sound good for product
>>  reputation.
>>  >
>>  > Can’t agree with you.
>>  >
>>  > Forcing ourselves to make perfect API from the first try we just put too
>>  much pressure on every decision.
>>  > Every developer making mistakes.
>>  > The product is evolving and the API too - it’s totally OK.
>>  >
>>  > For every new feature time required to be adopted and used in real-world
>>  production.
>>  > I believe, slight API changes is totally fine for early adopters.
>>  > Moreover, I think, that we should warn our users that some feature is
>>  very fresh and can have issues.
>>  >
>>  > So, Why Kafka and Spark is good enough to have unstable API and Ignite
>>  not? :)
>>  >
>>  >> 9 дек. 2020 г., в 10:08, Ivan Bessonov <bessonov...@gmail.com>
>>  написал(а):
>>  >>
>>  >> Conversation shifted into an unintended direction, but I agree.
>>  >>
>>  >> I think that if API can (or will) be changed then it should be
>>  deprecated.
>>  >> For that
>>  >> we can introduce @IgniteDeprecated that will contain Ignite version
>>  when
>>  >> API is planned to be removed. Otherwise it's either stable or
>>  experimental.
>>  >> Having officially "unstable" features doesn't sound good for product
>>  >> reputation.
>>  >>
>>  >> As for the modularization - I'm all for this idea. If we don't force
>>  >> ourselves to
>>  >> organize code properly then we'll end up with the same problems as we
>>  have
>>  >> in the current code base. And this way there's a hope of having good
>>  tests
>>  >> that can be completed in minutes, not hours. At least new ones.
>>  >>
>>  >> BTW, did we have any discussions about dependency injection and all
>>  this
>>  >> stuff?
>>  >> Seems like a related topic to me.
>>  >>
>>  >> ср, 9 дек. 2020 г. в 09:47, Zhenya Stanilovsky
>>  <arzamas...@mail.ru.invalid>:
>>  >>
>>  >>> Hello Nikolay, if i find out introduced features structure in some
>>  >>> project, i would prefer to choose different one )
>>  >>>
>>  >>>>>> Hello, Alexey.
>>  >>>>>>
>>  >>>>>> Think we can extend our @IgniteExperimental annotation.
>>  >>>>>>
>>  >>>>>> `@IgniteExperimental` - mark features that are truly experimental
>>  and
>>  >>> can be completely removed in future releases.
>>  >>>>>> `@NotRecommended` - mark features that widely adopted by the users
>>  but
>>  >>> implemented wrong or have known issues that can’t be fixed.
>>  >>>>>> `@NotStable` - mark features supported by community but API not
>>  stable
>>  >>> and can be reworked in the next release.
>>  >>>>>> `@Stable` - mark features that are completely OK and here to stay.
>>  >>>>>>
>>  >>>>>> We should output notes about these annotations in the JavaDoc,
>>  also.
>>  >>>>>> What do you think?
>>  >>>>>>
>>  >>>>>>> 8 дек. 2020 г., в 12:49, Alexey Goncharuk <
>>  >>> alexey.goncha...@gmail.com > написал(а):
>>  >>>>>>> Igniters,
>>  >>>>>>>
>>  >>>>>>> I want to tackle the topic of modules structure in Ignite 3. So
>>  far,
>>  >>> the
>>  >>>>>>> modules in Ignite are mostly defined intuitively which leads to
>>  some
>>  >>>>>>> complications:
>>  >>>>>>>
>>  >>>>>>> - Ignite public API is separated from the rest of the code only by
>>  >>>>>>> package name. This leads to private classes leaking to public API
>>  >>> which is
>>  >>>>>>> very hard to catch even during the review process (we missed a
>>  bunch
>>  >>> of
>>  >>>>>>> such leaks for new metrics API [1] and I remember this happening
>>  for
>>  >>> almost
>>  >>>>>>> every SPI)
>>  >>>>>>> - Classes from 'internal' packages are considered to be 'free for
>>  >>> grabs'
>>  >>>>>>> in every place of the code. This leads to tight coupling and
>>  >>> abstraction
>>  >>>>>>> leakage in the code. An example of such a case - an often cast of
>>  >>>>>>> WALPointer to FileWALPointer, so that the community decided to get
>>  >>> rid of
>>  >>>>>>> the WALPointer interface altogether [2]
>>  >>>>>>> - Overall code complexity. Because of the lack of inter-module
>>  >>>>>>> interaction rules, we are free to add new methods and callbacks
>>  to any
>>  >>>>>>> class, which leads to duplicating entities and verbose
>>  interfaces. A
>>  >>> good
>>  >>>>>>> example of this is the clear duplication of methods in
>>  >>>>>>> IgniteCacheOffheapManager and IgniteCacheOffheapManager.DataStore
>>  [3]
>>  >>>>>>>
>>  >>>>>>> I think we need to work out some rules that will help us define
>>  and
>>  >>> control
>>  >>>>>>> both Ignite public API and module internal API which still
>>  defines a
>>  >>> clear
>>  >>>>>>> contract for other modules. Some ideas:
>>  >>>>>>>
>>  >>>>>>> - Perhaps we can move all user public classed and interfaces to an
>>  >>>>>>> Ignite-API module which will have no dependencies on
>>  implementation
>>  >>>>>>> modules. This will prevent private classes from leaking to the API
>>  >>> module.
>>  >>>>>>> - We need somehow define which classes from a module are exposed
>>  to
>>  >>>>>>> other modules, and which classes are left for module-private
>>  usage.
>>  >>> Maybe
>>  >>>>>>> Java's jigsaw will help us here, but maybe we will be ok with just
>>  >>> more
>>  >>>>>>> strict java access modifiers usage :) The idea here is that a
>>  module
>>  >>> should
>>  >>>>>>> never touch a dependent module's private classes, ever. The
>>  exported
>>  >>>>>>> classes and interfaces are still free to be modified between
>>  >>> releases, as
>>  >>>>>>> long as it is not a user public API.
>>  >>>>>>> - A module should be logically complete, thus it may be
>>  beneficial if
>>  >>>>>>> module name matches with the code package it provides (e.g.
>>  >>> configuration
>>  >>>>>>> -> org.apache.ignite.configuration, replication ->
>>  >>>>>>> org.apache.ignite.replication, raft->org.apache.ignite.raft, etc)
>>  >>>>>>>
>>  >>>>>>> Any other principles/rules we can apply to make the code structure
>>  >>> more
>>  >>>>>>> concise? Thoughts?
>>  >>>>>>>
>>  >>>>>>> --AG
>>  >>>>>>>
>>  >>>>>>> [1] https://issues.apache.org/jira/browse/IGNITE-12552
>>  >>>>>>> [2] https://issues.apache.org/jira/browse/IGNITE-13513
>>  >>>>>>> [3] https://issues.apache.org/jira/browse/IGNITE-13220
>>  >>
>>  >> --
>>  >> Sincerely yours,
>>  >> Ivan Bessonov

Reply via email to