Nov 27

Since we had our agile fishbowl at work, we’ve moved ahead with adapting agile practices in our development process. For our projects, we’re working on creating user stories to fill our product backlog. I’ve read several threads on writing good user stories and gotten advice from several people on what makes a good user story, but I never realized how hard it is to actually write good user stories.For user stories, we’re using a format that includes:

  • The role for the story, is it a user, a specific type of user, or a customer
  • The context of the story, describing what the user is doing
  • The want of the story, describing how the feature should behave

The clarity of user stories over requirements is both amazing and overwhelming. The amazing part is understanding the intent of the story in the context of the user and how it affects their usage of the system as a whole. The overwhelming part is negotiating with the stakeholder to ensure both the context and the behavior have been properly captured and an adequate number of acceptance criteria have been defined. While this certainly increases the amount of time spent on a particular story, the number of details revealed by the discussion is well worth the effort.Finding Good ExamplesOne of the stumbling blocks I found when learning to write user stories is finding good examples that go beyond the typical “As an account holder, I want to withdraw money from my checking account so I can buy crack.” These textbook examples don’t really provide a significant level of depth, something I deal with when identifying improvements to an existing system. For example, here is a story that could be written:

As a customer, I want to verify the correct billing codes were included on the claim before sending it to the payer to avoid rejections.

This enhancement to an existing claim submission system might include a number of checkpoints where such a verification could be performed. The context really helps clarify this story to ensure it is properly implemented:

When importing claims, the billing codes in the 2100 loop of the 837 file should be compared to a list of known, valid billing codes and claims with invalid codes should held.

This additional context indicates that the billing codes should be checked when importing claims, a process that likely occurs on a daily basis. It is assumed that the user would then take the list of claims containing invalid codes and correct them in the originating system. This assumption, however, is just that as the story doesn’t attempt to describe any behavior of how held claims should be handled.

When a user is modifying a held claim, changes to the billing code elements should cause those elements to be reverified. If the billing codes are changed to valid codes, the claim hold should be removed.

This one gets a bit tricky. While dealing with the verification of billing codes on a claim, what is really being described is a new behavior. In my eyes, this means it is a different story.

As a user, I want to be able to correct the billing codes on a held claim so that I don’t have to re-import the claim for it to be sent to the payer.

Here we are describing the new behavior — the ability to modify the billing codes on the held claim. For this story, the previous context would be more applicable since it is dealing with the user activity of modifying the billing codes on a claim.Stories That Aren’t User StoriesSo what about things that are needed to support the above stories? No, really, that’s a question since I don’t have a really good answer at this point. Do you write a story to import a list of valid billing codes? Or do you write a user story to automatically download and import a list of valid billing codes from the payer every night? Where do those system-level stories go and how are they written? There really isn’t a role associated with the story, so I’m still struggling with that type of story.One such example might be something like:

As an application administrator, I want to be able to import a list of valid billing codes so that I can update the verification tables.

The context of such a story might include:

When an application administrator uploads a file containing billing codes, the existing billing code table should be cleared and the new codes added.

OnwardI didn’t really get into acceptance criteria in this post because that in itself is a series of posts. I will mention that having a deep set of acceptance criteria on a story will make it easier to estimate (size) the story, as well as improve your chance at success in implementing the story.If you as the reader have some good examples of stories that aren’t associated with a particular role, please share them in the comments as I’m really looking for some better examples of how these stories would be written.

Nov 12

Last week I decided that I’ve read enough, been exposed to enough, and gotten as far as I can get with agile software development without actually doing it. So I went in to our senior management and shared my experiences from the past few development events with them and managed to convince them to try and adapt some agile practices into our development process. By bringing forth the pain points we have during development (unknown status, slipping deadlines, inaccurate estimates, excessive impact from changes, etc.), I started to explain how we could gain greater transparency to our development process using certain agile practices.

After a few preparation meetings and a lot more discussion I introduced story writing and planning poker to the group today. I haven’t gotten enough feedback yet, but we are going to continue fleshing out our first batch of stories to fill our product backlog. Once we’ve collected some stories, we’re going to estimate them to get some experience with the process. If all goes well, I expect we’ll start our first iteration next week.

I’m encouraged so far, but there is still a lot of work to be done.

Nov 07

In my usual morning loop, I found the following tweaks to enable to Debug menu in Safari. In Leopard, Safari 3 debugging tools have gotten some serious love — I mean serious love. Let’s take a look!

First, you have to enable the debug menu on Safari. In Terminal, enter the following:

% defaults write com.apple.Safari IncludeDebugMenu 1

Once that is done, open safari (if it was running, it may need a restart) and notice the new Debug menu appended to the end of the standard menu. From here, you can open the web inspector and the world just opens up. There is so much stuff in here it’s hard to cover it all, but the features are deep. One of my favorite views is the network view that shows a timeline of the page load to find slow spots:

It’s pretty deep, I like it. I’m going to spend some more time with it, but I figured I would share it with those Mac dudes that are always into cool stuff.

Oct 27

