Agile Testing Manifesto Anyone?

Let’s help new agile testers find the road to agility!

This is a call to all agile testers to contribute creating the agile testing manifesto.

Please use comments to let me know what you think of the proposed values and suggest new ones you think should be included.

————————————————————————————————————–

Agile Testing Manifesto [Draft]

————————————————————————————————————–

We are uncovering better ways of testing
software by doing it and helping others do it.
Through this work we have come to value:

Delivering value over criticizing implementation the product (*)

Influencing outcomes over telling others what’s right and what’s wrong imposing rules (**)

Preventing defects over detecting and logging them (**)

Listening to people over analysing quality metrics

Improving our trade craft over process good practices (**)

That is, while there is value in the items on
the right, we value the items on the left more.

(*) Changes proposed based on further reflection

(**) Changes proposed based on feedback

HELP US: If you are willing to help with the project, we have created a Google group where we are discussing improvements on each of the values and discussing the introduction of new ones. Using the blog comments for this purpose is becoming difficult due to number of comments. If you want to help and have a Google account, let augeva@gmail.com know and I will send you a private invite.

50 years later…

I have a dream, that one day testers developers and product people will be able to sit together at the table of brotherhood

I have a dream, that one day team members will humbly seek help from each other and coach one another sharing their strengths

I have a dream, that one day team members will not be judged by their job title but by the value they deliver as a team

I have a dream, that one day team members will see the big picture and understand the true reason of their job

Because all team members are created equal.

 

Thanks to my teams for letting me live my dream.

Should developers test?

These are some of the arguments I have heard over the years:

1. Developers can’t test because they don’t have the right mindset, testers think about negative cases and how to break the system, developers only think about the happy path.

Is this true? There is indeed a huge amount of hackers that don’t care about much, and don’t give a rat’s arse about the quality of their code because they know there is a large number of lowly paid human beings called testers that will clean after them like a babysitter. They feel they shouldn’t bother with testing because other people will do it for them, they focus on writing tons of rubbish code and if a bug is found in production they don’t care because somebody will blame a tester for not finding it, certainly not them for writing it. I call this species the “half developer”. A large generation of half developers has been produced by some management thinking that by assigning a time consuming task like testing to somebody they can pay less they would have an overall cost saving with no repercussion on the product.

But is it really true that developers can’t test? Testing is a software engineering activity, as much as analysis, design, coding. Why in the name of God, developers would be so dumb that they cannot learn it? Please give me an explanation based on facts and not on the “mindset”.

Half developer going for a walk on the beach
Half developer going for a walk on the beach

When a developer tells me that he doesn’t have the right mindset for testing, expecting me, tester, to agree and reassure him like a loving mummy, saying “don’t worry I have the mindset and I will do it for you”, he is up for a surprise. I will stare at him with a concerned look and tell him: “Dude, I can help you learn the fundamental engineering skill you have ignored until now, so that when you have mastered it, you can finally call yourself a developer. You are welcome.”

2. Testers have a better understanding of the big picture

Why? Let me guess. In the aforementioned organizations where large amounts of babysitters are employed to clean the mess, developers time is so precious that they cannot be distracted by the real business of the organization they work for or by whether the business value is actually delivered. They must focus on writing code, the way such code will integrate with the other systems is not their concern, the babysitters will do integration testing, why do I bother knowing how the system works if the babysitters know it and will check it for me? I call this species the “clueless developer”.

But does knowing the big picture help developers make the right decision and write better code? Hell yeah! Without understanding the value that needs to be delivered, developers at best will write very efficient code that does nothing important.

So yes, yet again, a real developer understands the big picture, is fully aware of the business value he is delivering, and he will be able to contribute to the design of a business solution, however, clueless developers can skip this insignificant bit.

3. Testers are the voice of the customer

Of course, developers are too busy writing complex code to think about who will use their software and they can’t do anything about it for some strange reason, only the testers MUST talk to the customer! I call this the “sociopath developer”.

Sociopath developer: “Who cares if the customer can’t use my code as long as it does compile? What did you say? You told me you wanted this button otherwise you can’t do anything with my software? I must have had my headphones on, that’s what cool developers do, write code and listen to music, screw customers.”

