Michael's profileMike's BLOGPhotosBlogListsMore Tools Help

Keyword Cloud

Loading...

Weather

Loading...

Feed

The owner hasn't specified a feed for this module yet.
Thanks for visiting!
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.
佳俊wrote:
 
great! is very perfect!(jack he)
13 Mar.
Picture of Anonymous
Ganesh A K wrote:
Excellent information on Current trends and technologies !!
As well as research on soapUI,looks great...
-Ganesh.
3 June

Mike's BLOG

I believe you have my stapler.
14 August

Witches Cup 2009

 
My camera wasn't fast enough to freeze the action in the dimming light ....but these are the photos I got.  Fun night ....
  • met Adam Meyerson, the winner of the Pro/1/2/3
  • met McCormack ...former national road race champion
  • saw a bunch of people I know ...
  • very exciting criterium racing!!!
 
 
 
13 August

Monitoring web service endpoints with Soap-UI, Maven, and TeamCity

One of the differences between testing commercial-off-the-shelf software (COTS)and a hosted service is the time dimension.  With COTS, you are answering the question:  Does the software work as expected?  With a hosted service you are answering that same question, but also additionally answering the question:  Does the software continue to work as expected?   Which brings me to one of my favorite topics — monitoring.  Monitoring is the activity that needs to be performed to ensure that quality of hosted services is achieved every day.  I prototyped a web service monitoring approach that I thought I’d share.  It uses Soap-UI, Maven, and TeamCity.

Engineers that develop or test web services are usually familiar with a nifty tool called Soap-UI.   The tool is really useful with ad-hoc exercising of web services.  The tool helps form Soap requests that can be sent to a web service, can send the requests, visually display the responses, develop test cases, assert Soap responses, etc….

soapui1

Building on this, there is a Maven plug-in for Soap-UI.  Maven, the Ant-like tool for building Java projects, has a plug-in which can run the Soap-UI tests.   To do this, you have to write a pom.xml …which is very simple.  The pom will download all dependencies, including the Soap-UI tool itself, and run the tests that you defined through your interactive use of Soap-UI.  The pom looks like this ….

pom1

Once you have a Maven pom, you can then run your tests consistently from the command line …. with a simple Maven command:

mvn eviware:maven-soapui-plugin:test

When you execute this command, your tests run automatically.

mvn1

But you don’t want to be responsible for running the tests all the time.  This is where TeamCity comes in.  You add your project to TeamCity, and with cron-like precision, your tests will run…every hour, every day, monitoring your web service endpoints over time to make sure they behave as expected.

teamcity1

And not only does TeamCity run your tests, it has all the email notification of test passing and failing built-in.

Build successful x_monitoring_test::x_monitoring_test #15.134888 – Build results: http://toolsbuildserver:8111/viewLog.html?buildId=269528&buildTypeId=bt324

So if the  web service endpoint  misbehaves, you can proactively address the issue.

Monitoring ….quality over the time dimension.

09 August

Tokeneke Classic 2009

New England road cycling championships. I didn't win ...but had a darn good ride! Went all out redline on the first giant climb, but didn't make the first selection....was in the 2nd selection...a group of about 10. We chased and chased...but never caught them...but never lost sight of them either. I descended well....relaxed, all out, and hands off the brakes at speeds over 45 mph. Final climb .... spin, spin, spin....my group of 10 was whittled down to 3. With 150 meters to go I attacked them .... and had a nice sprint at the line ..




 

08 July

Fitchburg Longsjo Stage Race 2009

 
27 June

Wayne Elliot Memorial Circuit Race, 2009

Fun bicycle race in Plaistow, NH ...June 27, 2009 

Harpoon Brewery-to-Brewery Ride, 2009

147 miles in 1 day!!!  From the Harpoon Brewery in Boston, MA ....to the Harpoon Brewery in Windsor, VT.  If you get lost ...just go west until you hit the Connecticut River ...then turn right and go north for 50 miles!

 
09 June

King's Tour of the Quabbin 2009

  Beautiful ride ...good times.....
05 June

The 8 Fallacies of Distrubuted Systems

One of the things that keeps me awake at night is the 8 Fallacies of Distributed Computing.   As computers and software were transitioning from standalone entities to networked and distributed entities, all sorts of new unexpected issues and problems arose.  In 1994, Peter Deutsch recognized these issues as …in the general sense…failed assumptions of the new computing landscape.  Then in 1997 James Gosling of Sun added another failed assumption …and together these failed assumptions became what is known as “The 8 Fallacies of Distributed Computing.”    Says Peter Deutsch….

Essentially everyone, when they first build a distributed application, makes the following eight assumptions. All prove to be false in the long run and all cause big trouble and painful learning experiences.

1. The network is reliable
2. Latency is zero
3. Bandwidth is infinite
4. The network is secure
5. Topology doesn’t change
6. There is one administrator
7. Transport cost is zero
8. The network is homogenous

In a nutshell, I think it all sort of boils down to you can’t rely on the network or internet that connect the various tiers of a distributed system.  Stuff happens.  And most importantly, stuff you never thought of before…. will happen.    Your connection to a backend database may break.  The browser’s connection to the internet may become very slow, or fail.  Hostnames may not be resolved.     Your RMI connection to a back-end process may be broken.  Things that you assumed would be true as you developed the application …well, they may not be true when the application is deployed.

So as a QE Engineer, I am recognizing that …in addition to all the usual functional, performance, and usability aspects to software quality ….there are also the quality issues related to these 8 fallacies when testing distributed systems.  All sorts of new possibilities for test cases appear.   What happens when I yank the network cable out of my computer (or gently disconnect it) while using a distributed application?  And then what happens when I plug the network cable back in?  What happens when I the internet becomes very slow?  Is the application just slow? Or unusable?   The list of failure scenarios for distributed systems can be much greater than when testing a closed system that is installed on a single standalone computer.

I found in myself there is a mental shift that needs to occur when considering testing distributed systems.  Whereas in testing a closed system, a broken network connection may be thought of as an invalid test scenario or a problem in the test environment…with a distributed system these sorts of issues can be considered valid.   At first, it doesn’t seem right to log a bug that says (metaphorically) … “When I pulled the network cable out of my computer…and then put it back in …my distributed application no longer worked.”   Well initially you think …ummm….don’t do that and you won’t have any more issues like that.  Yes, but the application needs to be robust and handle that situation…which is may be a real situation.

So there are testing tools available to help find these sorts of issues.  One such tool is NetLimiter … which is used to introduce network latency into a test environment.  With such a tool you can find and flush out issues that traditional testing may not find.

Another approach I was thinking of …rather than a “post-development 8 fallacy testing phase” …are testing approaches that “inject”  the fallacies (such as latency)  right into the developer sandbox and build and test system.   For example, right now I am in a Maven build environment ….and the system-under-test is started with a command like this:

mvn jetty:run

This is simplifying a bit, but that is it in a nutshell…it starts a J2EE application server hosting the system-under-test.   This J2EE  application server  communicates with a MATLAB Distributed Compute application.   Now the concept is just this….introduce latency into the test environment by passing a property on the command line:

mvn jetty:run -Dlatency=1000