I’m writing a presentation on dependency injection with Castle Windsor to give at work this coming week. I’m going to present it at a lunch and learn for the software developers in our department. It should be interesting, I’m curious to see how it goes. If all goes well, it will be the first of a series that I’m going to put together.

Once I have the content and have run through it, I’ll post the samples and text here for everyone to enjoy. While it is introductory in terms of DI/IoC, it’s a fairly advanced topic compared to general programming topics. Should be fun!

Oct 19

Tulsa TechFest 2007 started this morning (well, last night if you’re a speaker) and there is a huge turnout for the event. There are so many people spread out amongst all the tracks — much more than last year.

I started off the morning with a game of Guitar Hero II in Chris Koenig’s booth. Nothing says happiness like pounding out a couple of tracks to start the day. A majority of the morning activities consisted of registration, sign-in, announcements and keynotes. The first session started at 10:30 AM, which is when I gave my talk on MonoRail.

I had a decent turnout for an obscure framework and was happy with the talk. There was some good discussion on the parts around the framework (Windsor, NHibernate, ActiveRecord), and a lot of good questions. I forgot to put together an example on ViewComponents, so I’ll likely write a blog post in a few days about how to build one.

Lunch was quick, I think the pizza to developer ratio was slightly underestimated, but we could all use on less slice of pizza now and then. This afternoon looks to be packed, so I’m on to the next event.

Oct 15

This weekend I will be giving a presentation on MonoRail at the second annual Tulsa TechFest. The event is packed with technical information for anyone in IT including a variety of tracks on security, networking, software development and management.

Last year I talked about using Microsoft’s new ASP.NET AJAX (previously Atlas) tools for building browser-based applications, as well as how to leverage the tools with asynchronous web services. This year I’ve chosen to present a getting started level introduction to MonoRail. With the Microsoft announcement of an MVC framework (System.Web.Mvc), it’s no doubt that there will be a lot of interest in what MVC is and how it differs from regular WebForms development.

The excerpt for my talk reads:

MonoRail is a different way to build ASP.NET applications that enforces the separation of concerns. Built using the model-view-controller (MVC) pattern, MonoRail uses controllers to handle application flow, models to represent data, and views for presentation. The end result is a web application that is maintainable and testable. This session demonstrates how to get started using MonoRail quickly and easily.

If you are anywhere near Tulsa, I highly recommend attending the free event this weekend. There will be a ton of technical content, free lunch, giveaways, and a whole lot of nerds. If you are shopping for a job, I can absolutely guarantee that there will be several consulting firms looking for developers to fill out their staff.

Oct 09

Refactoring applications can result in a large number of changes across the entire code base. Changes that result in a new method signature or additional properties on classes can reach far and wide in your application code.

This can be a particular pain when you realize a month later that the code change was not the best design choice. What makes it worse is over 150 files were changed, a mix of .cpp, .h, .idl, .cls, and .asp — basically a rainbow of technologies. At this point, you start to think, “Can my version control system undo my mistake?”

I’ve been using various forms of version control for 18+ years. I’ve been using Subversion for just over a year. No version control system I have used could handle the task of yanking out a revision in the middle of a history chain. Hell, most version control systems I’ve used don’t think of committing 150+ files in one operation as a single revision. But, Subversion is cool, let’s see what it can do.

I right click on the trunk, TortoiseSVN->Show Log. Okay, so far so good. I found the commit that had all the changes in it. In the revision list at the top of the window, I right-click and select Revert Changes from This Revision. “Do you really want to revert changes from this revision?” Hell yeah, I’m bold.

Waiting. Waiting. Okay, done.

I check my working copy (Subversion is notoriously smart about making changes to your working copy and only actually writing to the repository when you commit) and lo and behold the interface changes are all gone! The best part, the reason I’m writing this post, is that all of the changes after that revision are intact, including changes to the affected files. I’m not joking, this actually worked exactly as I had dreamed.

I started NAnt, waited for the results, and everything worked as expected. All the Visual Basic 6, Visual C++ COM objects, all the interface libraries, classic ASP pages, they all just worked. I called a couple of coworkers over to share in the joy. I’m not kidding, I never expected this to work. And Subversion came through with flying colors.

I’m going to double our Subversion budget for next year — oh wait, I forgot that Subversion is free.

Oct 03

What? Microsoft releasing the source code to the .NET Framework? Won’t this help Mono achieve their goal of duplicating the API on other operating systems?

I’m very happy to see this happening. I think it’s a major help for the growth of the framework in general.

I personally think they are doing this because of things like Silverlight 1.1. By creating a browser plug-in that enables the execution of CLR code written in C# on multiple platforms, they are already putting effort into multi-platform support for their development tools. Opening the source to the public eye will only help in the long run as the community finds problems and blogs about them, allowing Microsoft to get more feedback on their work.

The biggest push I get to design systems in Java is the multi-platform issue. Corporations often times don’t want to have their hand forced into relying on Microsoft for their back-end server systems. Words like scalability and uptime and typically thrown around when .NET is discussed. Having the ability to run CLR-based applications on multiple platforms would help drive some of those discussions towards real issues like developer skill sets instead of the bullseye on .NET’s head.

I’m glad to see this announcement, I definitely see it adding value to VS2008.