It is amazing.  I am on an airplane, blogging.  I have actual internet access.  At a speed that is quite respectable.  Fabulous is the word that comes to mind, though it doesn’t quite fully capture just how amazing this feature really is.

I am not sure I can ever fly another airline after this.  Well, I hear Delta has a similar service, not sure if it’s available across their entire fleet.

So, on a related note, it seems that even Virgin America First Class cannot be rid of those complete douchebags you seem to run across on a flight.  You know the type - the really cranky asshole who is SO COMPLETELY INCONVENIENCED by something that happened to him earlier in the morning, and has to take it out on his fellow passengers or, worse yet, the flight attendants.  Lately I have been traveling a lot for work and so my tolerance level for airport craziness has gotten a lot better, as it is clear that people who work in the airports have a very, very tough job.  Yes, I know it looks like they are somehow incompetent or don’t really care about you.  Maybe that’s true for some of them.  But give these folks a break - they also have to deal with security, the stringent rules placed upon them (and by extension, the rest of us) by the FAA, etc.

Anyhow - today’s douchebag was a first class passenger, who decided to completely ignore the rules regarding how much luggage to bring on the plane.  As he stepped on board, he took his carryon rollerbag and placed it in the overhead bin above the seat across the aisle from him.  Not above HIS seat, the OTHER seat.  Note, he could have spent abotu 30 seconds making room for his bag by doing a little shifting, but clearly that was too much work for him.

As he was doing this, the guy behind him asked if he could move his bag to his side so he can place his bag above his seat.  You see, the other guy’s seat was right below the bin where the douchebag placed his rollaround bag.  The douchebag’s response?  “WELCOME TO LIFE BUDDY TOO FUCKING BAD.”

I kid you not.  WHAT?  Are you serious?  Are you really that much of a dick, you have to treat your fellow human who has to sit across the aisle from you like that?  OMG.

The flight attendant did her best to make everyone happy, and really, she was amazing.  She ended up doing the shifting on behalf of Mr. Douchebag.

Seriously people - you really need to check your attitude at the gate (literally) when you get on an airplane.  No one really wants to be on it.  Well okay, not really true.  I could live in my first-class wifi-enabled seat, eating my fresh fruit, yogurt, and hot cinnamon roll while blogging.  :)  But still…

Outside of that moment, this is the most amazing flight I have ever been on.  Thank you Virgin!

Process Certification - y/[N]?

There has been a lot of chatter recently about the value of [enter Agile methodology here] certification. I think a lot of the chatter is due to the controversy surrounding the Scrum Alliance’s letters to various user groups, asking them to “license” the Scrum name. And I believe the other reason is the huge number of trainers out there making quite a living doing the Scrum certification thing.

Part of that last sentence isn’t fair. People need to make livings. And, there is immense - if not, with the right people, priceless - value in those who have led teams down the Agile path teaching and coaching others to do the same. But as with anything that looks really cool and works, you have folks who go through the certification motions just for the sole purpose of being able to make good money. It’s those who don’t see their career as a craft or who have real passion in what they do - they just want more money. Not that capitalism and the desire to be wealthy is bad, no judgments there. But I get the feeling that many of the “Agile trainers” out there just aren’t of the quality that many teams need. To extend the idea in my last entry (”architects who don’t code are like fashion designers who don’t sew”), there are a lot of people out in the field training novices how to design clothes without ever having picked up a sewing needle. Certified trainers, no less. I know, I’ve run into a few.

I really like Elisabeth Hendrickson’s take on certification, and the alternatives to official certification: WeVouchFor.

And, like Elisabeth, I must confess - I got started in Agile by going to Ken Schwaber’s CSM class in 2004. At the time I did not think much of the whole issue with certification. But now? Well, I’ve simply met too many Agilists who still just don’t get it.

And I’m not going to sit here writing in my holier-than-thou blog trying to convince myself that I know everything and I totally get everything. At least, I hope that’s not what I’m trying to do. I hope the day where I stop learning never comes. But, I can say that I have some good experience, both on a small-company level and at a large-company level, in rolling out and/or practicing Agile techniques. And by experience, I mean, I have been blessed with the ability to totally and royally fuck up beyond belief, get my ass burned by my various managers/clients, and learn from it and move forward. :)