And ….by instrumenting the code in the right place …. well….I am then simulating latency on the RMI communication between the application server (Jetty) and the MATLAB Distributed Compute Engine.

String latency = System.getProperty(”latency”);
System.out.println(”latency property = ” + latency);
if (latency != null) {

System.out.println(”sleeping …”);
try {
Thread.sleep(Integer.parseInt(latency));
} catch (InterruptedException e) {
e.printStackTrace();
}
}

Now …Thread.sleep() …that’s not rocket science.  But, simple as this is …by simulating latency, I am seeing all sorts of new behaviors in the Flex UI that I didn’t notice before.     Latency issues that may have gone unnoticed ..may now be flushed out….and that is what is important.

23 May

Stafford Springs Criterium 2009

Stafford Springs Criterium ....25th! 

I had a good ride.   I felt great ...and could move up when I wanted.  But didn't have the skills and nerve to hold my position through the chicane ... so was generally at the back.  At the back, in the draft ... but never really under threat of being dropped. 

GPS data
http://trail.motionbased.com/trail/activity/8285084
Looking at the data .... 19 miles, average speed of 22.1 mph.   Overall my avg heart rate was 153 ... which is at least 10 bpm less than what I can do for this amount of time.  So I had more to give...and wasn't under major duress.   HR graph shows no fatigue ...but does show some incomplete recovery the last few laps as the pace quickened.   I gave all in the sprint ...hitting 100% of my max heartrate and a top speed of 34 mph.  But poor positioning didn't get me much.

Photos
http://www.facebook.com/album.php?aid=97586&id=571342190&l=5eee72122c

Video
http://www.facebook.com/v/90665487190
http://www.facebook.com/v/90664552190
  


09 May

Minuteman Classic 2009


I had a fantastic race for myself!  Fun!  And I think I finished in the 2nd quartile ....will see on the results.  And a zillion thanks Gina, Bill, and Pete ....and Lorraine too! ...for coming to the race! 

First time up the big climb ...poorly positioned.  But stayed attaached.

Very strong headwind on route 12 .... but about 1/2 mile before the center of Sterling ... I attacked the peloton!  Yes ...this is the very first time I have ever been detached from the peloton ...on the front!  I felt great ...but probably not the smartest thing.  I was off the front for maybe 2 minutes .... then I let them catch me.  Recovered some ...but stayed in the top 10 positions ...and took the 2nd climb very well-positioned.  Yeah!

I asked this guy Jim who I met ...(who eventually got 3rd) ...what was going on at the front of the group when I attacked.  He told me they were like 'WTF? Who is this guy?' etc... and they really had to work some to catch me.  In hindsight ...probably not the smartest thing to do ...I should have used just enough energy to position myself well at the front.  Actually, it was probably lunacy ...but I don't care.  It was damn fun! 

So by the 3rd climb I was dangling ....and then detached.  Argh.  Working with a group of about 8 all the way around ...and on the headwind on route 12.  But I felt good ...and same spot ...as where I attacked before...I attacked again.  Dropped them all but one ... had about 400 feet on them.  I can see from the video and photos they were catching up .....but no one passed me on the climb.

Ultimately ...2nd quartile.  Still got dropped.  But did execute some overt aggressive cycling tactics ... had big fun.  Rode pretty well for myself ...

05 May

JUnitTestMaker ....

Looking at a test tool called JUnittestmaker ….

junittestmaker

It’s an open-source project circa 2001 by a company called WebMind …. apparently no longer in business.

The purpose of the test tool is to create JUnit test skeletons for entire packages of untested code.   The thought being …. if you have the skeletons …then you are over the initial hurdle of writing a unit test.   You point the tool at a package …and voila …. 1 test skeleton for every class.   The skeleton is JUnit 3 style …and you get an empty test method for every public method in the class under test.   I just tried it …voila …126 test skeletons on a particular package.

Initially there is a “wow” factor as you think …”wow, instant unit tests!!  unit test generation en masse!!”

But then there is a bit of a letdown after the initial wow.  The tests are empty and don’t do anything.

As I think about the challenge of unit testing …yes, there is some initial inertia sometimes in getting started, stubbing about the test classes, etc…. And this tool certainly does grease the skids on this initial part of the test writing lifecycle.

But the real challenge of unit testing still remains.  Meaningful tests that reflect the developer intention.  Meaningful tests that reflect the RFAIN.  Meaningful tests that prove the class is working as intended.   Meaningful tests that enable developers to refactor a class or package with confidence.   Mocking.

JUnittestmaker …. a bit of a misnomer.  It’s really JUnitTestSkeletonMaker.

Worthwhile?

26 April

Quabbin Road Race 2009

Fun day!  Good exercise. And no crashes.

I came in 39th out of 68 in the cat 4/5 35+.  Mid-pack.  Fat part of the bellcurve.  Yeah ...I'm "normal" ...statistically speaking...I've always wanted to be normal!

Got dropped on route 202 ... but had a good chase.   Says a friend and chase group companion about my riding ....

Mike,
You drove that chase group and got it all organized. I told you you had a lot more in you than you let on! Great day.
Jose.

The rollers in Ware really hurt.  And the final climb to the Quabbin tower was a total suffer festival!




   


24 April

Notes on listening to Martin Fowler talk on "Evolutionary Software Design"

