juin 2010Monthly :

Un coach agile dans les pièces automobiles – Sprint 3

Sprint planning

L’équipe commence à être efficace durant la planification de l’itération, j’ai moins à intervenir! En tant que tel, je trouve que c’est une bonne chose. Ca me fait penser que mes interventions précédentes ont porté fruit et que l’équipe devient indépendante. Du moins pour cette cérémonie…

Backlog maintenance

L’efficacité de l’équipe se propage aux autres cérémonies. Cette séance se déroule avec très peu d’interventions de ma part. Les membres de l’équipe discutent entre eux du contenu des stories, posent des questions au PO et s’entendent généralement, en 2 tours de planning poker, sur le pointage à mettre sur une carte. On pourrait penser que s’est une équipe formée depuis longtemps et qu’ils sont tous habitué de travailler ensemble.

Il reste un point qui risque de devenir problématique, le backlog n’est pas très garni. Ce qui fait qu’il n’y a pas de stories, ou même d’epics, d’avance pour les prochaines itérations. L’engagement de l’équipe pour la prochaine itération risque d’être limité par le contenu du backlog. Il y a de la sensibilisation à faire auprès du PO. À suivre…

Sprint review

Une autre review qui va bien! Cette fois, par contre, il n’y a que le patron du PO qui est présent, l’utilisateur n’est pas là. Ca n’empêche pas à l’équipe de recueillir tous les points auxquels elle était engagée. La patron pose quelques questions et semble satisfait. C’est une review express qui se déroule rapidement, mais ca n’empêche pas que tout le monde est content du résultat.

Sprint retro

Les membres de l’équipe s’attendaient à la formule des 2 sprints précédents; identifier les points forts et les points à améliorer. Un membre me demande en blague « C’est maintenant qu’on chiale ? ». Je lui réponds avec sourire que non, ce n’est pas aujourd’hui! J’ai autre chose de prévu. J’ai constaté que les membres de l’équipe travaillent beaucoup selon leurs spécialités respectives. Je pense que ca a un impact sur le déroulement des itérations, certains membres sont un goulot au début de l’itération et d’autres vers la fin. C’est un signe! Je questionne l’équipe sur le potentiel de travail de façon multidisciplinaire. Ils semblent s’opposer à ma proposition. Je comprends par leur réaction qu’ils ne sont pas contre, c’est qu’ils ne comprennent pas la même chose que moi. Ils entendent que tous les membres de l’équipe atteignent un même niveau d’expertise dans tous les domaines et que chacun peu faire le même travail au même niveau d’efficacité et de qualité. Ouf, je comprends qu’ils s’opposent. Ce que j’entends est plutôt que chacun peut faire du travail qui relève d’une autre discipline, ceci pour s’assurer que l’itération avance bien lorsque qu’un spécialiste n’est pas disponible (avec la saison des vacances qui approchent, ca va rapidement devenir une réalité!).

L’équipe me trouve dur avec mes questions, ils suivent quand même bien l’exercice de rétro. Il faut un peu d’encouragements de ma part, mais les équipiers finissent pas adopter l’idée de travailler en paire interdisciplinaire pour mieux partager la connaissance. On verra à la prochaine rétro comment ils ont apprécié l’expérience.

Effectively Tracking Cost in Scrum

 

Note that the ‘Scrum Team’ refers to the Product Owner, the ScrumMaster and the Team. The Team consists of developers with all the skills to turn the Product Owner’s requirements into a potentially releasable piece of the product by the end of the Sprint.

Last week I was discussing with Mathieu and he started to talk to me about a friend who is now Product Owner (previously project manager) on a Scrum project. This person wants to make sure he is doing a good job and wants to continuously improve. I said, this is really awesome!

Mathieu, then says that his friend asked him the specific question: if I want to track the time I am investing in creating user stories and prioritizing the product backlog, which work item type and fields should I use to enter actual time spent if I am using the new Scrum process template from Microsoft.

