Showing posts with label agile. Show all posts
Showing posts with label agile. Show all posts

Friday 10 February 2017

Agile Principles 101

So I spent the first few times teaching the Agile Principles in the way that I was ?taught? on a very expensive public certification* and it was the way I saw all the other agile coaches and trainers doing it. Peer pressure - even for an agile coach or agile teacher - is a tough thing to deal with! 

So too is that excruciating inner desire of wanting to teach all of the things (especially the things that took me a long time, and I learned the hard way)! But you only get a few minutes, hours or days in the lives of those whom you wish to help and there is a limit to how much of an impact you can make in those few short moments of time!


How To Really Teach The 12 Agile Principles Mindset - A Mystery Mastered

So 1 MS PowerPoint slide would go up, and the class would read the slide and the words silently. (How did I even know they were reading? Or were they just pretending to read so they could go home earlier?)

I would timebox this reading exercise to 6 minutes, as there are 12 of them. And everyone can read and understand complex phrases within 30 seconds, right?!!? 

And of course then another timebox for 4 minutes for Questions - "Are there any questions about this?" - kind of "emperor has no clothes" style - 99% of the time no one would ask anything. Probably because the principles are so simple to understand - people looking around would see their colleagues, managers, unknown strangers nodding knowingly! Perhaps even smirking with that secret deep understanding!

And, no one ever wants to feel uncomfortable - especially not by asking an obvious (to everyone else) question to clarify their own understanding, their own perception, their own experience!
Here's what that slide typically looked like (it hurts me just to revisit the old old decks!)



Notice how neatly all 12, and the title, fit really neatly onto 1 slide! Win! ;-)

I particularly like the tiny font size, and the bullets! Wow! Those bullets - they really draw attention to what's so very important to make sure the 12 principles of agile successfully transfer off the presentation and into people's consciousness, and cause the learners (?) to change their way of thinking, of being, their behaviours and thus the real target - their way of working to being more productive with the limited resources and time they have available!

Now for some truth of this widely used, common, dare I say - standard or best practice - approach...

In a nutshell, the pro's of this approach are:

  1. The trainer gets at least a 6 minute break
  2. The trainer can "tick the box" on the "we covered the basics" section / poorly defined learning outcomes
  3. Only 1 slide!
  4. Only 1 page to print for the pack for the attendees
  5. Lots of nods from the trainees - the words do seem sensible - which makes all trainers feel good inside!
  6. Very few questions (in 4 minutes) if any, and, no time to get into any real detail of either the trainer's experience(s) or learners' experience(s) - so only quick superficial answers or "park that one" statements to move along!

The con's of this approach are:

  1. Zero positive effect on the learners
  2. Sometimes negative impact on the learners as they begin to logically unpack and envision applying in their own organisation and discover stumbling blocks with all or nearly all of the principles!
  3. Learners feel rushed
  4. Learners realise the trainer might not be a good one or that the training content might not be good

Post mortem: 

Did you notice who gets more benefit from teaching the agile principles like this? Who's paying the money? Who's earning the money? Is it a fair exchange?

No one can apply anything that is read from a densely packed and boring slide like this! The agile principles are too concise and need expansion/discussion to help people interpret them correctly singly and collectively, and within the context of the learners which is unique from group to group, team to team and individual to individual. It's a subjective perspective thing!

I suggest don't teach or try to learn the agile principles this way, please. It's simply a waste of time and energy. I have many more experiences and ideas which I am sharing on What Is Agile For

* Seriously!!? Who can learn something as simple (NOT!) as ballet or agile (or anything else of real substance that is life changing) after only 1 or 2 days on an expensive course for which you get a certificate/certification/membership!!? Certifiable/certified maybe. :-)
Make The Agile Principles Real, Make Them Useful, Make Them Usable, Or STAY HOME! "Hey, teacher! Leave these kids alone!"
Thankyou for supporting! Best wishes on your journey!

Thursday 9 February 2017

What Is Agile For You What Is Agile For Us

So…what do you want to know?