These are just my notes on listening to Martin Fowler present his thoughts on "Evolutionary Software Design" ....

  • What is the relationship between Agile, Extreme, etc <<<<----------->>>>Design, Architecture ?
  • Design Stamina Hypothesis
    • good design promotes the ongoing addition of new features and change
    • no design may be quicker at the start
    • where is the payoff threshold?  it is in weeks ....not months
  • Design and Architecture are to manage complexity
  • Two types of complexity
    • Essential
    • Accidental
  • Design mitigates eliminates accidental complexity
  • Design controlls and organizes essential complexity
  • Technical "debt" as a metaphor for complexity
    • pay interest on your complexity
    • like being in debt
  • Two schools of design
    • Planned Design
    • Evolutionary Design ...Fowler is in this camp ...iterative...design and development together
  • Important role of Continuous Integration and Test (Yeah!!!)
  • YAGNI (you ain't gonna need it) in opposition to Planned Design
  • Priorities ...from high to low
    • tests pass
    • code expresses intent
    • no duplicate code
    • least code
  • Designs emerge from eliminating duplicate code
  • What is Architecture?
    • The highest level concept of a system
    • Major components and interactions
    • stuff that is hard to change
    • THE IMPORTANT STUFF (whatever that is)
  • Last Responsible Moment
    • defer decisions to last moment
    • late decisions
  • The Role of Architect
    • Technical leader
    • Involved
    • Mentor
    • Programmer ...hands-on


19 April

Tour of the Battenkill 2009

Wow ... fun day!  Hard riding!  But I finished!

 
15 April

#AmazonFail


A recent software failure known as #AmazonFail has lit up the Twitterati these past few days. And as with all bugs, I find it fascinating....

To start with the basics of #AmazonFail ....
  • the "#" pound-sign is how people began tag their tweets.
  • Amazon is the online retailer of books, of course.
  • Fail ....means problem. There's a whole "Fail" phenomena of images on the web of spectacular and funny failures.
According to Janet D. Stemwedel, Phd and author of the blog Adventures in Ethics and Science

The short version is that on Easter Sunday, a critical mass of people noticed that many, many books that Amazon sells had their Amazon sales rank stripped, and that these books stopped coming up in searches on Amazon that were not searches on the book titles (or, presumably, authors).

Those impacted ... de-ranked authors ... began tweeting. And tweeting. And tweeting. And with Twitter, with all the immediacy it brings to communication and issues ...the issue escalated into a Severerity 1 bug yanking Amazon employees away from Sunday dinner. And the issue seems on a trajectory to enter the category of web folklore and uber-bugs that are known by all who test software. There are so many fascinating aspects to this bug and its aftermath. But here's a few things that fascinate me...
  1. It was a bug in data, not in code. In #AmazonFail, a flag was set changing some data, which changed the behavior of a program. At previous places of employment I have heard debates on the issue of data. "Is data part of the system under test?" To the effect, "It's only a data issue, the code is fine." And apparently, according to this blog post ...the data in the catalog becomes "broken" all the time. Ok....just data.
  2. The bug affected ...not Amazon and it's transactional data...but it effected "The Community" of partners and authors dependent on Amazon's ranking system. Amazon may not have had a direct vested interest in the integrity of the ranking system, but others did. And this ranking system is based on user-generated data ...comments and ranking.
  3. The perception of quality. Only a mere 57,000 of the millions of items on Amazon.com were affected. But the negative perception of quality and fallout is much larger.
  4. The handling of the issue with the public seems to have left many dissatisfied.
So did people over-react. Probably. Was it just a minor data issue? Yeah, not a particularly fascinating root cause. But still...a fascinating software bug ....
05 April

Michael Schott Circuit Race 2009

GPS/speed/heartrate data from 2009 Michael Schott Circuit Race in Marblehead, MA...

http://trail.motionbased.com/trail/episode/view.do?episodePk.pkValue=7936284

video...

 
27 March

Using JUnit 4.x with JUnitPerf

One of the JUnit add-ons I like is JUnitPerf.  For very little effort, you can decorate your JUnit tests into performance tests — timed regression tests, and multi-user multi-iteration load tests.    Hey, the approach is not the end-all of performance testing, but I do think there is big value (and for little cost) to the approach.    But I had been recently stymied with the approach since switching to JUnit 4.x.  It just didn’t work.

So months later…on the exciting MATLAB Server EDU project ….I am once again wanting to use JUnitPerf to get some performance and load testing value built into the automated continuous integration and test  environment.   But as we are using JUnit 4.x …argh…stymied.  And I am loathe to change the dependency in the pom.xml to JUnit 3.x and refactor the tests.   But ….I found a neat little tip on the web for using JUnitPerf with JUnit 4.x, and here it is:

1) Create a JUnit factory:

import junit.framework.JUnit4TestAdapter;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import com.clarkware.junitperf.TestFactory;

class JUnit4TestFactory extends TestFactory {

   
static class DummyTestCase extends TestCase {
       
public void test() {
       
}
   
}

   
private Class<?> junit4TestClass;

   
public JUnit4TestFactory(Class<?> testClass) {
       
super(DummyTestCase.class);
       
this.junit4TestClass = testClass;
   
}

   
@Override
   
protected TestSuite makeTestSuite() {
        JUnit4TestAdapter unit4TestAdapter
= new JUnit4TestAdapter(this.junit4TestClass);
       
TestSuite testSuite = new TestSuite("JUnit4TestFactory");
        testSuite
.addTest(unit4TestAdapter);
       
return testSuite;
   
}

}

2) Then from the test class ....instead of doing this ...