Sociopath developer faces reality
Sociopath developer faces reality

Do people like this really exist? If they do, should we call them developers?

4. Context switching is bad, developers should develop, testers should test

This is probably the lamest argument of them all. Apparently a developer is able to switch between, analysis, design, code and coffee breaks but it is only the switching to test that magically creates context switching issues. I call these the “selective switchers”.

5. Developers can’t test their own code because they are biased

I ask you developer to honestly think about what your real goal is?

1) Producing successful software

2) Showing off in front of your colleagues

If you answered 2 you are a primadonna and I have no interest in working with you, so please get out of my blog now. If you answered 1 you are a real professional and you will find bugs in your own code, don’t worry.

Be lean, ask “why?”

why-god-why1

Your best piece of code is the one you won’t have to write.

Yes I am serious, and no, I am not intoxicated, let me tell you a story.

It was a sunny summer day in Dublin and “the three amigos” (Tester, Developer and Product Owner) were discussing the next user story to deliver.  It all started as usual with the Product Owner explaining what we were meant to do and as the story was quite small and easy we were soon starting to write our examples that would become acceptance tests and eventually code.

Everything was going smoothly, we had already agreed that we would add a field to our payload with the new information, until out of the blue, the tester said:  “why? I mean, why do we need to do this?”

The product Owner said: “Because we need to send extra information to customer A!”

The tester insisted: “But why do we need to send it to customer A?”

The product Owner said: “Because we always send it to system X so that it can create product Y”

Then the tester said: “But customer A doesn’t use system X and doesn’t sell product Y, so why do we have to send it?”

The product Owner said: “You might be right, but Mr. SuperBoss said he wants to send it!”

The tester said: “Well, we need to ask Mr. SuperBoss WHY he wants to send it”

The product Owner stood up, went straight to Mr. SuperBoss and asked him.

The fact is, there was no reason, we were wrongly assuming that customer A would need it.

Would you agree with me that the code we didn’t write is super clean, extremely cheap to develop, test, deploy, maintain and sunset?

It only ever costed a conversation, and a few whys, I bet you can’t do it much cheaper!

If you don’t see the business value of what you are delivering, ask for it, you might get a nice surprise and find out you don’t need it at all.

What’s with the tools obsession?

toolsYou can’t avoid them; they are in every discussion: tools, tools, tools and more tools.

There is no question on bugs that doesn’t get an answer like “open a bug in Jira and bla bla bla…”, every topic on performance have a Loadrunner or Jmeter here and there, no functional testing discussion seems to be worth its while if somebody doesn’t mention Selenium or QTP.

If you suggest somebody to talk and discuss the issues they have, somebody will jump in with the tool that will solve the issue straight away.

The CVs I review are festered with tools, some people with 3 year work experience claim they can use more tools I have ever used in almost 20 years.

For some strange reason, people believe that if you want to be agile you must use tools, when somebody clearly said “Individuals and interactions over processes and tools”.

Do not let the tools replace the conversations!

A Test Challenge and a bit of fun

WARNING: This blog post might contain strong language

It all started yesterday evening, when I saw @mheusser Testing Challenge on Twitter.

Test Challenge

As usual my first question started with “why”. I believe that to be able to develop/test any feature (and make sure it is useful), we need to understand the real business value that we are delivering, hence the question “why?”.

reply

I was very disappointed when I saw @mheusser’s answer because he didn’t give me any context to understand the real business value gained by the customer when sorting by PO. So due to the fact that @mheusser wasn’t going to give me any relevant information and the fact that I couldn’t be bothered asking him again I decided to employ my favorite Product Owner: Justin McDoitnow.

First I found out from Justin that PO actually meant Product Order and not Polymorphic Ostrich like I initially thought.

Second, I asked him what he meant with sorting by PO and he goes “Are you stupid? I mean they are in alphabetical order for f***s sake, and get going that we are late for the release!”

Good old Justin, always charming.

Numbers, letters? “Only letters”

At this point I didn’t ask what alphabet was used or if a special collation had to be applied because I didn’t want him to beat me up right now and suggested as valid the English alphabet with 26 small characters [a to z] no spaces allowed; Justin seemed happy and also confirmed with me that sorting works only one way, ascending order [a before b].

