Hi Roland,

Thanks for you very detailed response! I just read the book "The
Elements of Style" and will try to make my response short to save
readers time.

The Jackrabbit release process is manual, and takes a lot of peoples
times. Automating the process also takes time, and it doesn't make
sense to do it if you don't release often. But automating doesn't hurt
quality, and if we want to release more often, we need to automate
some steps. Voting is still possible, but releasing would be a lot
easier.

Jackrabbit is good quality software: it is well tested, because it is
used by many people, and bugs are fixed as they are found. It doesn't
have a great test suite, but the code is 'time-tested'. This offsets
the lack of unit tests. The problem is: changing Jackrabbit is
dangerous. We can't release often and need to maintain a branch.

A good test suite would make changes less risk. With an automated
release process, we can release more often. We do have the resources
to do that. Automated GUI testing is hard, but Jackrabbit is not such
an application, so automated testing is possible. What I have
automated in my project (H2):

- Platform testing (OS, JVM)
- Code coverage testing
- Performance testing
- Running unit tests of software that depends on it
- Test if Javadocs are complete
- Documentation spell checking
- File header checking
- Check if all XML is well-formed (including XHTML)
- (HTML-) link checking

Many of that is currently not done for Jackrabbit. Not all needs to be
done. But with all that, changing the code is less risky, and
releasing is a lot easier and quicker. You can list tested operating
system, databases, file systems, and virtual machines. With a good
test suite, users that want to use Jackrabbit on an unsupported
platform just need to run the tests. People that want to use different
versions of Jackrabbit dependencies can use OSGi or run all tests with
his version of the dependency.

Short release cycles are possible with all kinds of software. You can
do that with operating systems, you can do that with databases (H2).
You can do it where the API and behavior is well defined. With
Jackrabbit, it is: the JCR API is quite stable. There will be a
problem with JCR 2.0, but multiple incompatible API versions can be
supported using a preprocessor. For details, see
http://h2database.googlecode.com/svn/trunk/h2/src/main/org/h2/jdbc/JdbcConnection.java
(look for //#ifdef). Internal Jackrabbit APIs are also quite stable
(the PersistenceManager API for example), and new features can be
introduced using new interfaces.

> a bug is uncovered in an older release. The bug
> is reported, maybe even with a patch. And you want to tell
> them: "Duh, that release is 6 months old. We've had 12 new
> releases since, upgrade to the latest one first and if the
> bug is still in there, provide a new fix for that."?

Tell them: "Read the release notes between your release and now. If
there are breaking changes, disable the relevant system properties /
settings. Then try the newest release." Of course you can't help those
that don't have good tests, and at the same time rely on undocumented
behavior - for those, you would probably need individual bugfix
branches, where only the problems they ran into are fixed.

> Agile software development requires excellent test coverage.

Excellent software requires excellent tests. Functional test coverage,
and code coverage. Do you know Crap4J (http://www.crap4j.org)? It's
not perfect, but the idea is good.

> hard to attract volunteers if you require them to provide full test coverage

Stable software is more important than having many volunteers. With
unstable software you drive away customers. You also drive away good
developers because they always have to clean up the mess of those that
don't test. There is a 'sandbox' to try out things.

> That does _not_ mean there shouldn't be more test coverage ;-)

Yes, but we need to agree we want that. We need to define the target,
and the process.

Regards,
Thomas

Reply via email to