John Plocher wrote:
> James Carlson wrote:
>> We used to think that incompatible changes to
>> interfaces found in/on Solaris were always Bad,
>> and that evolutionary stability was always a
>> Good Thing.
> 
> Yes, stability is important, but it is not the only thing that
> matters.  Under your words, I hear "everything will be OK if we can
> achieve interface stability; if we can't, all we can do is punt" (and,
> yes, I am taking your statements to an unwarranted extreme :-)

Lack of stability implies that someone -- somewhere -- is constantly
rewriting his dependent software so that it continues to work over time,
despite the shifting sands under his feet.  Or it means that nobody
actually uses the exposed volatile parts so there's no dependency to
worry about.  Or it means that the people who use it just don't care
that it sometimes falls apart -- though I frankly don't know of any
cases like that.

As I said before, those sorts of schemes do indeed work.  It likely does
in fact mean something like "Volatile," at least for the portions of the
software that behave in that way.  And I have no problem whatsoever
using that attribute when it really does fit the situation.

It doesn't, though, match up with the way most software really behaves,
and applying it at random or based on external considerations (such as
authorship or "control") is quite counter-productive.

The subset that behaves this way is small, and I suspect much of it --
like some of the GNOME libraries -- is more properly regarded as
Consolidation Private than as Volatile.  It's rapidly moving because
it's internal to a larger project that is itself actively evolving and
part of a coherent community.  Those outside such a community shouldn't
consider using it, but those inside have no trouble keeping up.

> I think we need to admit up front that the traditional Sun Interface
> Taxonomy simply does not work for most "pass it on" FOSS projects -
> the only pragmatic answer to "what does this project team promise to
> commit to" is "nothing", because no matter what the past track record
> is from the upstream provider, they have no choice but to follow their
> lead going forward.

Don't get so hung up on "promises."  What we're really after here is
(regardless of origin) a prediction about the future of the software
itself -- i.e., how often does it change, in what ways, and on what
sorts of boundaries?  It turns out that people inside Sun are no better
or worse at those predictions than those outside, so "promises," though
nice, are not really the right thing to look for.  (How many times has
Sun said "Stable" or "Committed" and then later nuked it?  How does that
make those non-FOSS things any better or worse than FOSS?)

Instead, what we're after is _intent_, which can be expressed in many
ways, some explicit and some implicit.  An example of an explicit
statement is (of course) documentation saying what changes and when.  A
bit of mature FOSS has such material, though much does not.  An example
of an implicit statement is historical info -- "they wanted to change X,
but they didn't, because they knew several other projects were using it"
or "this part of the library has been the same since 1995" or even "if
this were to change incompatibly, then this other project would break,
and there's nobody maintaining that other project anymore."

Another part of implicit stability is design: things that look
half-finished, or like they're intended for use by humans alone, are
probably less than stable.  Those that look polished are probably more so.

All of that -- including the guesswork -- is relevant, and establishes
what we're after, which is whether project teams can establish
dependencies without _substantial_ fear of failure.

Obviously, all software breaks, and has bugs.  Bad things will happen.
The intent is only to keep bad things from happening due to simple
ignorance, not to achieve some sort of magical perfection.  That's not
going to happen, so don't think that "Committed" really means it'll
never ever change.

> The traditional Interface Taxonomy assumes that we have the option of
> not passing on (or re-engineering or deferring or ...) incompatible
> changes so we can live up to our commitments of stability.

Those aren't the only options available for ordinary FOSS projects
integrating using higher stability levels in the traditional Interface
Taxonomy.  Among the others are:

  - Mark some things as stable and others as not, depending on the
    situation.  It's often the case that there are things that are
    more stable than others, and that someone who understands the
    software can separate these out.

  - Get involved with the upstream community.  If the component is
    so important to you that you're going to depend on it, then don't
    be shy.  Suggest alternatives to incompatible changes and help
    plan out the ones that must happen so that they're less onerous.

  - Provide multiple versions, if that happens to be feasible with the
    component in question, and if it works for the consumers.

  - Figure out some way to sequence the release of changes, such that
    consumers are notified and are able to make the switch when the
    incompatible lumps come down the pipeline.  Timing is everything.
    (That is to say, "contracts.")

  - Create a compatibility layer.  Sometimes this is a simple answer
    and sometimes it's infeasible.

  - If the situation warrants, then fork the project if it gets in a
    bad state.  Obviously, forking is a serious prospect, but sometimes
    it makes sense.  Often it does not, but if you're going to be
    serious about any sort of engineering, then you can't arbitrarily
    toss viable answers off the table a priori.

