juillet 2010Monthly :

Une tortue flashée a 240!!!

 

Prise sur l’autoroute de la livraison, à la poursuite d’un modèle de processus qui venait de sortir. La tortue est désormais recherchée. Elle risque des années de travaux d’intérêts généraux, notamment dans le rôle d’accélératrice de solution pour les projets Scrum avec Team Foundation Server.

 

Source : Urban Turtle delivers a kick-ass experience for Scrum in Visual Studio Team Foundation Server

 

Pour télécharger la version compatible avec le tout chaud modèle de processus Microsoft Visual Studio Scrum : Urban Turtle

Create kick-ass software fast

 

 

Twitter Facebook Linked In Del.icio.us Download Urban Turtle Turtlepedia

One of the main orientations is to build Urban Turtle into TFS (as opposed to integrate with). All our design decisions are made to bring as much value-added as possible while creating a seamless experience for existing TFS users and grow with TFS as Microsoft adds new features.

If you are interested about the details of the three releases we have made since the Visual Studio 2010 launch in April, please read the following posts:

  1. April 30th – Urban Turtle 3.0 RTM is now available!
  2. June 4th – Urban Turtle 3.1 now available!
  3. July 8th – Urban Turtle 3.2 now available! – Support Visual Studio Scrum 1.0

We believe this orientation is what allows us to have a product that installs on the server in less than two minutes and gets a team to use it right away. We are very interested in hearing your stories and get your feedback about how we can further improve the experience.

Help us make our Urban Turtle a Chameleon ;)

Also, our tight integration in the Web Access user interface makes the user feel at home and perceive TFS with new capabilities (as opposed to using an extra product). This is a big plus to have a smooth user adoption. We know that adopting scrum is already an interesting challenge; you do not need tools to get in your way but be a possible accelerator.

Again, give Urban Turtle a try and let us know how we succeeded in turning it into a Chameleon.

Asking powerful questions to hire right

Many organizations spend a significant amount of time defining the experience, education, skills and other factors required for open positions. Most of the time, though, their hiring process fails to make sure they hire right. If you’re looking for a different way, you might be interested to know how it works at Pyxis.

This morning I sat down with François to prepare the first hiring interview of a candidate looking for a software developer position. We decided to not have a look at his resume just yet. Since one of our colleague had recommended the applicant, we trusted he was a good candidate and wanted to understand if there was a cultural fit.

We talked about the values, characteristics and behavioral traits we wanted to find in a potential colleague. We figured out we wanted someone who shared the following characteristics:

  • Accountable
  • Humble
  • Passionate
  • Intelligent
  • Team-oriented
  • Continuous improvement orientated

We then devised a series of powerful questions to help us figure out if the applicant was someone we wanted to work with. Below are some of the questions we used during the interview process. Keep in mind that those questions are no more than tools we used to orchestrate the conversation. How we frame the questions is decisive. To make sure we hire right, the questions have to be ambiguous, personal, and stressful:

  • Tell me why it is more important for you to be having this conversation with us, rather than being doing something else?
  • What are the things you hear yourself most often complain about in your current (or last) position?
  • What have you done to change the very things you complain about?
  • What would be an extraordinary accomplishment for you?
  • What is the greatest contribution that you plan to make to the organization?
  • What will you hold the organization accountable for?

With answers from the candidate to questions such as these, we now have a pretty good idea whether the candidate is a good fit for our organization or not.

The next step is to validate the technical skills of the candidate. I know of no other way to validate the skills of a developer than to orchestrate a conversation around code. So we will give the candidate an opportunity to show us what kind of developer he is through his code. But that’s another story.

Agile Coaching – Maybe all you can do is send a Hallmark card

As agile coaches helping organizations transition to a different way of doing things, are we doing a disservice to our clients by accepting a mandate that we know deep down will most certainly fail? Are we failing to recognize the fact that any attempt for a particular client to adopt an agile approach to software development is simply too far out of their reach?

A not so far-fetched example

Let’s just imagine that we walk into DoMoreTech Inc. and we are confronted with 40 developers, 4 QAs, a few ivory tower architects and control hungry project managers. Not to mention a management team that believes taylorism is still the best way to create software.

The Java developers are totally separated from the back-end C developers. A test means starting up the Tomcat server and clicking away.  If you mention unit or automated tests, they look at you like a bunch of deers caught in the headlights. For the past 20 years or so, C developers have been masters of their domain and are very comfortable working within the three and half carpeted walls of their cubicles.  One of them even installed a makeshift cardboard roof to cut down on noise! Oh, yes! And everyone is working on at least 5 projects in parallel.

The QAs are on a mission: Embarrassing the developers during the weekly “team” meeting. To ensure that they reach their bug finding quotas, they withhold information that might help developers today.

Developers tremble when he appears at the elevator doors. Even the paying client with clearly define business needs folds under the pressure of the all mighty Architect.  The Architect has positioned BDUF as a critical process that must be respected for any and all projects to be successful. This well defined process is flawless and the Architect’s design is always perfect and final. If there’s a problem, it’s obviously due to the developer’s lack of maturity and experience.

Project managers and management are really happy that this “Agile thing” will help them do more with less. Since they are not part of the problem, only the technical teams need to improve the way they work.  Now that they have “purchased” Scrum, they have ADDITIONAL tracking tools to better control the situation and make better decisions for the teams.

