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.

References

Image: https://image.slidesharecdn.com/what-is-agilehenrikknibergaugust202013-130828212836-phpapp02/95/what-isagile-henrik-kniberg-august-20-2013-19-638.jpg?cb=1377725694 http://blog.crisp.se/wp-content/uploads/2014/03/what-is-success1.png

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 https://upload.wikimedia.org/wikipedia/commons/thumb/9/99/Bristol_MMB_43_SS_Great_Britain.jpg/1200px-Bristol_MMB_43_SS_Great_Britain.jpg - 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.

Wednesday, 15 March 2017

When is a Prototype not a Prototype

When is a door not a door ...

... when it's ajar

Throwing away things that we've put effort into creating is not something that comes easy to most of us. It is hard to look at our outputs without seeing the hours and days of effort that went into their creation. Yet throwing away previous efforts is exactly the right thing to do when it comes to prototyping, or the consequences can be dire.

When is a prototype not a prototype?...

I'm not going to discuss in this post the merits of prototyping, suffice to say that an effective prototype can provide a massive learning opportunity. Whether or not to prototype in any situation is not really pertinent to the focus of this post. What I do find very interesting is that, whilst I have seen seen lots of what I would consider to be prototype code, it's rare that I've encountered a capability that was openly described as a 'prototype'.

What I have seen are 'proof of concepts' to demonstrate and trial a capability, or 'pilot' software where a product is being trialled on a subset of users and doesn't have to support the full scale of production use. I've seen 'innovations' coming from 'innovation silos' (where an individual or small group in a company has cornered the market in product innovation) which serve to demonstrate a new development. But I've rarely seen an honest, openly labelled prototype.

...when it becomes a product

Is there any problem with calling our prototypes something else? Well yes, there is a gigantic problem with it. Using the appropriate shared terminology is vital in understanding the situation we are in. In my opinion the correct approach in all of the situations I described above at the point of deciding to progress these capabilities into production would be to... wait for it... write it again using the existing code as a throwaway prototype. The team developing the production code would take valuable learning into that development from the existing capability and create a high quality piece of software from it. Unfortunately I've seen too many situations where this is not what happens.

Given that so many involved in developing and testing software are so aware of the perils of implementing poor code, it seems somewhat surprising that we'd ever allow the situation whereby we're trying to take prototype code into production, yet I've seen this happen many times, and often the development teams have little choice in doing so:-

  • In some cases where the code has come from an innovation silo, it has not been made clear that something is only a prototype. This is usually because doing so would rely on the innovator admitting in delivering low quality throwaway code, something that they're disinclined to do.
  • If a pilot capability hasn't been delivered to production quality, it can be a huge challenge to persuade the business of the need to rebuild when it is already being used, albeit in a limited capacity.
  • It is an unfortunate truth that, if you demonstrate a working piece of software to a C-level executive or customer account owner, it is then hard to persuade them that the next step is to throw it away and build it again, but this time 'properly', after all - you've just demonstrated it working.

Instead what I've seen happen on to many occasions is the decision is made to take the existing code as a starting point and turn it into a production quality piece of software.

This rarely ends well.

Turning prototype code to production code is a time consuming activity that yields little observable value outside the development team, as it generally involves such 'trivial' concerns as:-

  • Adding error handling and validation
  • Adding logging for monitoring and diagnosing faults
  • Putting in place proper decoupled architecture, isolating component responsibilities and defining interfaces
  • Adding transactionality around operations

All of this is critical to having a product that is genuinely ready for live use, yet delivers little in terms of new user facing capability that business owners can see as progress. Inevitably the development team come under pressure for taking so long to tidy up something that appeared to work with all of the features they needed. In one extreme example I had the CEO say to me of a particularly risky piece of research code written in a loosely typed script language -

'now we just need to test it, right?'.

Well wrong actually, what we needed to do was rewrite the whole thing in a more appropriate coding language that supported strong typing and at least compile time validation of parameters across function calls and interfaces, but that was not what he wanted to hear.

Shooting fish in a barrel

For testers this is a confusing and frustrating situation. Their initial explorations will typically expose a wealth of issues which should result in rethinking the entire approach but inevitably do not. Instead one of two things happens.

  • A massive onus is placed on testing to reduce the risk of release through bug finding.

    This is clearly an expectation which is not only impossible but demonstrates a lack of understanding of what testing is there to achieve (like giving someone a dilapidated old Datsun Cherry and expecting them to 'test' it into a Ferrari). The code has not been built incrementally to a high quality and so finding bugs in this situation is far too easy and, whilst potentially fun, is wasteful for the company and the skills of the tester. Error handling and validation and other basic requirements are eventually built in but, as these are done in response to the bugs found the result is that this takes longer and yields less consistent results than if it had been done as a consolidated activity during the creation of the software.

  • The testers are warned by management not to test 'too thoroughly'.

    I'm not quite sure what they are expected to do in this situation. All I can assume is that in order to release if the process is that code has to have been sprinkled with the 'magic fairy dust' of testing, then if this can be done without slowing things down by actually (gasp) looking for problems that would be a great help. On one occasion years ago I was actually told to test the 'easy bits' whilst avoiding any of the high risk areas I'd identified in my initial analysis of the system - sigh.

Other options

There are, of course, other options. Rather than attempting to test out an entire process with throwaway quality code another option is to create a 'tracer bullet'. A tracer bullet has a very different purpose to a prototype. Instead of a throwaway model designed to learn about the viability of a feature, a tracer bullet is a fully production quality but very narrow implementation of a small slice of the target feature set, which can be used as a starting point for evolutionary development. In the reference links there are some discussions around the purpose of tracer bullets. Here I'm referring to a thin slice of production code to help answer questions around architecture and interfaces, rather than a more incremental concept of developing slices and getting feedback, which some might consider 'evolutionary prototyping' however I consider implicit in an agile approach.

I recently had the pleasure of being involved in a cross team activity involving multinational teams to demonstrate an integration capability. I mentioned my determination to avoid the expectation of being able to implement prototype code with the developers. I was pleasantly surprised when they adopted a tracer bullet approach. In the session they developed an initial very thin but working slice of the integration that we could then directly implement and expand upon to create a production capability. It would have been all too easy to deliver a low quality prototype here and generate false expectation in the group around a realistic pace of development and the level of progress. Instead adopting a higher standard to a narrower piece of functionality provided a great starting point for the ongoing development.

Kidding ourselves

We do have a habit in software of kidding ourselves. Like cigarette smokers we go into a kind of state of denial that our bad habits will ever catch up with us and tend to repeat them over and over. I remember when I was a smoker I was terrified of the word 'cancer'. I didn't want to associate the grievous potential outcomes of my habit with the habit itself. Openly giving things the right names helps us to be honest about our situation, and software development is no different. By hiding prototypes behind terms like 'proof of concept','pilot' or 'spike' we are creating a loophole in our quality standards. We're excusing an approach of coding without rigour and testing, which is fine for a prototyping or research activity, but not the basis of a solid product.

My recommendation if you see this situation in the future is to openly and loudly use the word prototype at every opportunity.

  • I'm just working on some PROTOTYPE code
  • I'm not planning on testing the PROTOTYPE any further as I've found to many bugs, I assume I'll have more testing time when we develop the real one?
  • Is that the customer who are still using the PROTOTYPE version?

OK maybe you need to be careful with this, however promoting honest conversation around the state of what we're working with is the first step to avoiding some painful soul searching later.

references

Image: Old Door by Oumaima Ben Chebtit https://unsplash.com/search/door?photo=pJYYqA_4Kic

ShareThis

Recommended