Obviously, a combination of approaches will be needed for some parts.
There are likely other solutions that are situation-specific or that
don't come to mind at the moment.

There are many ways to solve these sorts of problems, but pretending
that they don't exist or that FOSS is a special new world where software
engineering no longer matters is just not one of them.  The issues
described by the Interface and Release Taxonomies aren't abstract
notions cooked up in a back room somewhere; they're actually a
reflection of Mother Nature, as she shows up in software.  If I call my
function foo() today, and you call it, then you're going to be sad if I
call it bar() tomorrow.  No amount of appealing to the magic of open
source will change the output of ld.so.1.

>  In today's
> environment, we don't have that option, and furthermore, nobody but us
> expects us to use those options in the first place.   If GDB does
> something we ourselves wouldn't have done, we still have to ship the
> new version on to our users - or those same users will go elsewhere to
> get it.  They (and we) don't have the option of doing without it, and
> we don't have the resources to re-engineer it.

Nobody suggested either was a necessary outcome.

> 3) We must allow for other versions of the thing to be installed, in
> additional locations if need be, even if those versions are
> incompatible with our stacks or other components.  However it is done,
> installation of another version of something must not negatively
> impact existing installed silos.

I think you're missing something important here.  *EVERY* solution to
the problem has a downside -- either by adding bloat, or risk, or
expense, or by actually being infeasible to make work.  Yes, allowing
multiple installed versions to work around an incompatibility is one of
the tools in the toolbox, but we cannot pretend that it's the only one,
or even that it's the best one.

It's not.

> To me, this sounds a lot like the JDK/JRE work that jek3 did - and the
> work that was going on in WSARC around architecting multiple coherent
> silos, with symlinks from /usr/bin and application ld.so linkage
> dependencies into one specific silo along with the ability to create
> and install alternative (potentially sparse) silos.

Again, there are architectural trade-offs to be made there.  That's
reasonable in some particular situations, but not in others.  If those
"silos" ever end up sharing things -- datasets, libraries,
configuration, or the like -- the problem becomes far more complex.  If
there's a bug that affects all of them, then even more so.

What you're describing isn't at all new.  It's not novel.  And it's not
the panacea that I think you're making it out to be.  It doesn't solve
the basic problem of managing dependencies between software components.

> Rather than having an architecture that only allows for a single
> global silo of "plays well with others" apps and libs, this moves us
> towards a world of multiple silos.  Each silo would have an assumption
> of stability within the stack, and no promises outside itself. - sort
> of like multiple co-instralled WOS's...

Unless there's a superhuman being who writes all the software in one
silo, you still need to manage dependencies *within* each silo.  I think
you've just moved the problem from one place to another ... and created
a few new scaling problems in the process.

Yes, it's hard to demand a single global version of each component.
It's a good thing over a long period of time, but it's certainly hard,
and perhaps *too* hard for some parts.  That doesn't make it less of a
useful goal, or something that should be tossed aside lightly.

> This isn't easy - but it isn't impossible, either, given some
> leadership and a desire to make something that works.  Rather than
> dumping a boil-the-ocean requirement on each and every FOSS project to
> acomplish by themselves, mostly in the dark, and without any role
> models, maybe we could nail down some architectural principles and
> offer some best practices...   Please?

I think you're using the multiple-supported-versions thing as a cart to
drag around an architectural horse, but if you insist, I'll say that the
ARC isn't necessarily the right place to _solve_ that problem.  Instead,
the community groups that would be most affected by the requirements
(say, Install and Packaging) should figure out what to do with the
solutions that someone who cares about this angle (say, *you*) creates.
 Once there are solutions, bring 'em to the ARC for review.  That's what
the "R" part of ARC is about.

The "Architecture Creating Council" is two doors down on the left.  ;-}

-- 
James Carlson         42.703N 71.076W         <carlsonj at workingcode.com>

Reply via email to