I guess there are 3 readers this agile principles blog post is targeted at:
  1. Total newcomer to the whole agile movement/thing
  2. Someone who has had some brief training, or read a few books, or someone working next to a team “going agile”
  3. Someone who just wants to understand when to reject agile and when to accept agile
Where Do I Start To Learn Agile And What Do I Use It For
What Is Agile For - And How Do I Learn Agile?

Firstly, welcome to this post (actually several that are linked!) about “agile”. I’ve said to myself for a number years, “do not go gentle into that good night” as many many have tried and most have only partially succeeded…the road to hell is paved with good intentions, and many brave good people who tried to communicate their "Eureka!"

To be inspired, and honour William Shakespeare, a little reminder from Hamlet, Act III, Scene 1 with agile updates:

To be [agile], or not to be [agile]: that is the question!
Whether 'tis nobler in the mind to suffer
The slings and arrows [mistakes] of outrageous fortune [delivery in the past],
Or to take arms [learn from the past] against a sea of troubles [complexity],
And by opposing [with a modern, learned mindset and approach] end them [deliver successfully and sustainably with a team that becomes a real competitive advantage]?

Note - I’m not trying to introduce or explain my interpretation of "agile" with this particular post. 

Instead I am going to connect various ways I have taught the 12 agile principles that are behind the agile manifesto to people who have attended my courses or people I have coached or led in organisations. I’ve read (and continue to read) (all) the books, speak to (all) the people and make my own mind up based on my experience.

I reckon if you and your team and/or peers follow the logic of the linked “HowTo Learn/HowTo Teach the agile principles” - and apply my guidance, you and your learners will discover for yourselves what these elusive, ambiguous, uncertain, etc principles mean for you and for your unique situation. And this deeper learning/realisation will set you up for great success in whatever you are going to attempt for the rest of your career.

A pushy declaration, I know. But I’ve been watching the people who really “got it” on my training and how their careers (thanks to linkedin!) have proceeded since 2010…and I am very pleased for them! And even more pleased that a simple manifesto and a few simple principles that were initially thought about in the software development and delivery space that I initially embarked my adult work life in ... have become to be understood as entirely applicable in all walks/works of life.

In the purest nutshell, by the dictionary, agile means "quick and nimble". These days it also has some ambiguous meanings appropriately and inappropriately added to the term, including "10,000 practices you can try to make your organisation quicker and nimbler" - also known as more competitive.

Agile Is Not Too Much To Learn - It Is Mindset
Agile Is [NOT] Too Much To Learn
I’m iterating this post, but over time the dedicated walk-throughs for learners, trainers, teachers, managers and the curious will expand here. Agile is really easy to explain and learn, but challenging to embody. You will see! 
Agile Is A Life Approach It Is A Mindset
What Is Agile For?

My recommended “understand, embrace agile right in mind to do agile right and get the best benefits” and "read them now!" agile books currently are:






Perhaps Agile is not a What, perhaps it is a When, or maybe it is a How?

Thankyou for supporting! Happy learning "to be agile" :-)


Thursday 5 May 2016

My favourite coaching tools: No Time To Improve Agile Retrospective Cartoon

This is a short and sweet one that always brings a little smile to my lips (and some or many team members) when I bring it up in front of the "we're too busy with important stuff" teams during agile retrospectives, or preceding an agile retrospective due to too much resistance because "we are too busy"!


No Time To Improve Retrospective Cartoon
From http://i2.wp.com/ecbiz168.inmotionhosting.com/~perfor21/performancemanagementcompanyblog.com/wp-content/uploads/2014/03/tobusytoimprove.jpg
It seems no one is currently sure where the original is, or who created it. For more modern updates there have been plenty, just search Google!

Retrospectives Help Teams Look After Themselves And Have Longevity
No Time To Improve / Retrospect As We're Too Busy!


Once we all get past the uncomfortable "Gulp" moment after this cartoon is presented, the team discusses what things are keeping the team members too busy to think about or to reflect or to introduce improvements to the way(s) they are working.