public static Test suite() {

int users = 10;

Test testCase = new
TestMatlabHtmlConsolePageStatefullSession();
Test loadTest = new LoadTest(timedTest,
users);

return loadTest;


use the factory...

public static Test suite() {

int users = 10;
JUnit4TestFactory mytestfactory = new JUnit4TestFactory(TestMatlabHtmlConsolePageStatefullSession.class);
Test testCase = mytestfactory.makeTestSuite();

Test loadTest = new LoadTest(testCase, users);
return loadTest;
}

So this allows JUnitPerf with JUnit 4.x. Not complicated, but very useful,
as it turns an automated single-user integration test into a much
more useful automated multi-user test for stateful sessions.


23 March

Charge Pond Race

  Well...I did my first race...Charge Pond 3/21.

I don't know my exact placing, results aren't posted yet. But I wasn't dropped. I was in the front group the whole way, but the last lap things splintered and I was a few splinters behind the leaders...who knows ...maybe 20 or 30 seconds back.

What I do know:
22 mph avg speed
161 bpm avg hr...that is close to my 1 hour max effort
GPS, speed, and HR data: http://trail.motionbased.com/trail/activity/7848024

Some video I made (my son was snapping pics, as well as doing the lap cards for the race official): http://www.youtube.com/watch?v=A8X2ApH_800


Full race report...

Two minutes before my first bicycle race of the season begins, I know I am not ready to race. I wheel my bicycle away from the start line. I get off my bicycle and sit down on the grass. I pull a wrinkled piece of paper from my back pocket. The paper has handwriting on it, and this is what it says;

When I close my eyes I will hear violins, and I will be at the center of the sun. I cannot be hurt by any crash in this race. I cannot be dropped because I will never give up. I will ride like Jorgie. And most importantly, when I close my eyes I will hear violins, and I will be at the center of the sun. The center of the sun.


I recognize the handwriting, it's my own. I wrote this cryptic gobbledy-gook self-talk. Gibberish I know, but it is absolutely essential to be in the right frame of mind for the next hour. So it's self-talk, a final pre-race message from myself to myself, and push everything else out of my mind. I read it one more time to try and convince myself of the validity of this message. No, not convince myself.....I know this isn't valid. I just need trick myself into accepting it for 1 hour....and say the final sentence out loud -- "When I close my eyes, I will be at the center of the sun". I take a deep breath, and get back on my bicycle and roll up to the start line. I am ready now.

The race begins, and we begin orbiting Charge Pond, at 22 mph. It's a 1 mile loop, some rollers, and then a steep downhill into a tight 120 degree turn and a sprint up a hill. The hill is not that long or steep...maybe 75 feet vertical at 7% gradient; but I know that by the 20th lap, if not sooner, this corner and the subsequent climb will be the decisive point in the race. My heart rate triples to almost 3 beats per second -- bup, bup, bup (say that bup bup bup to yourself quickly, three times in a second, put your own hand on your heart and imagine your heart beating that fast. How hard you would have to be working to be racing?). The peloton forms like a pack of hungry wolves there is jockeying for position. And though I am alone in the pack I already know what Jorgie would be telling me to do: he would have his right hand off the handlebars like he is dribbling an imaginary basketball saying "Calm down, calm down" -- if indeed that is possible while racing -- and I heed this imaginary advice and only focus on staying in the slipstream of the racer in front of me keeping my front wheel 6 inches behind his rear wheel conserving energy in the draft. Calm. Conserving. And gasping for air at 160 beats per minute.

After a few laps my metabolism begins to slow boil. Sugar and caffeine and adrenaline ...and then I feel endorphins releasing in my brain over my cerebral cortex. Things begin to boil inside like a tea kettle about to whistle .... my eyes are beginning to tear, drool out of my mouth. I can feel the tendons in my knees under duress. Thighs starting to burn. And the peloton is beginning to string out like a hungry snake looking for prey as it coils Charge Pond . I hear profanities and the sound of metal on metal -- a crash -- just ahead me. A racer bumps into me slightly. And then another racer bumps into me on the other side. It's intense. I try to veer around the crash, not become part of it, but I can't. And then my right hand reaches for the brake lever to slow down. But before I squeeze the brake I recall my pre-race message to myself -- I cannot be hurt. So I let go of the brake and veer hard left. I immediately know what Jorgie would do -- he would have his hand out, palm up, signalling "Come with me". I bear down on the pedals even harder and begin to move up on the outside of the pack, leaving the crash behind.

At the front of a group of racers it is safer, as the liklihood that if a crash occurs increases that it will be behind you and not affect you. Also at the front you tend to not get caught behind gaps that may form. Heck, it's a race ...being near the front is good. Near the front is good, yes; but not at the front. For at the front, you are bearing the brunt of the wind and everyone else is in your draft. No need to tow the peloton or a group around letting them benefit from your draft. And when I suddenly find myself at the front I immediately know what Jorgie would do ... soft peddle and get off the front ... and when I do I imagine I see Jorgie smiling and sort of clapping his hands as if to say "Good job Mike to get off the front".

An hour at this pace and the peloton is begins to break up. Sorted. Wheat separated from the chaff. A gap opens before me and suddenly I am out of the draft. I try to close the gap but can't, I not only have to accelerate to close the gap, but I am additionally now out of the slipstream bearing the brunt of the wind. I am falling out of the front group. But then I remember my note, my self-talk. I cannot be dropped, and I never give up. And I bear down and turn the pedals over applying smooth and relentless pressure over the entire circle of my pedal stroke in a massive gear. It seems an eternity, but eventually I catch on the wheel of the rider in front of me again. Reattached. I cannot be dropped.

At the top of the hill I see the lap card ...1 lap to go. I don't even know what is going on really...I am sucking wheel (drafting), pulling in a paceline, holding the wheel in front of me, closing gaps when they open, responding to attacks. The peloton has splintered and I am in a splinter group. There really is no tactics, I am just going all out as fast as I can go. There is no chance I can bridge to another splinter group, I am too tired. I am just hanging on is all I can do. What would Jorgie do? I have no idea.

I see the downhill and the tight corner, finally for the last time, I am so tired I really don't even care who wins at this point I just want this race over. Get across the line and lie down on the grass and recover. And out of fatigue, my forms slumps, and, exhausted, I begin to let a gap open to the wheel in front, and I close my eyes.

But as soon as I close my eyes, I remember my note to myself, my gobbledy-gook self-talk. When I close my eyes I will hear violins, I will be at the center of the sun. No, I will not just ride in, exhausted. I will be at the center of the sun!

I really need to dig deep now. I am already at my limit and in massive oxygen debt and my legs are screaming. But I jump out of the saddle, hands still in the drops, and close my eyes, and repeat out loud the words I wrote on the note: "I am at the center of the sun". And with that, I begin the final sprint, total combustion, red hot, feel the burn, crush it. It is just furious smash with one foot so hard trying to drive the pedal right off the spindle and into the pavement, and yank with the other, up the sprinters hill to the finish line. The center of the sun. I open my eyes, and I see the wheels spinning around me and I know one thing: I need my front wheel to surge in front of theirs. But it is so hard. So hard.

And then the white finish line flashes beneath me and it is over.

By the numbers...14th place, 30 seconds behind the winner. 22 mph avg.

That was a good ride for me. But then I remember....hmmmm....I never heard the violins, I need to work on that.





12 March

Race report: Minuteman Classic

Today was the Sterling Classic, a 28 mile road race hosted by the Minuteman Bicycle Club. Sterling, as you may or may not know, lays claim to be the town of Mary and her lamb of the famous nursery rhyme "Mary Had A Little Lamb". In the song's lyrics, Mary takes the lamb to school one day, and the kids ask the teacher: "Why does the lamb love Mary so?" Well, the reason the lamb loves Mary is.........the answer is in the song in the next line of lyrics. Can you remember? Well, I am digressing....I will tell you in a bit why the lamb loves Mary, if you choose to read on. First, I want to describe this bicycle race!

As the race is about to begin my mind goes back to Phil Liggett interviewing one of my favorite bicycle racers Alexander Vinokourov who says "The race today will be difficult. I will attack." These 9 words sum up bicycle racing so concisely, so universally. Vino's words -- true for any Belgian spring classic, true for any stage of the Tour de France, and true today in Sterling. The bicycle race today, like any race, will be difficult because it is a race. Crashes will occur. Injuries will occur. Courage will be tested on the descents. Strength tested on the climbs. Cooperation and competition. But there are 2 specific reasons today's race will be extra difficult: one, the race organizers have combined the category 4 racers with the category 5 racers, two, there is an absolute beast of a climb through Sterling center. As for the attacking Vino mentions, my current challenge is to stay with the peloton. There are dues to be paid and a ladder to be climbed. The rungs seem to go something like this: getting dropped, staying with the pack, getting in a breakaway, getting in the breakaway, getting on the podium. I am on the first rung of this ladder in this my 3rd year of riding, 1st year of racing, and only in my 3rd bicycle race. I know I will get dropped.

There is a neutral start for several miles, which means no racing, and the official pace car leads the pack through the town of Sterling at about 15 mph. I am chatting up a few Team Bicycle Alley riders and Team Polar Beverage riders I have ridden with in the past. The pace car pulls aside dropping us off at the foot of the beast of a climb. No need to check my watch; I know what time it is -- it's pain time!

Another nursery rhyme jumps into my head "Jack and Jill went up the hill to fetch a pail of water." When climbing it is important to find your rhythm, your groove, an aggressive yet sustainable pace. When I hit my climbing groove my bike talks to me. It says "Sh. Sh. Sh. Sh." The noise comes from...I don't know where it comes from... (Maybe in my head, maybe I'm going insane!) ...the tires on the road? Who knows. But my bike is not talking to me so this is a miserable climb.

Hills are the great sorting mechanism of a bicycle race. And after the first beast of a climb, is there respite? A descent to catch your breath? Heck no! After the first climb is ....a second climb! I find myself in a group of 3 and we are working pretty well together, rotating in a paceline. And we are making some good speed working together. But is an odd partnership: we are the grimpeur, the roeleur, and the puncheur. The grimpeur is French for climber, someone with a good power-to-weight ratio which is what is required to climb well. I am the roeluer, good on the flats with plenty of power, but a smidgen to much weight in the denominator in the power-to-weight fraction. Then there is the puncheur, strong, stocky, mesomorph. a sprinter. We have mismatched riding profiles that put our little ad-hoc cooperative group under duress over rolling terrain. I take a nice strong turn at the front of the paceline, and when I pull over I notice the puncheur is gone. Drats, I didn't mean to drop him. The grimpeur says "Nice pull". But unfortunately I gave a little too much to the group in my turn, and couldn't hang on his wheel on the subsequent climb. So then I am dropped. Double drats.

