One part of being a software engineer that I used to enjoy was the satisfaction of cracking a hard bug. Trawling through logs, using profilers and heap dumps and theorising on different ways different threads could have interleved etc. 

This week it suddenly dawned on me that I don't have to do this any more!

I've spent the last 6+ months working with some great people and we follow a number of great XP practices:
  • All our acceptance tests are automated,  many of them before development has started
  • All code is done TDD
  • All production code is paired on
  • We swap pairs every day, so unless a feature is completed in under a day most of our team will see the code
In addition we also have a great definition of done; for a particular feature it means:
  • Development complete (implicitly reviewed by the fact it was paired on)
  • All edge cases functionally tested and signed off
  • Deployed to our UAT environment
We always go the extra mile for functional testing. If a feature states we should store something persistently we don't only check that it has been but test all the edge cases around the datastore being down, being slow, traffic being dropped by a firewall etc. If is is a multi node cluster datastore (e.g Cassandra) we'll test that we still function when nodes go down etc. And when I say test I don't mean a quick manual test but automated tests running against every commit.

This is the first team I've worked in where I haven't had to fight for software to be developed like this. Regardless of how hard it is to create automated tests for a particular scenario - we'll do it.


So if you like fixing bugs or being woken up in the middle of the night with production problems - don't develop software like this!