I might even throw in the original Albert Einstein quote:
“If I had an hour to solve a problem I'd spend 55 minutes thinking about the problem and 5 minutes thinking about solutions.”
And/or I might put this one in front of the team to reflect upon:
"Give me six hours to chop down a tree and I will spend the first four sharpening the axe."
- Abraham Lincoln
Retrospectives Often Uncover Strategic Conflicts From The Top Most Leaf Perspective All The Way To The Root
No Time To Improve Because Strategies Are In Conflict (Usually, Deliver! Deliver! Deliver! Unintentionally Making That Axe Blunt, Blunter and Bluntest Of All!!)

If there are still some people needing deeper understanding of the situation they are in, I would introduce them to, and request them to, complete the Covey Time Management Usage Matrix (also known as self-study lightweight time and motion study). After this step is complete, especially including the lunch breaks, random web surfing, tea breaks, urgent phone calls and all the other really important things everyone does with intention or with serendipity at work as normal Business-as-Usual, then people are open to the message, and a humble inquiry!

Retrospectives Run Right Produce Practical Actions That Make Real Differences
Respect The People You Are Trying To Help - It Is Their Life!

Always respect the people you are introducing this too, and respect it is THEIR context and THEIR experience that matters, not yours, as external coach / observer / non-invested in the focussed business outcome! And remember why you are introducing this to them - something they are doing must be wasting energy in YOUR ?humble? opinion - not in theirs! Be careful and go very gently and respectfully!

Thankyou for reading! :-)

Monday 14 March 2016

My favourite coaching tools: Free work personality assessment

Caveats:
This free strength finders test is really insightful. Everyone I know has gained great benefit from understanding their strengths better! Some folks seek to find the answers of who they are, why they are, and what work are they supposed to be doing. They're seeking confirmation of their talents. Some believe we should be using our talents to achieve our destiny. Others believe we should be developing new skills until they become talents that we were not born with - and that these new talents are the path to our destiny.

If you feel good about what you are doing and you feel good about how you are doing it, then you feel good! When the Who, What and How are all aligned and in the right balance, you have a greater chance of getting into flow.

Success encourages success. Flow is particularly important for changing your life as these new higher level experiences actually change the brain.

As usual with any assessment where you are choosing more of one thing and less of another thing, your free work personality will shift around (a little) based on your current and immediate context. So a good time to do it is at the beginning of a day, before anything begins to sway your free thinking and feeling.

Required:
Internet access
Quiet space
10-15 minutes
An email account you don't mind using for the assessment

Step 1:
Give this link to the coachee: Imperative - bring meaning and fulfillment to work and ask them to do the assessment in the morning before work really starts.

