I think as agile practitioners we can learn a lot from Lean thinking and there are a number of concepts of Lean that I think apply very well to Agile Software Development.
This is the second part of a blog attempting to convey the Lean concept of waste and I have introduced some ideas for how we can help mitigate waste in an Agile environment.
The 7 deadly sins
Lean identifies 7 wastes (recently adding an 8th Waste)*
- Wasted Potential of People*
explored in more detail here.
Inventory / Work In Progress
In manufacturing the physical properties of inventory are obvious, piles of raw materials, stacks of part built products, warehouses of finished goods are all big and obvious, but in software, inventory is harder to see, it is intangible to the casual observer.
In software, Work in Progress takes many forms, most obviously this is in the form of code, any code not deployed to a customer is Work In Progress, that code cost time and money to create, the raw materials are developer thought and effort.
But Inventory is not just code, it is also knowledge, it is thought and problem solving, unrealized ideas and even experience and learning. Code is the manifestation of thinking, problem solving and planning. WiP/inventory is also the consequence and ideas resulting of conversations with users, usability testing, marketing. All of these are the efforts needed to create a product. But until those efforts are turned into a product it is all potential waste: time and money that are spent but until released to a customer are not providing value.
If we can learn to manage our Inventory/Work In Progress to limit it to only what we need and only what we can benefit from in a reasonable timeframe we can cut back on excess Inventory which in business terms this can have a major beneficial impact on our cashflow. Reducing Work In Progress also has the added benefit of making it easier to see other waste.
Effectively managing your WiP is probably the second biggest opportunity for waste reduction and the act of limiting WiP will help identify other wastes in your system.
In manufacturing, there is deemed no value in transportation. Moving a product does not add to it’s value and may even damage it with wear or breakage. reducing the distance between workstations or distance from your raw materials or the distance to customers can reduce the cost of time or effort and reduce the risk of wear or damage.
In software transportation could be best viewed as hand-offs, handing off work to another person or team requires effort, bringing them up to speed, co-ordinating, sharing the work. All this time and effort does not add any value to the software. But worse there is consequential loss of knowledge when there is a hand-off, and each hand-off results in a greater loss as the knowledge becomes fragmented and dispersed. Vital information may not be passed on leading to poor decisions, this is equatable to a breakage during transit.
Limiting hand-offs can reduce waste, having a team that contains all the knowledge and skills necessary to complete the work can help. Steps to improve and enhance communication so that less knowledge is held by a small number of people can mitigate the loss of knowledge during a hand-off. E.g. have all members of the team involved in story refining meetings so everyone is apprised of the intent of a story and can ask questions.
In manufacturing this is making a product to a higher standard than is required or spending longer on something than is necessary, or in using a tool that is over powered for the job at hand.
This is similar to Over Production in many respects as is it unnecessary work, but in software it is obfuscated. A feature may be needed, but we have over engineered it, spent more time and effort on it than is necessary. This is not an excuse to cut corners, but development and test effort should be reflective of the customer need.
TDD – Test Driven Development can help here, by writing the test first and limiting coding to passing the test can help reduce over-processing.
However, many developers engage in EDD – Ego Driven Development where they write unnecessarily complex code to solve a problem so they appear clever to their peers. Or RDD – Resume Driven Development where they introduce a shiny new: tool, technique or gadget, because… ” it is shiny and I wanted to try it out” or “It will look good on my resume” rather than because the product needs it.
EDD – Ego Driven Development where developers write unnecessarily complex code to solve a problem so they appear clever to their peers.
There is another form of Over-Processing and that is writing software to solve a problem that could be done more easily another way. We have a great desire to automate everything but sometimes the solution costs far more than the problem we are solving.
The waste of this seems obvious when described here but can be difficult to spot in the wild, pairing and TDD can help keep the focus on the goal and limit the opportunities for over processing.
Over-Processing – Re-Learning
Another aspect of over-processing is the act of re-learning, if you have solved a problem once you should not need to solve it a second time, or if someone else has solved a problem can you benefit from their learning.
We can reduce this waste with knowledge sharing within the team or having the whole team in discussions about design or story refining so that opportunities to avoid re-learning are increased.
Avoid long delays between first looking at a product and then coming back to it later where you need to remind yourself of context better to only start work on something when you are ready to see it through.
Waiting is any time that the product is not being actively worked on, this could be a story that is blocked waiting on someone or some event. I think most people see that as waiting time, but any card that is not being actively worked at any time is ‘waiting‘.
Any state such as ‘dev done’, or ‘QA done’, or ‘ready for test’ or ‘ready to deploy’ or even stories written but waiting in the backlog are ‘waiting‘. Most stories will spend far more time waiting than they will being worked.
This is often a symptom of having too much work in progress, but items waiting may be a sign of a bottleneck or potential areas for improvement in your workflow. Kanban focuses on flow – minimizing the waiting time, so identifying any area where there is excessive time waiting is a candidate for improvement in the workflow.
Keeping track of repeat blockers, or being aware of areas of your system where stories regularly spend time waiting can help reduce this waste. Challenge any story that is not actively being worked and ask why.
One technique for this is for team members to each have only one avatar and have them place it on the card/story they are currently working on. Any card without an avatar is waiting. Only allow one avatar per person.
Similar to transport in many ways but refers to the operator or the operation rather than the transport of the product, could the workstation be operated more effectively.
In software this is sometimes interpreted as Context Switching which unnecessarily slows down the team, this is certainly a major part of it, but I prefer a broader interpretation, anything that hinders the team from getting the job done effectively, this could be having the right tools, the right environment, the team working effectively together, communication barriers. But I can understand the desire to focus on context switching such as: support calls, emails, even distractions in the office space are forms of task switching that impair the effectiveness of the team to get the job done.
Identifying ways to improve the work environment and limit the interruptions could cut huge amounts of wasted time from your workflow.
Defects are another waste that gets compounded as a defect is exposed to all of the other wastes as it goes through the system which magnifies a problem that is already serious.
Defects are waste that grows the longer they go undetected, the problem itself is magnified by time and use, the more time the more frequently the defect occurs and the more users it impacts the more it costs you. That is until reported it is a hidden cost.
The waste is a hidden waste until much later so it can give us a false sense of security until the product reaches end of life and we have a full picture of the total lifetime cost we will not know the true extent of the cost of defects.
Another factor is that the cost goes beyond the impact of the defect itself the longer it goes undetected the less recent knowledge the development team has of the subject and so the learning time goes up. How often have you been asked t fix code of someone that left the company years ago and have no clue what they were writing. Once again one waste impacts another if that developer was using EDD you may have code that is so complex the effort to resolve is much higher.
We can try and combat defects with good development practices, such as pair programming, TDD, and comprehensive regression testing. Any efforts we can find to identify defects sooner or prevent them occurring reduces the waste and the long term impact.
Wasted Potential of People
I have seen this added as an 8th waste of manufacturing, and it goes doubly so for software development. In software development people are your greatest asset, it is a creative knowledge based activity and so providing the right work environment and opportunities is essential to getting the best from your people.
Demotivated people work slower and with less care, but enabling people to reach their full potential could reap rewards for you and your products.
Any system will have waste, some is necessary and some is not, but being able to identify what is necessary and what is unnecessary or what is waste and what is slack can greatly enhance your chances of making improvements that really help your software development process.
Often what you thought was waste is actually a valuable activity and what you thought was adding value was just adding waste. Understanding this helps you make the right decisions.
However, please remember – It is very important that waste reduction is NOT the Goal of your efforts, Waste Identification is a supporting activity for the Theory of Constraints, any efforts to improve a part of your system that is not the bottleneck is a waste in itself.
Your goal is to improve the entire system and focusing on one area without consideration for the system as a whole leads to the wrong decisions being made. Waste is just one of many considerations.