My reaction is … Interesting, why don’t you ask your friend how he is going to use this data to effectively improve as a Product Owner? If the Team is producing software that the users consider high value at an ever increasing and sustainable pace, don’t you think that those are great indications that the Scrum Team is doing good work? I believe those are much more interesting metrics to track than the actual effort he is putting in creating and prioritizing the product backlog.

Mathieu: Sure, I will suggest him that but I think he also wants to track cost.

Track Cost

Ha! This is getting even more interesting now. Because it leads to the questions of time and cost tracking in Scrum; a question I often get in my scrum classes, especially from participants working in large corporations.

When I started teaching Scrum in 2004, I used to answer in my classes that time tracking is not part of Scrum but if you want to track actuals on sprint backlog items for administrative purposes, you can go ahead.

Observing Scrum Teams doing time tracking on sprint backlog items invariably leads them to questions like:

  • Where do we put the time for meetings?
  • Do we need to have absolutely all tasks in the sprint backlog?
  • When we are pairing, do we do time entries for each of us?
  • When we plan, do we create tasks for all the available hours we have? (more on this in the post Sprint and Compelling Goals)

And the list goes on. All these questions are a struggle for the Scrum Team and answering them does not help them in creating high value software fast. Therefore, my answer now is: Tracking actual work on sprint backlog item is not part of Scrum. Period.

The reaction I usually get is either “this is impossible in real life” or “you are telling us that a Scrum Team is not responsible for its cost”.

I think that a Scrum Team IS responsible to be aware of their cost and the value they bring to the organization; they are software professionals and therefore they strive to maximize the ROI of their work. The Product Owner is specifically accountable for maximizing the ROI by appropriately prioritizing the product backlog.

The reaction is usually “I don’t get it. You are saying not to track actuals on sprint backlog items and at the same time that the Scrum Team is responsible for its cost.”. Here is the suggestion I usually provide. Most organizations are interested in knowing how many hours their people work to be able to produce the pay checks. Therefore they have a timesheet system where people enter their time. My suggestion is to have time entries per project (much higher level of granularities than the sprint backlog items). Therefore, a team member working on a single project will produce one time entry per period. Timesheet system or not, you should be able to easily query your enterprise systems to know salary costs for a given period. May be you are lucky enough to have a cost tracking system in place that is able to give you the answer to how much expenses directly related to the product development were made during the same period.

My point is that it should be possible to identify the total cost of an iteration and have the Scrum Team track this. Considering all of this, I have a request to make to Microsoft : Add the fields ‘Scrum Team Cost’ (numeric) and ‘Other Costs’ for iterations in the Scrum process template. This will be useful for enterprise Scrum. May be it is not too late to put it before version 1.0 goes final ;)

Cheers,

~françois

Agile lessons learned #11 : Harry the crap collector

Harry the crap collectorVince came back home today only to be greeted by firetrucks and the local fire marshal. He was quickly relieved to learn that his brand new condo was not on fire. Unfortunately, for his neighbor Harry, the fire marshal was there expelling him from his own home until he got his mess together.

When Vince found Harry he was in a terrible state of mind. You see, 78 years old Harry had been collecting all the newspapers he could get his hands on ever since his wife had died at 52. 26 years of newspaper stacked up against the walls was too much and a suspicious neighbor made a phone call to the local fire department before Harry would turn his home into the biggest BBQ the city had ever seen. Harry had just lost his entire collection.

All this turmoil shook up Vince inside. When he came back to work Monday, he started thinking about all the mess that was accumulating in his own project.

He made the following list of all that was accumulating around him :
- The backlog had tons of duplicate bugs
- A ton of stories were planned for but not estimated
- The main domain classes of the application were starting to have more responsibilities than the companies C.E.O.
- Some of the controllers were getting bloated
- The code produced by the interns had not been peer reviewed for weeks
- The users documentation was dated by two revisions