Step 2:
When the assessment is complete, you will have the Who, How and Why the coachee works in the organisation, as well as some insights connected to the archetype/persona that has been matched (again, statistician George EP Box's "all models are wrong, some are useful" applies!). And a couple of hints about all the other imperative archetypes/personas that could have resulted if you had answered a couple of questions a little differently - because you will have an indicator of how many other respondents have been similarly labelled!

And you will have a free online profile you can share with others - friends, family and colleagues! It's very well presented and highly interactive!

You now have found your strengths and have the data to either focus coaching goals and plans on making more use of the work personality insights - all up to the coachee and your understanding of the person's needs. Their strengths and a clue about their weaknesses. Plenty to work with!

This assessment is really great for all team members to complete and share their results with each other. The quick insights about each other helps the team figure out how better to work to each other's own interests and strengths - in some ways also similar to Belbin's team roles.

Thankyou for reading. Let me know how it goes!

Thursday 12 July 2012

Test Driven Development solutions to same problem

!WARNING - THIS POST IS WRITTEN FOR SOFTWARE FOLKS!

I discovered Test Driven Development / TDD in about 2005/6 thanks to Gunjan Doshi's TDD Rhythm and 1-2 old articles on JavaWorld.

Years later I read Kent Beck's book Test Driven Development (The Addison-Wesley Signature Series) (or US) and was glad I had not missed anything fundamental from my non-standard "foundations" on the subject. These days there is a fairly good intro on Test Driven Development wikipedia entry. This post is aimed at software craftsmen and journeymen and perhaps even masters - to inspire a bit of thought along the following dimensions that impact the solutions that evolve:
- the understanding of the functional requirement
- the understanding of the non-functional requirement
- approaching the solution in primarily an iterative approach (managing complexity, perhaps)
- approaching the solution in primarily an incremental approach (managing complication, perhaps)
- the understanding of the required test strategy to ensure required quality level is achieved

Dimensions that, in TDD, result in the tests selected AND the order in which to approach the tests, which result in the emerging of different solutions.

I've spent a great deal of time leading/mentoring/coaching Test Driven Development (TDD) sessions, working with teams and individuals on a particular problem which they had no experience in beforehand. These sessions were the correct environment for us both to learn TDD, or for them to learn TDD, or even as part of a recruitment selection process where the team was practising TDD and we had to ensure candidates could practice TDD as we did.

I selected a problem that was documented on wikipedia on the page describing Numerology. I like discovering interesting coding problems on wikipedia as the descriptions there are [theoretically] internationally acceptable and understandable - which helps enormously to "level the playing field" for English first language speakers as well as non-English first language speakers.

The specific problem I wanted to pair up on is described very well under "Methods" in terse language (another "pro" as time is always pressured, and I wanted a problem understood, solved and discussed in 30-45 minutes).
In essence for this challenge, I wanted solutions to be developed that would convert a word, a phrase, and ultimately a person's full name, into a number, using simple rules that had to be analysed on the wikipedia page and extracted, without my help, to establish the even playing-field going into the solution development phase and discussion phase thereafer.

The first part of the rules were simply how to encode letters to numbers according to Numerology:

1 = a, j, s;
2 = b, k, t;
3 = c, l, u;
4 = d, m, v;
5 = e, n, w;
6 = f, o, x;
7 = g, p, y;
8 = h, q, z;
9 = i, r

The second part of the rules would usually give the candidate 2 strategies depending on how detail-oriented the person was.

For those who rushed through understanding the requirements, the rules were simply summing individual numbers repeatedly until the total < 10, eg using the wikipedia examples:

3489 ? 3 + 4 + 8 + 9 = 24        ? 2 + 4 = 6
Hello ? 8 + 5 + 3 + 3 + 6 = 25  ? 2 + 5 = 7

For those who paid a bit more attention, the rules were simply:

  value modulo 9, if 0, then 9

It is *always* interesting to see who picks up the shorter modulo 9 strategy, and who does not. (feeding into a lightweight Belbin assessment - see my Coaching with Belbin)

The various solutions below highlight [clearly] how the right problem tackled in the right way creates a much more readable, maintainable, extensible and flexible solution using TDD. Although even the less TDD-correct approach still produces an acceptable result. For me though, the best solution was actually produced largely without using TDD. Can you spot it?

/***************************************/
// TESTS
/***************************************/

I have removed name identifications and some "interesting" tests from the typical TestClasses that were all similar to either:

// Simple
import Calculator;
import org.junit.Test;
import static org.junit.Assert.*;
public class CalculatorTest {
    Calculator calculator = new Calculator();
    /*
     * Test Cases:     *    
     * 3,489 => 3 + 4 + 8 + 9 = 24 => 2 + 4 = 6     *          
     * Hello => 8 + 5 + 3 + 3 + 6 = 25 => 2 + 5 = 7  *
     */
    @Test public void testCalculateImportantChars() {        assertEquals(2, calculator.convertCharToNumeric('k'));        assertEquals(1, calculator.convertCharToNumeric('a'));        assertEquals(9, calculator.convertCharToNumeric('r'));        assertEquals(5, calculator.convertCharToNumeric('n'));        assertEquals(8, calculator.convertCharToNumeric('h'));        assertEquals(5, calculator.convertCharToNumeric('e'));        assertEquals(3, calculator.convertCharToNumeric('l'));        assertEquals(6, calculator.convertCharToNumeric('o'));        assertEquals(9, calculator.convertCharToNumeric('i'));        assertEquals(8, calculator.convertCharToNumeric('z'));    }

   @Test public void testCalculateHello() {        assertEquals(7, calculator.calculate("Hello"));    }
}

OR:

// More along Kent Beck's final example approach

import Calculator;
import org.junit.Test;
import static org.junit.Assert.*;

public class CalculatorTest {

   Calculator calculator = new Calculator();

   /*
    * A = 1
    * B = 2
    * C = 3
    * a = 1
    * b = 2
    * j = 1;
    * k = 2
    * i = 9;
    * 0 = 0
    * 1 = 1
    * 11 =  2
    *
    * AA = 2
    * AB = 3
    *
    * 1B2a =6
    */

   @Test
   public void testCalculate1() {

       String[] inputs = {"A", "a", "B", "b", "C", "k", "j", "i", "AA", "AB", "ABc", "0", "1", "11", ",", " ", "1B2a", "-1", "hello", "3,489"};
       int[] outputs = {1,1,2,2,3,2,1,9, 2, 3, 6, 0, 1, 2, 0, 0, 6, 1, 7, 6};

       for(int testcase=0; testcase < inputs.length; testcase++) {
           assertEquals(outputs[testcase], calculator.iWantToBelieve(inputs[testcase]));
       }

       assertEquals(-1, calculator.iWantToBelieve(null));
   }

}

/***************************************/
// SOLUTIONS, all checks and Exceptions removed for brevity
/***************************************/



/* Common Solution 1 */


public class Calculator {

   public int iWantToBelieve(String string) {
       if(null==string) {
           return(-1);
       }
       int result = 0;
       for(int pos = 0; pos < string.length(); pos++) {
           int valueToAdd;
           char currentChar = string.charAt(pos);
           if(Character.isDigit(currentChar)) {
               valueToAdd = Integer.valueOf(String.valueOf(currentChar));
           }
           else if(Character.isLetter(currentChar)){
                int tmpValue = Character.toUpperCase(currentChar) - 64;
               int valueOfCharacter = tmpValue % 9;
               valueToAdd = valueOfCharacter == 0 ? 9 : valueOfCharacter;
           }
           else {
               valueToAdd = 0;
           }
           result+=valueToAdd;
       }

       if(result>9) {
           result = iWantToBelieve(String.valueOf(result));
       }
       return(result);

   }

}


/* Common Solution 2 */


import java.util.HashMap;
import java.util.Map;

public class Calculator
{
 private static Map numericCodes = new HashMap();
  
  static 
  {
   numericCodes = initialiseNumerologyMap();
 }

 public Calculator(){
 }
  
 public int calculate(String word) {
   char[] chars = word.toLowerCase().toCharArray();
   int[] digits = new int[chars.length];
    
   for (int i = 0; i < chars.length; i++)
   {
       char characterValue = chars[i];
       Integer numeric = numericCodes.get(characterValue);
       if (numeric == null)
       {
         digits[i] = 0;
       } else {
         digits[i] = numeric;
       }
   }
   int sum = 0;
   for (int i = 0; i < digits.length; i++)
   {
     sum += digits[i];
   }
   if (sum > 9)
     return calculate(""+sum);
    
   return sum;
 }

 /* 
  * 1= a, j, s; 2= b, k, t; 3= c, l, u; 4= d, m, v; 5= e, n, w;
  * 6= f, o, x; 7= g, p, y; 8= h, q, z; 9= i, r  
  */
 private static Map initialiseNumerologyMap()
 {
   // a to z mappings
   for (int i=97; i<123; i++) {
     int alphabetValue = i%96;
     int modulatedValue = alphabetValue%9;
     if (modulatedValue == 0) {
       modulatedValue = 9;
     }
     numericCodes.put((char)i, modulatedValue);
   }
   // 0 to 9 mappings
   int j=0;
   for (int i=48; i<57; i++) {
     numericCodes.put((char)i, j);
     j++;
   }
   return numericCodes;
 }

}

/* Common Solution 3 */

public class Calculator {

   public int calculate(int n) {
       if (n == 0) {
           return 0;
       }

       int result = n % 9;
       if (result == 0){
           return 9;
       }
       return result;
   }

   private String a2n = "abcdefghijklmnopqrstuvwxyz";

   public int convertCharacter(char ch) {
       return calculate(a2n.indexOf(Character.toLowerCase(ch))+1);
   }

   public int convertWord(String word) {
       int sum = 0;
       for(char c : word.toCharArray()) {
           sum += convertCharacter(c);
       }

       return calculate(sum);
   }

}

/* Common Solution 4 */

public class Calculator {

   public int convertCharToNumeric(char c) {
       int intValue = (int)c;
       if ((intValue >95) && (intValue < 129)) {
           int numericFate = (intValue - 96) % 9;
           return convertForNumerology(numericFate);
       } else {
           return 0;
       }
   }

   private int convertForNumerology(int yourFate) {
       if (yourFate == 0) {
           return 9;
       }
       return yourFate;
   }

   public int calculate(String word) {
       int total = 0;
       for (char c : word.toLowerCase().toCharArray()) {
           total += convertCharToNumeric(c);
       }
       return convertForNumerology(total%9);
   }

}

/* Common Solution 5 */

public class Calculator {

   public int calculate(int n) {
       int result = n % 9;
       if (result == 0) {
           result = 9;
       }
       return result;
   }

   public int convert(String word) {
       String workingWord = word.trim().toLowerCase();

       int total = 0;
       for (char ch : workingWord.toCharArray()) {
           int intValue = (int)ch;
           if ((intValue > 96) && (intValue < 123)) {
               total += (intValue % 96);
           }
       }

       if (total > 0) {
           return calculate(total);
       }

       return 0;
   }

}


/* UnCommon Solution 6 */

public class Calculator {

   public int calculate(long n) {
       if(n%9==0)
           return 9;
       return (int)(n % 9);
   }

   public long convertStringToNumber(String string) {
       String tmpString = string;
       tmpString = tmpString.toLowerCase().replaceAll("[^abcdefghijklmnopqrstuvwxyz]", "");
       tmpString = tmpString.replaceAll("[a,j,s]", "1");
       tmpString = tmpString.replaceAll("[b,k,t]", "2");
       tmpString = tmpString.replaceAll("[c,l,u]", "3");
       tmpString = tmpString.replaceAll("[d,m,v]", "4");
       tmpString = tmpString.replaceAll("[e,n,w]", "5");
       tmpString = tmpString.replaceAll("[f,o,x]", "6");
       tmpString = tmpString.replaceAll("[g,p,y]", "7");
       tmpString = tmpString.replaceAll("[h,q,z]", "8");
       tmpString = tmpString.replaceAll("[i,r]", "9");
        return Long.parseLong(tmpString);
   }
  
}

/**************************/

It seems to me that TDD represents some interesting mental/psychological challenges for people who try:

  • For software newbies, it is almost effortless, but they struggle to see the value in what they're creating as their solution emerges - I think due to a lack of experience looking at mountains of badly written and poorly designed legacy systems
  • For software oldies, it is darn painful, and they struggle to see the value in the extra steps they're taking, constantly battling the urge to do more error checking and handling, to make the solution more complicated, and generally reach a point of suspended disbelief needing to see more examples and try it again in their work environments
  • For some, and it is so far impossible for me to recognise them, they reach almost immediate "ah ha!" realisations of the power of TDD. They're flexible and open enough to suspend their not-as-entrenched over-thinking thought processes that the "oldies" display yet they have experience of maintaining some old production systems and dealing with some of their more novice mistakes that have come back to haunt them again, and sometimes again and again.
  • Keith Braithwaite   and I once discussed that people applying TDD properly ("coincidentally" those who love doing so) experience  Csikszentmihalyi's "Flow"  - and hence even more benefits for those who successfully embrace, as well as the organisations that setup them up to succeed/embrace.


I look forward to hearing other points of view on the above 6 solutions for the "same problem" over the next few years.

A smarter SMART for even better collaborative Objectives (including OKRs)

My favourite coaching tools: SMART Acronym Another Update