Software components should be completely independent, with no (externally visible) state, no implicit links to other components besides the specified dependencies. But software systems may be surprisingly fragile when it comes down to mixing components into an installation of the product. This is no problem for products with “static” release policies, where every installation is the same. But this fragility is highly visible in plugin environments like Eclipse, where every user tailors the installation directly to his needs.
The Eclipse core acts as a framework, where plugin software may connect at specific points and add its own functionality and extension points. In my experience, updates to the eclipse core are treated with much caution, at best — because “everything breaks”. So, why does everything break? Every functionality provided by Eclipse is coming from plugins. Although these plugins are loosely coupled and independent, they rely on each other adhering the specifications of the role they fill. Slight changes in the behaviour of one plugin may have a small local impact, but can affect the whole software system. Dependent plugins may fail, leaving extension points unoccupied, which causes other plugins to fail.
This is only one of the possibilites of errors rippling through a whole system of loosely coupled components. It is not easy to avoid those errors — testing all possible combinations is rarely feasible, especially if the possible combinations of components is very large and may not even be known to the component developers. There is no way a component developer can test all interoperability issues in such an environment. It is often hard enough to corner the problems local to his own component.
The question I think about at the moment is: Is it possible to work with facts gathered from local tests and transform them into information about an environment composed of pre-tested components? In general, the answer is probably (and sadly) “no”. But maybe it is possible to help users tailor their software installation and choose only safe and compatible components, perhaps by limiting the possiblities down to components whose tests are good for the same environments or techniques like “lazy tests”, which are only run when a specific environment should be installed and test this combined environment for local errors.
This may enable soft constraints on the installed environments, where negative results are definitive (“this combination of components won’t work for this component”), but positive results have no real information at all (“may fail in an untested case”).
RSS