I then called the lead developer Zack Hack, and asked him if they had reused any open source library for doing the sorting and he goes “No, Gus, we didn’t because we analysed what was available and they were all bad. But hey! We implemented this brand new algorithm that performs much better than anything that has been written before, it rocks! Let me tell you how we do it! So we take…”. I obviously put Zack on mute and let him reach developer climax on his own. The information was enough, as usual the wheel was reinvented yet again, and it had to be tested.

So I started testing the first scenario.

Scenario1: Let’s make sure Zack didn’t f**k up the alphabet

I populated the database (or whatever persistence layer you like) with the following POs

zzzzzzzzzz
yyyyyyyyyy

……….

aaaaaaaaaa

Logged on to the app, clicked on sort and verified that the order was, guess…

aaaaaaaaaa

bbbbbbbbbb

……….

zzzzzzzzzz

OK Zack didn’t screw the English alphabet, that’s a good start.

Now I only verified sorting based on the first letter, but that’s not enough, Zack and his new “very useful algorithm” could have screwed up the sorting of the second character or the third or the fourth, etc.

I need a new Scenario.

Scenario2: Let’s make sure Zack’s algorithm can sort POs with at least one common character in early position

That’s not as easy now, I make a quick calculation and discover that the possible combinations of 10 elements from a pool of 26 where the order is not relevant is 1.83579396e+8

I call Justin and tell him that I need 3 light years to complete testing and he threatens to fire me so I decide to try to identify a pattern that might help me reduce the amount of test cases to a small number. Pen and paper, try, fail, retry and eventually after 10 minutes I notice an interesting behaviour applied to certain set of characters, have a look:

initial test data

Did you see anything? I knew you would, well done, yes the diagonal has the first 10 letters in order and under the diagonal the letters are repeated starting from the second to the last. Why did I do this?

I did it because it allows me to do something special: First the 10 POs (horizontal lines) are already in “order” according to our rules. Hence pushing the “sort” button would leave them as they are and I can assert that the first PO stays on top.

This first test does nothing more than Scenario1 didn’t do with all the a’s and the z’s, but watch what happens if I move the first character of the first PO to the last position and I push up the first character of the second PO to be the first character of the first PO:

after_first_moveAt this point if I push the imaginary “sort” button the alphabetical order of the second letter will be compared and I expect the second PO to go to the top (c>b) hence the second PO to be the first in the order.

What if I now move the second character of the second PO to the last position and I push up the third character of the third PO to be the second character of second PO?

 

Ehm… I think I see a pattern… Every time we do our move and we click sort we compare a character at position n and the n(th) PO becomes the first in the order.

This could take me a couple of hours to test manually through the user interface or just about half an hour to automate it.

after_second_move

I have a quick peek into the code and to my horror I discover that the whole multi-tier application is a monster single Java class of 13,256,459 lines of unreadable code. This means that any change, even unrelated to “sort PO” might break it! Definitely automate now!

OK Eclipse up and write some really dirty code that does the job:


