Arnaud,
Adding to all said above;
EntityStore vs EntityIndex
Think "World Wide Web". Website is the EntityStore, Google is the EntityIndex. You probably also realize quite quickly how impossible it would be to run that on a "all-in-one database management system".
Qi4j allows multiple "Google" and "multiple website" just like it should be.
Team Composition
When I introduced Qi4j in my team at Morgan Stanley, the "regular Joe" next to me, picked up the core concepts and approaches very quickly, and in ~2 weeks he was as productive as he ever got. And he was happy(!!!) since he could stop worrying about "serialization", "networking" and all kinds of "cruft" being in the way.
So, I think all of us would probably recommend "One Qi4j-fluent" team member, who learns all the ins-and-outs, possibly a bit ahead of time. Maybe that is You. Maybe you take help from me (available at times) or Paul (available at times), or simply learn the hard way with help of mailing list.
Contribution back
Well, we are a small, but dedicated community. We don't stand on the barricades and scream out our message on how great Qi4j is. We use it, because we find that it provides raw value without the network effect of "many other users", which is required for projects like Hadoop or Ruby on Rails.
The obvious first "contributions" will be technical questions that documentation is completely lacking. So, instead of simply answering the question in mailing list, we should make it a habit to add the answer to docs at the same time.
Secondly, you will probably find bugs sooner or later. Reporting them, preferably with a reproducible testcase, will be tremendous help. We try to not let bug reports lay around very long.
Documentation is always welcome in every project. Here too... We write docs in plain text Asciidoc, which is then generated into static text locally.
Some libraries and extensions need a bit of care. Assuming "ownership" of those would be great.
Beyond that, things that have been discussed and pondered over the last half year or so is the advent of Java 8. I think we should start working on a Qi4j 3.0, which is solely based on Java 8, and we fully leverage closures (Qi4j has its own functional approach, also extended to some io operations), and ensure that we can be better at combining Java and Scala, in the same application (proof of concept exists).
Architecture and Design
It depends a lot on what you are trying to achieve, whether Qi4j is a good fit or not. If you are building a bond market prop-trading engine, you are probably better off without the execution overhead in Qi4j.
If the model you try to build is well understood, and has strong performance criteria, then Qi4j is probably not the best tool.
OTOH, if the model is "unknown" and expected to change a lot, especially initially, then Qi4j excels. Even in the long run, Qi4j has built-in Data Migration support, so that old entities can be on-the-fly upgraded as part of normal execution.
IF you are not sure which storage solution you want to work with, Qi4j allows you to delay that decision until later. Your code is practically agnostic to storage solution, AND the query engine.
Primarily, Qi4j gives you the choice to delay many of the "hard production questions" to much later in the development cycle. It allows you to make drastic changes to your model, without too much re-write of boilerplate code that you forget to update. It frees you from many of the mundane infra-related tasks, and let you focus on your actual domain model.
Stumbling Blocks
A few things are quite common to get going.
1. Getting the application architecture (layers and modules) right. Both "too many" as well as "too few" layers can be found. Examples try to show, 4-5 layers should do... Configuration at the bottom because many entity stores need configuration. Infrastructure such as EntityStores and Indexing on top of that. Then the Domain layer where all your interesting code end up. You may have an "orchestration" or "services" layer, and you may have an "Interfaces" (web, rest, mail, smoke signals) layer at the top. Often, people have problem with proper Visibility and set it higher than it should be. Every time you increase from the default "module" you should ask if that is the right thing to do, or whether you should have a repository that is visible, and it deals with all the access within the module.
2. Thinking in Queries. Most of us come from a SQL world, where everything are queries. So we chuck everything into the store and later figure out how to retrieve it. Instead, imagine that there are no queries at all, and you need to solve the domain model "in memory" and only with Java objects. You would aggregate and reference things as they are in the domain model, and you will realize that there are actually much fewer cases when Query is really needed. Our "Volatility Inference Engine", which took option quotes from the markets and computed the implied volatility and constructed a so called "volatility surface" (3 dimension graph of strike price(x), expiry(y) date and value(z), had NO queries in it all.
3. If you are doing DDD, not enough focus on "The Aggregate" and understanding its implications. Read Vaughn Vernon's book "Implementing Domain-Driven Design", which has a good chapter on "Aggregate" (well, I wrote a big chunk of it...). The Aggregate in Qi4j is supported, but in an odd way. The @Aggregated annotation will indicate that the referenced entity will be removed when the parent is removed. Which is kind of "ok" but not complete, since Qi4j doesn't refuse the child to be referenced more than once. But, Aggregate can almost always be "composed" into a single entity. For non-Qi4j developers this is a very foreign concept. But effectively, all the containing entities are effectively collapsed into a single object in terms of storage, but can be used as the individual parts. Yummy.
Please keep us informed of your thinking and eventual path forward, even if it doesn't include Qi4j
Cheers
Niclas