….

Vince then went to see his Product Owner and told him about the issue. He was dumbfounded to learn this at first, but after a long discussion, he brought the team together, talked about what was most urgent and how much dealing with each issue would cost.

He then added the elements with the best return on the investment at the top of the backlog and chipped in where he could to help the team address these issues. Within a few months, the situation was very promising and the team was now bringing up issues all the time without the need for them to accumulate.

A year later, most of his fellow Product Owners and their teams were engulfed in crap that had accumulated sprint after sprint. Always planning to fix it later,they never ever did.

Meanwhile this team just glided through the problems at a steady pace and it seemed nothing could stop them in their tracks. For the team members, the project just felt like a train anybody would love to embark on. Their biggest pride, was that it was their own.

-Nicholas Lemay

Snake Charmer avoiding snake bite with virtuality !

Quick entry, it’s getting late…

Every Pythonista should have virtualenv installed. It gives you the ability to create virtual environment (duh!). That means you can create a virtualenv for a project using django1.1 and some old eggs without having an impact on your current killer app project.

To install it, just run:


pip install virtualenv
python virtualenv.py path/to/my_virtual_env
path/to/my_virtual_env/bin/activate

And you’ll be using a brand new environment that you can throw away without impacting your other python environment…. Awesome! For more go to virtualenv’s page : http://pypi.python.org/pypi/virtualenv

Now if only we do this in ruby… oh wait, it exists : http://github.com/nkryptic/sandbox
I’ll try it and see how it goes !

RVM is the way to go for ruby.. I’ll post something later on that

Migration to JIRA 4.1.x for more than 4 years old plugin

Minyaa is the successor of Kaamelot plugin, initially developped for JIRA 3.7 and maintained until JIRA 3.12.

When Minyaa started to replace Kaamelot, there were more than 120 modules in atlassian-plugin.xml file.

Kaamelot (now Minyaa) comes with improvements for different features in JIRA and many i18n properties.

Following Atlassian documentation, the way to define i18n properties is as follows :

<atlassian-plugin key="jira.plugin.minyaa.core" name="Minyaa JIRA Plugin Core" pluginsVersion="1">
  <module key="ModuleKey" name="ModuleName" ...>
      <resource type="i18n" name="i18n" location="com.myplugin.jira.MyClass" />
   </module>
   <module key="OtherModuleKey" name="OtherModuleName" ...>
      <resource type="i18n" name="i18n" location="com.myplugin.jira.MySecondClass" />
   </module>
</atlassian-plugin>

For some modules, the I18n resources were declared using 2 files, in order to reuse existing i18n resource files without having to duplicate translations.

<atlassian-plugin key="jira.plugin.minyaa.core" name="Minyaa JIRA Plugin Core" pluginsVersion="1">
<module key="ModuleKey" name="ModuleName" ...>
...
<resource type="i18n" name="i18n" location="com.myplugin.jira.MyClass" />
<resource type="i18n" name="i18n.Other" location="com.myplugin.jira.MyOtherClass" />
...
</module>
...
</atlassian-plugin>

Without more detailed documentation, when Kaamelot (Minyaa) required to extend existing i18n properties, the technic used was to append a new I18n Location in the extended WebWork Action, by accessing I18nBean object.

You can imagine that with 120 modules (components, webwork actions, Report, Portlet, Service, Issue Tab Panel, Project Tab Panel, …), extending i18n properties may be a pleasure …

With JIRA 4.0, the Gadgets arrived with new constraints … Minyaa portlets have been migrated into real Gadget (Atlassian Framework 2) only for JIRA 4.1.x.

As Minyaa performs many extensions in JIRA components, it was not possible to migrate Minyaa plugins in OSGi Plugin. Only Portlets have been migrated into Gadget in separate Plugin (jira-plugin-minyaa-xxx-gadgets-4.x.x-x.x.jar).