So I am riding by myself for a bit. The road race has turned into a time trial. Time trialing requires the ability to ride very hard without the dynamic of competition or cooperation of a bicycle race. I look at my heart rate monitor and manage my exertion to keep my average heart rate at 160 bpm.

A rider catches me from behind, and this puzzles me. Not that I have delusions of my riding strength, but I have been hammering. The great sort out of the pack has already occurred. So I was not expecting to be caught from behind by anyone. When he goes past me he says "Do you want the wheel?" meaning, do you want to draft behind me? The expectation then being that we would then cooperate, taking turns on the front breaking the wind. I nod and nestle 6 inches behind him. He is strong and relentless, what was he doing behind me? And his bike is making noise, wouldn't he have oiled his chain before race day? Puzzling. As we rotate, 30 seconds on the front, 30 seconds in back to rest...and oh that slight rest feels good....we exchange some conversation. His name is Jim. Cat 4. Flatted in the first lap. I get it now, he got a spare wheel from the neutral support vehicle which doesn't quite mesh with his derailleur properly which explains the noise. And it explains why he was behind me...he lost 1 minute or so swapping his wheel out. This is a good partnership for me...we are flying and working well together. But I also recognize it is an unequal partnership. I am getting more out of this cooperation than he is. Therefore it is a fragile and tenuous alliance and may not last.

Jim puts his hand out and stops pedaling. There are police cruisers in the road and a rider lying motionless on the road. The racer in the road is not moving at all. He may be unconscious. There is the sound of the ambulance. He is hurt pretty bad. Gulp. "Jack fell down and broke his crown."

Jim and I continue to make good speed, but up comes the beast of a climb. This climb will put test our partnership. One, I need to not get dropped. Two, I need to climb so strong so that Jim sees no weakness; he needs to see me as a strong partner for our alliance to continue. We crest the climb together, and Jim says "Nice climb. We'll see how you do on the next climb." I continue to ride hard, but I am way over my threshold at this point. My heart is beating at 184 bpm, I can't sustain this tempo. I need to recover a smidgen to get back down to the 170 bpm range. Jim sees the weakness...and says a few parting words of encourgement to me and waves goodbye. That's the way racing works: opportunistic cooperation, no charity.

Back to my time trialing, metering out self-inflicted suffering and punishment to maintain a 160 bpm heart rate. I see a rider ahead of me and I set my mind to catch him. I try and try and can't close the gap. I am the donkey and he is the carrot on the end of a stick, I will never catch him. I start to get discouraged but then I see I am in fact narrowing the gap! So I am digging and digging and eventually I catch him. I think about working with him cooperatively, but he is fatiguing. Not a good relationship for me. I drop him easily.

I see two more riders ahead and think "Bogeys, 12:00 high". I work and work and catch them. I fly past them, I thought one of them was Jim and I wanted to declare "I'm back! Let's go!" But neither one was Jim and I realize I am an idiot for flying past them like that. I slow a smidgen and point to my rear wheel. They line up and I take a nice pull, make a nice contribution of pacemaking to the group, an ante, an offering of teamwork. That seals the bond and we 3 work together to the finish.

The finish line is at the crest of the beast of the climb. This gives the crowds a chance to witness some good suffering. When a bicycle race gets slowest, such as on a hill, it sometimes gets most exciting. The riders don't go by so fast, you can see their faces grimacing, and the final sort out of suffering occurs. I am climbing strong even though I am 24 miles past fresh, and then I hear it. "Sh". Did I hear what I thought I heard? "Sh. Sh. Sh." Oh my bike is talking to me, finally, and I stomp out the cadence out of the saddle. "Sh. Sh. Sh. Sh." Oh, talk to me baby! "Mary. Had. A. Lit. tle. Lamb."

There's crowds and cheering. People yelling encourgement. Loud music playing. I hear someone shout my name. Fans. Team Bike Alley members who finished an earlier race. Or Seven Hills Wheelmen members on a ride-to-the-race. I can’t turn my head to look, I am in my own world of pain and suffering right now. I finish strong, but am glad the race is over.

I have the whole ride recorded on my Garmin. Speed was 19.8 mph avg. Not fast enough apparently to stay with the pack. I think I need a smidgen more...maybe just 1 more mph to get up near 21 mph. I spent the entire winter training working on my climbing; I am stronger, but I need to climb a little stronger still. But still, I am pleased with that speed of 19.8 mph avg considering the first few miles were 15 mph with the neutral start and there was an overall elevation gain of over 100 feet. Ascending...avg 15 mph. Flats...avg 21 mph. Descending...25.4.

Heart rate...overall a zone 4.3 .....with 54 minutes in zone 4, and 7 minutes in zone 5...I was working very hard. My average heart rate was 161 ...which is almost exactly what I was targetting. Max heart rate was 184....that is less than I thought...my max is 193 and I thought I was full out on that big climb. Maybe I was improperly geared?

The big climb....112 feet elevation gain with average slope of 10%, max slope of 12%....that is a beast. What makes it difficult is that when that climb is over there is almost immediately another 150 foot climb. I actually liked that the finish was at that top of the big climb, that must make for great viewing by the spectators.

Oh....and back to the nursery rhyme that originated in Sterling, Mary Had A Little Lamb:

Mary had a little lamb its fleece was white as snow;
And everywhere that Mary went, the lamb was sure to go.
It followed her to school one day, which was against the rule;
It made the children laugh and play, to see a lamb at school.
And so the teacher turned it out, but still it lingered near,
And waited patiently about till Mary did appear.
"Why does the lamb love Mary so?" the eager children cry;
"Why, Mary loves the lamb, you know" the teacher did reply.



Now, the answer to the question at the beginning of the race report: "Why does the lamb love Mary so?" the eager children cry. The answer is: the lamb loves Mary because "Mary loves the lamb". Aw shucks....the hopeful adage of love reciprocated. The love you get is from the love you give. What a happy thought for Mother's Day!
06 March

Bikes, Bagels, and Bad Breath

Bikes, bagels, and bad breath -- the minivan is chock full in the pre-dawn darkness. This morning I'm hanging with the wild bunch, the cool kids, the hardcore racing cyclists. There are decades of race experience packed in this van; but, also something rather child-like. When the sliding door of the minivan shuts sealing out the outside world with us inside it is suddenly quiet. We look at each other, smile, and exchange high-fives: "Let's go race our bicycles!"

As we drive through small towns in southern New Hampshire I am mulling something I recently read from a continent away, an ancient African proverb: If you want to go far, go together; if you want to go fast, go alone. In today's contest -- the Lake Sunapee Road Race -- I will need to do both, go both far and fast; race together, and race alone. Racing together cooperatively with others, I will need to share the brunt of the wind resistance with cycling tactics of pack riding and pacelining to complete the 46 miles of this course as fast as possible. And racing alone, I will need to employ the tactics of attacking, bridging, and sprinting. My outcome and final placing will be the result of my fitness, but also largely how well I manage the yin and yang, the cooperate and compete, the together and alone para dox that occurs in every bicycle race.