public class TestSort {

public static void main(String[] args) {

char[][] testData = {

{ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' },

{ 'b', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' },

{ 'b', 'c', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' },

{ 'b', 'c', 'd', 'd', 'e', 'f', 'g', 'h', 'i', 'j' },

{ 'b', 'c', 'd', 'e', 'e', 'f', 'g', 'h', 'i', 'j' },

{ 'b', 'c', 'd', 'e', 'f', 'f', 'g', 'h', 'i', 'j' },

{ 'b', 'c', 'd', 'e', 'f', 'g', 'g', 'h', 'i', 'j' },

{ 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'h', 'i', 'j' },

{ 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'i', 'j' },

{ 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'j' } };

for (int i = 0; i < 10; i++) {

if (PushSortAndReturnPoIndexOfTopRecord(testData, i) == i) {

System.out.println("PASS");

     } else {

System.out.println("FAIL: PO at position " + i

+ " was ordered incorrectly");

     }

char temp = testData[i][i];

testData[i][i] = testData[i][9 - i];

testData[i][9 - i] = temp;

     }

 }

private static int PushSortAndReturnPoIndexOfTopRecord(char[][] myData,

int rowNumber) {

int index = 0;

// Seed DB with 10 records
// Call the sort function
// returns the index of the row that is now at the top

return index;

     }

}

I will look at refactoring this piece of sh** ehm, code and add it to our CI system once I have some time, for the moment it helped me prove what I wanted.

Of course my code is verifying the order only looking at the PO field and the other fields might have been messed up. I do a quick manual check and see that this doesn’t happen, for the moment this is enough for me, I will add this extra check to the automation while I re-factor the code.

While I was writing the test code I had a couple of thoughts:

  1. Can 2 POs be identical? Justin says “NO!” and calls me a moron because supposedly I was meant to know it.
  2. Are we enforcing this unique constraint on the database or we just hope it doesn’t happen?

I’m going to answer question 2 myself, just pull up a SQL client, and run an insert with a PO that already exists, luckily I get “ORA-00001: unique constraint (XYZ.PK_PurchaseOrder) violated”.

Good!

I had some strange feeling and I asked Justin what would be the worst thing that could happen if the customer couldn’t sort by product owner for some reason on in the worst scenario if the sort returned wrong results. Justin face turned white and he started rambling about “huge loss of revenue, loss of customers, loss of testers limbs etc…” Apparently the company relies on sorting by PO so much that any malfunction could be fatal.

So, I ask, if it is so important, say a customer has just sorted by PO and a new PO comes through soon after and it should be seen by the customer in the top 20 displayed on screen, what happens if he doesn’t see it? Justin goes “if it happens we’re f****d”.

How long is too long for a PO to be displayed after it has been added?

“5 seconds”.

Ok, new test. I seed the DB with 20 items and sort. All good, they are all sorted in right order, but we knew that already. Now I add a new PO seeding it so that it should be the first after sorting. I don’t sort and I wait for 5 seconds. It appears at the top on the screen! Yes, the guys have thought about this, but I am not sure how the system will support the load with many PO’s already present and many added every second, let me see…

Hey Justin, how many PO’s do we have in our DBs in production, and how many new PO’s do we expect per day? Justin thinks for a while and goes “At the moment about 100,000 but we need to be able to scale to up to a Billion and in 3 years we are projecting sales in excess of 10,000 items per day hence potentially 10,000 POs per day”.

I seed a db with ~1B POs (LOL), sort them by PO, go for a coffee, a spin on the bike then return and see if the POs are sorted. When I return, I write some code to add 20 new PO’s each second while sorting by PO, then I pack my stuff and go on a 3 weeks holiday, I’ll come back just in time for the test to be completed.

Thanks to @mheusser for the test challenge.

The wrath of the mighty metric

Reasons why some software delivery teams don’t give a damn about their customers

It feels like a century ago, but once upon a time, less than a century ago, I was leading a traditional test team in an organization where 3 separate teams of Business Analysts, Developers and Testers were delivering software in an incremental iterative death march style. Each of the 3 teams had its own leads and managers and each of the 3 teams was measured by specifically tailored metrics. My team’s efficiency was to be measured based on the mighty DDI Defect Detection Index calculated as DDI = (Number of Defects detected during testing / Total number of Defects detected including production defects)*100. The DDI had to be greater than 90% otherwise our team would have been deemed inefficient, bonuses dropped and the test team itself branded as a bunch of losers.

Yes you guessed right, the other 2 teams were measured in a similar way, their efficiency was also based on number of defects, the lowest the better.

God I am glad this is only in the past. Even remembering this makes me sick in the stomach. Sick like every time a production defect was detected, sick like every time a defect that our team detected was rejected, sick like every time I had to go to the triage meetings and inevitably have an argument either with the BA lead or the DEV one because that defect that we found was not seen as a possible improvement for the product but as a threat to some team’s metric. I’m not even going to describe to you the awful discussions that followed the acceptance of a defect as valid when a decision had to be made on whether the defect was due to bad requirements or bad code.finger-pointing

The funny thing was that no matter which was the efficient team and which were the inefficient ones, the software delivered was the same, no change whatsoever, the customers were constantly quite unhappy. The real value that the metrics gave to the department was the ability to point fingers based on numbers. They say numbers never lie, maybe numbers don’t lie but how many lies can we tell to fabricate numbers?

Since then many things have changed in my professional life and today I don’t have to fight stupid battles to fabricate numbers in order to define efficiency so I can, funnily enough, use my time more efficiently.

Why calculating confrontational metrics doesn’t work? The problem is in the fact that we are humans; if you attach prestige and monetary value to a metric, the metric becomes the goal of the team and the battle can begin. The test team doesn’t care how useful the product delivered is, all they care is opening as many defects as possible so that the mighty DDI doesn’t go under 90%, if this means opening defects that are absolutely no harm to the customer but only to the development team and the schedule it doesn’t matter. The same logic can be applied to development and the BA teams that will spend their time obfuscating their requirements and defending their code from the stupid defects opened by the test team. All this creates a climate of tension, distrust and hostility. Nobody really cares whether the customers are happy as long as the individual teams metrics solemnly declare their efficiency and fingers can be rightly pointed :-(.

teamwork

The funny thing is that it is very easy to resolve this problem and put the focus back on the customer. Create a cross functional self organising team able to analyse, develop, test and deliver a complex software project and judge the team on how well they satisfy the customer needs. The team lives as one, produces quality as one, delivers customer value as one, succeeds as one or fails as one. The goal of the team matches the goal of the company and failure or success of the team determines failure or success of the company, it’s called agile team, try it out!

How to transform bad Acceptance tests into Awesome ones

So you want to learn how to write good acceptance tests? There’s only one way, let’s write some.

This is a practical example that is designed to help beginners write clear and easily maintainable acceptance tests.

Our System

We are BOG, “Bank Of Gus” and we have a Loan Approval Processing System that takes in input some data regarding the applying customer and his loan requirements, as output it returns either Accept (the customer will be given the loan) or Reject (the customer will not be given the loan).

The marketing manager wants to start selling a new Holiday Loan and produces the following user story:

As a Customer
I want to borrow money from the bank
So that I can go on Holiday and enjoy myself

Acceptance Criteria:
In order to get the Holiday Loan approved
1) The Customer must be 18 or older
2) The Customer’s salary must be > €20,000.00
3) The Customer Time in employment must be >= 6 months
4) The Loan amount < (Customer salary)/5

