Agile Tools
I read a bunch of Agile and Scrum user groups, since I am fairly involved both in Agile development and tool support for Agile development it seems sensible to stay in touch with what people are talking about and what questions they are asking.
It seems like about once a month someone will post a question to one of these groups asking for advice on what backlog management tool they should use or what is everyone else using. Often they are looking for open source tools, but not always. More often than not, whether they are requesting open source tools or not, sales people from the various agile tool companies jump on these posts to push their product, often bringing up the old “how free is free” argument, implying that open source means poorly made and you will spend more time/money trying to get it working than you would just buying their fantastic tool.
I often wonder about these types of questions. They are so unspecific about what the asker is actually looking for, I often want to ask: “What makes you think you need a tool?” or “What is the problem you are trying to solve?”. Obviously I would like people to check out Express, like it, and get a lot of value from it, but it seems hard to imagine that anyone is going to be able to select a tool unless they are clear on what they need from it and how it is going to improve their process.
For many groups there is no need for anything more sophisticated than a whiteboard and some type of shared document space, like a wiki or a google doc/site. For other teams this is nowhere near adequate. What are the factors that make this nowhere near adequate? I thought I might explore them as I have some experience in this and it is why I began developing Express in the first place.
1. You have stakeholders who are not co-located with the development team: This is really common for external development companies, outsourcers, and consultancies. There is nothing unagile about not having all stakeholders co-located. Of course there needs to be a customer representative but that person will likely be representing all sorts of interested parties who would like to be able to get information on how the project is going. Tools can help here to keep the remote parties in the loop about what is going on and allow them to review the stories as well as progress.
2. Your team is distributed. There is nothing unagile about this either. Many teams have an off-site component to their development or have entire sprint teams off-site or off-shore. Of course everyone being in the same room has immense benefits in terms of informal communication and information sharing but that is not always an option and in some cases, not even desirable. Teams who are not physically co-located need to work hard to maintain communication and their commitment to tasks assigned to them. The best way to do this is with a virtual wall. This allows everyone to view the current state of the iteration stories and tasks.
3. You need to manage and track project metrics. Some agile teams are not too concerned about detailed metrics. They know their velocity and that is enough. Other teams like to keep detailed metrics on what happened during a sprint. This can be very onerous unless the team has some tools to help. Tracking this kind of thing on a spreadsheet can quickly become problematic. An Agile project management tool can be really helpful here to track how many points were delivered in each iteration, how the total count of story points delivered compares to the number of story points required to release, etc.
4. Your team has stakeholders who would like to know when you’re likely to be finished. Okay, that is probably every team but it can be very difficult to say when you are likely to be finished when you don’t have a tool to help with estimation and time tracking. If you are using a backlog management tool you should be able to get a more and more accurate picture of how you are tracking and when you are likely to deliver.
In general I think that knowing what you are looking for is going to make a big difference as to the tool that you select to manage your backlog. Other considerations are around integration with existing tools (if you have them) such as defect management tools and version control. It is well worth just thinking about whether you need this type of integration and exactly what benefit you see your team getting from it.
Express Roadmap
Posted by adam in Express Releases on March 15, 2010
I thought it might be useful to detail where Express is right now and where it will be going in the immediate future. This should serve both as documentation for people on what features are currently available and also provide information to people who are thinking of using Express as to where the application is heading in the near future. This roadmap is somewhat changeable, as I try to groom the next features being developed based on feedback from users.
Currently I am working on refactoring the UI to support more information. I am going to remove the project summary and iteration summary accordion from the main backlog screen and create vertical tabs down the right hand side that will allow the project and iteration panels to be able to slide out from the right and be visible no matter what main screen you re on. this will allow me to add a 3rd panel for impediment management which is a core feature for the 8.0 release.
I am also increasing the amount of historical information retained by Express to be able to track change. This means that in future Express will be able to report on story points added or removed from an iteration. We will also be able to track change at a project level. This will allow a burnup chart to be generated for the project and a burndown for an iteration can also indicate how the target for the iteration changed.
Filters and searching are also coming to version 0.8. I am looking to apply these to both the backlog management screen and the virtual wall. I will likely implement most of the functionality in point release but look at 0.8 shipping having filtering of stories.
I’m keen to get feedback from users as to what features they think are most important so please go ahead and comment here or (even better) post on the feature request tracker here.
Express 0.7.5 Released
Posted by adam in Express Releases on March 6, 2010
I have just released Express 0.7.5. This release fixes a layout issue for task cards on a Linux client with a limited font availability. It ensures that the scrollbar doesn’t appear on the card if the only available sans-serif font renders slightly taller than normal.
This will be the last 0.7 point release. Work on the 0.8 release is progressing well and will include filtering, extra reporting and impediment management.
Express 0.7.4 released!
Posted by adam in Express Releases on March 2, 2010
I have just released Express version 0.7.4 it can be downloaded at sourceforge. This release has just one new feature – individual swim lanes for tasks under a given story. I intended to do a number of small features in this release but due to the number of requests for this feature I decided to release it immediately and move the search and filter features, which are only partially completed, into the next release. I am going to start on the 0.8 release now and bring all the currently requested features all into that release as well as the completion of impediment management.
Express 0.7.3 released!
Posted by adam in Express Releases on February 4, 2010
Express version 0.7.3 has now been released on sourceforge. This version contains a number of fixes and improvements including:
- Unassign
- Deselect themes
- Sorting on assigned to in the backlog grid
- quick menus for stories and tasks on the virtual wall
- Fixed missing effort record for ‘now’ on the burndown
- Ordering of multiple themes for a story
Postcards From a Vietnam Labour Camp Pt IX
Wow I’m almost at the big postcard X! I’l have to save some really juicy stuff to put in that one, I’ll make it a special Gala edition postcard and really pile on the bullshit… because I generally hold back so much that on a day to day basis I feel kind of repressed.
I’m learning so much living here in Vietnam. If only I had been flown here instead of to the Alfred hospital when they evacuated me from Thailand you probably wouldn’t even be able to tell I had been burned. In Hoi An, even the people on street know the secret to fixing a sub-glottic stenosis (the medical condition behind my trachea tube). They know and they are happy to share their advice for free, unlike those schiesters at the Alfred and in the Wellington hospital in London. The solution mostly revolves around Ginger, oddly enough a spice whose very smell causes me to want to blow chunks. Basically if I would modify my diet to include massive doses of ginger then apparently I could just pull out my trachea tube after a couple of days. I’ve decided when I get back to Australia I am going to sue my surgeons for malpractice, while they were busy doing surgery and repairing damaged parts of my anatomy, what they actually should have been doing is giving me some ginger tea!
While we were staying in Hoi An, we also had the joy of watching some local TV stations. We discovered that Lily doesn’t really give a shit what language the cartoon is in as long as it has some type of animal that she likes, currently that means Elephants, Lions, Giraffes and Monkeys. I was initially kind of surprised about this, but when you think of how poor a grasp on English most 2 year olds have I guess the surprising thing is that cartoon makers bother putting voices on at all. Bill & Ben certainly didn’t bother when I was a kid, they just said “a bob bob bob bob”. I happened to catch a new and improved episode the other day which actually has a narrator and found that the stories made no more sense than they did when I used to watch them as a 4 year old.
While we were in Hoi An I actually saw an English movie dubbed in Vietnamese while we were channel surfing looking for cartoons containing the aforementioned animals, so I have got to describe it. Okay, I accept that there is a certain amount of bullshit in my emails, but you have got to believe that the following account is absolutely accurate and in no way exaggerated… believe me, I couldn’t make this shit up!
In the west when they dub a movie, they generally try to find people to do the voices who sound a bit like the actors voice which they are going to play. For instance if they were going to dub Harry Potter, they would get some children of the correct sex to do the lines for the various kids in the local language. Not only do they not bother trying to match the actors age/sex/style over here, they don’t even bother to get multiple actors to dub the lines. They get one person to basically read out the story over the top of the movie. Generally they don’t even seem to be reading out the scene being played, although my grasp of Vietnamese is not good enough to swear that they are never in synch. It seems kind of ironic to me that in a country where wages are the smallest component of any type of business venture, they don’t want to pay for more than one actor to dub a western movie.
I feel I have to share another of my dirty secrets with you all. I don’t know what is about writing these emails that forces me to articulate my dirty secrets, but unfortunately that is just the way it is, you have to take the good with the bad…
I grew up as an rabid anti-colonialist. I hate the idea of the English or the Dutch, etc. sailing into some, so called savage country, and taking over in the name of civilization. Mostly civilization just builds a massive underclass which is thoroughly exploited to the benefit of those bringing civilization. While we were in Hue, however, we stayed at this amazingly plush hotel called La Residence. It was a bastion of French colonialism back before they had their asses kicked by Ho Chi Minh and the boys and it is filled with literature telling of how the filthy French exploited everyone and eventually got their just deserts.
This is the type of stuff which would usually have me nodding my head and completely sympathizing with the suppressed natives. But to my surprise I found myself imagining what the French reaction must have been when Ho Chi Minh and the fellas declared that they wanted the French to leave and that they could run the country themselves, thank you very much. They must have absolutely wet themselves laughing. Just imagine how humiliated and despondent they must have been to have their asses kicked by a couple of million Vietnamese who were still having problems with the concept of separating their sewage from their drinking water. You really have to admire the grit of the Vietnamese. It’s just a little unfortunate that they won. Although, when you look at the chaos and number of deaths on the road over here you can definitely see the legacy of French colonialism is still alive and kicking.
Well, thats enough of my ramblings for now. I have to rest and compose myself for the Gala X edition. I am also going to start adding some photographic material and perhaps some slightly less vitriolic material here in case I ever end up in court and want to make myself appear to be a decent human being.
Postcards From a Vietnam Labour Camp Pt VIII
It has been a while since my last postcard. Since then we have been up to Hue and Hoi An for a weeks holiday and countless bizarre and email worthy events have happened. I might break this up in to a couple of posts to try and distribute the tedium of reading each them over broader time period.
Something I have always been aware of, but never paid particular attention to, is the way that being in a group can lower individual IQs by a fairly significant amount. I estimate the drop, conservatively, at around 36 points. It seems to be across the board, pretty much everyone who is part of the group is effected, this is how stupid shit like the Cabramatta riots happens. People who weren’t particularly bright to start off with, join up in a group, and are reduced to a thinking capacity so limited that they can’t even work out that the car they are paint bombing or hitting with a baseball bat is, in fact, their own. This same phenomena can occur in really big checkin queues. For some people the IQ reduction brings them to a point where they no longer even understand what it means to checkin as a group.
We had the misfortune to be in a checkin queue at the HCMC airport which was big enough to have a noticeable effect on IQs. Vietnamese queueing behaviour is pretty unpleasant at the best of times, but when IQs drop past a certain level some really hilarious shit starts happening. I have witnessed people who are not even checking in, push to the front of the checkin queue and start up a 5+ minute discussion with the staff member who is supposed to be checking in people’s baggage. The fact that the staff here are so poorly trained that instead of ignoring these idiots and doing their job, they actually engage in conversation and stop processing the already enormous queue, is testimony to the fact that either the airlines are hiring straight out of special school or that the checkin staff are effected by the IQ lowering phenomena also.
On this day we had the tape strips and poles up, creating about 6 or 7 rows and hairpin turns to negotiate before you got to the counter. We were about 1 row from the front when I noticed a Vietnamese lady doing the usual shit they do over here, basically pushing as far to the front as they can get until someone forces them to stop. They routinely push forward like this until someone gives them a firm elbow or punches them. Once this has happened they behave themselves for a brief period of time and don’t appear to hold a grudge against the person who, admittedly with proper cause, just gave them a good belting. But innevitably they will go for it again.
This lady tried to make it past Lily, Jac and I, and frankly after waiting 20 minutes already I wasn’t in the mood to let it go. I put my arm out and stopped her “I don’t suppose you noticed this enormous queue”? I asked gesturing to the crowd behind us which looked to me to be more people than the last Melbourne football game I went to (though I guess that isn’t saying too much). Surprisingly she actually understood me and stopped. “I travel with people” she said gesturing forward. I looked at her dubiously since the indicated 2 people were just about to go to a checkin counter and didn’t seem to notice that they had lost one of their group. I decided that there was no point in pursuing a conversation with her about it and turned away. She slipped forward a couple more places but didn’t join her friends. Her friends were at the checkin as I turned back. I looked at her, she looked at me and I gestured to her friends, she gestured to the people in front of her as if they were restraining her at gun point.
So lets get this straight, she pushed past about 70 ppl, including me, because she is together with a group of people who are already checking in without her… maybe my IQ was being affected because that didn’t make any sense to me, I decided to force her to go and check in with her supposed friends and perhaps explain to her that if she wasn’t actually checking in with them, that their presence in the queue in front of her didn’t endow her with any special privileges. Both the couple and her seemed pretty confused by the whole situation when I marched her up but I had little sympathy for them since I spend most of my time in Vietnam feeling that way.
After we had finally checked in and gotten to the departure lounge we sat down to wait for the boarding announcement. In English it sounds like they have the same boarding calls as they do in Australia and most other countries:
“We’d like to announce that flight xyz to blah di blah will be boarding shortly. Could elderly passengers, those with a disability, traveling with infants, or in need of assistance please proceed to gate blah di blah”. Obviously the rich also count as disabled or needing assistance as first class and business class ticket holders are always included in there somewhere.
The Vietnamese version of the boarding call, however seems to include some extra parts which aren’t in the English version. Judging by the passenger behaviour, I can only conclude that their version went something like this:
“We’d like to announce that flight xyz to blah di blah will be boarding shortly. Could elderly passengers, those with a disability, traveling with infants, in need of assistance or who don’t give a shit about trampling the elderly or disabled please proceed to gate blah di blah”. Obviously, in Vietnam, that means everyone. Jacqui, Lily and I have taken to staying seated until the stampede has passed and the bodies of those unfortunate enough not to make it have been removed, then we board at a more leisurely pace.
As I mentioned earlier I’ll break this up and send our Hue and Hoi An experiences and observations in the next postcard.
Flex Authorize Tag
Posted by adam in Development, Flex on May 22, 2009
It is a very rare event when I am asked to code an application which doesn’t have some security constraints. Most Java MVC frameworks provide some type of role based security for the UI out of the box. No such thing exists in Flex. I decided, after casting about for an existing solution, to write an authorize tag for myself. This component has the following properties which need to be set:
- roles – one or more roles (strings) which are to be evaluated against.
- userRoles – one or more roles(strings) which the user has
- components – one or more components which will be effected if evaluation of roles against userRoles fails.
- type – type of evaluation to be performed one of:
- ‘hasAny’ – evaluates true if userRole exists in any of the roles
- ‘hasAll,’ – evaluates to true only if userRoles contains all roles
- ‘hasNone’ – evaluates to true if userRoles does not contain any of the roles.
- behaviour – the behviour to be applied to the specified components:
- Disable – disables the components if evaluation fails
- Vanish – causes the components visible property to be set to false if evaluation fails
- Collapse – causes the components visible and includeInLayout properties to be set to false if evaluation fails
Here is the code, please feel free to copy it and use it. Any feedback would be appreciated:
package com.express.security { import flash.events.Event; import flash.events.EventDispatcher; import mx.collections.ArrayCollection; import mx.collections.ICollectionView; import mx.collections.IList; import mx.collections.ListCollectionView; import mx.collections.XMLListCollection; import mx.core.UIComponent; import mx.events.CollectionEvent; import mx.events.FlexEvent; public class Authorize extends EventDispatcher{ public static const HAS_ANY : String = "hasAny"; public static const HAS_ALL : String = "hasAll"; public static const HAS_NONE : String = "hasNone"; public static const DISABLE : String = "disable"; public static const VANISH : String = "vanish"; public static const COLLAPSE : String = "collapse"; private static const BEHAVIOUR_ENUM : String = DISABLE + "," + VANISH + "," + COLLAPSE; /** * Roles which will be evaluated against the type rules and user's roles. */ private var _roles : ICollectionView; /** * Roles which the current user has. These will be evauated aginst the type rules and roles. */ private var _userRoles : ICollectionView; /** * Components which will have behaviour applied to them based on the evaluation outcome. */ private var _components : ICollectionView; /** * Specifies the type of evaluation which will be applied to the roles */ [Inspectable(enumeration="hasAny,hasAll,hasNone")] public var type : String; /** * Specifies the type of evaluation which will be applied to the roles */ [Inspectable(enumeration="disable,vanish,collapse")] public var behaviour : String; public function Authorize() { super(); addEventListener(FlexEvent.CREATION_COMPLETE, handleCreationComplete); } private function handleCreationComplete(event : FlexEvent) : void { evaluate(); } public function evaluate() : void { var result : Boolean = false; if (_roles != null && _userRoles != null && type != null) { if (type == HAS_ANY) { result = evaluateAny(); } else if (type == HAS_ALL) { result = evaluateAll(); } else if (type == HAS_NONE) { result = evaluateNone(); } } applyResult(result); } protected function evaluateAny() : Boolean { for each(var userRole : String in _userRoles) { if (containsRole(_roles, userRole)) { return true; } } return false; } protected function evaluateAll() : Boolean { for each(var userRole : String in _userRoles) { if (!containsRole(_roles, userRole)) { return false; } } return true; } protected function evaluateNone() : Boolean { for each(var userRole : String in _userRoles) { if (containsRole(_roles, userRole)) { return false; } } return true; } protected function containsRole(roles : ICollectionView, role : String) : Boolean { for each(var userRole : String in roles) { if (role == userRole) { return true; } } return false; } protected function applyResult(result : Boolean) : void { for each(var comp : UIComponent in _components) { switch(behaviour) { case DISABLE : comp.enabled = result; break; case VANISH : comp.visible = result; break; case COLLAPSE : comp.visible = result; comp.includeInLayout = result; } } } public function get roles():Object { return _roles; } public function set roles(val:Object):void { _roles = convertToCollection(val); evaluate(); } public function get userRoles():Object { return _userRoles; } public function set userRoles(val:Object):void { _userRoles = convertToCollection(val); _userRoles.addEventListener(CollectionEvent.COLLECTION_CHANGE, handleCollectionChange, false, 0, true); evaluate(); } public function get components():Object { return _components; } public function set components(val:Object):void { _components = convertToCollection(val); _components.addEventListener(CollectionEvent.COLLECTION_CHANGE, handleCollectionChange, false, 0, true); evaluate(); } private function handleCollectionChange(event : Event) : void { evaluate(); } public function convertToCollection(value : Object) : ICollectionView { if (value is Array) { return new ArrayCollection(value as Array); } else if (value is ICollectionView) { return ICollectionView(value); } else if (value is IList) { return new ListCollectionView(IList(value)); } else if (value is XMLList) { return new XMLListCollection(value as XMLList); } else { // convert it to an array containing this one item var tmp:Array = [value]; return new ArrayCollection(tmp); } } } }
Migrated Technical Blog
Posted by adam in Uncategorized on May 1, 2009
Hi all. I have migrated my technical blog to redredred
From now on I am only going to use this blog for personal and non-technical posts.
Postcards From a Vietnam Labour Camp pt VII
Vietnamese people have a radically different world view to that of the average Australian. Buddha and luck rules virtually everything that happens in their world. Every shop has a shrine to Buddha, usually with some disco lights around the outside and incense burning on the inside, often with some food or drink in there. I am almost afraid to ask what the reason for this is, I can only assume that Buddha, being such a hearty fellow, is in need of constant snack options and his spirit wanders around Vietnam pigging out on these little goodies. Presumably after a good feed he is then in the right frame of mind for bestowing some good luck on the shop which fed him, in the form of business.
Even the act of driving to work involves a fair bit of faith and a great deal of luck. You can tell by the way that they drive that they generally don’t experience themselves as responsible for, or able to control in any way, the total chaos which is a Vietnamese road. When a truck comes up behind a motorcycle, doing 5 km/hour down the middle of the road, zigzagging around in the usual way, which could be due to complete confusion about where the hell they are going or how to operate their vehicle, or a very clever tactic for avoiding missile lock from any US jet fighters which may not yet know that the war finished quite some time ago, they usually sound their air horn at around 1000db. The bike rider’s usual response to that is either to completely ignore the ear shattering blast and go on attempting to avoid missile lock or else to look over their shoulder with an amazingly mild expression which seems to say “Gosh your having a bit of bad luck right now aren’t you? I hope things work out better for you soon”.
If this scene was in virtually anywhere else in the world, the truck driver would probably get out of his truck with a large iron bar, run up to the retarded bike rider, and beat him savagely about the head. If I were a jury member on the aforesaid truck driver’s trial I would be forced to acquit based on reasonable cause. Over here the truck driver just keeps on honking his horn with a resigned look on his face which seems to say “This is a very unlucky day for me, I wish I had offered some chocolate doughnuts in the disco shrine this morning”.
It should be noted that the truck driver is not the only one experiencing this bad luck, since his horn is so tremendously loud and unpleasant that anyone living within a Kilometer is unlikely to experience any of the inner harmony that worshiping Buddha is supposed to bring. In fact the chances of successfully meditating during one of these constant truck horn shit storms has got to be close to zero. This goes some way to explaining the confused approach to Buddhism, demonstrated by the Vietnamese, which appears to have nothing whatsoever to do with Buddha’s teachings.
My irony meter is permanently redlining over here. Every drive I take and most of my work interactions are so heavily peppered with ironic content it is amazing that I am not permanently sneezing! The unfortunate thing is that most of the time there is no-one nearby that I can share with. Never-mind, it doesn’t stop them from being funny.
This morning for instance I saw a bag lady walking down the street. Now in a country where over 80% of the people can’t afford to run an air-conditioner you might think it is hard to identify a bag lady, but actually the social structure is as obvious here as anywhere I’ve been. Poor (relative to local standards) people just look poor. Poor women, for instance, almost uniformly wear these shockingly floral matching pants and tank-top outfits. It is possible that after the war all the female Viet Cong traded in their black pajamas for a floral matching pants suit and they are still wearing the same ones today.
Down from that level are the bag ladies/men and beggars. They tend to abandon tradition and where absolutely any scungy rag they can find. This particular lady drew my attention. She was not wearing the traditional floral pants suit but instead had obviously thrown together the identifying ad hoc outfit made up of the cheapest crap she could get her hands on. She had the standard, almost offensively bright, floral pants on but a tan coloured sheer top, so sheer in fact that I can’t bring myself to describe in words the front view as she passed me. The rear view, however was what awoke my sense of irony as realized that the cheapest piece of crap that she could lay her hands on was in fact a Dolce & Gabana top with the D & G stitched in in diamantes down the back.
My ultimate irony however, and one that I can scarcely imagine being topped in this lifetime, is that Lily appears to be learning the words ‘fuck’ and ’shit’ not from me, but from JACQUI!!! It’s not that I am actively trying to repress my naturally foul mouth in front of Lily, but for some reason I just don’t seem to feel the inclination to swear when she is around. Jac on the other hand is around her a lot more than me during the day and I guess has more opportunity. She dropped something and broke it the other day and said ‘fuck”! Lily who was running around my feet at the time looked up at me and said “fuck daddy”. I just about wet my pants!
Well, I guess that is enough of my pointless observations for now, talk to you all again soon.