Exactly when the hostilities began, I don't even know. For almost half the race I am nestled in the peloton. We are zipping along at over 20 mph, and I am under no duress. I could smoke a cigarette, read a book, hold a conversation, check my email on a wireless PDA, go all day at this level of exertion and complete a century. But all of a sudden, the peloton just seemed to explode and there were racers strewn up and down the road. Whether the racers at the front took a secret vote and decided to turn their pedals in anger, or if it was the vicious gusting 20 mph crosswinds coming across Lake Sunapee, or if riders' metabolisms suddenly overheated ... I truly have no idea.... in any event, the peloton began to break up. Whole contingents of racers are yo-yo'ing on the ascents, chasing on the descents, ripping through corners trying to remain in contact with la tete en course, the head of the race.

Whatever it was that suddenly hit the peloton though....I felt it for sure....but it didn't exactly hit me, not a direct hit anyways. It was a very near-miss, and although damaged, I survived. Still, I needed to take inventory of myself. "Status reports from all sub-systems! Check in now!" my inner voice issued the command. "Legs reporting in: heavy lactate in the thighs, but we'll be okay." "Cardio systems reporting in: under duress, but we'll recover in a moment." "Fighting spirit: totally undamaged!" That last status report was the most important, what I needed to hear from myself.

Around me I see a variety of other racers and I quickly scan in all the subtle body language cues: some slumped shoulders, some poor cadence, some poor form. And then I see what I am looking for: strong steady cadence, strong form, someone unscathed from whatever hit the peloton. I bridge, with difficultly, to get on his wheel, and my first impressions are confirmed -- he is strong. I'm struggling to stay on his wheel, and he is probably working 30% harder than me blocking the wind. This guy is a racehorse with the bit still clenched firmly between his teeth. I pull up next to him and make a circular motion with my index finger that would be interpreted by a non-cyclists as the motion for "crazy." Maybe I am crazy, maybe he is crazy, but that is not what I am indicating. He knows I am asking "We work together, rotating in a paceline, yes?" because instantly he bellows: "Let's do it!"

This ad hoc alliance was the creation of a train that served us both well. Working together with another racer saves the person behind maybe 15 bpm of heartrate, a little recovery, just enough to keep driving a hard pace. Fifteen or twenty seconds on the front, then pull a little to the side, and a slight flick of the elbow as if to say "your turn," and then drift to the back for a bit of rest. The headwinds and crosswinds blowing in across the lake were fierce and solo riders, riding without the benefit of drafting, we either passed, or they latched on to contribute to, and benefit from, this paceline.

On the final 10 miles we raced through wreckage of the head of the field. One racer was on the side of the road, leaning over his bike gasping and crying. Some looked stuck in molasses. Some got on the train, but some we just went around without showing any sympathy for their struggling carcasses. Roadkill.

With a few miles to go, someone in the paceline said something like "We can do this hard way, or we can do this the easy way." Translation: "Let's just ride in together, without attacking. A peace treaty?" Really, this was an incredibly sane and attractive offer. The top 10 placings are out of reach for all of us. Our metabolisms pushed to the brink of complete meltdown, practically desperate with fatigue all of us. Why not just finish this race the easy way?

But then my mind travels back to the minivan, and I remember why I am came here -- to race my bike -- and I remember the African proverb: if you want to go far, go together; if you want to go fast, go alone. I have gone far racing together with the others. Much of the excitement of the race, much of my overall speed, I owe to the peloton, to the paceline, and in particular, to that racehorse with the bit between his teeth that helped power me through the course and through the carnage after the peloton broke up. All that was good. Very good actually. But that was then, and this is now. I decide: now it is almost time for me to go alone, if i can, to go as fast as I can.

We circle the rotary to begin the final 1/2 mile which is uphill 5% gradient. I hear a voice which I instantly recognize from the minivan which brings a smile to my face, my Columbian friend now improbably and suddenly yelling in French, "Allez!, A llez!, Mike Foley!" as if this were the slopes of Alpe d'Huez in the Tour de France, not a meaningless sprint for mid-pack placings in the cat 5 35+ division of a regional race. Here comes my answer to the question, "Hard way or easy way? Peace treaty?" Out-of-the-saddle, I make an exertion, a decidedly uncooperative exertion, and leave much of my paceline behind. We will finish this the hard way, racing to the end. One last hill. I hear another voice from the minivan 'Go Mike Foley!" and that triggers the final sprint, all out, I hold nothing back.

After I cross the line I am totally spent and I head for the grassy median and I just uncleat one foot and tip the bike over and fall on the grass gasping, staring straight up at the puffy white cumulous clouds billowing against a beautiful blue sky, just letting my heart rate come down a bit. After a minute or so I stand up and look around. I see who I am looking for, the co-captain of the paceline, the racehorse that rescued me from the breakup of the peloton. "Dude, you're an animal!" I say, and we shake hands. He says, "That was good racing!" Indeed.

By the numbers:


44.36 miles
20 mph
157 avg HR ....which is a strong effort for me...my 1 hr max effort is about 162 bpm....and this was a 2 hour race
10 minutes zone 5
64 minutes zone 4
31 minutes zone 3 aerobic
24 minutes zone 2, century pace
32nd out of 44
9 minutes behind the leader
05 March

Are You Ready?

“Are you ready?” asked the United States Cycling Federation race official to the 40 or so cyclists each standing with one foot on the ground and the other foot cleated to their bicycles. But not one of the cyclists said a word in response to the race official. Only a red-tail hawk, high on a branch above, had anything to say, letting out a long SCREEEECH, and then swooping low, instinctively knowing that in this place here, something was about to happen.

Although I did not answer the question of the race official, I thought about it: Am I ready? Can I climb? Can I descend with reckless abandon at speeds approaching 40 mph? Can I handle the shoulder-to-shoulder jostling in the pack? Can I ride my bicycle at 23 mph for 1 hour over hilly terrain?

The answer to that last question – can I ride at 23 mph – is no. That is too fast for me, too fast for all the other racers too. If I ride 100% maximum effort for 1 hour I can hold about 18-19 mph, about 5 mph short of the requisite speed today. But I am not dismayed at my apparent shortcoming in this regard. There is a magic of sort that happens at a race that will enable me to ride faster than I can alone. The magic happens when you join the contentious fellowship called a bicycle peloton. The peloton is a 100-legged beast that is able to power through the wind in a way faster that any individual rider can ride alone. This magic of the peloton and group riding is what I am counting on, indeed, why I am here at all. But while I am optimistically counting on the magic of the peloton to ride fast, I am fully cognizant the peloton is not a benevolent beast. Indeed, the peloton is absolutely merciless, and if you so much as slip a gear with a mechanical incident, fatigue one iota on a climb, become cautious on a descent, the peloton will leave you behind in an instant. And once dropped, you will never be able to catch back on ….your 18 mph solo pace will never be enough ….and your race is essentially over. Or, if you think you can outrace the peloton by trying to breakaway off the front…Hubris! Madness! If you breakaway off the front, the peloton will surely hunt you down and take back it’s own.