The Loan Application Form (UI) exists already, the Loan Application Form calls a REST service that is what we are now updating to allow for this new product. The UI is also ready and able to display our outcome, a big green Approved or red Rejected string based on what our service returns.

The Loan Application Form looks something like this:

I am eager to start writing acceptance tests, and I start writing down the first one without thinking much, (please don’t get bored by the first test, I promise it gets better, this is the worst one you’ll see)

I’m going to use a rich celebrity for my first test, let’s try to make things interesting.

first_test

Auch… 16 steps for ONLY ONE TEST, by the time I do all the necessary scenarios with boundary analysis I am going to have a document the size of the iTunes licence agreement and this is only the start!

HINT #1: Focus on “what” you are testing and not on “how”

First of all, do I really need to say that I go to a page and that I fill each field and that I push a button? That’s the “how” I use the app, it is not necessarily “what” I do with it. The “what” is “a customer is applying for a loan”.

Could I generalize and get to a concept of a customer applying for a loan? YES
Do I really need to fill the web form to exercise the code I am writing/testing? NO
Can I abstract it, use a test double and call directly my code? YES

Focus on what you are testing, you are not testing the UI, you are testing the loan approval logic! You don’t need to exercise it through the UI. You would exercise it through the UI only if you were testing the UI.

Ok let’s use a test double. I create a mock with the data as per example above and will use it for testing, but, it’s not making writing the test any easier Sad

I could do something like

second_test

Besides the fact that I abstracted the how (the customer entering strings and clicking buttons) with the what (the customer applying for a loan) I still have a very messy test with loads of detail and quite difficult to read and maintain.

It looks slightly better but not good enough, I couldn’t even fit all the data on one line and I took the lazy option of adding ellipses, but in the real world ellipses don’t work, they can’t be automated, imagine repeating this for all the scenarios I need to cover, it’s a disaster, what am I going to do?

HINT #2: Eliminate irrelevant Detail

Do I really need to know the name of the customer to decide if I want to approve his loan? NO
Do I need to know his sex? NO
Shall I continue asking rethorical questions? NO

