Article

Rob Wehrli plug-devel@lists.PLUG.phoenix.az.us
Wed Oct 23 15:00:02 2002


This is a multi-part message in MIME format.

------=_NextPart_000_003E_01C27AA4.C166F310
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

> Here I thought this was a pretty good (and quick) article
> about using XP on a quick project.
>
>
> http://www.leoscott.com/cgi-bin/pywiki?BowlingScores
>
> Carl P
>


Sorry for being so late to respond to this thread...I was traveling...

I like the idea of using XP (pair programming, mostly) for the
development of code in organizational environments where it is possible.
I've used XP (at least portions of it) since 1996, earlier if you count
pair programming by itself.  I attended the first ever XP Immersion
training in December of 1999 when Bob Martin came up to me at the C++
World conference (in Miami, that year) and asked if I'd like to join in
on the fun.  At the end of that week, I flew to Chicago (even though it
was December and I was packed for Miami!) and went through the program.

Some of the fundamental thinking behind XP is very good, IMO.  I
especially like the idea of composite, iterative development cycles
using the "story board" analogy for constraining the cycle.  In my
experience, however, there never seems to be a "decision maker" around
who can play the role of the customer adequately...that is, make
decisions in a timely and effective manner.  The "write the test before
the code" is fundamental to "embracing change."  The "traditional"
thinking is that changes are bad since they affect so many other
"systems" that it is too difficult to properly deal with changes without
affecting the entire system.  Therefore, tests evolve with the code to
perform necessary "regression testing" and functional tests so changes
that affect another portion of the system are more readily acknowledged,
pin-pointed and problems eliminated or fixed.  In practice, writing a
test is only as effective as the test that tests the test?  If you don't
have to "debug" the test, I guess you're OK?  In Java, junit, for
example, is an effective test framework.  I haven't seen a "version" of
it for C++, so there seems to be at least a disconnect on that level.

I didn't spend too much time working on it, but I felt that a "C
version" of the bowling scores piece would be interesting in view of all
of the OO stuff :)  I still have a problem with calculating the 10th
frame if the first ball of the 10th is a strike.  I've been too lazy to
go back and look at it.  This is a situation where having written a test
before the code might possibly be useful, however, it seems to me that
the test would be nearly as hard to write as the code...not sure...

It was all for fun anyway.  I didn't read/review the "other" solutions
at the links that Carl sent out...I thought it would be fun to see if I
could write one (in C) that worked...I got sorta close :)  I doubt that
my approach is any better, though I do think that it would/could
possibly serve as a basis for a "bowling engine."  It was a bit of a
challenge to try to do the simplest thing that worked, which is a
"method" promoted by XP.  Maybe someone else will learn from whatever
"architectural" choices I made and perhaps even give some feedback
regarding these so I'll learn something new, too.  I wasn't trying to
design the "Empire State Building" of bowling score calculators, rather,
just hammer out something that worked...well mostly ;)

...btw...before sending this, I did a quick hack on the code to "fix"
the 10th frame handling.  The problem was when a strike was thrown on
the first ball in the 10th frame and the second ball thrown was not a
strike, it would stop at that point and not throw the third ball.  I've
got it throwing the third ball (albeit a hack)...I'm not sure if the
scoring is 100% accurate, but I think it is fairly close :)  Anyone
willing to check it out?  Perhaps someone with more bowling knowledge
than me?

In case anyone is wondering, I started writing this on the plane on
October 9th after reading Carl's email...it was a 6 hour flight and I
had battery life for about 4 hours of it.  I finished up some loose ends
when I returned, haven't looked at it since then, and then later, I
finally dug it out for this list...I meant to send it out earlier, but
forgot all about it as work piled up while I was away.  I initially
thought to write it in C++, but then it would be a comparison of OOP
methods, and for something "reasonable" I felt that it needed more
effort and more design than I wanted to spend on it, so I just wrote it
in "quick and dirty" C.  Hopefully it isn't too bad...some quick looks
back at it show that the InitGame should have the argument passed to it
be const...I'm sure a lot of other "little" problems like that are in
the code.



Take Care.

Rob!

------=_NextPart_000_003E_01C27AA4.C166F310
Content-Type: application/x-gzip;
	name="bowl.tar.gz"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
	filename="bowl.tar.gz"

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
hSpUoQpVqEIVqlCFKlShCjr8H/MoVn8AyAAA

------=_NextPart_000_003E_01C27AA4.C166F310--