FOSS and Interface Taxonomy levels: Re: Integrate libsane and sane into Solaris [PSARC/2008/170 FastTrack timeout 03/11/2008]

John Plocher John.Plocher at sun.com
Wed Mar 5 10:45:48 PST 2008


James Carlson wrote:
> Uncommitted is *far* better than Volatile.  It restricts chaos to the
> Minor release boundaries, which are much less frequent than the rate
> at which we ship patches.

The difference between Volatile and Uncommitted and Committed
is in how the *project team* chooses to behave.

Software development is, at its heart, a set of producer-consumer
relationships.  Someone produces the source code, another compiles
it.  Someone makes packages/tarballs out of the result and another
uses them to construct a product...

The difference between FOSS development and that "all-done-by-us"
is simply that the role of the project team changes from being
source code authors to being importers and integrators.

As importers, the project team has to decide how often it will
import new versions of the source code from its external supplier,
what expectations to set for others and what glue and trim they
need to come up with to make it fit into our product mix.

The interface taxonomy provides some of the words we use in
setting those expectations.  Our son is studying Algebra in
school this year; he might express this as

    Expectations = f(Behavior(supplier),Promises(project team))

Raymond is focusing on only one component - the supplier's
behavior.  Jim is focusing on the other.  As usual, both of
you are right :-)

The project team is the final arbiter of /when/ change happens
in our components - if they do nothing, then nothing changes.
The team could put a version of libsane into the OS now, and
decide to never ever put a newer version into the system.
The result?  libsane would be a very stable interface because
the project team committed to never changing it.  (it also
would get extremely stale over time...)

The other end of the spectrum is also "interesting".  The project
team could decide to integrate a new version of libsane each and
every time the supplier dropped off a new one.  What would we
be able to say about the stability then?  Not much, other  than
"you get whatever the supplier gives - good luck".  This is where
understanding the supplier's behavior is so important.  If they
are well behaved, the effective stability might still be stable;
if not, it won't be.

The middle ground is where we find most projects that we
intend to reuse as part of our systems.  There, the stability
MUST be high enough for us to produce robust systems - if the
foundation components aren't stable, the system won't be,
either.  This requires the project teams to buffer their
supplier's behavior to keep it from negatively impacting our
derived systems.  Buffering implies that the project team's
job is harder, and that it may cost the company more resources.
As above, that cost is dependent on the actual behavior of the
supplier combined with the promises made by the project team.

It should be clear by now that there are some combinations of
supplier behavior and project team promises that work better than
others:

     Behavior	Promises	Effect on consumers
     --------	--------	-----------------------
     stable	stable		low cost, high satisfaction
     evolving	stable		short term OK, long term not[1]
     chaotic	stable		high cost[2], low satisfaction[1]

     stable	evolving	low cost[3], high satisfaction
     evolving	evolving	low cost[3], high satisfaction
     chaotic	evolving	high cost[2][4], low satisfaction[1]

     stable	chaotic		high cost[4], low satisfaction[1]
     evolving	chaotic		high cost[4], low satisfaction[1]
     chaotic	chaotic		high cost[4], low satisfaction, low use

What does this all mean?  IMO:
    Don't misrepresent either the supplier or your own ability
      (don't promise more than you actually can deliver),

    If your supplier is chaotic, you must either get involved with
      the supplier and fix the chaos problem *or* don't bother
      putting that component into the foundation of our systems, and

    If you don't intend for the component to be REUSED BY OTHER
      CORE TEAMS, don't put it into the core components of the OS,
      where we have stricter requirements for avoiding incompatible
      changes.  On the other hand, if it is intended for reuse, it
      really must be reusable in a low cost, low risk way.

   -John
____

[1] satisfaction among consumers will be low because they won't
all agree on /which/ of the versions of the supplier's code
they should use, thus guaranteeing the eventual uselessness
of whatever version the project team chose.

[2] high lifetime cost to the project team as they spend more
and more resources sustaining their fork over time.

[3] As long as the project team makes sure it has a way to roll
over to a new, incompatible version, so it doesn't get left
behind when its supplier evolves.  This means choosing a
consolidation that allows incompatible change to the interface
taxonomy types that were chosen.  It also may imply supporting
multiple incompatible versions of the component or having some
other transition plan in mind.

[4] low cost to the project team, but O(n) to O(n^2) sustaining cost
to "n" consumers and to distro producers as a whole



More information about the opensolaris-arc mailing list