Pages

Tuesday, 22 December 2009

Muzzling an Angry Dog

I've been setting aside as much time as possible recently to read Michael Feather's Working Effectively with Legacy Code. A large amount of our code-base for one product is very much in this court and now, unfortunately, needs dealing with. Luckily, though, the more I refactor this type of code the more I realise how much I enjoy it.

I was explaining some of the governing principals to a colleague today...

  • "First you have to get your legacy code into a test harness, then you can safely alter it."
  • "OK."
  • "However, you'll need to alter it before you can do that."
  • "Huh?"

I have come to the conclusion that Working with Legacy code does not so much involved harnesses as muzzles. It is akin to Muzzling an Angry Dog. First, you have to sneak up to it, from behind, without making any noise or disturbing it's environment. Then, once the muzzle is safely on you can relax and poke it as much as you like. From now on, our estimates will have a 'Dog Muzzling' factor added to them.




[And, no, I do not condone taunting any dog, angry or otherwise.]

Tuesday, 8 December 2009

Annual Company Review

We have just had our annual Company Meeting today - accompanied by some stellar Italian food. Part of my presentation was to review our development achievements over the past 12 months. In December 2008 we were using Visual Studio 2005 and Visual Source Safe - and that was pretty much it. Today, just 12 months later we have implemented the following:

  • Visual Studio 2008 Developer + Database Editions
  • Team Foundation Server 2008
  • TFS Source Control
  • Continuous Integration Server
  • Nightly Builds
  • Fully automated build and deploy to test servers
  • Unit Tests (20% Code Coverage so far)
  • Code Reviews
  • 2 projects using Scrum
We now score 10 / 12 on the Joel Test.

Wow, what a difference a year makes!

Monday, 7 December 2009

Moq Setup Causes Compiler Error CA1506

I have been using Moq to help enable some unit tests and I've been getting intermittent build exceptions caused by the Code Analysis engine when calling the Setup method of my new mock object.

Example:

var mock = new Mock<IDoSomething>();

mock.Setup(x => x.DoSomething());

CA1506 is raised as a warning to Avoid excessive class coupling. This is, obviously, a little strange. Stranger still is that this warning results in a compilation error.

Anyway, it's a bug in Visual Studio. The workaround is just to remove this check from your Code Analysis (goto Project Properties | Code Analysis | Maintainability Rules and uncheck CA1506).

Wednesday, 18 November 2009

Reach Out and Touch A Developer!

I can only imagine what you're expectations are of this post given the title! You may be reading this for entirely the wrong reasons. If so, remember, Google is your friend.

Over the weekend I caught the DDD bug and started buying books, subscribing to blogs etc. As part of my random hops I stumbled upon Stephen Oakman of The Agile Workshop. He says in his Contact Us page that anyone is welcome to just pop in if they're passing. Having found myself in Cambridge yesterday lunchtime I did just that. Bit of a risk || leap of faith but I thought, hey, why not?

Turned out to be a fantastic use of a lunch hour. Once they'd gotten over the shock of someone actually taking them up on their offer we settled into some truly geeky discussions.

So, why on earth am I blogging about this?

Simple: if you work remotely you need to actively build a network of peers.

With the advent of Skype, Mikogo etc. remote working has never been so productive; but a developer in this environment still won't have a pool of knowledge comparable to, say, working in a large, office-based company. The guys at The Agile Workshop not only make half-decent coffee but seem pretty spot-on in many fields of software development that I am passionate about. They also loaned me a raft of books from their 'library', which I will return - honest :).

Here's to a mutually beneficial relationship.

Tuesday, 3 November 2009

2 Week Sprints!

Both of our applications that use the Scrum development framework have now halved their iteration cycles from 4 weeks to 2 weeks.

This felt rather daunting at first. I was worried that there just wouldn't be enough time to actually develop something of billable, business value for our customers. However, I have been pleasantly surprised by the universal acceptance of this change. Developers, analysts and managers all report to less confusion about the relevant content of the Product Backlog - this has many cross-overs with some Getting Things Done principles regarding removing clutter.

With this one simple process change we now feel much more 'sprinty': able to really focus on a smaller number of work items. We have also doubled the amount of feedback measured and adaption possible; velocity is also more meaningful.