My point? How can we “certify” experience? In Agile (and I would assume in RUP, Waterfall, etc other process), experience counts for so much more than simply education. Agile techniques at their basic level are taught, but they are further refined at the company, team, and individual level through tweaks after doing. A.K.A. screwing up, learning-through-retrospective, moving on. How in the world do we certify that? The closest thing I can think of is something along the lines of WeVouchFor. I like that I am  able to describe my own skills (i.e., “Coached teams”) and have people specifically vouch for that piece (”Michael coached me”) and provide evidence/testimony to it (”result was a team practicing Agile and still is!”).

Of course, I see a small danger here too.  I see a danger of “you scratch my back, I’ll scratch yours.”  Again, it’s not a bad thing if the scratching really happened.  But “official certification” does offer potential employers and clients some sense of understanding that the certified person did, in fact, attend a class and did, in fact, pass it.  Vouching does not.

I don’t have an answer.  I have some ideas.  I need to think about them some more.  I like the idea of possibly letting certain “vouches” carry more weight than others, and that reciprocal vouches are worth the least.  Again, the logic still has problems. How would you quantify the value?  Points?

This particular topic was the one thing I wanted to bring up during the AgilePalooza Open Space, until I was rudely interrupted by my employer and had to leave.  Perhaps next time.

A great analogy, brought to you by a viewing of Bravo TV’s “The Fashion Show.”

Here it is:  An architect who does not code produces the same quality of work as a fashion designer who does not sew.

Please, for all of you who hold that title of “Architect:”  Do not tell me your “team of people” will dive into the details.  If you do not know the ramifications of your design (which eventually come out in the details) then show me someone who does.  If you’re responsible for systems design, even at bird’s eye level, please be able to do some coding so prove your design, even if you’re not officially coding for the project.

Seriously.

Neat: @javax.inject.Inject

Read on Bob Lee’s blog about a new collaborative effort to “standardize” dependency injection via annotations:

@javax.inject.Inject at Google Code

Neat!  I’m very happy to see this came about as a collaboration between the 2 competitors.  I use that word a bit loosely here of course, as I switch between using Spring and Guice depending on the project and its needs, and (to me) they serve different types of applications.

Congrats guys!

From MacRumors:  Apple’s Cash Hoard Triggers Acqusition Rumors

So, this scares me just a little bit.  It was not that long ago when Apple was bleeding - nay, hemmoraging - money from every pore.  It had piled up wads of money in previous years which pretty much kept it alive  long enough to buy back Steve Jobs and rescue the company from its failed product strategy.

I’m hoping the rumors are just that - rumors.  IMHO Apple, while making amazing products and therefore making amazing money right now, could just as easily fall out of favor with finicky consumers and find itself in an all-t00-familiar position all over again.  It will need that hoard of cash to reformulate and adapt, just like it did before.

I’m all for dividend distribution in general as well, but not for companies like Apple.  Or Microsoft, for that matter.  These companies are not in a business that is constant or stable - technology is still ever-adapting and ever-competitive, and realignments are common.  That takes cash.

Besides, WTF would Apple do with Twitter anyway?  Honestly, I’m still at a loss for what Twitter is exactly for, anyway.  Marketers tell me it’s an amazing channel, but people don’t go to Twitter so they can be marketed to, they go there to communicate.  Just like on Facebook.  Just like they did on MySpace.  MySpace fell out of favor, as will Facebook, and will Twitter.  I would say Twitter is well on its way, now that “tweeting” is a mass-market phenomenon and no longer a tool of the hipsters only.  That’s usually when these things start to become boring.

Electronic Arts?  That kinda makes sense.  MacOS has always had a big gap in its games category.  Most popular games are developed for the Windows platform (though recently EA has committed to developing for the Mac, and of course World of Warcraft (Warcrack?) is on the Mac, thankfully).  But I think that gap can be filled without spending the savings account.

My $0.02 on the matter, FWIW.

Here I thought I was going to have to bite the bullet and learn more than a little bit of Ruby by way of Behavior Driven Development.  I thought I was going to have to actually put my head down and start active coding in Ruby in order to use the Cucumber BDD framework, specifically to parse the Given/When/Then clauses.

I thought about writing my own framework to do just that in Java, and actually started to.  Then I went to the magical Google and - wouldn’t you know it? - I found JBehave.  Of course!  I knew Dan wouldn’t have let me down by making me go the way of Ruby :)  (not that there’s anything wrong with Ruby, I just like to take my sweet time drinking kool-aid :) )

I love how it is just as easy to write JBehave tests as it is to write Cucumber tests:

Given a user with the email address “someone@something.com” has not already registered with the system
When
a user tries to register in the system with the email of “someone@something.com”
And a name of “Michael Dowling”
And a date of birth of “1/1/1985″ (yeah right)
Then
register the user with an access token of “Registered”

