What is an Anti-pattern. Firstly, it’s a pattern that you think will improve things, but in actual fact, it does the opposite. It makes things worse. Sometimes this is visible, sometimes it isn’t. The following is a list of Anti-patterns that I have observed.
Backlog
In scrum, the purpose of a backlog is to give an idea of the work that is to be done for the project/product to make it a reality. At a high level it is the product owners vision in coarse grain. When the team gets the backlog, they break down the requirements to determine what needs to be involved.
The undefined backlog takes many forms. One form is that the product owner is too busy to define at a high level what they want. They only define the immediate sprint or two sprints worth of work. This means that the team has no idea of the long term vision. They only have immediate goals. This does not give the team ownership of the tasks.
The product backlog becomes a list of tasks where the product owner has done the breakdown themselves. Again takes ownership away from the team. It also means that there may be no coherence between tasks giving the developer little context to go by.
The product backlog does not result in a working component. The best method of measuring an agile project is in the working software. Something needs to be running at the end of each interval (sprint) and be production ready. That way everyone along the SDLC is working on getting something done earlier. Developers develop a working instance, no matter how primitive, testers can test that primitive instance, with caveats, documentation is done etc and at the end, there is always something of ship-able quality.
The product backlog is not prioritised, or is prioritised in multiple streams even if they require the same skill set. I.e., the items in the backlog are “assigned” to individuals, and not the team. This again takes ownership of the development from the team, and the individual especially if the way the task is to be executed is dictated rather than worked out.
The final, which I have already mentioned is that tasks are assigned to individuals before the team has a chance to break the tasks down and understand what is involved.
Planning
In scrum, there are 2 planning sessions. Sprint planning 1 and Sprint Planning 2. Sprint planning 1 is to go through the backlog with the product owner and determine what stories or task the team will accept for that sprint. This gives context to the team so they are across what the product owners vision is and can get first thoughts of how long a task will take. It gets everyone in line with the product owners vision.
The second sprint planning session is where the team deep dives into the stories and does the nitty gritty design. Granular tasks are determined and this is where you get the cards for the sprint. It also serves the purpose of making sure that everyone on the team is across the details of what is happening. It allows team members to contribute to tasks even if they are not involved directly with the task. This also gives the team a sense of ownership on the execution of the task.
Where the Anti-patterns is, is when management or the team think that they know what they are doing and decide they do not need a planning session or they need minimal planning. This could be to save time, reduce meetings etc. It is actually pretty rare that this is the case and what ends up happening instead is that team members have no idea what is happening during the sprint. Time gets wasted explaining the situation and somethings the situation needs to be explained more than once as one team member may ask the same questions as another.
Daily Stand Ups
Daily Stand Ups are there to show the daily progress of the work. You talk to 3 questions. What did I do, What am I going to do and what is blocking me.
Where the Anti-patterns occur is when the meeting becomes a status meeting. News is given and the conversation veers away from the progress of the work. This can lead to another Anti-patterns where Stand Ups take too long. I’ve been in Stand Ups that have gone consistently over an hour because of this. The purpose of the stand up is to make people uncomfortable by standing so the meeting is short. No more than 15 min. If it goes more than 15 minutes, people tune out.
Another anti pattern is giving a status update to the product owner or manager. This is a meeting for the team. It is to let the team know what you are doing and an opportunity to offer help if required.
Another Anti-pattern is talking about tasks that are not recorded either on the board or in the task management software. All work should be logged.
No Showcase
The showcase is where the working incremental, warts and all is shown to the stake holders. It can also serve as a mini handover session. If there is no showcase, then there is the “opportunity” to skip the working incremental requirement.
Retrospective
The purpose of the retrospective is to look back at what has been done in the last interval and see what can be improved. It is not wishy washy improvement either. It needs to be measurable.
A common Anti-pattern when teams first start out is that they struggle with the retrospective and find little to no value in it. So they think about dropping it or extending the period between retros in order to save time and do the work. When you do this, you miss the opportunity to analyse what you have done and figure out ways to improve.
Another anti-pattern is to change how often you have the retrospective. If you are not doing fixed length sprints (eg, maybe doing Kanban) then there is the tendency to hold off the retrospective until the end of a development phase, this may be months later. A lot can happen within those months, and without looking back over a short interval, you miss the opportunity to improve.
Retrospective when you first start them out, can be a little difficult. Its hard to know how to improve and what to improve without an Agile coach or someone who understands the process. What then happens is that the retrospective gets a little superficial. If you are looking back and not seeing any problems, then that is a problem. One thing that Agile does is try to highlight problems. Through fixing these problems do you get better. If things are getting a little superficial and you are glossing over the problems, then you are not doing retrospectives right.
Finally, not having any tasks set up to do that are measurable. A good guideline is SMART goals.
- Specific
- Measurable
- Agreed Upon
- Realistic and
- Time Based
is a good standard for adding tasks to the backlog from the results of the retrospective. Again, this is how you improve.
Command And Control
When starting out with Agile/Scrum for the first time, it is not unusual for the product owner or scrum master to be a manager. Be it the team leader or higher. When this happens in these cases is that old habits of Command and Control kick in. The manager assigns tasks to individuals in the development team. Tasks are broken down based on hours of work. Not story points. In this case, the manager is taking ownership of the tasks away from the team. By assigning tasks, and worse breaking them down themselves, the manager has kept ownership, and the development team is just a cog in the engine.
This can lead to failure as the team is no longer empowered. They have no say in the solution and thus mindlessly do the work as required. Yes, it is the scrum masters role to protect the team from this sort of thing, but if the scrum master has no power, and all the power is in the product owner, the role becomes moot.
Big Bang improvement
Another anti-pattern is big bang improvement. A good example is that you need automated deployment. This has been determined part way through a project. Big Bang improvement is spending the next 3+ months (in my case 12+ months) developing an automated deployment system without iterative or incremental use by the rest of the development team.
Part of Agile is getting value as soon as possible, even if its not full value. Some value early even if its not directly related to the production system is better than nothing short term and everything much much later.
You also run the risk that your efforts in getting the big bang solution in place do not live up to scratch and add only a little value in real life.
Another anti-pattern is delaying improvements until there is slack in the schedule. Slack rarely happens, and more than likely will never happen if you do not include the improvements early. The reason for this is that your technical debt racks up, you spend more time fixing the issues rather than improving.
There is an old joke, “How do you eat an elephant? One bite at a time!” but if you never take that first bite, you will never eat the elephant.
Education
If you do not know what is required for Scrum or Agile, and you only go by what you see superficially, you are going to fail. Learn what scrum is. Learn its history. Learn how it has been implemented in other industries. For example, it all started with Toyota. Read up on the Toyota production system. A good book is “The Toyota Way” by Jeffrey Liker.
If you jump in without understanding, you run the risk of doing Cargo Cult Agile.
Quality and definition of done
An agile anti-pattern that tends to be done is missing the definition of done, or skipping quality checks during the development process.
For quality checks, this could take the form of not doing unit tests, code reviews etc until after development is complete. This could happen days or weeks later and is usually skipped in the interest of time. Why is this a problem? Well, usually when problems are found out after development, the developer has to get back into the mindset that they were in while developing the feature. This takes time. Then they have to do the implementation again and recheck etc.
If the checks are done while development is still in progress, then you save that time that it took the developer to get back into the rhythm. This time saved is usually significantly shorter than the testing task in the first place. There will be a productivity hit initially as you are not use to doing the checks while working, but you will find in the long run that adding the checks actually saves time.
The other anti-pattern is not defining a definition of done or acceptance criteria. Again, left off due to time constraints. But what happens here is that work comes back to the developer because it is incomplete. Why is it incomplete? Well, in this case, the developer didn’t know that they had to cater for that situation. Having a definition of done, or acceptance criteria gives the developer a perspective on what is required and gives solid checks that they can measure their code by.
Lack Of Long Term Thinking
What is lack of long term thinking? This is where the immediate problem is looked at and the overall solution is glossed over. This could take the form of doing the work immediately. You have to repeat the same task anther 4 times for other environments. Instead of thinking of ways you can quickly automate the process or even semi-automate the process to save a little time in the long run, while sacrificing the short term implementation, you just go ahead and brute force the implementation. This means that when you do the task in the other 4 environments, its going to take the same amount of time.
An example. Say you have to do a deployment from Dev to Test. It takes about a day to do the deployment. It is tedious work, but not that complicated.
If you spent 2 days automating the task, the deployment could be done in an hour. But you don’t have time, You need to deploy now. So you spend the day deploying from Dev to Test. Then when you have to deploy to Pre-prod, it takes you a day.
So far you have taken 2 days. If you had automated the task, it would have taken 2 days and 2 hours.
Now, you have to deploy to prod. If you do the brute force method, you would have taken another day. So 3 days all up. If automated, 2 days and 3 hours. A saving of 5 hours.
The more you have to repeat the task in the long term. Lets say, there is a bug fix and you have to redeploy to all environments again, the more savings you make time wise.
i think of this problem a bit like the poverty trap. For example, you cannot afford to go to a supermarket. No car or public transport. So you have to buy groceries from the local convenience store at significantly higher prices. Which prevents you from saving money so that you can afford to go to the supermarket to save money.
You need to transcend the work. Look at ways to improve the process in the long term. Not the short term. Do this continuously. This is called Kaizen, and is a major part of the agile philosophy.
In the anti-pattern, you are stuck in the poverty trap based on time rather than money.
Another anti-pattern is that of outsourcing. You need a project done. So you bring in outsiders to do the project. One the project is complete, they hand over to the BAU (Business As Usual) team, which then has the problem of having to understand what has been built. In the mean time, the people that have all the knowledge have long since left.
Another anti-pattern is buying pretty toys (tools) without knowing what your requirements are just because it looks pretty and simple. But no one ends up using it because it doesn’t meet the use case.
Lack of communication
Have you ever been in the situation where you feel that you have been left off something that everyone else knows about? A conversation may have happened at the “water cooler”, or the modern equivalent, the coffee machine, that may have affected you, but you were not present when the conversation happened.
Or have you been in the situation where you are told “You should know that”, but this is actually the first time you have heard this.
Or, an email was sent months ago. You brushed it off because it was irrelevant at the time and subsequently forgot about it, but when you ask about the topic, you are told that they sent an email – why don’t you know about it!
This anti-pattern is a big one. Communication can kill an agile project, especially when you are berated for not knowing something, Morale of the person goes down and so does their productivity.
You need to re-think your communication goals. It is not efficient to send out an email if only half your team takes in the knowledge, or do a hand over for something that won’t be used for 6 months. The efficiency isn’t in the dissemination of the knowledge, but in making sure that the recipient retains the knowledge. this can take the form of a one-on-one session, writing details in a wiki page for future reference (Do not use email – it is a horrible interface for knowledge). Write a tutorial.
If something is discussed at the water cooler, get everyone else together and re-discuss the topic. Even if you don’t think its relevant to someone, it might actually be.
Make sure that everything needed at some future point is documented in enough detail that it can be picked up at a later date. For example 6 months down the track. Make sure its in an easily searchable format – such as a wiki.
Finally, do pair programming or mob programming. This is an excellent method of getting everyone on the same page. you may think that it isn’t efficient as you have 2 or more people doing one task on one computer, but there is nothing better for handover than doing the work together.
Not making it a safe environment
This final lot of anti-patterns has to do with not making the environment safe. I don’t mean taking care of frayed power leads (although you should take care of those straight away), but I mean giving an environment where people can speak their mind without being shut down. Where dissent is tolerated or even encouraged – if its relevant to the job.
If you do tell those that have different opinions to shut up effectively, they may just do that. Then you lose your most valuable feedback – the check to see if you are doing things correctly or not. Or if you are going down the wrong route.
These are the anti-patterns (at least in my opinion) that I have encountered.
If you agree or disagree or have some of your own anti-patterns that you have encountered, let me know in the comments.