Sunday, 1 October 2017

Software Development - A Sisyphean Task?

It's rarely a pleasurable event returning from holiday. No matter how much you might enjoy your job it's still a sad event when that family time is over and you have to return to the more mundane routine of home, work and school. On arriving back you're never quite sure what emails are sat in your inbox or what post has landed on your doormat.

(I sincerely hope that you take the opportunity to take time away from emails on holiday - it's a holiday for a reason and the extra productivity from a genuine break far outweighs the apparent benefits of 'keeping on top of things' whilst away)

My return from holiday this year was markedly more pleasurable this year than previous years thanks to :

  1. My inadvertently buying double the amount I intended of a wine I'd never tasted at a spanish wine merchant and subsequently finding it to be quite delicious
  2. My finding a copy of Gojko Adzics new book 'Humans vs Computers' on the doormat as I arrived through my front door.

It's rapidly becoming one of my favourite books on software.The basis of the book is a series of lessons on the common pitfalls in software with strong and amusing anecdotes of projects that have suffered them.

  • Individuals getting charged tens of thousands of pounds for hotel rooms and car rentals because of decimal point position bugs
  • Computer systems refusing to initialise on 29th February as they didn't recognise it as a date
  • UK Post-codes failing to match because of inconsistency in how they handle the space between the incoming and outgoing postcode sections
  • US drivers being assigned huge numbers of fines due to inadvertently selecting number plate sequences matching the default text that traffic officers would enter in forms for a non-readable plate.

Whilst the stories that Gojko shares are amusing and eye-opening in equal measure, there is a more worrying aspect to them. The reason behind many such anecdotes being amusing is the fact that they strike a chord of familiarity with so many of us. The fact that so many people that have worked in software development, particularly testing, can identify with the calamities that can occur when working with leap years shouldn't really be trivialised as a subject for amusement. The problems with decimals that, as Gojko points out, cause so many embarrassing and costly mistakes, really aren't a laughing matter. I've spent my entire working life working with computer software and yet we still don't seem to be able to match addresses between different IT systems. We do seem doomed to making and discovering the same mistakes over and over again.

A sisyphean task?

I was chatting to a group of testing enthusiasts including Rob Lambert a while ago about the current state and future of testing. Rob in his eloquent way went on something of a diatribe about the fact that we won't be able to truly progress until we find ways to solve these same issues that come up again and again. I couldn't agree more.

When I started this blog it was with this post suggesting that software testing might be perceived as akin to the task of Sisyphus - forever destined to repeat the same activity. I wonder whether in actuality it is software development as a whole that on too many occasions is more like a Sisyphean task. Despite the availability of open source code repositories, shared libraries, Nuget Packages, development frameworks and ever more functional programming languages, we do still seem to have a habit repeatedly striving and struggling to solve the same issues that have been plaguing software development teams since the days of the BBC Micro.

Even casting my mind back over the last year or so I can recall examples of problems that I have encountered in exactly the 'classic' areas that provide such a rich supply of anecdotes for Gojkos' book.

  • Last year I was forced to implement a manual backup to an automated validation process for people using one of my systems as it was not possible to reliably check a match between postal addresses algorithmically between two separate systems
  • On a related system I was forced to prioritise a change to the UK postcode processing of an interface as an associated website provided postcodes without a space whereas our own system utilised and expected spaces.
  • A couple of years ago a system I supported encountered an issue where the 2015 leap second resulted in massive unexplained CPU usage requiring a server reboot to correct
  • In the last couple of weeks I've had to revisit discussions on calculation of performance figures in a customer dashboard as the example figures we were given demonstrated rounding up to the nearest integer whereas to maintain consistency with other systems we actually needed to always round down to one decimal place.

It's not all bad news

In a weekly publication I read there is a section "It wasn't all bad news" where they present some more light hearted stories from the week to stop the reader from being too depressed at the state of the world.

In a similar vein I'll leave with this sentiment. It may be easy to rue the apparent lack of progress in avoiding issues in software development, however at the same time there are still many reasons to be glad:-

  • Software testing as a craft is still very much needed.
  • Testing Heuristics have far greater longevity than expected and so our fantastic testing resources such as Hendrickson, Emery and Lyndsay's Test Heuristics Cheat Sheet are still valid and relevant.
  • We can enjoy great stories around software issues, such as those that Gojko has collected together in his book, relate to them and continue to share them even years later.

So I suggest taking some time to have a read of "Humans vs Computers" and maybe feel better about things the next time you can't match a postcode, or your software stops working on February 29th.

Sunday, 13 August 2017

The Big Bang

In the last month two significant things happened in my work.

  • Firstly we completed a major release for a high profile client.
  • Secondly I got the opportunity to work in the new River office for the first time.

This is an exciting time in my current company as we strive to move not just to taking an agile approach in our software development, but to embracing agility across the organisation by working flexibly and incrementally, always looking to add value and regularly review priorities. Working in an agile way on internal projects is one thing, taking an incremental approach with customers is not always as straightforward, particularly with customers who have a large set of requirements, a target date when I they want these to be delivered by and an expectation of getting it all delivered in one 'Big Bang'.

New Office

I worked in the new River office for the first time recently. In a mildly surreal experience a colleague and I were initially sat at desks in the middle of a nearly empty room.

I then I had to move to the corner of the room as the chap who was using an industrial cleaner to deep clean the carpets needed me to move. I wasn't bothered by this, or the noise of the cleaner, or lack of tea making facilities. I had a desk in an isolated space where I could get my head down on a task that required some careful attention. There was a lot of value in that office space for me.

Typically you would think of a move to a new office as a classic big bang operation with everyone packing boxes and piling in as part of a large scale coordinated event. Right now in typical fashion for my company, we're taking things incrementally and getting a lot of value even before the whole thing is ready. People started having meetings over there and some folks went over just to get some quiet 'heads down' time. Then slowly teams started to move in as and when they could be supported and at this stage about half of the company are now based in the new site.

Old School

By way of a contrast, in recent weeks I've been involved in a major release of software to support a customer engagement programme. As this was a replacement for an existing site the customer was keen to get as many of the features in place ready for a big launch as possible. The release was also the first to be based on a set of core capabilities that we were investing in ourselves that needed building from the ground up to support not only the bespoke needs of the programme in question but also other similar programmes in the future. This magnified our uncertainty around the development, and therefore the risk, significantly.

When working with new customers and trying to convince them off the benefits of an iterative approach, one of my favourite images to reference is one from Henrik Kniberg

It gives a very simple representation of why delivering incrementally can provide a safer option, particularly in projects with large scope or many deliverables. Not everyone is familiar or convinced by such an approach and many still insist on rolling the scope, and risk, up into a major release - as was the case in my latest project.

Did it work?

I have to say that in terms of big bang customer releases my most recent one was one of the smoother ones that I've been involved in. There was a lot of effort put in and some longer hours as we approached the release, however we did release within 2 hours of the target time with the majority of the features in place and a generally happy customer. If I was to attribute this success to anything I would highlight two factors

  • We ran a number of user testing sessions during development to demonstrate and get feedback on the features delivered to that point, essentially embedding a level of incremental delivery into the larger project
  • We did manage to negotiate a number of features out of scope of the initial release thanks to a very reasonable customer and some open conversations.

As we approached the release the customer could not have been more reasonable about things that were/were not going to be included. Nevertheless there was still a degree of pressure around the delivery that resulted in some anxiety, not least on my part, around getting the release out on time. I was painfully aware of the potential for a sense of frustration around having to compromise on some of the features that would be available from day one.

It is hard to over-state the sense of satisfaction and relief that comes in getting software released. The difference in anxiety level in a team that has successfully delivered working software and is adding to it, as compared to one that is in the process of accumulating a large inventory of unproven software, is tangible. From a personal perspective, the discomfort I felt in having a fixed scope of work and a fixed release date to deliver led to some very stressful moments.

What has happened since has also not been plain sailing. Despite efforts to maintain our standards around our core capabilities, we still accumulated a small degree of technical debt leading up to the release such that we consequently struggled to deliver the follow up work to the time-scales expected by the customer. We simply weren't in a position to progress them as quickly as we thought due to the final push to deliver the release.

In a riff on a Benjamin Franklng quote, I once read that 'the smell of poor quality lingers for long after the champagne bubbles of an on time release have gone flat'. I can relate to the sentiment. I'm pleased that we made the right decisions to maintain quality under pressure in most decisions, but not all. Despite the apparent success - the retrospective that we held post-release exposed the discomfort felt by some of the team in the days leading up to the release due to having to increase the pace of development.

A Confession

At this point I should make a confession. The fact is that for 9 years in my previous company all we did were big bang releases. Our customers didn't want new versions of the software every 2-4 weeks so we'd typically roll up new functionality into 6 month releases. Over this whole time we consistently delivered on time and with the target major feature set. In my more moribund days at that company (I am prone to a high level of self criticism) my VP would repeatedly remind me what a fantastic achievement it was to repeatedly release on time over such a period of years.

In order to achieve this we tailored our approach so that they were very well suited to tackling Big Bang releases successfully:

  • We worked constantly with the same team on the same product so had highly predictable velocity
  • We generally operated to product roadmap deadlines rather than customer deadlines, whereas other big bang releases I've worked on were based around when the customer wanted to release rather than a practical target appropriate for the software in question.
  • We had the ability to negotiate scope from the beginning and remove items from the release that were unachievable, or became unachievable due to emergent priorities
  • We had the time to focus on a continuous integration and testing structure that allowed us to maintain a constant level of quality.

It wasn't that we had the luxury of working slowly - the pace and predictability of the work delivered was impressive. It was the case that we had the maturity of process to know what was possible and predict early what was not. We also had the rigour and stability in our continuous integration and testing processes to know that we were never far away from a releasable product.

Big Bang or Hard Sell?

When working in a commercial capacity it is easy to plump for the big bang approach. In simple terms - it is easier to sell.

As an example I was recently asked to scope/cost a response to an RFP (Request For Proposal) from a company wanting an intranet and engagement programme. On examining the RFP it was clear that the scope had been established more on the basis of a big list of features desired by a number of stakeholders than a clear understanding on what value the program was intended to deliver. The list of technical requirements was huge, yet each sufficiently ambiguous to present a high level of uncertainty and risk in attempting to deliver. Even so the customer was expecting a fixed cost fixed time-scale based response to the delivery.

We took a brave approach to the response and actually offered a fully iterative delivery. We suggested working with the customer to establish their highest priority goals and target initially the delivery of features that supported those incrementally. We fully expected this to be a challenging approach and our expectations proved correct. The customer's response was along the lines of :

"Why would we take that approach when we can work with another supplier who promises to deliver this whole list in a fixed time for a fixed budget?"

I'll admit it is a harder sell. Customers are always going to prefer the illusion of certainty over the honesty of unpredictability. I've included some useful links in the references below on approaches to try to sell an agile approach to project delivery from others facing this same challenge. My strong belief is that, any supplier who did promise such a delivery would need to renegotiate once clearer details of the true requirements became clear.

On a more optimistic note - for some companies that we work with the understanding that agile deliveries can present a lower risk to both parties is starting to take hold. We are encountering more organisations who not only understand but expect an incremental delivery. Given how ubiquitous agile understanding is in development communities if can be hard to believe how alien the concept is in other fields. yet the common perception is still that the setting of arbitrary deadlines for large scope projects will deliver software of equivalent value as delivery through a process of incremental release, review and refinement. Hopefully as stories of the successes of more incremental projects become more readily available this will change, so to help this process along...

Despite the project I've described above being a 'big bang', we still approached the work in an agile way. We delivered completed features through the process and exposed these to the user community for feedback and refinement as we went. Because of this, despite the fact that not all of the scoped features were available on day one, we still released on the target day, with what is proving to be a very popular and well liked application (one of the users this week wrote a poem in celebration of the new system!) and a solid set of core capabilities that have the quality and exten sibility to use in other implementations. So I'll leave you with another of my favourite Kniberg images, to help in deciding whether the project was successful or not.



Tuesday, 23 May 2017

The Most Effective Form of Communication

Have you ever had trouble explaining what your job is to someone? Whilst struggling to explain your role outside work may provide some social awkwardness, when the same situation arises with work colleagues it can be more of a problem. If those colleagues interact with you directly and have a very different expectation of what you should do than you, it becomes a genuine concern.

One thing that has characterised the roles that I've held since I first became involved in setting up and leading teams is the need to establish an understanding amongst others of what I and my teams do. When I was focused solely on testing this was typically due to the need to correct a restricted and out of date view over what testing involved. When running technical support it was more around establishing an understanding of what support could and should be doing for others and the appropriate ways to interact with the support team. More recently, as I've overseen the introduction of Product Owners into River, I've seen it in relation to understanding what a Product Owner does and how they work.

I've tried various ways to communicate out what's involved in different roles.

  • Presentations to talk people through the processes and activities undertaken by the team
  • Group sessions on how to work together
  • Taking each new starters through individually to discuss what we do
  • I've even created graphic user journeys in prezi showing people might interact with the team

All of these have worked well to some extent. There is, however, one approach that I've found consistently communicates am understanding of what a role entails better than any other. That is by focusing on doing a great job.

Not as easy as it sounds

It sounds simple, however this isn't always the case. If within your company there are those who misunderstand your job, responsibilities or approach then it is likely that they will make demands of you that are inconsistent with what you know will deliver value from your role.

I've had many situations in my work in software testing where the expectations of others differed greatly from my own opinion of good work

  • Being asked to test a piece of software where the only reference point for target behaviour is the software itself ('can you just find the bugs?')
  • The perception of testing as a process of creating test scripts and running them
  • Testers being expected to ignore the risky architectural concerns in a piece of software and focus on trivial bug finding in the user interface
  • The perception of a lack of need for testing other than creating automated unit tests and running them

...and the same is true of other areas that I've worked in

  • Product owners being expected to deliver an already defined list of features simply by 'turning them into user stories' and assigning them to sprints
  • Product owners expected to predict which features will be delivered in which exact sprints to strict timescales throughout a lengthy development
  • Support staff being expected to repeatedly deal with the same issues in flawed software without raising their concerns and recommendations for improvement with the product team

In all of these cases, the situation that the individuals or teams can find themselves is a frustrating one. There is expectation, often associated with a certain level of pressure, to perform a role that is fundamentally different to the one that you should be, or want to be, doing.

Turning in around

As I said in my post 'Knuckling down' - I believe in putting in your best effort to resolve problem situations rather than being too quick to walk away based on a role not meeting your expectations. Clearly if your organisation shows no sign of changing despite all efforts to improve then the door is an option, but I'd always strive to try to turn this around first. But how to do this?

I suggest to start with, ask yourself why the mis-perception exists. Do you believe that what you see as the role will genuinely deliver more value than simply delivering the work in the way that is anticipated?

Presumably the answer is yes. Therefore by changing your behaviour to deliver in the way that you envisage you should deliver more value to the stakeholders in the process than they were hoping for. The problem here can be that, making major changes can impact an existing flow of work. The last thing you want is for your 'improvements' to be associated with a big disruption. Instead I've found that a more incremental approach, focusing on introducing small changes and steering the pipeline of future work rather than what is currently in progress, is much more easily digested.

  • Do some small elements of the work your way 'guerilla' fashion and then demonstrate the value from those small pieces - nothing demonstrates the value of exploratory testing more than a shed load of risks and problems exposed that wouldn't have been discovered by your test scripts.
  • Know when to bend and when to push back - if people ask you to deliver tasks that aren't appropriate, potentially agree to it this time to avoid disruption but state clearly that on the next occasion you will be tackling it in a different way
  • As you deliver, go 'above and beyond' on the work, but make sure any extra effort clearly demonstrates the value of your preferred approach
  • Use what you have done to provide information on status or risk that would not have been available previously
  • Avoid a backlog of inappropriate work building up - take the opportunity when discussing new work to introduce new ideas at that point and establish a change in expectation for future programmes

The what, not the how

You inevitably need a level of stubbornness here. No matter how much you believe in what you should be doing, if you consistently acquiesce to others demands then attempting to steer a role away from their misguided expectations of it is going to be a challenge. One of my greatest failings in the past has been too easily assuming that the approaches taken by others are appropriate without questioning and asserting my own ideas on a process. Over time I've found what really helps to reinforce stubbornness is passion. The more passionate I am about something the more likely I am to research it, discuss it, reinforce my beliefs around it and belligerently strive to deliver value by doing it, even in the face of conflicting expectations.

If you find yourself in such a situation the most important thing to remember here is that other people ultimately aren't really interested in how you do your job so if you persist you are more likely to win through. Others are probably not that excited by discussions around why your approach is better so trying to present people with explanations of theory is going to have limited success. What people do care about its achieving success in their own roles, so focus on how you can help them with that. The most effective way of convincing anyone of the value of a different approach is by showing what it can do for them, and the best way of achieving this is by doing it. Really damn well.

Image - there are many who believed that a metal ship would be too heavy to float, or that a screw propellor would not work as well as a paddle. Brunel proved them all wrong when he built the SS Great Britain.