Friday, November 18, 2011

Executing all SQL files in a folder

SET dbName=RemmicomMeetingDb
SET sqlCmdCommand=sqlcmd -S . -E -i

%sqlCmdCommand% "DropAndCreateDb.sql"

FOR /F %%i IN ('dir /b /on *.sql') DO %sqlCmdCommand% %%i -d %dbName%

Monday, November 07, 2011

Incremental Software Delivery

What i see occur quite often is that User Stories are to big, resulting in work that is not done at the end of the sprint.

Lets take a look at the story below:


As an office manager I would like to be able to lookup contacts quickly so that I can quickly find someone's contact details.

clip_image001[1]

Acceptance criteria

  • Given an Office Manager enters "como" When I press the search button Then he/she should see the contact details of everyone who's full name contains "como"
  • Given an Office Manager enters"ce" When I press the search button Then he/she should see the contact details off everyone's title containing "ce"
  • ...

Now if we think about this for a second, we could start to break down the tasks as follows:
  • Create the database tables
  • Create the data access layer
  • Create the DTO's
  • Create the UI
  • Create the service layer
If we stop and think about this a second it does not really make sense in a incremental delivery mindset. If you reflect on this from a Form Follows Function Perspective, that the shape of an object should be based upon its purpose. This is a faulty breakup of the feature we are trying to build, since we are going to make the purpose - storing the data in a database and then transfer it to a screen - take precedence over the function, searching contact details.
It makes more sense tobreak up the screen in functional components as shown below:
clip_image002
Then we could break the feature up as follows:
  • Display Search Results
  • Enter Search Criteria
  • Display status message "x out of Y contacts"
This will require developers to shift there mind from "Horizontal thinking" - thinking in terms of technical layers, to vertical thinking - what I often refer to as "Slicing the Cake". This enables you to incremental delivery of features and get earlier feedback.
The most important thing is the green grid displaying the search results. From a technical perspective this seems a bit weird, since we autmatically think that its not usable once we have hundreds of contacts. But this mindset is wrong, it is workable, whether its practical that is another thing.
If we would take this approach we could deliver the following screen to the Product Owner:
clip_image003
If he can get his hands on this he can allready take a look and maybe he could allready experience this bit of functionality and conclude he would like to add some fields to the grid like email and phone, that he did not think of immediately.
So an extra task is added to the story "Add email and phone fields to the grid"
In the meanwhile wile the product owner is allready playing around with the screen we can allready add the yellow part to the screen:
clip_image004
This will enable very short continuous feedback loops, moreover working like this will help you deliver functionality sprint after sprint.
This is what the end result could look like
clip_image005
As you see apparently there was no more time for the status message at the bottom of the screen and this task has been removed from the story another change from the initial version is also the "Search" button.
Find here an overview of what was implemented and what was removed:
As an office manager I would like to lookup contacts quickly so that I can quickly find someone's contact details.
  1. Display search results: Done
  1. Enter Search Criteria: Done
  1. Display status message "x out y contacts": removed
  1. Add phone and email fields to the grid: Done
  1. Filter results grid when typing text: Done
  1. Remove search button: Done
There is one caveat with this approach, business user tend to like alot to add stuff, but they really dislike removing stuff… But this is where the timebox principle kicks in, if for instance there would be no more time left than the 2 last tasks (tasks 5 and 6) than the Product Owner might still choose to accept the story as done and the Functionality could potentially be shipped.