Gadgets, as any graphical item, require I18n Properties ! How does it work ?

Following Atlassian documentation, it only requires to declare in gadget xml file the supportedLocales macro with a key filter for I18n key. A new component (the I18nResolver) is able to load all I18n resources of all plugins and extend the Gadget definition using the key filter.

Ok, lets go ! For Minyaa Core, my first portlet to migrate was Minyaa Fragment Portlet

  • The Minyaa Core Gadget plugin (jira.plugin.minyaa.core.gadget) is created.
  • The declaration is done as follows :
<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs ...>
#supportedLocales("gadget.common,portlet.fragments")
</ModulePrefs>
...
</Module>
  • All needed i18n resources definitions are provided by the plugin identified jira.plugin.minyaa.core

Oups … Some of i18n key were not translated!

After many search in documentation, I have connected the debugger in order to understand where the issue was …

Root cause :

The I18nResolver performs a scan of all i18n resources provided by different plugins, and jira.plugin.minyaa.core i18n resources are found and loaded!

Yes, but they are loaded in a Container based on HashMap and using the couple pluginKey + i18nName, as a key.

It means that jira.plugin.minyaa.core i18n resources are loaded using jira.plugin.minyaa.core as pluginKey, and each i18n Resources Name.

Since Minyaa Core plugin contains more than 1 module the i18n Resources were not unique.

Before the migration, the atlassian-plugin.xml modules were declared as follows :

<atlassian-plugin key="jira.plugin.minyaa.core" name="Minyaa JIRA Plugin Core" pluginsVersion="1">
<module key="ModuleKey" name="ModuleName" ...>
...
<resource type="i18n" name="i18n" location="com.myplugin.jira.MyClass" />
<resource type="i18n" name="i18nOther" location="com.myplugin.jira.MyOtherClass" />
...
</module>
<module key="OtherModuleKey" name="OtherModuleName" ...>
...
<resource type="i18n" name="i18n" location="com.myplugin.jira.MySecondClass" />
...
</module>
...
</atlassian-plugin>

Since the migration, each i18n resource has to be unique (per i18n resource file) as follows :

<atlassian-plugin key="jira.plugin.minyaa.core" name="Minyaa JIRA Plugin Core" pluginsVersion="1">
<module key="ModuleKey" name="ModuleName" ...>
...
<resource type="i18n" name="i18n" location="com.myplugin.jira.MyClass" />
<resource type="i18n" name="i18nOther" location="com.myplugin.jira.MyOtherClass" />
...
</module>
<module key="OtherModuleKey" name="OtherModuleName" ...>
...
<resource type="i18n" name="i18nSecond" location="com.myplugin.jira.MySecondClass" />
...
</module>
...
</atlassian-plugin>

I18n translation is important for all plugins, but you need to be aware that for large and old plugins, this is not a small work !

From Miner with a Cart to Snake Charmer with a Guitar

Starting tomorrow, I’ll dive in the world of Django, one of Python’s famous web frameworks. I messed around with in the past week and I feel like the framework is pushing me in a direction that just ain’t natural to me.

Coming from Ruby on Rails, I welcomed the idea of having a project that contains multiple apps (a concept that will be introduced in Rails 3 I believe). What I found unnatural is the way the Django generates some code for you. When you run

manage.py startapp myapp

It will create a Python package called myapp, which is great. However, it gives you a models.py, tests.py and views.py (a View in Django is the equivalent of a controller in Rails). If you follow the tutorial from Django’s website as the coding standard, you’ll end up with all your models from your app in a single file, all your views in single file, etc.

While some pythonistas will argue that if you split your apps properly the size of the models.py (or views.py) will never be a problem, I tend to believe along with a bunch of people that for the sake of readability and maintainability, each model, each controller and each test class should be in its own file. If the language allows multiple class in a file, it doesn’t mean you should do it… I mean we don’t write application on a single line even though the compiler/interpreter will accept it ’cause that’s just retarded…