So, highly recommended. I wonder if we'll move to a one week sprint as Ken Schwaber currently recommends? Xtreme sprinting!

Thursday, 22 October 2009

DevExpress CodeRush and Refactor! Pro Review

I've been taking a look at this 2-product package from DevExpress over the last couple of weeks. These are my findings...

Pros
  • Adding cyclomatic complexity numbers to the left-hand margin of members was very nice. This gives you immediate awareness of whether your method needs to be refactored.
  • The Metrics window allows you to see any of the 8 measures for an entire class and then double click a member to dig down into the code. This I liked a lot.
  • Adding contracts to methods was reasonable.
  • Automatically greying out unused or unnecessary code (including namespaces, contexts and members) was very nice.
  • Inline ability to suppress suggestions for a varying scope was good.
  • Pull Member up. Lists parent classes to move a member to.
  • "Introduce a using statement" (to an IDisposable object) worked extremely well.
Cons
  • Initial thoughts are that it hides poorly written code and, thus, detracts from Craftsmanship.
  • I removed all the vertical connecting lines - far too messy.
  • The suggestion to make some variables inline was wrong. It makes the code harder to understand and, anyway, the compiler will do it.
  • The jump / break / return pointers are interesting and pretty, but it simply validates overly complicated code.
  • The suggestion to replacing objectName + ".sql" with string.Format("{0}.sql", objectName) is not necessary. Strings are, indeed, immutable; but you can concatenate them efficiently during the instantiation.
  • Suggestions to remove this. from variables - I didn't like that. I don't qualify methods with this, but I do for properties and fields. It would have been nice to separate the features.
  • I removed the Region Painting functions as it was less clear than VS's inbuilt features.
  • Disabled the Structural Highlighting. If you need an icon next to the word private to tell you that it's private then you really shouldn't be a developer!
  • Circular suggestions. Having converted a newed-up object to use Initialisers it then changed the suggestion to decompose it!
Wish List
  • A prompt to automatically end a #region. including the text e.g. #endregion Constructors.
  • Context-sensitive help in the Options dialog please.
  • Ability to add multiple metrics rather than just Cyclomatic Complexity or Line Count etc. to the left-hand margin of classes.
  • In the Option dialog identification of Level in the tree view would help.
  • A refactoring routine to create the protected On() method for events.
Conclusions? Well, overall, not bad at all. I thought I wouldn't like the interaction and the perceived lack of control; but it was actually pretty easy to use. It does take a while to learn. You just have to get stuck into some code and see what it suggests. Soon you'll find yourself wondering whether it can do xyz for you - normally it can. I, personally, will be keeping it.

My biggest fear is that too many of the features are there just to mask bad code design.

Tuesday, 20 October 2009

TFS 2010 Beta 2 - Basic Edition

Just a very quick to note about the new version of TFS called 'Basic'. Lots of people blogging about it but, for me, the biggest feature is it's ability to install on a non-server OS.

Very cool.

