Chicken, Shut Up!

In this post I’ll try to explain why it’s better not to accept changes or new tasks during an iteration. The trigger for this post is an experience I had a few weeks ago. I worked on a very interesting project, it’s a project with short iterations and a daily demo. The client is amazing – smart, responsive and very creative. The client acknowledges that not everything is known in advance and many changes are expected along the way. So far, so good. However, there is a downside – the involvement can make the feedback loop too short – as feedback gets translated into tasks within the same iteration.
The goal of agile development process is to deliver products in constant throughput, respond to changes and get to the final release with well working software that provides the exact value the client needed. In order to do all that both parties must stay realistic and take the right risks.

What’s required for efficient development?

Estimations

One of the nice ideas in agile is the iteration plan. During the iteration plan the client gets to tell what’s the most important features, the developers get to ask for details and finally estimate how much effort the feature requires. Since iteration plan includes all the developers planned to work on the features, all get the chance to contribute their point of view about each feature. The points of view are what’s the best way to implement (perhaps base the code on existing solution), they can talk about risks (this feature influences the performance, requires redesign, etc.), when everybody is well involved they point on more missing details in the specifications. All these allow us the reduce the risk – we get better effort estimation and we know better if we should expect side effects.
When a ticket is added during the iteration, it’s planning gets less focus – it is either gets planned by less team members or it gets planned by developers who do it while being distracted by the task they’re already in. The result is usually the we get less accurate estimations.

Focus

We all know that in order to get better software we need better code. With better code we have fewer bugs and easier maintenance. A very well known way to achieve this is having the developers code in “the zone” for as long as possible. Being in the zone requires understanding the problem, finding a solution and being able to incrementally implement it. All agile flavors have a good way in getting the developers in the zone. The idea is same – separating concerns. There’s a defined period of time devoted to non-development tasks, like iteration plan, demos, etc. The rest of the time is focused on development, which is known to us as iteration, sprint and so on. During this time the developers get to work on a predefined tasks, tasks which they had a chance to think about for spec (with the client) and technically (during effort estimations). If the developers are required to step into a mini-phase of planning in the middle of the iteration, the thinking mode must go back to planning mode. This is very likely going to cause a loss of focus which leads to less efficient development.

Priorities

This is the simplest part and the riskiest. It is clear that most software being built is limited by real world constraints – money and time. Since we can’t get all the features from the backlog done on the first iteration we prioritize. This means that out of a set of relevant features, we pick the most important ones. Using this simple rationale we get to maximize the value of the developed software. What happens when a feature sneaks into the iteration? Usually it doesn’t really go through the usual prioritizing mechanism. Mostly commonly the reason for adding a feature is either it looks like it can “seal a feature” or it can solve some local problem. Both reasons provide value, but none promise to maximize the value.

What we lose by silencing the chicken?

The chicken clearly wants the same as the pig – software that meets the user’s needs. The chicken has several ways to help – provide feedback, collect requirements and prioritize. When we force the chicken to stay quiet we limit his ability to provide feedback and re-prioritize. The lack of feedback can lead to work being done for nothing (like change in feature). The lack of ability to prioritize during iteration can lead to a very important feature which was just “discovered” pushed to the next iteration instead being implemented now rather than a less important feature.

Summary

The way of deciding on the right thing to do is by expectation. We know that breaking an iteration has its price, we also know that silencing the chicken has its price. To get the right balance, we should choose only either tiny tasks (e.g. changing label text or the color of a UI element) or essential tasks whose lack is going to make an ongoing tasks redundant. If the importance is arguable, then adding it to the iteration has a high chance of requiring an excessive amount of effort. Usually, the possible damage from putting it off is negligible since we’re not abandoning the task forever, just moving the discussion about it to next iteration plan.
In the long term, using these guidelines also helps the chicken in two levels – firstly by having more realistic expectations. Secondly, they lead to more focused rational planning by always looking at the big picture of the backlog.

Balancing working hours toward better productivity

I’ll start by saying – I don’t know what the best balance is. Then, what can I tell?

The obvious

  1. The ratio between our working hours and productivity is not linear. We all know that, nothing new here. If we work 12 hours a day instead of 10 we won’t produce 20% more features.
  2. When we need to get more work done, we work more hours.

The almost obvious

What does our productivity looks like during the day?
image
Everybody agrees about this graph until the productivity gets closer to zero. But is possible to have negative productivity ?

Negative productivity

This is the counter intuitive part, we had encountered it so many times but it’s still hard to accept it. Starting sometime during the day, we do more harm than good – we cause more bugs, produce fragile design and less readable code. Even though our feature might work just fine, we did more harm than good – next week, when we have to extend the feature, we’ll have to understand code of an inferior standard. We’ll fight the design and most likely, we’ll fight the bugs we missed before.
From my personal experience, during the last year I found myself fighting with features for very long hours. Most of the times when I gave up and left the office, the next morning was extremely productive. I could throw away all the mess I made during the previous evening and write nice code within an hour.

Conclusion

The conclusion is very straightforward – when you’re getting to the zone of overwork, Go Home! You’re wasting your time, you’re wasting your boss’s money and you’re planting seeds in code that’ll annoy your teammates in the near future. We all know this is counter intuitive, but working shorter hours makes us more productive.

More thoughts

We have concentrated on the productivity of a single day. A bit more interesting can be to analyze a whole week. Is it possible that working one day less a week will improve our productivity? If we find this to be true, will we act and shorten our work week? If we’d shorten our work week, should we get paid less or more? On one hand we’re more productive, so we should be paid more, but on the other hand, we work less, so we should be paid less. This leads to an interesting question – are we paid for our time or for our results?
There’s a lot to think about here, but we must find first the optimal balance of working hours and days.