The magic of the bike race, for me anyways, happens when you lose yourself and become a part of the peloton, a cell in a larger organism, a gazelle in the herd. Perhaps that is why no one answered the race official’s question, the racers are already beginning to lose their individuality in the 100-legged, but voiceless, peloton.

While at the starting line, I took a quick look around to absorb my surroundings. The Blue Hills,so by early explorers who gave these hills beyond Boston Harbor that name because of their blueish hue, are all around me. But this morning, I see no blue, only a kaleidescope of colors from the water droplets on my wraparound sunglasses. Each water droplet showing spectacular colors: yellow from the blooming forsythia, violet from azaleas, glistening chrome from deraileurs, and all sorts of colors from the advertising-plastered lycra clothing of the racers.

Not that I can predict the future or the outcome of this race, what will happen over the next hours is, at some level, already known. The race will begin at a furious pace and only get faster and faster like the unrolling of a carpet, and at the end of the carpet’s unrolling the pace will be such that the peloton, or what is left of it whittled down as it will become through massive attrition, will be stretched out like a snake and the strongest will be at the front and the weaker sorted towards the back. For me, the race is not about victory at all….it is about the ride, the journey. My race is one of survival, to fight to stay in the peloton as long as possible, to belong, to not be dropped.

People have advised me on race strategy. The best strategy advice I have received, and from an experienced racer, sort of now my ‘coach’, is to stay near the front of the peloton. For at the front, you avoid getting caught behind gaps that may open up in the peloton because of fatigue or crashes. But I also find this advice amusing and it reminds me of the secret to winning basketball games that I received once: “You need to stop your opponent from scoring, and you need to score yourself.” Yes indeed, the team that does that will win basketball games. And yes, if I can stay near the front of the peloton then I will have raced well. Both good advice, but both easier said than done.

The race officials rattles off a list of disclaimers and warnings: "Watch out for the broken pavement on ____ Street." "Do not dive into the corners, the race will not be decided on your positioning coming out of any corners. The race will be decided on the climbs." "Do not cross the yellow line." The racer next to me says snidely "The real issue is the steel plates across the road where there was construction yesterday. It's at the bottom of the fastest descent, and it will be a skating rink. Watch out for the crashes and bodies flying there." I ignore all these dangers. While normally risk-averse and methodical, the next hour is all out and I have no intention of touching my brakes under any circumstances. I am a rolling mid-life crisis on a 3k carbon fiber bike.

“Well, have at it.” The race official says, and all the riders do just that stepping on a pedal, cleating in with the other pedal, permanently attaching themselves to their steed, barring crashes, for the next 60 minutes. The pace quickens rather abruptly and my heart rate more than triples from a resting rate of 50 bpm to 160 bpm, nearly 3 beats per second, where it will stay for the next hour desperately trying to supply my legs with oxygen and energy needed to propel myself around on 2 wheels.

Soon the Blue Hills are under our wheels. The main climb is max 10% gradient, in old money that's 1 in 10...for every 10 feet forward you climb 1 foot. Hills are one of the great sorting mechanisms in a race. With cruel efficiency, the weak are culled and dropped from the peloton. And those who are not dropped will begin to be sorted in order from strong to weak. I shift down to 39x25 to begin the intent, turning my legs over at 90 rpm. I begin to focus and repeat my climbing mantra – “up”. I think of this one word only when I am climbing. Up, up, up, saying the word with each pedal stroke. It is mind over matter. This one word crowds out all else, like a light in an otherwise dark room…keeping the fatigue, pain, and self-doubt at bay. This pace is too high, I need to ease; up. My thighs are burning, I need to slow down; up. This hill is too long and steep; up. Up, up, up.

And then we begin to reach the crest of the hill – the end of the up -- but does the pace ease? Is there respite at the top of the hill? No. Why is there no respite at the top of the hill? I have no idea, but if you don’t hold the same climbing exertion level over the top of the hill and down the other side, someone else will, and then you will be dropped just when you thought you made it to the top. If the purpose of the hill was to cull the weak, then the crest of the hill is to cull those foolishly optimistic that the pace will relent. I hold that exertion level right over the top and get right up to speed as quickly as possible.

And then comes the descent. Madness. Hands off the brakes, chins resting on the handlebars, knees and elbows tucked in, trying to present the most aerodynamic shape to the wind. I lift my head up just a smidgen and I can see my mph drop on my cyclecomputer; stay in my tuck. And at speeds up to 40 mph, I fight to stay on the wheel in front of me, ticking a big 53x12 gearing over at 120 rpm, 6 inches behind the whirring wheel of another racer.

I hear the clash of metal and the uttering of profanities behind me – someone has crashed. More likely 2 or more have crashed. While riding at your limit, these accidents are bound to happen. And those caught behind the crash will be separated from the peloton and have to spend precious energy to catch back on to the peloton, if indeed, they can do that at all. Yet another reason to ride near the front.

Over and over this repeats: Climbing, cresting, descending, cornering. And all the while the race is like a millstone grinding away at the peloton. Wearing it down. Separating the wheat from the chaff. Dropping riders along the way like a meteor entering the earth’s atmosphere. A race? Nay, it is mostly about attrition. And the struggle of anti-attrition, to stay attached to this wonderous and monstrous beast called the peloton.

The word “peloton” is a French word meaning “ball”, and maybe this is the best way to explain or understand a bicycle race. The peloton is just a ball or mass of riders. This ball is subject to 2 very strong and opposed forces acting on this ball. One force draws the peloton together and is based on the need of the riders to cooperate in the fight against wind resistance. Riding behind another rider, drafting as it is called, requires 30% less effort. This is why there is a peloton, or ball, in the first place. Every racer recognizes the winning recipe of opportunistic altruism of riding in a group. The second force acting on the peloton is a force that acts in the opposite direction trying to dissolve or explode the peloton. This force is based on competition, and everyone is trying to get to the finish line first, not necessarily tow their rivals in their wake as they make a competitive effort. The other thing to recognize about the peloton is that this ball or mass of riders is not comprised of a single consistency. Some racers specialize in climbing, others specializing in flats or descending, and everyone of different fitness levels. So this ball can be seen as a social entity subject to both the forces of cooperation and competition, as well as external forces of hills, descents, corners, crashes, and what not. Sometimes the ball stretches out in a long line, and sometimes the ball fractures as it did on the hill on the second lap.

On a hill the cohesiveness of the peloton, as well as the individual racers, is under massive duress. Gaps open, and it is work, work, work to close the gaps down. But one gap opens ahead of me and the peloton splits in two. This is a major issue, and when it happens, it's business time. Time to go to work and chase back on. Another rider and I, recognize the decisiveness of this gap. I accelerate hard to get in his draft, with a few riders doing the same to get on my wheel and in my draft. This is how pacelines form, and one did. A paceline is an ad hoc cooperative effort between racers, each taking a short turn or pull in the wind, and then rotating to the back. It is an extremely efficient cooperative formation, and together as a group we chase back on to the peloton. But even though we made it back to the peloton, there was a high price to be paid. Our chase took 2 or 3 miles, and we all made a payment out of our ver-dwindling precious reserves for our time outside the peloton.