In JBehave, being clearly well-designed in an IoC manner, asks you write the Steps to execute the above spec:

package minderupt.scenarios.steps;
 
import org.jbehave.scenario.annotations.Given;
import org.jbehave.scenario.annotations.Then;
import org.jbehave.scenario.annotations.When;
import org.jbehave.scenario.steps.Steps;
 
public class CreateUserSteps extends Steps {
 
	private String email;
 
	@Given("a user with the email address \"$email\" has not already registered with the system")
	public void checkForRegisteredUser(String email) {
		// code to check for pre-existing email
	}
 
	@When("a user tries to register in the system with the email of \"$email\"")
	public void registerUserWithEmail(String email) {
		// code to register with email
	}
 
	@When("a name of \"$name\"")
	public void registerUserWithFullName(String name) {
		// code to register with name
	}
 
	@When("a date of birth of \"$dob\"")
	public void registerUserWithDateOfBirth(String dob) {
		// code to register with DOB
	}
 
	@Then("register the user with an access token of \"$token\"")
	public void checkForCreatedUser(String tokenExpected) {
		// register user and confirm returned token, blah blah
	}
 
}

…and then write the actual test case, specifying configuration options and the actual steps to execute during the test:

package minderupt.scenarios;
 
import org.jbehave.scenario.JUnitScenario;
import org.jbehave.scenario.Scenario;
 
import minderupt.scenarios.steps.CreateUserSteps;
 
public class CreateUser extends Scenario {
 
	public CreateUser() {
		super(new CreateUserSteps());
	}
 
}

I like this approach for multiple reasons, not the least because I can re-use the steps for different spec documents utilizing the same language, but also, I can change the test case configuration so that on my dev machine (local build) I can run all the tests and simply outputthe results to my console, but in my CI system, the output goes out to some kind of standard reporting system in pretty HTML.  Yay.

Like I mentioned in a previous post, one of the things I want to do is be able to fully spec out a requirement in a document (in Word, HTML, Wiki, etc) which will have a mix of business logic rules, FIT tests, and BDD tests.  Then as part of a build, split out the FIT tests and run FIT against those, parse out the BDD tests and run those, and then output a report back into the combined document for the entire team to see.  Can’t be too hard, just a matter of parsing Word/HTML, recognizing the type of tests, and running them.  Integration project, really.

But I think it would be immensely useful, especially for organizations that (still) communicate over such types of documentation;  a behavior that I feel isn’t going away anytime soon.  Might as well make the transition a little bit easier, I think.

Why do you want to do Agile?

Believe it or not, I ask this question all the time.

I come from the belief that if you’re in a team, and you’re getting products out the door, and your product owners/managers are happy, and your developers are happy, and (most importantly) your customers are happy, then why adopt Agile?

As I am an Agile enthusiast, you’re probably shocked to read the above paragraph.  But, why?  See - I like asking this question because it lets me really understand why a team wants Agile coaching.  Sometimes I get a team that wants to  implement Agile, but not because they want to improve themselves but rather because their manager told them to do it.  I’ve learned through the years that those teams who are forced to do Agile without having internal reasons for doing so, tend to fail at implementing Agile.  Or they end up worse off than they were before.

In order to implement Agile the team has to commit to some minimum disciplines in order to be successful.  Scrum is a great overall process but for software engineering jobs it must also be supplemented with development practices (unit testing, automated acceptance testing, modular codebase, etc).  The testing team also has to be on board with a dramatic change.  These things cannot just be “adopted” willy-nilly - it takes commitment.  And teams without that level of commitment - to themselves, to quality, to their customers - should just not bother.

Of course, these practices don’t have to be adopted all at once - it is expected to happen piece-by-piece as well.  But the commitment must be there to eventually get to that point.

A couple weeks ago I attended a public class led by Elisabeth Hendrickson and Dale Emery (which, btw, was aboslutely AMAZING and if you have not taken their class before, I would highly recommend that you do so).  Two things stood out during that 3-day class:  Elisabeth’s simulation (where we all naturally migrated to a more test-first process), and the discussion around ATDD using natural domain language.

For example:

Given a user with the email address “someone@something.com” has not already registered with the system

When a user tries to register in the system with the email of “someone@something.com”

And a name of “Michael Dowling”

And a date of birth of “1/1/1985″ (yeah right)

Then register the user with an access token of “Registered”