The only important variables for designing the logic of my application are the ones described in the acceptance criteria, look back: Age, Salary, Time in employment, Loan amount

OK this looks promising, let me try to write the original test using only those.

third_test

This looks definitely better, it exposes only the parameters that have an impact on the loan approval logic, it is more readable and while reading it I have some idea of how the system will work, that’s better isn’t it?

OK let’s write all the scenarios to comply with the acceptance criteria using boundary analysis, equivalence partitioning and other test techniques.

fourth_test

Auch again… I haven’t even started looking at the cases where the loan will be rejected and I have already 4 very similar tests that will bore to tears the Product Owner, so much that he won’t speak to me for a month, what can I do?

HINT #3: Consolidate similar tests with readable tables

I know of a very useful way of writing tests that are very similar without repeating myself over and over and make the readers fall asleep. It’s called scenario outline and I’m not going to explain in words what it does, I’m just going to show it to you because I know that looking at it you won’t require any explanation.

sixth_test

Wow, this looks much better! One test of 3 lines and examples that cover all the possible scenarios! Do you remember when you needed 16 lines of unnecessary detail to describe only the first line in the examples above? This is certainly a an improvement, more readable, more maintainable and all around 100 times better than the original one.

Also, look at it closely; it gives the business an amazing power of using this test in the future to make changes! Imagine that we end up in a credit crunch (again) and the banks want to tighten the way they lend money. So they decide to increase the minimum salary to 30,000 and the minimum time in employment to 12 months for example.

A quick copy and paste + small refactor and we get:

seventh_test

That’s quite powerful isn’t it?

Now if I was a tester and I wanted to be picky I would tell you that there are plenty of scenarios that have not been tested and a full decision table should be created to give good coverage.

Yes you guessed, I am a picky tester, let’s build the decision table for the Credit Crunch scenario.

HINT #4: Use decision tables and boundary analysis to get high coverage (DON’T DO THIS! It is an anti pattern and I am leaving it here as an example of something I learned to avoid along the way)

How do I build a decision table?
First you need to know what your variables are and what “interesting values” need to be considered.

What’s an “interesting” value? They are all the values a variable can take that might make the logic fail. Generally they are Boundary values.

Ok back to the Credit crunch requirements:

2) Customer salary must be > €30,000.00
3) Customer Time in employment must be >= 12 months

The salary variable, for example has 3 interesting values: 29,999.99, 30,000.00, 30.000.01
Respectively, left boundary, boundary and right boundary (some observers might say that 0 and -1 could be interesting values as well, I agree but for the purpose of this exercise we won’t consider them).

How about time in employment, the interesting values are: 11, 12, 13

OK I have 2 variables each with 3 “interesting” values (or dimensions)

I can immediately calculate the amount of tests I need to get 100% coverage with all possible combinations of “interesting” values.

NumberOfTests = dim(salary)*dim(time_in_employment) = 3*3=9

9 test cases will cover all possible paths using all combinations of “interesting” values.

Let’s build the decision table, and guess what? It can be expressed as a test!

eight_test

1 test, 3 steps, 9 examples, 100% boundary analysis coverage, in English, readable, maintainable, clearly expressing the business value delivered, what do you want more?

One last thing; you might be in a situation where decision tables with many variables with large dimensions will require hundreds or even thousands of test cases. If these tests are run at the unit level I wouldn’t worry too much about the run time but if for instance you are testing some Javascript logic and are able to do so only through the UI this will require a long time to execute and not represent a good Return On Investment.

What can you do? There are many ways of reducing the amount of tests to run still maintaining relevant coverage. One technique is called pairwise testing, it is very straight forward and uses tools to quickly identify the highest risk tests that should be included and eliminate the ones with less risk associated. Pairwise testing is outside the scope of this document, If you are interested in knowing more about it, check this out! http://bit.ly/T8OXjZ

Test drive your user story!

A Demo to me is like a test drive. Say I want to buy a second hand car and I see 3 of them I like in the saloon window, all nice and shiny, but I am not sure which one will have all I need. A good shop assistant asks me what my requirements are and suggests we try the first one.

car salesman