By the third ascent I had worked my way back up to the front 5 or 10 positions. Astutely alert to the possibility of gaps, when one opened in front of me, I raced around the rider in front of me to close the gap. I stayed attached on this third ascent, although I find myself sorted towards the back. On the flats, I focus on drafting and pack positioning, working my way back through the peloton to one of the top 5 positions.

Just before the final ascent, the pace mysteriously eases, a lull before the storm. I take a look around and take a few deep breaths. See who smiles. See who nods. See who slumps their shoulders in resignation. I look at my gearing to make sure – 39x25 – and again begin the intent for the final time. Up. Up. Up. Turning the gears over at 90 rpm. Up. Up. Up. This climb is about who can suffer the most, and I begin the climb in suffering debt. I’ve been splunking in the pain cave for the last 5 miles, and as the hill accelerations and hill sprints start, I drop the flashlight.

A rider next to me turns his head to look at me, and I realize my “up, up, up” mantra is no longer my inner voice, but has leaked over to my external voice. Embarrassed for a moment, I realize I have become the cycling equivalent of the grunting Monica Seles, a tennis player whose vocal grunts upon hitting the ball scare not only the opponent, but also those watching tennis on TV.

And its not just my metabolism that is on the brink of meltdown, so is the cohesiveness of the peloton. The cooperative nature of the peloton is dissolving as the pendulum swings to raw self-interest and competition. It is wheel-to-wheel, shoulder-to-shoulder, physical jostling and verbal jousting…”Move up!”, “On your left!”, “What you waiting for?”, “If you ain’t got no legs then get out of my way” etc…

They are really drilling it, little gaps opening, and I am closing the gaps down, but I am on my limit. With the hill accelerations and sprinting, the sorting process of this final climb is ruthless. My thighs are loaded with lactate. Gaps open that I cannot close, and I finish just a few seconds behind the leaders. 17th place out of 38 racers. I’ll take it, that was a strong ride for me.


02 March

Working on my presentation skills, how leaders connect

I attended a 2-day seminar where I was coached on developing presentation skills by the amazing Nick Washienko, Phd. Made some good headway in this regard. It was all video...watching video, being videotaped, being critiqued, understanding the dynamic of a good presentation, and practice, practice, practice.

The first part of this clip is "baseline" .... uncoached, untrained....just practicing introducing someone else. There's a lot wrong with this: I'm standing behind the desk, reading from paper, limited engagement with listeners...the list goes on and on of all the things I am not doing well.

The second clip is after about 6 iterations. In this clip I am just practicing engaging the listener. Much higher state of engagement, not standing behind the desk, much better body language, etc...

The third clip is the 8th iteration. This is putting it all together -- introduction, engagement, 1 content section, conclusion.  Not perfect, but much better!
 
03 February

My Mathworks Idol submission: MATLAB Top Gun

At work they are having a contest called "Mathworks Idol". To enter, you submit a humorous MATLAB or The Mathworks-related video. Here's my submission...   



02 February

Joel on Software: Podcast #38


First there was The Joel Test: 12 Steps to Better Code .... a good article by Joel Spolsky where he articulates 12 steps to better code...

The Joel Test

  1. Do you use source control?
  2. Can you make a build in one step?
  3. Do you make daily builds?
  4. Do you have a bug database?
  5. Do you fix bugs before writing new code?
  6. Do you have an up-to-date schedule?
  7. Do you have a spec?
  8. Do programmers have quiet working conditions?
  9. Do you use the best tools money can buy?
  10. Do you have testers?
  11. Do new candidates write code during their interview?
  12. Do you do hallway usability testing?


As I read this I found myself nodding "Ok, ok, good, ok..." through this article.

And in response to this essay, apparently many people suggested adding a 13th step ... "100% unit tests of all your code." Yeah! Seems like a good goal. But in follow-up Podcast 38 Joel Spolsky takes the bold stand to argue against against this additional 13th step... but also responds "yeah" to this ...
And I find, sadly, to be completely honest with everybody listening, quality really doesn't matter that much, in the big scheme of things... There was this quote from Frank Zappa: "Nobody gives a crap if we're great musicians." And it really is true. The people that appreciate Frank Zappa's music aren't going, "that guitar was really off." They're hearing the whole song; they're hearing the music,
Oh my. Is he off his rocker and uttering some sort of software blaspheme in a weak moment? Or is he saying something else? So I am rereading this article very carefully to see if I can figure out what he is saying. So here is Joel's first argument against 100% code coverage ...
...if a team really did have 100% code coverage of their unit tests, there'd be a couple of problems. One, they would have spent an awful lot of time writing unit tests, and they wouldn't necessarily be able to pay for that time in improved quality.
To summarize, I think he is saying there is a point of diminishing returns on code coverage as it approaches 100%... Here's Joel's second argument against 100% automated unit test coverage ...
...that the type of changes that you tend to make as code evolves tend to break a constant percentage of your unit tests. Sometimes you will make a change to your code that, somehow, breaks 10% of your unit tests.
Hmmm....having unit tests in place allow you to refactor the class-under-test with confidence knowing that the behavior is not inadvertantly changing. And yes, if you change the behavior of your classes-under-test, then yes...unit tests will break. Unit tests are supposed to enforce a consistent behavior in the class under test. Of course in a test-driven environment, the developer would be changing the test first, and then changing the class-under-test so that the test would pass.
as your project gets bigger and bigger, if you really have a lot of unit tests, the amount of investment you'll have to make in maintaining those unit tests, keeping them up-to-date and keeping them passing, starts to become disproportional to the amount of benefit that you get out of them.
So yes, there is a cost to maintaining unit tests if you are going to change the behavior of the class-under-test. But isn't the cost equation on automated testing one of high initial cost in developing them, and then reap the rewards as they keep running for 'free'. So then he recognizes the "cost" of maintaining unit tests is highest when there is a lot of churn...
To me it's about churn.
True. But when there is the most churn...isn't that also where the benefit is also greatest? So then comes this ...
I might do more black-box tests [instead of unit tests..]
And by this they mean not unit tests ... but integration tests covering use-cases or workflows ...I assume. Okay, I sort of agree here. Unit tests are not the end all of automated tests. You also want higher level integration tests ..or GUI automation tests. The benefit to these sorts of automated tests is that they often cover a lot more code, they often more closely match what the customer will do, they often more closely match business requirements, etc... But black box and higher level integration tests are costly too...when they fail, you often don't know where exactly the failure occurred. Next up in the essay...is I think a gaff on his part where he argues against programming to an interface. And then another gaff...
And I find, sadly, to be completely honest with everybody listening, quality really doesn't matter that much, in the big scheme of things... There was this quote from Frank Zappa: "Nobody gives a crap if we're great musicians." And it really is true.
Okay, I respectfully disagree with that. Is he really trying to say, albeit poorly: "Customer-perceived quality may not be directly proportional to unit test code coverage"? Or ...is this some version of the Time, Quality, and Cost Triangle: .... with Joel favoring cost and time ...at the expense of quality (unit tests)? Or is it that he thinks 100% unit test coverage is not practical (untestable code, diminishing returns, etc...)? This latest essay by Joel Spolsky just left me scratching my head....