This executes the following Cucumber code (in Ruby):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Given /a user with the email address "(.*?)" has not already registered with the system/ do |email|
  @email = email
end
 
When /a user tries to register in the system with the email of "(.*?)"/ do |registerEmail|
  @registerEmail = registerEmail
end
 
When /a name of "(.*?)"/ do |name|
  @registerName = name
end
 
When /a date of birth of "(.*?)\/(.*?)\/(.*?)"/ do |dobMonth, dobDay, dobYear|
  @month = dobMonth
  @day = dobDay
  @year = dobYear
end
 
Then /register the user with an access token of "Registered"/ do
  token = RegistrationService.register @registerEmail @registerName @month @day @year
  if token != "Registered"
    raise "Not registered"
end

The neat part of this is that it is an executable document;  meaning, it is input to “test fixtures” written by development to test the software being developed from an acceptance point-of-view.  This is the essence of “Behavior Driven Development” or BDD, of which I am a total convert.

I want to write much more about this topic - and I will.  For now, though, the one though swirling through my head is the need to have documents be in formats large organizations (such as my employer) use to describe requirements (behaviors).  I doubt it will be possible for most teams to check-in plain text files and be comfortable with that.  Plus, these documents will need to be passed around, possibly stored in Wikis, or other document management systems (even though ideally, these documents would be in source control along with the ATDD code).

I think I found a new project for myself.  Hmmm….

From InfoQ:  Scrum Alliance Asks User Group to Sign Licensing Agreement

Yikes.  Upon first reading the headline of this article all I could think was “oh crap, this marks the beginning of the end for Scrum.“  At this point, the Lean zealots are throwing their hands in the air exclaiming “I told you so!“  Ha, perhaps.

What I like about Scrum is the overall process components it gives us.  It tells us to use a backlog, but it doesn’t tell us what those backlog items must be.  It is common to use User Stories as backlog items, but I’ve worked with teams who use bug reports as backlog items.  Scrum gives us the concept of the “Planning Meeting” where we estimate the backlog items and commit to work during the Sprint, but there is no defined agenda for the meeting.  It is common to use XP’s model for planning (”The Planning Game“), among others.  Same with the demo, the retrospective, and the sprint itself.  Heck, even the sprint length is negotiable!

The point is, we get carried away with the notion of “pure Scrum.”  I find the whole certification practice around Scrum to be completely ridiculous, as groups rarely implement “pure Scrum” because it doesn’t exist.  The components within Scrum tend to be customized by the team, especially during the retrospective.  And it is even more common to use Lean techniques for doing so (which is why I find the fight between Alan Shalloway and his group of Lean folks and Ken Schwaber and his Scrum folks to be equally stupid as Agile certification programs), making Lean and Scrum obvious cooperative processes.

Also, need I remind the Scrum folks that the word originates from a Rugby move?

I will still practice Scrum for the foreseeable future, as I’ve seen so many amazing improvements to teams that I have implemented Agile with.  In each of these teams I hold the expectation that the basic process of Scrum will be modified to fit the needs of the team, which is exactly what I tell them. Besides, some of the most common question I get when I coach teams in Agile is “what about testing?”  “What about development?”  Again, other Agile practices being brought into the Scrum team negate the whole idea of “pure Scrum” and therefore no one organization can own the process.

I’d like to see them try.

I’ve always been a huge believer in using Code Coverage tools (such as Clover, CodeCover, EMMA, gcov, etc) as a way to report on how in-depth your unit tests are.  Generally, I use them with Quality Assurance/Quality Control groups to determine where to focus any additional testing efforts during a Sprint.  While we tend to benchmark required coverage at 85%, this is always a general rule with the understanding that every project (and, therefore, every project’s code) is going to be different, with different needs.

An interesting post at InfoQ talks a bit about the need to be careful about using a required coverage metric during TDD:

Out of the gates, Gruber’s primary statement is that TDD proponents do not suggest code coverage as “a one true metric”, that it is useful but only to degree and taken in context with other sources of feedback. He denounces Pang’s claim that “(Pang) 100% code coverage has long been the ultimate goal of testing fanatics”, stating that “(Gruber) high code coverage is a desired attribute of a well tested system, but the goal is to have a fully and sufficiently tested system”.

I completely agree with this statement.  Code coverage is, again, a tool for determining where additional testing time can be spent, as well as identifying any risks of releasing code into production that is not currently covered by unit tests.

The following quote sums it up nicely:

code coverage [in the context of TDD] is a great way to notice that you screwed up and missed something, but nothing else

More information can be found on InfoQ’s post.