Now you can run a local copy (with all the loveliness you're used to) for all those little projects that aren't really the property of your employer!

Sunday, 18 October 2009

A Fireside Conversation

"I had a wonderful dream last night."

"Tell me more" you say as you lean a little closer.

"Well, I dreamt that I lived in this wonderful fantasy world full of unicorns and faeries. Every day was perpetual spring and the streams ran clear and cool. I had two close neighbours and each morning one would bake bread and the other would fry bacon. Disease and crime were a thing of the past. Best of all, though, was that every public member of Microsoft's entire Base Class Library now implemented an interface."

"No way!"

"Seriously, the unicorns were beautiful."

"No, I mean the bit about the interfaces."

"Really? What, you find the rest of my utopian landscape somehow more plausible?"

"Um... yes."

"Hmm..."

"But now you mention it; that would be quite something. Imagine how easy IoC and DI would become? Unit Tests would flow from our fingers like olive oil. Simple, elegant Adapter Patterns would fill the skies like flights of swallows."

"I can almost see them."

"It can't be that difficult, can it?"

[Pause]

"Anyway, another pint?"

Tuesday, 13 October 2009

Enabling Code Coverage on TFS Build Server Without VS Test Edition

Back in May 2009 I exchanged a number of emails with Buck Hodges regarding Code Coverage on my build server. Here's my original blog: Oi Microsoft, this IS part of Development!. Basically, the upshot was if you don't have Visual Studio 2008 Test Edition installed on your build server you will not be able to run Code Coverage as part of your automated builds.

Well, I've now managed it.

To be honest I'm not exactly sure how this happened! Inside my Default.TestRunConfig file I had my main (ASP.Net MVC) project enabled. Recently, I have added more projects to my solution and their respective \bin\debug\ dlls have been automatically added to the Code Coverage list of artifacts to instrument. I then noticed that Code Coverage results were appearing in the build for these new libraries. No coverage for my main project though. The final stage was to remove the Code Coverage reference to the main project and, instead, target the resultant dll.

I now have full unit testing and code coverage on my entire solution - a result that, apparently, can't happen.

Wednesday, 7 October 2009

Dependency Inversion Pattern Clarification

Given the following 2 dependancy structures...

interface IDependancy
{
}
class DefaultDependancy : IDependancy
{
}

... I have seen many Dependency Inversion (DI) patterns implemented in the follow way...

class Worker
{
    private IDependancy _dependancy;

    Worker()
        : this (null)
    {
    }

    Worker(IDependancy dependancy)
    {
        if (dependancy == null)
            _dependancy = new DefaultDependancy();
        else
            _dependancy = dependancy;
    }
}

I'm also guessing that you've probably gotten this far, thought "seems about right" and are about to flip back to see if anything new's happened on Twitter? Well, hold on - 'cos you're wrong!

The problem with the above scenario is that it doesn't correctly convey the intention of the pattern. The content of the non-default constructor is being asked to cope with two, entirely different, situations.

  1. "Did the client intentionally, and knowingly, call the default constructor" or
  2. "Did the client call the non-default constructor directly and accidentally pass in a null reference?"

This is a perfect recipe for the most wonderful 'managed' error: NullReferenceException. This will be made even more troublesome if you haven't yet switched to using small methods as you'll have no idea what's null. Enjoy!

So, here's what you should be doing ...

class Worker
{
    private IDependancy _dependancy;

    Worker()
        : this(new DefaultDependancy())
    {
    }

    Worker(IDependancy dependancy)
    {
        if (dependancy == null)
            throw new ArgumentNullException("dependancy");

        _dependancy = dependancy;
    }
}

Now we know that if the non-default constructor's sole parameter is null then it's because there's a problem. Actively throwing our own ArgumentNullException also allows us to take control of the situation and name the offending variable.<

This simple change removes any ambiguity in your code and makes your intentions abundantly clear.

Wednesday, 30 September 2009

Can Distributed Teams be Truly Creative?

As I've mentioned before, I lead a distributed, UK-based development team. We have been using this model for a number of years now and have produced and shipped a number of quality, profitable products.

I spent all of yesterday in the same room as another developer as we blue-sky-brain-stormed-out-of-the-box (!) some solutions for an ongoing problem. What I noticed most was how easily ideas started to flow when we were both just walking around the same home office, sipping coffee, tossing a rugby ball and occasionally glancing at the same screen.

Now, we are an Agile company - and I'm not just paying lip-service to this morning's most fashionable meme. We ship regularly and often, we Scrum every morning and we hold retrospectives after every 4 week sprint. However, are we missing something? Are we missing an environment that creates those sparks of genius that turn a profitable product into a remarkable product?

Working from home has some enormous advantages:
  • No daily commute.
  • Perfect, individual working environment.
  • Flexible hours (being home for the delivery or boiler service).
  • No overtime barrier. It's easy to stop at 6pm, put the kids to bed, walk the dog and dine with your wife then carry on with work immediately after.
  • ... the list goes on.

How, then, do we combine the benefits of home-working with those of being in the same room? My understanding is that teleportation is still some way off. There is also the issue of cost. Do we rent more office space that we can sporadically utilise? That would seem like an unwarranted overhead.

I apologise if you've now read all this way, made a temporal investment in this article and are just waiting for the payback answer... cos there isn't one! Sorry.

In my defence I think my development team will be meeting more regularly and we'll see what that spawns. I will update this post as and when I discover new solutions. Alternatively, contact me with your ideas and we can start building a list of suggestions.

Saturday, 19 September 2009

Microsoft WinQual - An Oxymoron?

Microsoft has a website dedicated to helping partners develop and test quality software that targets their platforms. Unfortunately, they don't seem to have been dog-fooding their own standards.
  1. Their site is not internationalised. I live in the UK and, as such, I would like my dates to be dd/MM/yyyy and my words to have significantly less 'z's, thank you very much.
  2. It has a headline banner stating that the entire site will be offline the 2nd Tuesday of every month for 'future planning'.
  3. If you forget your password it emails your company's administrator asking them to reset it for you. Imagine my surprise when I received an email requesting that I reset the password for myself!
  4. I am currently trying to submit our test results to certify one of our products as 'Compatible with Windows 7'. Unfortunately, "The Windows Quality Online Services Web application is temporarily unavailable. Please try again later."
  5. The site only works with IE6 or higher (no support for Opera, Chrome, Safari or Firefox).
  6. Finally, they provide 64- and 32-bit versions of their self-test software. After spending quite a few hours running through the 32-bit tests (as Virtual PC doesn't support 64-bit OSs!) I was delighted to receive the following message from the website: "This site only supports 64-bit submissions."!
As a small company these acknowledgements are very important in allowing us to play with the 'big boys'. Come on Microsoft, a little help?


Follow up...

To top it all I've just tried adding the tested product to our Gold Partner status to increase our points tally - but it fails. The submission ID does not match their database records. Luckily the WinQual site has a satisfaction survey on the main page, so I thought I fill it out and submit some feedback. Yep, you've guessed it - "Page Not Found".

And finally...

Apparently the reason my partner program won't recognise the submission ID is that it takes a minimum of 15 days for the services to sync with each other. I'm sorry, this is still 2009 isn't it!?

Thursday, 17 September 2009

Why you shouldn't call Abstract Methods from your Constructor

Calling abstract methods from your constructor is bad practice as it denies your concrete class any opportunity to set itself up. This is particularly noticeable in IoC situations (e.g. Unit Testing). Here's an example...

abstract class BaseClass
{
    public BaseClass()
    {
        Setup();
    }

    public abstract void Setup();
}

class ConcreteClass : BaseClass
{
    public ConcreteClass()
    : base()
    {
    }

    public override void Setup()
    {
        // TODO: add setup code here...
    }
}

Well, that will work fine. But what if ConcreteClass is tightly coupled to another class. For instance, it could access the Configuration class...

class ConcreteClass : BaseClass
{
    public ConcreteClass()
    : base()
    {
    }

    public override void Setup()
    {
        string setting = ConfigurationManager.AppSettings["MySetting"];
    }
}

Again, no problems here. However; ideally, we would like to remove this tight coupling by implementing an IoC pattern...

class ConcreteClass : BaseClass
{
    private IConfigurationManager _configurationManager;

    public ConcreteClass()
    : this(new DefaultConfigurationManager())
    {
    }

    public ConcreteClass(IConfigurationManager configurationManager)
    : base()
    {
        _configurationManager = configurationManager;
    }

    public override void Setup()
    {
        string setting = _configurationManager.AppSettings["MySettings"];
    }
}

And this is where the problems arise. The Setup() method will now throw a NullReferenceException because the ConcreteClass's constructor has not been allow to run before its own instance methods have been called!

Unfortunately, there is nothing in the C# compiler or Code Analysis tools (to my knowledge) that will flag this as even a warning.

The solution is to recognise why you need to call the Setup method and before what other event. This normally gives you the opportunity to call it from an OnMyEvent() method.

Tuesday, 15 September 2009

RSS Mashup for VS2008

Having stared at the VS2008 homepage for more than a year now and realised that the RSS content hadn't updated, not once, I finally decided a change was in order. I use my HTC HD mobile RSSHub for all my 'real' news reading and I subscribe to over 70 feeds. VS2008 can handle one - so my options were rather limited!

That is until I discovered xFruits. They offer a blindingly simple mashup facility whereby you can take n feeds and squeeze them into one. The resultant feed itself has its own url. Now my VS homepage subscribes to one feed that contains the headlines for my most read subscriptions. The RSS -> PDF function is pretty cool too!

Simple and fantastic.

Tuesday, 18 August 2009

Domain Names: Use 'Em or Lose 'Em

I have been getting increasingly frustrated by the number of vacant or abandoned spaces on the web that could be put to good use. Just last week I thought of a great idea for a website and also found the perfect domain name. Unfortunately, this had been registered in 2004 but still hadn't had a single page uploaded.

So, here's my shout-out to ICANN to regulate the following:

Let's give domain name purchasers a window of opportunity to do something useful with their site. The first instance of a domain name should only be registerable for a one year period. This aught to be more than sufficient to make use of it. If, after that period, you've done sod-all except hold on to it in the hope that someone will buy it off you; well, you forfeit it. You also can't re-register it.

There are so many people with so many good ideas, but they're being stifled by greedy name-huggers.

Wednesday, 8 July 2009

Current Reading List

These are the books I currently have open (on my desk, on my floor, on the window sill - you get the picture)...
Not enough hours in the day!

Saturday, 4 July 2009

Entity Framework: First Impressions

I have been working my way through Julie Lerman's book 'Programming Entity Framework' (review to follow) in order to evaluate the technology. On the face of it it seemed the perfect replacement for part of our existing solution that leveraged, the rather delapidated, SQLXml.

The concepts and patterns of the model seem absolutely spot on - very encouraging. However...

The EDM UI Designer that Microsoft has shipped is not even Beta 1. It seems that every change / customisation I make to my model is accompanied by a caveat. For example:
  • "Remember that if you make the base class abstract and then extend it you'll receive a compilation error. That's OK."
  • "If you want a '0 or 1'-to-Many relationship, first add it as a 1-Many, then setup your mappings then, finally, change the relationship back. Otherwise the designer breaks."
  • "You'll need to manually edit the SSDL Xml for this to work."
One of the really neat features of EF is the way it will sync with any changes to your underlying data source. Unfortunately, any manual changes you make to the conceptual layer are lost every time you update the model!

Secondly, the automatic code-behind generation leaves much to be desired. I think I read that this can be re-configured, but I shouldn't have to. Each Entity comes with its own Factory method. I would like this in a separate, static class please. I would also like it to instantiate a Builder class to do the work.

Finally, the exceptions. I appreciate that I am new to the framework but the errors (normally relating to Mapping Fragments) require the developer to wade through xml. Not good.

Overall, I want to use this framework but I'm loathed to give it the thumbs up. Hopefully, VS2010 will have a working designer?

Wednesday, 10 June 2009

Using Technology to Compensate for Lost Convection Currents

Working remotely has massive benefits that have been lauded for eons: no commute, flexible working hours, progressive working practices yada, yada yada; but it also has some major drawbacks. The main one that's been gnawing at me recently is the lack of Convection Currents of Information.

Being physically surrounded by like-minded developers (in an office) exposes you to these convection currents. You can't help overhearing John talking about the new API he discovered, or Sarah arguing with Mike about which Pattern would best solve problem X. When you work from home all you get is silence.

The great thing about these currents is that they are usually exciting, challenge you to change the status quo and stop you resting on your existing methodologies. It can be difficult to keep your saw sharpened if you lack day-to-day peer interactions.

I recently upgraded my phone to a cool new Windows Mobile device. The inbuilt RSS hub is now full with dozens of blog- and podcast-subscriptions that I can access anywhere, anytime. This is revelationary! Today I read Joel's post: 12 Steps to Better Code whilst out in the garden with the dog. Fantastic. And so little effort involved! I am no longer required to be at my desk if I want to learn.

And that really is the key: I needed a no-brain, easy solution to keep in touch with my peers and what they are doing today.

Just because you work remotely doesn't mean you can't be part of the conversation.

Tuesday, 9 June 2009

Polymorphic Limitations in Strongly-Typed ASP.Net MVC Views

Strongly-typing your views gives you nice, easy access to what ever view model your controller passes to it. Simple and powerful.

Unfortunately, though, there are some limitations.

  1. Your View Model cannot be abstract.
  2. Your View Model will only get POSTed back as itself.

The first point is fairly simple. Everything works until you POST back your view model e.g.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Update(MyAbstractViewModel model)
{
    // Clever bits go here...
}

Calling this action will result in the framework throwing a MissingMethodException: Cannot create an abstract class.

The second point is a little more complicated. Let's say you have 3 classes:

public abstract class MyAbstractViewModel
{
}

public class ViewModel1 : MyAbstractViewModel
{
}

public class ViewModel2 : MyAbstractViewModel
{
}

Now you create a simple GET Action that returns a View (strongly-typed to MyAbstractViewModel).

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index()
{
    MyAbstractViewModel model;

    if (something)
        model = new ViewModel1();
    else
        model = new ViewModel2();

    return View(model);
}


The view will render successfully. Unfortunately, our original POST Action will not receive either of the concrete classes - only the one the view is explicitly typed against (i.e. MyAbstractViewModel).

These are, obviously, not major issues but it does limit developers' creative freedom and the most elegant solution may have to be foregone in order to fit the framework.

Thursday, 21 May 2009

Oi Microsoft, this IS part of Development!

I've hit a rather frustrating wall whilst implementing my Build Server for TFS 2008. As a company we have licenses for TFS 2008, VS2008 Development Edition and VS2008 Database Edition. Note the absence of VS2008 Test Edition (this is important!).

Our dev branch of source control is using a Continuous Integration model and builds the entire application on every checkin. Marvellous. However, I have been struggling to get the build to run (and report on) Code Coverage as part of the Unit Tests.

Turns out that you need to have VS2008 Test Edition installed on your build server. WTF!? Firstly, why should I need any client-side applications installed on my server for it to work (you need VS2008 Developer Edition to run Unit Tests as part of the build)? Secondly, why is Code Coverage considered part of the Test Edition? As a developer, a core part to producing good software is Unit Testing - which is worthless without a measure of Code Coverage!

Come on Microsoft. You've got to give us proper tools if you want us to continue developing for your platforms. Hopefully, life will change with VS2010?

Many thanks to Buck Hodges for responding to my emails and helping clarify the situation.

Session Availability in ASP.Net MVC

We are in the process of porting one of our Web Forms apps to ASP.Net MVC. This is just something we stumbled upon...

this.Session is null in a Controller's constructor.

Not a huge issue as you can use a Lazy Loading Pattern to circumvent it. It does raise the question of 'why?' though. The MVC (or Routing) framework is responsible for newing-up your Controllers to handle requests. Why couldn't Session be spun up prior to this?

Tuesday, 5 May 2009

LINQ to SQL only goes so far.

I have just finished re-writing my ailing photography website. I have taken the opportunity to write it afresh using ASP.Net MVC and LINQ to SQL. Whilst the latter is hugely more sensible than programming against a database it did highlight a flaw quite early on.

'Entities' in LINQ to SQL (i.e. database tables / views) are connected to each other via Associations. These map 1-1 with the Relationships in your database. Unfortunately, you can't customise these objects thus denying the developer and means to filter entities. Example:

I have 2 main entities in my application: Albums and Photos. An Album can contain many Photos and a Photo must be part of one, and only one, Album. I then added an IsExcluded property to the Photo entity. Unfortunately, I can't set the Association between the 2 to recognise this filter.

Solution 1: Create a new View called 'IncludedPhotos' and use that in the domain model.
Solution 2: Move to LINQ to Entities.

Friday, 6 March 2009

Securing Multiple Sub Domains in IIS 7 with Wildcard SSL

This used to be a real pain in IIS 6.0 but it's gotten a lot easier in IIS 7.

Let's say you set up a web server with the following sites...
  • www.site.com
  • test.site.com
You could bind each individual site to a specific IP Address but this can be expensive and simply doesn't scale. What you should be doing is using Host Headers to help IIS differentiate requests for the different end-points. For a good overview of how to do this take a look at Setting Host Headers in IIS 6.0.

Now, you can do exactly the same thing with https - but there's no UI for it. Possibly the most requested feature hasn't made it into IIS 7. Amazing!

So, here's what to do...
  1. Add a new binding for the web site. Set it to be https, keep the default port and choose the SSL Certificate from the dropdown.
  2. Open <$System32>/inetsrv/Config/applicationHost.xml.
  3. Search for the host header for that site.
  4. Edit the https binding by appending the host header (it follows the same pattern as the http entry.

Friday, 27 February 2009

"We Don't Have Time to Implement Scrum!"

This is a statement I hear frequently in my company from POs and managers. Ken Schwaber recommends that, when starting out with Scrum, not to implement it on a low risk, manageable project 'cos everyone will say "So what? It was gonna work anyway!". Much better to pick a project that is critical and is just about to fail.

Problem with that is that it's nearly impossible to convince the PO to allocate any time to setting up even one sprint. Today I was on the receiving end of "We just need to get it done!". "Well", I said, "when's that gonna be?". "I don't know, but we don't have time for all this planning and stuff.".

On one hand I do understand where the PO is coming from but at what point do you stop and make some space to implement something that should reap massive benefits?

Slightly disappointing, but how can you argue with the PO?

Friday, 20 February 2009

I hate unmanaged code!

Just tried to install yet another application that I would have loved to have used - unfortunately it's written in unmanaged code and they haven't developed the 64bit version yet!

Unless you are writing truly cross-platform apps or you need something that can count in billionths of a millisecond then please use a managed framework.

No-one's impressed that you can 'handle' C++ and you're not fooling anyone that your situation warrants a 'pure' language.

Thursday, 19 February 2009

Acronyms and Abbreviations

Just a list of the common acronyms I'll be using in posts.

Wednesday, 18 February 2009

Separation of Responsibilities in a Scrum Team

We are now halfway through our second 2 week exploratory sprint. The team consists of 4 pigs:

  1. Team Member, Developer, Scrum Master (myself)
  2. Team Member, Tester, Product Owner
  3. Team Member, Developer
  4. Team Member, Tester
Both developers have fully embraced the methodology and the associated tools (TFS); however, the other 2 team members have greeted it with a less-than-enthusiastic attitude. Both seem to view it as an unnecessary overhead.

2 specific problems have arisen...

1. Product Ownership

The Product Owner (PO) has a very relaxed attitude to who can add items into the Scrum. To him this is sensible as we should all have an understanding of priorities. To me it makes everyone's job harder. I think I wanted the PO to have total responsibility for this area so that the Team Members (TMs) are free to just develop what's in front of them. This also removes any burden of 'why did you do that?' from the TMs.

2. Time Boxing

The PO is quite unwilling to defer tasks even though it is clear from the Scrum Burndown Chart that we are not going to finish all the work items in this sprint. Does this matter? I have tried to explain that one of the benefits of time-boxing and this trend data is that we can make decisions early and inform stakeholders and customers that certain deliverables will be delayed. This can now be done weeks in advance of the deadline (as opposed to the morning of the delivery!).

Hopefully, these issues can be addressed more fully in the retrospective.

Tuesday, 17 February 2009

IE8 - another triumph!?

I recently updated IE7 to IE8 Beta 2 with the hope that Microsoft had managed to improve the load performance. Unfortunately not :(. Compared with Chrome's ability to 'new up' a tab IE is truly pitiful.

To make matters worse IE8 has now developed a fault. Whenever I open a link it decides to copy it to a new window... and another ... and another... you get the idea! Luckily it's so slow at creating these new entities that I have more than enough time to close my work and reboot!!!

Can the guys at Google please hurry up and make Chrome work with Sharepoint please? Then I could finally ditch the MS offering.

Sunday, 15 February 2009

Introduction

Hi, I'm Chris and I'm the Development Director for a small UK-based, distributed software house.

We have a suite of software products, all of which are doing very well - but there's something missing.

I have decided to write this blog to learn, in public, a variety of subjects and disciplines that I am attempting to implement in my company. The aims of the blog are:
  1. Share my experiences with other people that might be in similar positions.
  2. Learn from others who have already made this journey via comments and contributions.
  3. Improve my own learning experience by writing about it.
Point 3 is also there in case no-one ever reads this!

So, what am I trying to do? Two things: Good Coffee and Good Code. Having made the, long overdue, move away from instance coffee to espresso and cappuccino it's now time to make the move to better code! In order to do the latter I am implementing a number of technologies, products and methodologies with help from the following...

Hopefullly, I will be able to share the good points but also the problems and difficulties that we experience in implenting these in a small, distributed company.

I will also be taking the opportunity to rant about anything related to the two main topics.

I hope you enjoy my stream of consciousness!