If you intend to split your models and views, you’ll be in for a surprise. Django allows you to do this, but not without extra work (yes, it takes extra work to do things right when a framework steers you in the wrong direction).

You’ll want to create a models package along with its __init__.py. In it, you’ll need to import EACH AND EVERY model that you’ll create. Let’s say I have a class called Food in a food.py file, I’ll have to write this in my models __init__.py file

from food import Food

Agreed, it’s not much work, but a framework should not require you to write more code to separate your business entities.

The Agile Coach’s Charter

 

 

In December 09, a colleague of ours was a tad bit envious of a great initiative leaded by Laurent Cobos.Laurent, through a collaborative effort with the Pyxis developer community created the Pyxis Developer’s Charter.

Seeing the rallying effect of the Developer’s Charter, we attempted to launch a similar initiative for Agile Coaches, but we had limited success. Coaches being in high demand these days, we had less time to invest in developing a strong and honest charter that other coaches could easily identify to.

We did however identify some conditions of success:

-The language must be business compatible

-Must show that the coach is accountable to the client

-Must show that our client is equally accountable to the coach

-Can included specific practices

-What else?

And through our internal wiki and a couple of meetings, we came up with this:

As an Agile Coach, I commit to the team and its organization to…

  • Never apply recipes
  • Respect your distinct culture
  • Help you challenge your current culture, principles and practices
  • Let you learn from your mistakes
  • Not let you make irrecoverable mistakes
  • Put in place an empirical process that allows learning
  • Allow you to evolve within that empirical process
  • Allow the process itself to evolve
  • Have to courage to say No
  • Guaranty bug free software ;)

  • Telling you what you must hear and not what you would like to hear.
  • Not inflict help
  • Help you expose the value you create
  • Help you expose non-valuable activities
  • Help you identify obstacles
  • Help you identify solutions
  • Help you to communicate efficiently
  • Be continuously aware that I can be profoundly influenced by the non-Agile surroundings, immediate context and personalities. (Inspired from The Tipping Point)

What would you add, change or simply remove?

What makes uncomfortable?

Which statement makes you stand-up and cheer?!

What would be your preferred format?

Would you sign this Charter?

is accountable towards the client

Share/Bookmark

Un coach agile dans les pièces automobiles – Sprint 2

 

Sprint planning

J’apprends que le patron du PO a vraiment apprécié de participer à la review de la semaine dernière. Il veut être invité encore à la fin du sprint présent. C’est une bonne nouvelle!

Pour débuter, j’explique à l’équipe qu’à la dernière itération ils ont réussi à réaliser 4 points de story. En principe, ils devraient aussi être capable de réaliser 4 points à cette itération. À la review de l’itération 1, une story a été refusée par le PO. Je me souviens qu’ils étaient convaincus qu’il ne restait que peu de temps à faire pour la compléter. Alors, l’équipe pourrait s’engager à faire 6 points. Aahhhh! Soulagement collectif. Ils n’avaient pas bien compris qu’ils pouvaient s’engager à plus. L’équipe regarde le backlog, est confiante et s’engage à réaliser 10 points. J’aime ça les équipes optimistes!!

Backlog maintenance

Avant de débuter la séance, nous avons une petite discussion à propos d’une situation « particulière ». Le patron du PO ne peut pas être présent pour la review et demande à l’équipe de faire la présentation à un autre moment pour qu’il puisse y assister. Après discussion au sein de l’équipe, les membres proposent d’échanger les séances de planning et de review. Ai-je bien compris ? L’équipe veut s’engager sur le prochain sprint sans connaître le résultat du sprint actuel ? Il semble que j’avais bien compris… L’équipe justifie qu’elle se sent en confiance de réussir l’engagement et qu’il n’y aura pas de problème. Même si l’équipe ne réussi pas, les membres considèrent l’impact mineur. J’ai fait part de mes réserves, l’équipe connait les conséquences potentielles. Je leur laisse maintenant la décision.