Ok. Now what?

After a few days, when all these non-winning conditions are confirmed – What do you do as an Agile Coach? Jump in and hope for the best? Run away and never look back? Or maybe do away with the detailed diagnostic and simply leave a Hallmark card on the manager’s desk saying: “Sorry, but this ain’t gonna work”

Personally, I’ve seen watered down variations of the example above in different organizations and I’ve never turned down a client.  But to even hope for agile transition to succeed, the client does need to comply with two simple requirements:

Requirement 1

A pilot project (unless “Big Bang” implementation is considered). Neither a small and meaningless “test tube” project nor a do or die project. How about something just in the middle that involves external dependencies and creates value?

Requirement 2

We need a team. To quote a colleague of ours: “We don’t coach projects, we coach teams!”  And this team needs to be committed to one project. This Scrum team will be composed of a ScrumMaster, Product Owner and qualified individuals to create the solution.

Whether or not these requirements are met, a Mandate Charter is created in collaboration with the client to clearly define, among other things, the conditions of success (COS) of our initiative.  Taking time with the client to establish the conditions of success is a great collaborative activity and allows us to have those hard conversations and setting some facts straight.

If the basic requirements are met, the COS can be far reaching and beautiful things can happen!  If not, the COS might be superficial or even cosmetic in nature.  At this point, decisions need to be made.  Is the client willing to pay for cosmetic changes to his or her organization?  Does the client see value in these changes and is he or she able to sell ME on it?

It’s all about managing expectations.  A client can’t expect an agile coach to turn water in wine. But allow a coach to work with some quality basic ingredients and we just might end up with an award winning Cabernet Sauvignon.

Party on!

Share/Bookmark

Making good use of assertion messages in tests

Have you ever struggle with coming up with useful assertion messages in your tests? Well, I have; until not so long ago.

I remember when I started using JUnit. It was summer 2000, and I became addicted to writing tests first. I was already writing automated tests at that time, inspired by my lecture of Thinking In Java. Not using any automated unit test framework, I was writing my tests last in the good old main() function. I had to inspect the outcome of my tests for correctness each time I run them, and that was painful.

JUnit was a discovery that changed the way I programmed and approached software development forever. Central to xUnit frameworks is the notion of making the tests self-checking by using assertion methods, basically utility methods that evaluate whether an expected outcome has been achieved. Now I had a way to express the expected outcome, let the computer check it for me, and produce a useful message for me (and others) – the human readers – to help diagnose problems. One of the goals of automating tests is to use tests as documentation. In case of test failure, what you want is for the test to act as a tracer bullet, helping you understand very quickly what the problem is. Assertion messages play a role in this. A well-crafted assertion message makes it clear which assertion fails and what the symptoms of the problem are. Now that’s easy to say, the hard part is to figure out what the message should say.

As Nat Pryce and Steve Freeman explain in their book, during the test-driven cycle, after you make the test fail, take a moment to read the assertion message, ask yourself what the reader will get out of it, and adjust to make the diagnostics clear. They provide a number of best practices in the book to help with test diagnostics. One is about making the assertion messages explanatory.

I have long been in the school of thought that strives to have a single assertion per test method and as result, for a long time I felt no need to use assertion messages. If you use small and focused tests and name them well, the tests will tell you most of what you need to know to diagnose the problem. For example, when the following test fails:

calculatesGrandTotal() { String[] prices = { "50", "75.50", "12.75" }; BigDecimal expectedTotal = new BigDecimal("138.25"); for (String price : prices) { cart.add(anItem().priced(price).build()); } assertThat(cart.getGrandTotal(), equalTo(expectedTotal)); } 

the failure report can be considered enough to understand what the problem is:

Expected: <138.25> but: was <139.25> at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20) at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8) at test.com.pyxis.petstore.domain.order.CartTest.calculatesGrandTotal(CartTest.java:53) ... 

Indeed, the name of the test tells us that the cart fails to calculate its grand total correctly. The assertion messages shows the difference between the expected and actual outcome. Yet we can make the diagnostics even easier for the reader by simply adding an assertion message to identify the value being asserted:

 assertThat("grand total", cart.getGrandTotal(), equalTo(expectedTotal)); 

See how that helps:

grand total Expected: <138.25> but: was <139.25> 

I’ve come to adopt that practice since reading Pryce and Freeman’s book. Assertion messages are not used as often as they should. They can really help make failure reports more helpful, whether you have a single or multiple assertions in your test.

Another help in making assertion reports clearer comes from using Hamcrest matchers and assertThat(). Consider the following example:

findsItemsByNumber() throws Exception { havingPersisted(product); havingPersisted(anItem().of(product).withNumber("12345678")); Item found = itemInventory.find(new ItemNumber("12345678")); assertThat("available inventory", found, itemWithNumber("12345678")); } 

In case of failure, here is what we get:

java.lang.AssertionError: available inventory Expected: an item with number "12345678" but: number was "87654321" at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20) at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8) at test.integration.com.pyxis.petstore.persistence.PersistentItemInventoryTest.findsItemsByNumber(PersistentItemInventoryTest.java:56) 

which I hope make the point.

As Pryce and Freeman say, diagnostics are a first-class feature. I now do my best to make assertion messages helpful so that whoever has to change the code in the future will understand what the expected behavior is.