• Release the hounds

    Have you ever seen those fugitive movies where they have the pack of bloodhounds and they rub some garment in their faces, then someone yells out "release the hounds" and the dogs all go running off in different directions sniffing at the ground and barking. Eventually, the dogs start to converge on the scent (if it's found) and trail the running fugitive. Sometimes the dogs run into water and have to be lead back to the trail on the other side. Sometimes they lose the trail altogether and have to  be leashed back up until a different fugitive is on the run or until the police get a new lead on where to search for this runaway.

    I like this metaphor for agile teams because it really visualizes to me the visceral behavior of a well formed team on the "hunt" for functionality. We're given a scrap of clothing and told to get the whole person based on a brief scent of what it's all about. Hopefully for us we have users we can talk to, customers to talk to, other business people to ask about this functionality.

    Additionally, sometimes we run into roadblocks. Sometimes we hit a barrier so big with a piece of functionality that we have to just pack it up (cancel the sprint) and start a new sprint. Just because this happens, it's not the end of the world. Scrum did you a favor by allowing you to say "hey, this isn't going to work because <this> is in my way".

    I think many times we're so complacent with our organization that we begin saying things like "that's just the cost of doing business" or "well it's worked for 20 years, why change it?" or "that's just how such and such department does their work".

    Sometimes, people see the roadblock and have a snowday while it 'works it self out'. Merely ignoring the problem and cherry picking other items off the backlog to work on. "Yea, i couldn't do that text change because legal is verifying the verbage so i went ahead and fixed that button toggle animation thing that we saw on the product backlog".

    Let us as teams be those excited dogs chasing fugitives down hastily! Don't let us become giant st bernards laying on a bear rug in front of a fire lazily wasting away our day. (i have no idea where i got that, it just sounded like a complacent dog)

    Full story

    Comments (0)

  • Agile: Simple Design

    Let's say that you took your car into the shop, and you wanted to get your oil changed. You sat for an hour or two and you ask the mechanic, what's going on? what's taking so long? he responds "well you hit 40,000 miles so we went ahead and changed the air filter, turn signals, brake pads, brake fluid, did a transmission flush, differential flush, radiator flush, water pump replacement, timing belt replacement, and cleaned out your car. your total will be $1400, it won't be done until next week, and we don't really accept credit cards or checks so if you have cash that would be nice"... you'd be a little upset, don't you think?

    That's where simple design comes in:  In extreme programming, for most general cases we're told to

    1. Use the simplest thing that may work
    2. don't write it if YAGNI (you aren't going to need it)
    3. write once and only once (no duplicate code)

    because it's

    1. easier to understand and maintain
    2. requires the least amount of work
    3. gives the customer the most amount of business value for that iteration (ROI)

    Think back to a time when you were in some code that was highly abstracted and how confusing it looked. (Microsoft's Data Access layer factory for patterns and principles comes to mind). Now try to imagine if you applied that level of abstraction to all of your code, in some grandiose attempt to welcome change throughout the application...

    public class BusinessObject<T>

    {

     public T  Fetch(ObjFactory<T> factory, SelectionFactory<T> selectionFactory){}

    }

    --makes sense but horrible to look at unless you absolutely need something like this, don't do it

    --you may recognize this code, if so.. think "would you need all of this? always? How much bloat am i PAYING to maintain?"

    It would be completely unintelligible very near impossible to maintain (especially with any amount of turnover in your development group)

    Simple design is honestly something that is difficult to implement, because

    A) One person's simple is another person's complex

    B) we've been burned so many times by changes

    C) we may already work with existing complex code

    So what can we do? How can we get started with this simple design?

    1. Get unit testing, preferably automated built+automated testing. This encourages and allows for people to couragously refactor code for it to be simpler.
    2. encourage collaboration, if the team communicates more about how something should work they'll code more alike and legible for everyone.
    3. educate people to follow the 3 XP mantras (simplest first, YAGNI, code once only once)

    Am i saying not to use pre-built components? no, if the most simple and easy to understand thing is to plug in some sort of third party component then buy it and put it in there. The bottom line is the bottom line here... the customer's ROI is the most important thing on our minds with this practice.

    Am i saying that you can't abstract things? in a way, yes... don't abstract until the absolute moment that you need to. If your sprint is to write a printing component that prints to 1 type of printer, then make it print to only that type of printer and move on to the next thing on the list.

     

    Full story

    Comments (0)

  • Please microsoft... more platforms?

    Microsoft really pisses me off. Yea, I’m sure there’s only 10,000 blogs that begin with that sentence, but here’s my explanation. First of all, let’s figure out if we agree on something. Web content is the worst user experience in the world.

     

    If you disagree, then let me just make these comments to try to convince you, but if you still disagree, then I guess quit reading. Web content is generally stateless unless you use some plugin like flash or silverlight. Web content looks different depending on which browser you’re in and requires complex layout via css and javascript to get things to work well on more than just one browser. Web content has to be ‘posted back’ meaning you download the data AND the presentation every time you do any changes on the page (sometimes less with ajax, but again that adds more complexity to development).

     

    If you’re still with me, then you agree that web content is a horrible user experience and in general just a bad way to present your UI. (or you’re just curious what I’m going to say). Either way, the dialog I was having with myself today was “why don’t we have .net winforms or wpf applications that work on every platform, after all, that _IS_ the point of the .net clr right? platform independence.”

     

    One reason came to mind out of several, Microsoft  is greedy. Let’s face it, why would Microsoft go out of their way to develop .net CLRs for openBSD, macs, solaris, etc (forgive me I’m not a unix nerd so I don’t know the cool names for this stuff). There's no money in it for them (directly)

     

    So the answer then becomes, Java. Unfortunately, you still start running into the same problems that you had with the web. It doesn’t look the same on this machine as the other, it runs slow, my user experience is different.

     

    I challenge Microsoft to step up to the plate and make wpf/winforms for gnome, elf, mac (whatever you call all that stuff) and give us a truly platform independent CLR that has a stateful user interface.

     

    Plus WCF/WSE/WebServices that runs in a CLR on unix machines would be nice too.

    Full story

    Comments (0)