Integrate early and often, it’s a software configuration management mantra that we’ve been repeating for years. Integrate early and often is continuous integration. Every source control tool promotes this concept; you can read about it in the SVN book to the ClearCase manual. It’s been preached as a SCM standard for almost as long as we can remember. In the case of Continuous Perfection we gave up our “integrate early and often” principles, so how can we solve this problem?
Flexible Agile Tools to the Rescue
We can preach “integrate early and often” all we want. But if our tools don’t help us achieve that goal, it can be an exercise in futility. The problem with traditional SCM systems is even though they tell us to “integrate” the only thing they seem to do well is “isolate.” Think about the branches in your environment; they are static representations of a point in time in your development cycle. How do you know when it’s time to merge changes from the other branches? How do your developers know when it’s time to pull in changes to their local workspaces?
Automatic inheritance is a way to keep your developers connected with the rest of the organization. It gives them the ability to automatically pull in changes as needed. It also connects entire development teams. (See “Understanding Stream Inheritance”)
The second problem is that when the build is broken, there is no easy way to recover. Asking an entire development organization to roll back the codebase to an older version could take a day. Having an SCM tool that allows you to move the milestone in which your branch is based off of is a powerful way to get around this.
Tying into this is your build management solution. Free continuous integration servers are great at building and spitting out the results. But with every build that’s produced, there are a set of actions that need to take place. Being able to dynamically roll out code based on test and build results allows your QA teams to keep working even when code has been integrated poorly.
Create a Culture of Integration
This is the most important aspect, creating an “integration” culture in your development team. Often merging code is an overlooked and under rewarded task. Developers must deal with the merges, but often don’t get credit for doing so. Sometimes a difficult code integration takes a few hours, and developers may feel that this is eating into their valuable time.
Incorporating continuous code integration into your daily lives can help this. This might mean that you have Tasks that are assigned to your User Stories that deal with code integration. Or this might mean doing a code / review / integration session with your team. Engaging our team mates and making sure that the work that’s being done for these code integrations is rewarded and recognized goes a long way in relieving the frustration of a bad code merge and ultimately saving you from Continuous Perfection.