Monday, 30 April 2007

QCon 2007 - What I learnt about process - Part 2

Going through my notes I discovered this useful map of an agile life-cycle. I think it came from Rachel Davies's session on user stories.

Agile project life-cycle

As text it reads:

Bird's eye view of life cycle


  • business domain
  • technology
  • process
  • scope
Keep as short as possible (< 2 weeks)

Release planning - create roadmap of releases
  • May not happen until some initial iterations
  • Flesh out plan as you progress
  • Deliver high risk / high value items early
  • Set concrete release dates but vary features
Production - aim is to arrive here ASAP

Planning phases

Customer needs
Implementation considerations
Implementation tasks
Estimated task list
Customer reviews effort vs. necessity

UI Design is often done an iteration ahead,
to help users & team understand what is required

QCon 2007 - What I learnt about process

A post in a series that summarises what I learnt at QCon 2007.

This post focuses on development processes.

For a mind map version, click here QCon 2007 Process Notes

Inspiration came from the following excellent sessions:

Implementing change

  • Have retrospective to establish SWOT's to address
  • Prioritise cultural changes each iteration / project
  • Do simple things well, then focus on clever/hard things

Agree on principles as early as possible, e.g.

  • design
  • unit testing

Key success ingredients are

  • Encapsulation
    • Classes should "keep secrets"
    • Tell, don't ask
    • Prefer private over public
    • Leads to more readble code
    • Keep the domain model clean of non-domain code/entities (e.g. UI, DB)
  • Do the simplest thing that will work (not the same as doing the easiest thing)
  • Making code test driven: lowers cost of change
    • Test for required behaviour not implementation
    • Refactoring is the second leg of TDD (first being testing)
  • Growing better developers is best investment that can be made in a team

Use risk maps

risk map

Bridges and ferries

  • Bridges:
    • Promote activities that build bridges between developers and the business
    • Encourage activities that have feedback
    • Minimise "distance between" developers and the business
    • Consider co-locating developers and end-users
  • Don't build "ferries", that distance or separate developers from the business

User stories

Less is more

  • Tool for collaborative planning, i.e. purpose is to encourage communication between stakeholders
  • Facilitates collabrative dynamics, via the 3 C's:
    • Card
    • Conversation
    • Confirmation
  • Can exist alongside more formal and comprehensive documents
  • Aim is to write less sooner, to minimise cost of change
  • Sometimes prior analysis should be done to understand problem domain, before moving onto stories

Why's and how's of a story

  • System "commisioner" provides "why's"
  • End users can provide "how's"


  • As a I need so that .
  • e.g. As a book buyer I want to find a book by entering the ISBN number, so I can locate it quickly
  • OR simply state user goal


Minimise "work in progress" - "Done" means system and acceptance tests pass

Minimal process

  • Artifacts
    • Product backlog
    • Spring backlog
    • Burndown chart
  • Meetings
    • Sprint planning
    • Daily meeting
    • Sprint review
  • People
    • Product owner
    • Scrum master
    • Team


Include rollout script for use by Operations.

QCon 2007 - References to follow up on

Various resources that I haven't got round to looking at yet, but are worth doing sooner...

Adding tagging to dokuwiki

This wasn't as straight forward as I'd hoped, but we achieved it in < 1 hour.

We used the tag plugin for dokuwiki. Installing this (and its pre-requisite plugins, feed and pagelist) was easy.

Initially I couldn't get the topic feature (that shows pages with a tag) to work - it resulted in a blank page. This was traced to curl not being installed. Doh!

The easy fix was (detailed at the curl site):
  1. Get the required binaries (php_curl.dll, libeay32.dll and ssleay32.dll).
  2. Ensure the latter two binaries are in the PATH.
  3. Uncomment the curl extension in php.ini.

Friday, 27 April 2007

QCon 2007 - What I learnt about architecture

This is the first post in a series that summarises what I learnt at QCon 2007.

This post focuses on solution architectures.

For a mind map version, click here QCon 07 Architecture Notes

Inspiration came from the following excellent sessions:

Replacing Amazon's architecture

  • Monolithic application to SOA
  • Took 6 years
  • Cost $2 billion
  • Only 30% of cost delivered visible business value
  • 70% was on the "heavy-lifting"

Architecture relates to

  • how it runs
  • how it fails
  • how its developed
  • how it changes during
    • development time
    • run-time

Architecture is interwoven with the development process