The car is clean, smells like new, the guy tells me about performance, fuel consumption, shows me how to operate the GPS, how to engage cruise control and so on.

I’m cruising along, I like it, and I’m definitely going to buy it!

On the way back to the saloon the car breaks down.

How come? the guy just told me that the car had been serviced and was perfect! He is saying something about a small issue with the injector that they are going to fix in 10 minutes when I get back to the saloon. Will I buy it? Probably not. But mainly, do I trust this guy and try any other of his cars? You know the answer. 

A demo is where we show our customers how we have implemented their vision and we demonstrate the newly added business value. A demo is also a point where IT development members should be proud of what they have achieved.  A Demo is an incredibly powerful point for gaining or losing trust and confidence from our customers.

So what do I do to do a good demo? This is my recipe:

Prepare a “Demo Script”. It’s a small document that steps through the paths that I plan to follow when demonstrating my user story to the customers. This helps me focus on the business value I want to express and will be a useful “test drive” when verifying everything is as per the script before I talk to our customers.
stevejobspresents2

It is absolutely fundamental that before the Demo I go through the script and verify everything is as expected. If the car salesman had taken the car for a spin, he would have spotted the injector fault, fixed it before the demo and probably sold me the car.

We MUST do the same with our user stories in the same test environment that will be used for the Demo, our customers don’t care whether it is an environmental issue or not, they know about complex software configurations as much as I know about injectors, very little.

You want the business users to trust you? Test drive your user story with a “demo script” and give a proud and confident Demo!

Can we use impact mapping to define a training strategy?

It was a cold December morning in Dublin, I was shivering and wet getting back to my desk after a cigarette break, when I asked myself, “can you use impact mapping to define a training strategy?” No idea I thought. There is only one way to find out…

This was my first attempt to use Impact Mapping, and I had been dying to try it out since I first heard about it at Agile Testing Days in Potsdam less than a month ago, let me tell you how it went.

I had previously scheduled a meeting with a colleague to decide our strategy to coach our development teams to use Acceptance Test Driven Development. The meeting was in the afternoon, I thought, let’s use this to try it out.

Here we are, me at the whiteboard my colleague sitting in front of me.

First question “Why” do we need to coach the teams on ATDD? This helped us identify the real business value we were chasing, in our case after a few tries and some close calls ended up being “Zero bugs detected in UAT”. Once we identified this, it opened the discussion on how to quantify the money value of the business value. This was an extremely interesting exercise and the discussion provided us with a clear view on how this will make the company money and how to address management questions on this specific topic, pretty neat!

We got the biggest value when we asked ourselves what behaviours we needed to change in our customers to achieve success. This first of all sparked discussion on who our customers were and we expanded our thinking about the development teams as a whole to looking at the different individuals, different roles and levels and we also included management in the mix. This in turn sparked a lot of discussion on what category we needed to influence first.

We asked ourselves “who can help us achieve this and who can hinder us?”. This was a penny dropping moment as we quickly came to the conclusion that our customers for the first delivery were not all the development teams but some key influencers as their behaviour change would influence other people’s behaviour as a consequence. This cut quite a lot of the ground work considering we have 7 development teams to coach. By thinking about who could have hindered us we also thought about some specific approaches to influencing this group of people.

Now we had a business goal with a money value associated and we had identified the customers and the behavioural change. It was time to test a few options. This was quite a straight forward operation and came really natural to us to assess our first deliverable was going to be a Workshop for the influential people we had selected.

The map drawn on the whiteboard wasn’t anything artistic to be honest but here you go.

ImageTraining strategy impact map

(In case you’re wondering the sinking boat was our visualization of the impact of lack of team ownership :-))

Always focusing on the behaviour we needed changing we managed to get into more of the details and the content of the Workshop and in less than an hour we ended up with:

Clear understanding of our business goal, its value and how to measure success (0 bugs in UAT)

Clear view of what the max value min effort first deliverable was going to be (workshop to key influencers)

Clear view of who our customers were and how to approach them (influencers, hinderers + development teams)

A high level plan of the content of the workshop to be delivered

This was one of the most energizing and productive meetings I have had in a long time, we came out of that room with clear plans and a nice feeling we are going to succeed.