Skip to main content

When Agile is not common sense

It's been about 8 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 practising 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 to complacent.

TDD
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.

Pair Programming
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.

Mob Programming
See pair programming

No Estimates
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.

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 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.

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.

Comments

Popular posts from this blog

Setting up Fitnesse on Ubuntu in 7 steps

Some pretty basic steps but just to make sure it's here for everyone to see. Setting up fitnesse and running the jar is easy enough. Just go to http://fitnesse.org/ and get started and do it on your desktop just to see it in action. But for me that wasn't good enough I wanted it to run as service on ubuntu. I stole a few tricks from how ubuntu runs jenkins and setup fitnesse a similar way. 1. Create a user and group for fitnesse (optional) I didn't do this because I wanted tomcat, jenkins and fitnesse all running as the same user. Call it laziness to avoid any permissions classing but it doesn't change the process that you need to create or choose what user you're going to make it run as. Don't make it run as your user or root! 2. Download the jar file and place it in /usr/share/fitnesse Make the folder too of course. It can belong to root as long as the fitnesse user has read access 3. Create the folder to run in at /var/lib/fitnesse Fitnesse user needs...

RestFixture

So most of the tests I'm writing now in Fitnesse are using RestFixture . Being able to do all this black box style testing has helped me get a lot of tests up and running without having to change the existing code base. Now I've taken a step future with my own little fork  so I can use scenarios and build nice BDD style scripts. But first I want to give me own quick guide to using RestFixture Step 1: Installing You can dive straight in by grabbing the latest jar files for RestFixture here  https://github.com/smartrics/RestFixture/downloads If you know what you're doing can get the nodep version to work nicely along side other libraries you may be including in Fitnesse. But I grabbed the 'full' version and unzipped it into a RestFixture folder alongside my FitNesseRoot folder. Step 2: Write your first test I took advantage of the built in Fitnesse api as a basic test and wrote a page called RestFixture with the following contents !define TEST_SYSTEM {slim} !...

Are mocks/fakes reusuable?

Programming 101 states: Don't copy and paste code. If you find yourself doing something repetitive then do it right so you can reuse the same code. Functions, classes and even separate files all serve this end. Now that I'm writing tests all the time I often find myself creating Mocks. Mocks are where you tell code to use a pretend version of some functionality instead of the real one. It could be because the real one does something you don't want in your tests (writes files, reads a database) or it could be that you've got some messy legacy code you can't to pull into your tests (yet). There's other reasons too but you get the idea. So if I make a Mock version of a class it makes sense to try and share that with everyone else that might be trying to test with that same class. Or does it? That assumption has some serious flaws that I'm only now starting to understand. And here's a few: Behaviour you need to test may be completely different to the next gu...