Le backlog n’est pas très garni, ça a comme conséquence que peu d’items sont estimés. Nous avons prévu deux séances de backlog maintenance pour cette itération, pour permettre au PO de rédiger d’autres stories. Pour la séance de ce matin, l’équipe a réussi à estimer 4 stories. Ça ne semble pas beaucoup, mais les discussions entourant les stories étaient intéressantes. Elles ont permis de faire diviser une story en deux, afin de réduire la complexité, de clarifier des éléments et faire ressortir des points que le PO doit éclaircir pour la prochaine séance.

Sprint review

Comme au sprint 1, des intervenants ont assisté à la review. Il y a 3 stories à présenter et le résultat d’un spike. Le PO a pris contrôle du clavier dès le début de la séance. Première story à démontrer; le PO commence à faire le tour des écrans pour valider l’information transmises. Il ressort tranquillement qu’il n’est pas prêt pour la review, il cherche un peu quelles données utiliser et où sont certaines informations. Je prends note que je devrai un peu mieux accompagner le PO pour qu’il se prépare pour la review. Les membres de l’équipe semblent aussi l’avoir remarqué. Je ne serai pas seul à en parler au PO…

Sprint retro

Pour cette deuxième rétro je préfère rester au niveau des processus. Alors je garde une formule assez traditionnelle de faire ressortir les points forts et points à améliorer. J’oriente par contre la discussion autour des cérémonies de Scrum; planning, backlog maintenance, review, retro et le déroulement général des itérations. Des bons points ressortent sur les différentes cérémonies. À l’opposé, l’équipe trouve que la mêlée quotidienne est inefficace; les membres de l’équipe communiquent beaucoup et se synchronisent près du tableau de tâches à chaque matin avant l’heure de la mêlée, alors ils ont le sentiment de se répéter. Pourtant, à quelques reprises durant la mêlée quotidienne, d’après la réaction de certains autres membres face à la réponse à « Qu’as-tu accompli hier? », j’ai senti que de l’information nouvelle circulait dans le mêlée. Elle n’est peut-être pas efficace, mais elle semble utile!

Change is the job of the ScrumMaster

I recently finished reading Community, the Structure of Belonging, by Peter Block. While reading the book, I could not help but draw parallels with what I teach about Scrum.

In his book, Block talks about the small group as the unit of transformation. I already wrote about Scrum as a tool to foment change. In the context of Scrum, the Scrum Team is that small group, that unit of transformation. It changes the context of work in a way that alters how we think, behave and thus work together, which in turn can radically improve performance. François shared a similar view recently on Scrum teams, compelling goals and performance.

Block also states that for real transformation to occur, it is not more or better leaders that we need, but more care and belonging. I’m often asked what role management plays in Scrum. People ask the question : “So in Scrum, that means we don’t need managers?”. Mike Cohn has already addressed part of that question in his last book, Succeeding with Agile, by saying that management has a key role to play by creating the right environment for self-organization to occur. To add to that idea, we can say that management task is to shift the context, so that it creates in the Team a sense of belonging and ownership. Engagement from the Team will come from care so we must be careful to choose care over speed or scale.

Scale, speed, and practicality are always the coded arguments for keeping the existing system in place.

Scrum is all about changing the existing system. This is why the ScrumMaster primary responsibility is to ensure the Scrum process is followed. He or she uses Scrum as a tool to ask powerful questions to spark off change.

The ScrumMaster job is to change the conversation. The ScrumMaster is initiator, facilitator and leader of real discussions. This is a leadership role about creating commitment and accountability, which are the building blocks of self-organization.

To make a difference we must start by naming the way things are, use powerful questions as a tool, and listen, rather than advocate or defend.

ScrumMasters, take the time to master the art of orchestrating conversations, for this is what your job is about.