A "
FixedInterface" here is a
PublishedInterface for sale.
news:comp.object discussed whether interfaces that arise from the
RefactorMercilessly practice of
ExtremeProgramming can create APIs that one can sell to end-user programmers.
DanielParker wrote:
Keep in mind that you have to go pretty deep into Beck's TDD before you will find code that even remotely approximates what someone with a little domain knowledge and some understanding of software principles would write, given a little time to reflect. There is absolutely no point in having core interfaces between components go through those kind of iterations.
KB's TDD book covers
TestDrivenDevelopment, not XP, and assumes a customer who wants money
(hence his money example). Not interfaces.
On a team selling interfaces, let's follow XP's core principles and see what
happens.
First, get the best possible
DomainExpert (just like any other methodology [right?]).
The best possible domain expert will have experience delivering
ApplicationProgrammingInterfaces to
UserProgrammers with fixed interfaces. (We can also work this with a lame domain expert, too.)
We appoint them to the
OnsiteCustomer role, and then they write some
UserStories requesting APIs.
The team's job now is, for each US, is to help the
OnsiteCustomer specify
CustomerAcceptanceTest criteria. "Help" generally means "challenge" here. Everyone's job is to challenge assumptions.
The
CustomerAcceptanceTest (CAT, from here on in) for an API feature is a small app using that feature the way a
user-programmer would.
The developers challenge the OC to make each CAT as different as possible. Customers will Accept our API when they find it solves their problem their way.
(We may also envision USs that state "the API returns the correct error message if it is used wrong". We have all experienced APIs that failed this one!)
This situation is the same as for any
UserStory and its CAT; where the whole team reviews the CAT criteria to make sure nobody can improve it. (Recall the criteria is just on paper so far.) But this means even if the
OnsiteCustomer is not the >best< domain expert possible, they are not the bottleneck in the system.
Now the team starts converting
UserStories into real CATs,
ProgrammerTest, and
code.
When the time comes to refactor, they refactor mercilessly. Except the CATs.
The White Book clearly states that the element of a check-in is production
code and "unit" test code. You are not allowed to change the CAT
("
FunctionalTest") as freely as
ProductionCode, because when you check-in
all tests must pass, but other programmers might be working against a given
CAT, so it might not pass yet, so you can't use it to determine if your most
recent edit broke anything.
Refactoring stops at the CAT.
The unit test code gates the production code, but the CATs gates the
UserStory. So when the CATs pass, the
OnsiteCustomer takes the
UserStory
card back.
If the CATs specify fixed interfaces, the team delivers fixed interfaces.
Nobody expects fixed interfaces (or anything else an end-user needs) to
spontaneously emerge from refactoring!
If development encounters any problem with the specifications, they will
perforce already have source code demonstrating the problem. So they can
submit this to the OC, who can change the specifications, upgrade the CAT
criteria, and re-start its
UserStory.
If end-users request an upgrade, the OC can request a new function;
C
reateFileEx() as usual.
Because there are many CATs, the team satisfies the principle "build an API
by building more than three client applications."
But hey, there have been threads where XP'ers were loath to make any concessions about the expense of refactoring interfaces.
Frankly, our technology has not caught up with us. Databases, ORBs & GUIs
were all invented to permit a few kinds of testing and refactoring while
hindering others. I suspect databases still exist that prevent one from
adding a column freely, without copying table contents around.
In future, such APIs will be written with Agile teams in mind.
--Phlip