It’s been about 10 years since I got my Agile training from James Grenning and started an Agile Pilot with my team. Right from the start I was super keen and got people practicing TDD and Pair Programming even though I didn’t really know if that effort would pay off. I just knew we had lots of problems with the old way so I wanted to embrace the new.
So I’d run my own little sessions with the broader team in Sydney sharing Agile concepts and ideas. Giving us a chance to discuss things and keep learning long after James had left. But often I would present new ideas and a few people in the group would respond “oh of course, that’s just common sense”. Initially I thought it was great as they were embracing these ideas as valuable even though it was not what we were doing before. But after a while I started to get frustrated because they we’re not really listening. If some small part of a concept fit nicely with their “common sense” then they took that on and ignored the rest.
For example I’d point out that Agile asks us to plan regularly but to never put too much value into any plan. You need to be prepared to throw out your plan from yesterday because you learned something new today. “Oh of course, that’s just common sense.” But what I’d observe is they didn’t re-plan regularly, they would just stick to the old plan unless something was clearly going wrong, and only then would re-plan in an attempt to react. They didn’t adopt the new idea as they didn’t understand that it’s about being proactive. They didn’t understand the value in making continuous minor adjustments or even just discussing how their understanding has shifted over time.
So I did a presentation to them about when Agile is not common sense. Put out the ideas that clearly challenged their old thinking and through that made my case that they allow other ideas to challenge them too. My list has grown over the years and it’s still something I refer to when I feel people are being too complacent.
We all understand the value in having tests. But writing a test before there is any code? Writing a test before we have a clear picture of what we’re building? TDD should challenge the way you learned to program.
Two heads are smarter than one. But we all assume it’ll be the same speed as just 1 person so under value the benefits. But in studies we find that, with practice, the speed increases by quite a lot. Most of programming is not typing; it’s thinking about the problem. The same is true for creating tests in that typing is a very small part of the time spent. With practice we see pairs operate at about 1.8x the speed of an individual while also having 50% fewer bugs.
See pair programming
Estimates can be a dysfunction. Is someone asking for a completion date or trying to figure out a cost, plan a release or looking for a deadline to enforce. Move the conversation away from estimates as much as possible. Try and find a short term deliverable people can focus on instead where a date of “soon” is acceptable for everyone. Long term planning is unlikely to be accurate or useful so estimates have little value.
If something is difficult or error prone? Then do it more often
Teams will often avoid doing a minor release due to headaches in the release process. A good coach will then insist that releases be daily until release issues are resolved. It applies to many areas where we avoid facing issues rather than fixing them.
Maximise the work not done
We want to work on a prioritised list so that we can avoid doing things that have little value. Sure the customer says they want A, B & C but if C will help them immediately then do that and give them the software before working on A & B. You might find out that with C fixed that B drops from being the second most important feature to no longer being required.
Safe to fail
Encourage teams to challenge themselves and occasionally fail. If the team never fails then how do you know they are actually trying to improve? If you treat everything as so important you cannot risk failure then you do not allow improvement. So you are not allowing teams to operate at their best when you demand only the best.
Having a detailed and complete test suite allows quicker changes to your code
Many with only a little experience at writing tests would disagree. The tests break in confusing ways. Changes to the software trigger many required changes in the tests. But really that’s just changing code with poor tests that are too tightly coupled and fail in bad ways.
Reducing your Work in Progress to go quicker
When under pressure to deliver we want to take on as much as possible. It’s natural to feel that by progressing on many tasks at the same time we’re progressing quickly towards everything being complete. But it’s an illusion. LEAN and Agile encourage WIP limits because of research showing we are more productive when we’re not multi-tasking. But it requires discipline and working out all those blockages and hand-overs that lead people to be idle.
That’s my list for now. As an aside it’s worth remembering that common sense is cultural and really just wraps up a lot of assumptions we share. I do this contrast more to challenge people’s thinking than really seeing a lot of value in something being common sense or not. When we start thinking of something as common sense we assume others know it and that’s an unhelpful assumption.