Operational manageability

  • Design for
    • operational configuration
    • operational monitoring
    • failure (no SPOF's)
  • Maintain clear dependencies

Design up-front the parts that are costly to change

  • Reduce the significance of remaining decisions
  • Defer decisions to the last responsible moment
  • Metric is cost of reversing decision
  • e.g.
    • testability
    • security
    • maintainability
    • performance
  • Its like putting stones in a bucket.
stones in buckets

How much up front design (UFD)?

  • BUFD - Big
  • RUFD - Rough
  • NUFD - None
  • Time spent should be inversely proportional to
    • Knowledge of domain
    • Experience in design


  • "A stable architecure is not the same as a frozen architecture"
  • "Doing the simplest thing that works is not same as doing the easiest thing"

Tuesday, 24 April 2007

Setting up dokuwiki on IIS with integrated authentication

Having enjoyed the benefits of MediaWiki, at my previous employer, I've been keen for some time to set one up a my new place. A friend of my recommended dokuwiki, which stacks up well against others.

Setting up was fairly easy, but as there were a few gotcha's, here's what worked for me.

The mix

  • IIS on XP Pro SP1
  • PHP (latest version at time of writing)
  • dokuwiki (latest version at time of writing)
  • Active Directory

The recipe


  1. Install PHP (used the Windows installer, despite recommendations against it). During the install process, selected to use the ISAPI server version and just the GD2 extension.
  2. Followed Peter Guy's excellent instructions for remaining configuration and testing.
  3. If you can, put php.ini under source control - it does require tweaking, which is worth tracking, i.e. in addition to the changes in step 2, the SMTP server needs pointing to the desired mail server.
  4. If you want to use integrated authentication, remember to uncheck anonymous access and check integrated authentication (see below)!
  5. NB: Don't skip the testing step - this may well save you grief later!



  1. Unzip the download and point the default web site at the dokuwiki folder.
  2. Follow the dokuwiki instructions.
  3. Remember to move/rename the install.php script once you've set it up as you like it.
  4. Place all of the dokuwiki under source control, noting that conf/local.php will require to be editable if you configure dokuwiki from the configuration web page. Note also that using the web page can overwrite any manual changes to local.php, though it does attempt to include a second configuration file (local.protected.php) that such changes should be placed in.

Getting integration authentication to work

  1. Setup basic authentication so that you have a handle on how this works - this is a useful fall back position. Dokuwiki instructions are excellent.
  2. Using the ACL configuration page, create two acls: one for editors, one for readers. These are written to conf/acl.auth.php. The editor group name can then be used to match against the Active Directory group that you wish to give edit rights to. E.g. if you just want your developers to have edit rights and they exist in an AD group called "Development", create an ACL entry granting all access to a new group named Development, and change the ALL group access to read-only.
  3. Follow James Van Lommel's excellent instructions on getting LDAP to work. Note that you may require to set the credentials that are used to connect to ldap, should anonymous authentication be disabled.
  4. local.conf (or rather local.protected.php, as this is not overwritten) needs the following added to pick up the users credentials (taken from the dokuwiki ldap page):
if (isset($_SERVER['AUTH_USER']) and !isset($_SESSION[$conf['title']]['auth']['info'])) {
 list($d, $username) = split("\\\\", strtolower($_SERVER['AUTH_USER']), 2);
$_REQUEST['u'] = $username;
4. inc/auth/ntlm.php requires the following change (also taken from the dokuwiki ldap page):
function auth_checkPass($user, $pass){
// verify that IIS has authenticated this person via NTLM
if(isset($_SERVER['AUTH_USER']) and isset($_SERVER['AUTH_TYPE'])) {
return true;
return false;
If you're using Firefox to access the wiki, then my earlier post about NTLM authentication and Firefox may be of interest.

Implementing nice url's

dokuwiki provides instuctions for displaying nice url's with Apache, but none for IIS. Fortunately James van Lommel has already figured out using mod_rewrite for IIS. At the time of writing, the mod_rewrite website was unavailable, so I stuck with James's configuration, but used the free version of ISAPI_Rewrite instead. Having dokuwiki as the default website meant the following httpd.ini settings worked for me (note the addition of the idx handler, as James's configuration didn't handle indexes for namespaces).

RewriteRule ^/_media/(.*)\?(.*) /lib/exe/fetch.php?media=$1&$2 [L]
RewriteRule ^/_detail/(.*)\?(.*) /lib/exe/detail.php?media=$1&$2 [L]
RewriteRule ^/_detail/(.*) /lib/exe/detail.php?media=$1 [L]
RewriteRule ^/$ /doku.php [L]

RewriteRule ^/lib/(.*) /lib/$1 [L]
RewriteRule ^/(.*)\?do=(.*) /doku.php?id=$1&do=$2 [L]
RewriteRule ^/(.*)\?idx=(.*) /doku.php?idx=$2 [L]
RewriteRule ^/doku.php\?id=(.*) /doku.php?id=$1 [L]
RewriteRule ^/(.*) /doku.php?id=$1 [L]

Monday, 16 April 2007

Diffing .Net assemblies

As we're about to commence a major .Net phase at work, I know that this is something I'll be needing to do.

Scott Hanselman has provided a great post (as ever) on the subject, which I'm posting here so I don't loose track of it: Managing Change with .NET Assembly Diff Tools